summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorChristian Gmeiner <christian.gmeiner@gmail.com>2012-09-14 16:29:10 +0200
committerChristian Gmeiner <christian.gmeiner@gmail.com>2012-09-17 10:15:23 +0200
commita59a9f79435e0fa294d73c27053d59696d9e3d97 (patch)
tree706d3c56920dc5a0d6c8511034bba7facc74ad4d
parentea8011b21d695ac81aca3f2d3df1dc48b4bb2470 (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>
-rw-r--r--src/mainboard/bachmann/ot200/mainboard.c52
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,
};