I'm writing an app which has to talk to the SPD table on a memory module. The app is to run on Win2k and XP onx86 basedPC's. As I am not very well experienced at the hardware level I need a few pointers on how to do this. As far as I know I will have to enumerate the SMBus to find the address of the EEPROM's on each of the installed memory modules. Can I do this by sending an SMB_REQUEST as per the Microsoft DDK documentation? I already have the SPD specs so I know which byte addresses I need to read - I'm just haveing trouble finding the device itself.
Here issome information we received from ourengineering contacts:
The driver you are trying to write is for a function that typically resides in the BIOS. It can be done in a driver just fine, but the SPD addresses that you are interested in are hardware-specific and are either based on a resistor stuffing option on the board, or are somehow jumperable on the board. Most platforms do not have a machine-readable address, but have this hard-coded into the BIOS as a platform dependency. The BIOS can pass the address of various SMBus devices along to the OS in system management tables. This may be what you are thinking when issuing an SMB_REQUEST to the OS, where you would request the physical SMBus addresses of each of the DIMMs SPD prom devices. We cannot say for sure that this SMB_REQUEST OS API does this function, though, as we are not familiar with it.
In the short term, you could find a hardware spec for the platform and physically look up the SPD addresses, then hard code these addresses, or somehow make them configurable in the driver. These, unfortunately, change from platform to platform based on a number of factors (number of memory slots on the platform, number of other SMBus devices present like clock controllers or management controllers). Once you figure out the device addresses, then you need to be able to use the SMBus base address register found in one of the Southbridge PCI functions to read the data that is needed.
Very helpful. Thank you very much. As there are quite a few available apps that already do this, I'd hazard a gues that the platform variations cannot be too severe. I try to get a range of hardware data as a starting point and then just keep testing.