[OpenPower-Firmware] Undocumented SCOM registers and DIMM addressing

Krystian Hebel krystian.hebel at 3mdeb.com
Wed Jan 20 01:22:47 AEDT 2021


Hello,

I'm analyzing memory initialization code as a part of preparation for 
coreboot port for Talos II. I have encountered a few undocumented 
registers, all of them (so far) have SCOM addresses 0x0501082X. In the 
part of code I am analyzing, the first write to those registers happens 
in istep 13.8, but as it is done by an initfile, I didn't pay too much 
attention and assumed that this is just the default, non-configurable value.

Registers from the same group appear again in 13.13 for setting up the 
translation between controller addresses and DIMM addresses. This time 
they are at least named by constants: MCA_MBA_MCP0XLT{0,1,2}. Field 
names can also be found in header files, but without any explanation as 
to what they exactly configure. I haven't analyzed further code yet so 
can't tell if this is the last place where they are accessed.

I have decoded, more or less, which port address is assigned to which 
DIMM bit and under what circumstances, but there are still some 
unanswered questions, or assumptions I would like to confirm. 
Nevertheless, it would be nice to have a proper documentation of all 
pieces required for the initialization of the platform.

How many port address bits there are? Is it either 40 or 56 bits, as 
mentioned in section 10.2 of POWER9 Processor User's Manual? How are 
port addresses from all ports (MCAs) mapped to the address space seen by 
CPU?

Which bit numbers are more significant? I assume lower port address bit 
number is more significant, seeing that the highest numbers are always 
allocated, and lower only if needed. On the other hand, if that is the 
case, wouldn't assigning higher number/less significant address to D-bit 
improve performance due to interleaving? Assuming that both DIMMs have 
the same size to avoid holes, of course.

I assume that bits which are not encoded in `enum xlate_bit_maps` are 
hardwired to column bits 0-3 and row bits 0-14. There is also 
`PORT_ADDRESS_22` in enumeration that isn't used anywhere in the code, 
is it also hardwired? Also, why some of the map fields in registers are 
5 bits, while other are only 3 bits long? Given that the registers are 
sparsely filled (at least from what can be decoded from the header 
files) I don't think this is done just to pack more data in one register.

I have also noticed that both BG bits are mapped, even for 16Gb devices, 
which according to DDR4 specification have only two bank groups, so they 
should use just BG0. Was this an overlook or is there any purpose for 
mapping both bank group bits?

I hope that wasn't too much questions for one email.

Best regards,

-- 
Krystian Hebel
Firmware Engineer
https://3mdeb.com | @3mdeb_com



More information about the OpenPower-Firmware mailing list