diff options
author | Christian Gmeiner <christian.gmeiner@gmail.com> | 2012-09-14 16:29:10 +0200 |
---|---|---|
committer | Christian Gmeiner <christian.gmeiner@gmail.com> | 2012-09-17 10:15:23 +0200 |
commit | a59a9f79435e0fa294d73c27053d59696d9e3d97 (patch) | |
tree | 706d3c56920dc5a0d6c8511034bba7facc74ad4d /src/mainboard | |
parent | ea8011b21d695ac81aca3f2d3df1dc48b4bb2470 (diff) |
Set SMBIOS mainboard version based on i2c eeprom
In the field there are different hardware revisions and some
of them have problems with UDMA as a resistor is missing. We can
detect this situation in coreboot and e.g. the linux kernel
can take this knowledge and disable UDMA.
Change-Id: Ib75cad7acedbc1dc65378bb9bfc3f353cbe21427
Signed-off-by: Christian Gmeiner <christian.gmeiner@gmail.com>
Reviewed-on: http://review.coreboot.org/1512
Tested-by: build bot (Jenkins)
Reviewed-by: Patrick Georgi <patrick@georgi-clan.de>
Diffstat (limited to 'src/mainboard')
-rw-r--r-- | src/mainboard/bachmann/ot200/mainboard.c | 52 |
1 files changed, 52 insertions, 0 deletions
diff --git a/src/mainboard/bachmann/ot200/mainboard.c b/src/mainboard/bachmann/ot200/mainboard.c index 76b3c53568..74555b69d0 100644 --- a/src/mainboard/bachmann/ot200/mainboard.c +++ b/src/mainboard/bachmann/ot200/mainboard.c @@ -18,7 +18,59 @@ */ #include <device/device.h> +#include <device/smbus.h> +#include <smbios.h> +#include <console/console.h> + +/* overwrite a weak function to fill SMBIOS table with a custom value */ +static u8 hw_rev = 0; +static char mb_rev_str[2] = { '0' }; + +const char *smbios_mainboard_version(void) +{ + /* UDMA is not working on all supported devices */ + if (hw_rev < 113) { + mb_rev_str[0] = '1'; + } else { + mb_rev_str[0] = '2'; + } + + return mb_rev_str; +} + +static void init(struct device *dev) +{ + unsigned int i; + u32 chksum = 0; + char block[20]; + device_t eeprom_dev = dev_find_slot_on_smbus(1, 0x52); + + if (eeprom_dev == 0) { + printk(BIOS_WARNING, "eeprom not found\n"); + return; + } + + /* read the whole block and check if checksum is okay */ + for (i = 0; i < 20; i++) { + block[i] = smbus_read_byte(eeprom_dev, i); + chksum += block[i]; + } + + if (chksum != 0) { + printk(BIOS_WARNING, "wrong checksum: 0x%0x\n", chksum); + } + + hw_rev = block[5]; + + printk(BIOS_DEBUG, "hw revision: %u\n", hw_rev); +} + +static void enable_dev(struct device *dev) +{ + dev->ops->init = init; +} struct chip_operations mainboard_ops = { CHIP_NAME(CONFIG_MAINBOARD_VENDOR " " CONFIG_MAINBOARD_PART_NUMBER) + .enable_dev = enable_dev, }; |