util/spd_tools: Document adding support for a new memory technology
Add documentation describing how to add support for a new memory technology to spd_tools: - Add a section to the README. - Document the memTech interface in spd_gen.go. BUG=b:191776301 TEST=None Signed-off-by: Reka Norman <rekanorman@google.com> Change-Id: Ie710c1c686ddf5288db35cf43e5f1ac9b1974305 Reviewed-on: https://review.coreboot.org/c/coreboot/+/59005 Reviewed-by: Karthik Ramasubramanian <kramasub@google.com> Reviewed-by: Tim Wawrzynczak <twawrzynczak@chromium.org> Tested-by: build bot (Jenkins) <no-reply@coreboot.org>
This commit is contained in:
		
				
					committed by
					
						
						Tim Wawrzynczak
					
				
			
			
				
	
			
			
			
						parent
						
							b455dd3486
						
					
				
				
					commit
					e6a1ebe55b
				
			@@ -590,3 +590,48 @@ util/spd_tools/bin/part_id_gen \
 | 
				
			|||||||
        `dram_id.generated.txt` with the new part.
 | 
					        `dram_id.generated.txt` with the new part.
 | 
				
			||||||
    *   Upload the changes to `Makefile.inc` and `dram_id.generated.txt` for
 | 
					    *   Upload the changes to `Makefile.inc` and `dram_id.generated.txt` for
 | 
				
			||||||
        review.
 | 
					        review.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					## How to add support for a new memory technology
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					### 1. Gather the SPD requirements
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					To generate SPDs for the new memory technology, information is needed about the
 | 
				
			||||||
 | 
					list of bytes in the SPD and how the value of each byte should be determined.
 | 
				
			||||||
 | 
					This information usually comes from a combination of:
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					*   The JEDEC spec for the memory technology, e.g. JESD209-5B for LPDDR5.
 | 
				
			||||||
 | 
					*   The JEDEC SPD spec for the memory technology, e.g. SPD4.1.2.M-2 for LPDDR3/4
 | 
				
			||||||
 | 
					    (also used for LP4x and LP5).
 | 
				
			||||||
 | 
					*   Platform-specific requirements. SoC vendors often don't follow the JEDEC
 | 
				
			||||||
 | 
					    specs exactly. E.g. the memory training code may expect certain SPD bytes to
 | 
				
			||||||
 | 
					    encode a different value to what is stated in the spec. So for each SoC
 | 
				
			||||||
 | 
					    platform using the new memory technology, any platform-specific requirements
 | 
				
			||||||
 | 
					    need to be gathered.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					### 2. Implement support in spd_tools
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					Support for the new memory technology needs to be added to both the `spd_gen`
 | 
				
			||||||
 | 
					and `part_id_gen` tools.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#### `spd_gen`
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					Adding support to `spd_gen` requires implementing the logic to generate SPDs for
 | 
				
			||||||
 | 
					the new memory technology. The changes required are:
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					*   Add the new memory technology to the `memTechMap` in `spd_gen/spd_gen.go`.
 | 
				
			||||||
 | 
					*   Add a new file `spd_gen/<mem_tech>.go`. This file will contain all the logic
 | 
				
			||||||
 | 
					    for generating SPDs for the new memory technology. It needs to implement the
 | 
				
			||||||
 | 
					    `memTech` interface defined in `spd_gen/spd_gen.go`. The interface functions
 | 
				
			||||||
 | 
					    are documented inline. Examples of how the interface is implemented for
 | 
				
			||||||
 | 
					    existing memory technologies can be found in the `spd_gen/` directory, e.g.
 | 
				
			||||||
 | 
					    `lp4x.go`, `ddr4.go`, `lp5.go`. While not strictly necessary, it is
 | 
				
			||||||
 | 
					    recommended to follow the overall structure of these existing files when
 | 
				
			||||||
 | 
					    adding a new memory technology.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#### `part_id_gen`
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					The `part_id_gen` tool is memory technology-agnostic, so the only change
 | 
				
			||||||
 | 
					required is:
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					*   Add the new memory technology to the `supportedMemTechs` list in
 | 
				
			||||||
 | 
					    `part_id_gen/part_id_gen.go`.
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -28,10 +28,37 @@ type memPart struct {
 | 
				
			|||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
type memTech interface {
 | 
					type memTech interface {
 | 
				
			||||||
 | 
						/*
 | 
				
			||||||
 | 
						 * Returns the set -> platform mapping for the memory technology. Platforms with the
 | 
				
			||||||
 | 
						 * same SPD requirements should be grouped together into a single set.
 | 
				
			||||||
 | 
						 */
 | 
				
			||||||
	getSetMap() map[int][]int
 | 
						getSetMap() map[int][]int
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						/*
 | 
				
			||||||
 | 
						 * Takes the name and attributes of a part, as read from the memory_parts JSON file.
 | 
				
			||||||
 | 
						 * Validates the attributes, returning an error if any attribute has an invalid value.
 | 
				
			||||||
 | 
						 * Stores the name and attributes internally to be used later.
 | 
				
			||||||
 | 
						 */
 | 
				
			||||||
	addNewPart(string, interface{}) error
 | 
						addNewPart(string, interface{}) error
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						/*
 | 
				
			||||||
 | 
						 * Takes the name of a part and a set number.
 | 
				
			||||||
 | 
						 * Retrieves the part's attributes which were stored by addNewPart(). Updates them by
 | 
				
			||||||
 | 
						 * setting any optional attributes which weren't specified in the JSON file to their
 | 
				
			||||||
 | 
						 * default values.
 | 
				
			||||||
 | 
						 * Returns these updated attributes.
 | 
				
			||||||
 | 
						 */
 | 
				
			||||||
	getSPDAttribs(string, int) (interface{}, error)
 | 
						getSPDAttribs(string, int) (interface{}, error)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						/*
 | 
				
			||||||
 | 
						 * Returns the size of an SPD file for this memory technology.
 | 
				
			||||||
 | 
						 */
 | 
				
			||||||
	getSPDLen() int
 | 
						getSPDLen() int
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						/*
 | 
				
			||||||
 | 
						 * Takes an SPD byte index and the attributes of a part.
 | 
				
			||||||
 | 
						 * Returns the value which that SPD byte should be set to based on the attributes.
 | 
				
			||||||
 | 
						 */
 | 
				
			||||||
	getSPDByte(int, interface{}) byte
 | 
						getSPDByte(int, interface{}) byte
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 
 | 
				
			|||||||
		Reference in New Issue
	
	Block a user