summaryrefslogtreecommitdiff
path: root/src/mainboard
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 /src/mainboard
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>
Diffstat (limited to 'src/mainboard')
-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,
};