I note that SMBios Type 20 would help here, but it's optional as of version 2.5 (2006-09-05) pp. 25, L796, and pp. 131, whereas types 16, 17 and 19 are mandatory, but don't quite help.
Physical Memory Array (Type 16)
There is one of these structures for the entire system, explaining what is possible on this board.
Handle 0x1000, DMI type 16, 23 bytes Physical Memory Array Location: System Board Or Motherboard Use: System Memory Error Correction Type: Multi-bit ECC Maximum Capacity: 768 GB Error Information Handle: Not Provided Number Of Devices: 24 Memory Device (Type 17)
There is one record per each Dimm, which tells you the physical Dimms installed on the board.
Handle 0x1100, DMI type 17, 34 bytes Memory Device Array Handle: 0x1000 Error Information Handle: Not Provided Total Width: 72 bits Data Width: 64 bits Size: 2048 MB Form Factor: DIMM Set: 1 Locator: DIMM_A1 Bank Locator: Not Specified Type: DDR3 Type Detail: Synchronous Registered (Buffered) Speed: 1600 MHz Manufacturer: XXXX Serial Number: XXXX Asset Tag: XXXX Part Number: XXXX Rank: 1 Configured Clock Speed: 1333 MHz Memory Array Mapped Address (Type 19)
There can be multiple of these records, and each record lists a range of physical addresses.
Here is the output with two 2GB sticks:
Handle 0x1300, DMI type 19, 31 bytes Memory Array Mapped Address Starting Address: 0x00000000000 Ending Address: 0x000CFFFFFFF Range Size: 3328 MB Physical Array Handle: 0x1000 Partition Width: 2 Handle 0x1301, DMI type 19, 31 bytes Memory Array Mapped Address Starting Address: 0x00100000000 Ending Address: 0x0012FFFFFFF Range Size: 768 MB Physical Array Handle: 0x1000 Partition Width: 2 And here is the output with 4 sticks; 2*2GB and 2*4GB:
Handle 0x1300, DMI type 19, 31 bytes Memory Array Mapped Address Starting Address: 0x00000000000 Ending Address: 0x000CFFFFFFF Range Size: 3328 MB Physical Array Handle: 0x1000 Partition Width: 2 Handle 0x1301, DMI type 19, 31 bytes Memory Array Mapped Address Starting Address: 0x00100000000 Ending Address: 0x0032FFFFFFF Range Size: 8960 MB Physical Array Handle: 0x1000 Partition Width: 2 Note that in the first sample output above, there were two 2GB DIMMs, but two ranges of 3.3GB and 0.7GB. With 4 Dimms, the system will also coalesce the memory array mapped address region into two chunks, as it is just representing the same as the e820 map, i.e. the valid memory physical address ranges.
1 to many Type 20 records are tied to exactly one type 17 memory device, meaning that the entire physical range can be known:
Example
$ sudo dmidecode -t 20 # dmidecode 2.12 SMBIOS 2.6 present. Handle 0x002F, DMI type 20, 19 bytes Memory Device Mapped Address Starting Address: 0x00000000000 Ending Address: 0x000FFFFFFFF Range Size: 4 GB Physical Device Handle: 0x002B Memory Array Mapped Address Handle: 0x002E Partition Row Position: 1 Handle 0x0030, DMI type 20, 19 bytes Memory Device Mapped Address Starting Address: 0x00100000000 Ending Address: 0x001FFFFFFFF Range Size: 4 GB Physical Device Handle: 0x002C Memory Array Mapped Address Handle: 0x002E Partition Row Position: 1 It seems possible to go from address to DIMM for EDAC - Error Detection & Correction purposes, but not from DIMM to entire range.
Looking at the source code of mcelog, it is also using type 20 for its decoding.
dmidecodeandlshw, but I think you're looking for more than what these provide?lshwusesdmidecodeas code base anddmidecode -t 20gives wanted information. But, as noted, by version 2.5 of SMBIOS the structure holding this information "Memory Device Mapped Address" aka Type 20 or bank location is optional – thus Q is if there is another way to retrieve the same information. – Link betweentype 17's Locator value and physical address range (as optionally provided byType 20).dmidecode -t 20output, can you explain the type 17's locator value vs. physical addr., type 20?