udev: Extract RAM properties from DMI information

Add memory_id program to set properties about the physical memory
devices in the system. This is useful on machines with removable memory
modules to show how the machine can be upgraded, and on all devices to
detect the actual RAM size, without relying on the OS accessible amount.

Closes: #16651
This commit is contained in:
Bastien Nocera
2020-12-02 12:40:42 +01:00
committed by Zbigniew Jędrzejewski-Szmek
parent 84a1ff9457
commit 4dd465cb4e
11 changed files with 859 additions and 0 deletions

1
.gitattributes vendored
View File

@@ -1 +1,2 @@
*.[ch] whitespace=tab-in-indent,trailing-space
test/dmidecode-dumps/*.bin binary

8
rules.d/70-memory.rules Normal file
View File

@@ -0,0 +1,8 @@
# do not edit this file, it will be overwritten on update
ACTION=="remove", GOTO="memory_end"
SUBSYSTEM!="dmi", GOTO="memory_end"
IMPORT{program}="dmi_memory_id"
LABEL="memory_end"

View File

@@ -17,6 +17,7 @@ rules = files('''
60-serial.rules
70-joystick.rules
70-mouse.rules
70-memory.rules
70-touchpad.rules
75-net-description.rules
75-probe_mtd.rules

File diff suppressed because it is too large Load Diff

View File

@@ -174,6 +174,7 @@ foreach prog : [['ata_id/ata_id.c'],
'scsi_id/scsi_serial.c',
'scsi_id/scsi.h'],
['v4l_id/v4l_id.c'],
['dmi_memory_id/dmi_memory_id.c'],
['mtd_probe/mtd_probe.c',
'mtd_probe/mtd_probe.h',
'mtd_probe/probe_smartmedia.c']]

View File

@@ -0,0 +1,33 @@
MEMORY_ARRAY_LOCATION=System Board Or Motherboard
MEMORY_ARRAY_MAX_CAPACITY=34359738368
MEMORY_ARRAY_NUM_DEVICES=2
MEMORY_DEVICE_0_TOTAL_WIDTH=64
MEMORY_DEVICE_0_DATA_WIDTH=64
MEMORY_DEVICE_0_SIZE=4294967296
MEMORY_DEVICE_0_FORM_FACTOR=SODIMM
MEMORY_DEVICE_0_LOCATOR=ChannelA-DIMM0
MEMORY_DEVICE_0_BANK_LOCATOR=BANK 0
MEMORY_DEVICE_0_TYPE=DDR4
MEMORY_DEVICE_0_TYPE_DETAIL=Synchronous Unbuffered (Unregistered)
MEMORY_DEVICE_0_SPEED_MTS=2400
MEMORY_DEVICE_0_MANUFACTURER=0000
MEMORY_DEVICE_0_SERIAL_NUMBER=00000000
MEMORY_DEVICE_0_ASSET_TAG=None
MEMORY_DEVICE_0_RANK=1
MEMORY_DEVICE_0_CONFIGURED_SPEED_MTS=2400
MEMORY_DEVICE_0_CONFIGURED_VOLTAGE=1
MEMORY_DEVICE_1_TOTAL_WIDTH=64
MEMORY_DEVICE_1_DATA_WIDTH=64
MEMORY_DEVICE_1_SIZE=4294967296
MEMORY_DEVICE_1_FORM_FACTOR=SODIMM
MEMORY_DEVICE_1_LOCATOR=ChannelB-DIMM0
MEMORY_DEVICE_1_BANK_LOCATOR=BANK 2
MEMORY_DEVICE_1_TYPE=DDR4
MEMORY_DEVICE_1_TYPE_DETAIL=Synchronous Unbuffered (Unregistered)
MEMORY_DEVICE_1_SPEED_MTS=2400
MEMORY_DEVICE_1_MANUFACTURER=0000
MEMORY_DEVICE_1_SERIAL_NUMBER=00000000
MEMORY_DEVICE_1_ASSET_TAG=None
MEMORY_DEVICE_1_RANK=1
MEMORY_DEVICE_1_CONFIGURED_SPEED_MTS=2400
MEMORY_DEVICE_1_CONFIGURED_VOLTAGE=1

View File

@@ -0,0 +1,67 @@
MEMORY_ARRAY_LOCATION=System Board Or Motherboard
MEMORY_ARRAY_MAX_CAPACITY=68719476736
MEMORY_ARRAY_NUM_DEVICES=4
MEMORY_DEVICE_0_TOTAL_WIDTH=64
MEMORY_DEVICE_0_DATA_WIDTH=64
MEMORY_DEVICE_0_SIZE=8589934592
MEMORY_DEVICE_0_FORM_FACTOR=DIMM
MEMORY_DEVICE_0_LOCATOR=ChannelA-DIMM0
MEMORY_DEVICE_0_BANK_LOCATOR=BANK 0
MEMORY_DEVICE_0_TYPE=DDR4
MEMORY_DEVICE_0_TYPE_DETAIL=Synchronous
MEMORY_DEVICE_0_SPEED_MTS=2667
MEMORY_DEVICE_0_MANUFACTURER=Samsung
MEMORY_DEVICE_0_SERIAL_NUMBER=416433E9
MEMORY_DEVICE_0_ASSET_TAG=9876543210
MEMORY_DEVICE_0_PART_NUMBER=M378A1K43CB2-CTD
MEMORY_DEVICE_0_RANK=1
MEMORY_DEVICE_0_CONFIGURED_SPEED_MTS=2400
MEMORY_DEVICE_0_MINIMUM_VOLTAGE=1
MEMORY_DEVICE_0_MAXIMUM_VOLTAGE=1
MEMORY_DEVICE_0_CONFIGURED_VOLTAGE=1
MEMORY_DEVICE_1_TOTAL_WIDTH=64
MEMORY_DEVICE_1_DATA_WIDTH=64
MEMORY_DEVICE_1_SIZE=8589934592
MEMORY_DEVICE_1_FORM_FACTOR=DIMM
MEMORY_DEVICE_1_LOCATOR=ChannelA-DIMM1
MEMORY_DEVICE_1_BANK_LOCATOR=BANK 1
MEMORY_DEVICE_1_TYPE=DDR4
MEMORY_DEVICE_1_TYPE_DETAIL=Synchronous
MEMORY_DEVICE_1_SPEED_MTS=2400
MEMORY_DEVICE_1_MANUFACTURER=859B
MEMORY_DEVICE_1_SERIAL_NUMBER=A02550A6
MEMORY_DEVICE_1_ASSET_TAG=9876543210
MEMORY_DEVICE_1_PART_NUMBER=BLT8G4D26AFTA.16FBD
MEMORY_DEVICE_1_RANK=2
MEMORY_DEVICE_1_CONFIGURED_SPEED_MTS=2400
MEMORY_DEVICE_1_MINIMUM_VOLTAGE=1
MEMORY_DEVICE_1_MAXIMUM_VOLTAGE=1
MEMORY_DEVICE_1_CONFIGURED_VOLTAGE=1
MEMORY_DEVICE_2_PRESENT=0
MEMORY_DEVICE_2_FORM_FACTOR=Unknown
MEMORY_DEVICE_2_LOCATOR=ChannelB-DIMM0
MEMORY_DEVICE_2_BANK_LOCATOR=BANK 2
MEMORY_DEVICE_2_TYPE=Unknown
MEMORY_DEVICE_2_TYPE_DETAIL=None
MEMORY_DEVICE_2_MANUFACTURER=Not Specified
MEMORY_DEVICE_2_SERIAL_NUMBER=Not Specified
MEMORY_DEVICE_2_ASSET_TAG=Not Specified
MEMORY_DEVICE_2_PART_NUMBER=Not Specified
MEMORY_DEVICE_3_TOTAL_WIDTH=64
MEMORY_DEVICE_3_DATA_WIDTH=64
MEMORY_DEVICE_3_SIZE=8589934592
MEMORY_DEVICE_3_FORM_FACTOR=DIMM
MEMORY_DEVICE_3_LOCATOR=ChannelB-DIMM1
MEMORY_DEVICE_3_BANK_LOCATOR=BANK 3
MEMORY_DEVICE_3_TYPE=DDR4
MEMORY_DEVICE_3_TYPE_DETAIL=Synchronous
MEMORY_DEVICE_3_SPEED_MTS=2400
MEMORY_DEVICE_3_MANUFACTURER=859B
MEMORY_DEVICE_3_SERIAL_NUMBER=A0254F38
MEMORY_DEVICE_3_ASSET_TAG=9876543210
MEMORY_DEVICE_3_PART_NUMBER=BLT8G4D26AFTA.16FBD
MEMORY_DEVICE_3_RANK=2
MEMORY_DEVICE_3_CONFIGURED_SPEED_MTS=2400
MEMORY_DEVICE_3_MINIMUM_VOLTAGE=1
MEMORY_DEVICE_3_MAXIMUM_VOLTAGE=1
MEMORY_DEVICE_3_CONFIGURED_VOLTAGE=1

View File

@@ -133,4 +133,11 @@ if conf.get('ENABLE_HWDB') == 1
endif
endif
if want_tests != false
udev_dmi_memory_id_test = find_program('udev-dmi-memory-id-test.sh')
test('udev-dmi-memory-id-test',
udev_dmi_memory_id_test,
timeout : 90)
endif
subdir('fuzz')

31
test/udev-dmi-memory-id-test.sh Executable file
View File

@@ -0,0 +1,31 @@
#!/bin/sh
# SPDX-License-Identifier: LGPL-2.1-or-later
#
set -e
export SYSTEMD_LOG_LEVEL=info
ROOTDIR=$(dirname $(dirname $(readlink -f $0)))
UDEV_DMI_MEMORY_ID=./src/udev/dmi_memory_id
if [ ! -x "$UDEV_DMI_MEMORY_ID" ]; then
echo "$UDEV_DMI_MEMORY_ID does not exist, please build first"
exit 1
fi
D=$(mktemp --tmpdir --directory "udev-dmi-memory-id.XXXXXXXXXX")
trap "rm -rf '$D'" EXIT INT QUIT PIPE
for i in $ROOTDIR/test/dmidecode-dumps/*.bin ; do
$("$UDEV_DMI_MEMORY_ID" -F "$i" 2>&1 > "$D"/out.txt) && rc= || rc=$?
if [ -n "$rc" ]; then
echo "$UDEV_DMI_MEMORY_ID returned $rc"
exit $rc
fi
err=$(diff -u "$D"/out.txt "$i.txt" 2>&1) && rc= || rc=$?
if [ -n "$rc" ]; then
echo "Parsing DMI memory information from \"$i\" didn't match expected:"
echo "$err"
exit $rc
fi
done