aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/arch/x86/boot/smbios.c26
-rw-r--r--src/include/smbios.h6
-rw-r--r--src/mainboard/google/butterfly/mainboard.c37
-rw-r--r--src/mainboard/google/link/mainboard.c65
-rw-r--r--src/mainboard/google/parrot/mainboard.c50
5 files changed, 82 insertions, 102 deletions
diff --git a/src/arch/x86/boot/smbios.c b/src/arch/x86/boot/smbios.c
index b8f2ec7c28..65bf538cee 100644
--- a/src/arch/x86/boot/smbios.c
+++ b/src/arch/x86/boot/smbios.c
@@ -303,6 +303,32 @@ static int smbios_write_type32(unsigned long *current, int handle)
return len;
}
+int smbios_write_type41(unsigned long *current, int *handle,
+ const char *name, u8 instance, u16 segment,
+ u8 bus, u8 device, u8 function)
+{
+ struct smbios_type41 *t = (struct smbios_type41 *)*current;
+ int len = sizeof(struct smbios_type41);
+
+ memset(t, 0, sizeof(struct smbios_type41));
+ t->type = SMBIOS_ONBOARD_DEVICES_EXTENDED_INFORMATION;
+ t->handle = *handle;
+ t->length = len - 2;
+ t->reference_designation = smbios_add_string(t->eos, name);
+ t->device_type = SMBIOS_DEVICE_TYPE_OTHER;
+ t->device_status = 1;
+ t->device_type_instance = instance;
+ t->segment_group_number = segment;
+ t->bus_number = bus;
+ t->device_number = device;
+ t->function_number = function;
+
+ len = t->length + smbios_string_table_len(t->eos);
+ *current += len;
+ *handle += 1;
+ return len;
+}
+
static int smbios_write_type127(unsigned long *current, int handle)
{
struct smbios_type127 *t = (struct smbios_type127 *)*current;
diff --git a/src/include/smbios.h b/src/include/smbios.h
index ebe167ef20..42c5d2da94 100644
--- a/src/include/smbios.h
+++ b/src/include/smbios.h
@@ -8,8 +8,14 @@ unsigned long smbios_write_tables(unsigned long start);
int smbios_add_string(char *start, const char *str);
int smbios_string_table_len(char *start);
+/* Used by mainboard to add an on-board device */
+int smbios_write_type41(unsigned long *current, int *handle,
+ const char *name, u8 instance, u16 segment,
+ u8 bus, u8 device, u8 function);
+
const char *smbios_mainboard_manufacturer(void);
const char *smbios_mainboard_product_name(void);
+
const char *smbios_mainboard_serial_number(void);
const char *smbios_mainboard_version(void);
void smbios_mainboard_set_uuid(u8 *uuid);
diff --git a/src/mainboard/google/butterfly/mainboard.c b/src/mainboard/google/butterfly/mainboard.c
index 32a830842a..b11c22678f 100644
--- a/src/mainboard/google/butterfly/mainboard.c
+++ b/src/mainboard/google/butterfly/mainboard.c
@@ -343,40 +343,19 @@ static void mainboard_init(device_t dev)
}
}
-static int butterfly_smbios_type41(int *handle, unsigned long *current,
- const char *name, u8 irq, u8 addr)
-{
- struct smbios_type41 *t = (struct smbios_type41 *)*current;
- int len = sizeof(struct smbios_type41);
-
- memset(t, 0, sizeof(struct smbios_type41));
- t->type = SMBIOS_ONBOARD_DEVICES_EXTENDED_INFORMATION;
- t->handle = *handle;
- t->length = len - 2;
- t->reference_designation = smbios_add_string(t->eos, name);
- t->device_type = SMBIOS_DEVICE_TYPE_OTHER;
- t->device_status = 1;
- t->device_type_instance = irq;
- t->segment_group_number = 0;
- t->bus_number = addr;
- t->function_number = 0;
- t->device_number = 0;
-
- len = t->length + smbios_string_table_len(t->eos);
- *current += len;
- *handle += 1;
- return len;
-}
-
static int butterfly_onboard_smbios_data(device_t dev, int *handle,
unsigned long *current)
{
int len = 0;
- len += butterfly_smbios_type41(handle, current,
- BUTTERFLY_TRACKPAD_NAME,
- BUTTERFLY_TRACKPAD_IRQ,
- BUTTERFLY_TRACKPAD_I2C_ADDR);
+ len += smbios_write_type41(
+ current, handle,
+ BUTTERFLY_TRACKPAD_NAME, /* name */
+ BUTTERFLY_TRACKPAD_IRQ, /* instance */
+ 0, /* segment */
+ BUTTERFLY_TRACKPAD_I2C_ADDR, /* bus */
+ 0, /* device */
+ 0); /* function */
return len;
}
diff --git a/src/mainboard/google/link/mainboard.c b/src/mainboard/google/link/mainboard.c
index 2731df0204..08b1c02a96 100644
--- a/src/mainboard/google/link/mainboard.c
+++ b/src/mainboard/google/link/mainboard.c
@@ -180,50 +180,37 @@ static void mainboard_init(device_t dev)
}
}
-static int link_smbios_type41(int *handle, unsigned long *current,
- const char *name, u8 irq, u8 addr)
-{
- struct smbios_type41 *t = (struct smbios_type41 *)*current;
- int len = sizeof(struct smbios_type41);
-
- memset(t, 0, sizeof(struct smbios_type41));
- t->type = SMBIOS_ONBOARD_DEVICES_EXTENDED_INFORMATION;
- t->handle = *handle;
- t->length = len - 2;
- t->reference_designation = smbios_add_string(t->eos, name);
- t->device_type = SMBIOS_DEVICE_TYPE_OTHER;
- t->device_status = 1;
- t->device_type_instance = irq;
- t->segment_group_number = 0;
- t->bus_number = addr;
- t->function_number = 0;
- t->device_number = 0;
-
- len = t->length + smbios_string_table_len(t->eos);
- *current += len;
- *handle += 1;
- return len;
-}
-
static int link_onboard_smbios_data(device_t dev, int *handle,
unsigned long *current)
{
int len = 0;
- len += link_smbios_type41(handle, current,
- LINK_LIGHTSENSOR_NAME,
- LINK_LIGHTSENSOR_IRQ,
- LINK_LIGHTSENSOR_I2C_ADDR);
-
- len += link_smbios_type41(handle, current,
- LINK_TRACKPAD_NAME,
- LINK_TRACKPAD_IRQ,
- LINK_TRACKPAD_I2C_ADDR);
-
- len += link_smbios_type41(handle, current,
- LINK_TOUCHSCREEN_NAME,
- LINK_TOUCHSCREEN_IRQ,
- LINK_TOUCHSCREEN_I2C_ADDR);
+ len += smbios_write_type41(
+ current, handle,
+ LINK_LIGHTSENSOR_NAME, /* name */
+ LINK_LIGHTSENSOR_IRQ, /* instance */
+ 0, /* segment */
+ LINK_LIGHTSENSOR_I2C_ADDR, /* bus */
+ 0, /* device */
+ 0); /* function */
+
+ len += smbios_write_type41(
+ current, handle,
+ LINK_TRACKPAD_NAME, /* name */
+ LINK_TRACKPAD_IRQ, /* instance */
+ 0, /* segment */
+ LINK_TRACKPAD_I2C_ADDR, /* bus */
+ 0, /* device */
+ 0); /* function */
+
+ len += smbios_write_type41(
+ current, handle,
+ LINK_TOUCHSCREEN_NAME, /* name */
+ LINK_TOUCHSCREEN_IRQ, /* instance */
+ 0, /* segment */
+ LINK_TOUCHSCREEN_I2C_ADDR, /* bus */
+ 0, /* device */
+ 0); /* function */
return len;
}
diff --git a/src/mainboard/google/parrot/mainboard.c b/src/mainboard/google/parrot/mainboard.c
index bc505beaff..34cb24e87e 100644
--- a/src/mainboard/google/parrot/mainboard.c
+++ b/src/mainboard/google/parrot/mainboard.c
@@ -156,49 +156,31 @@ static void mainboard_init(device_t dev)
parrot_ec_init();
}
-static int parrot_smbios_type41(int *handle, unsigned long *current,
- const char *name, u8 irq, u8 addr)
-{
- struct smbios_type41 *t = (struct smbios_type41 *)*current;
- int len = sizeof(struct smbios_type41);
-
- memset(t, 0, sizeof(struct smbios_type41));
- t->type = SMBIOS_ONBOARD_DEVICES_EXTENDED_INFORMATION;
- t->handle = *handle;
- t->length = len - 2;
- t->reference_designation = smbios_add_string(t->eos, name);
- t->device_type = SMBIOS_DEVICE_TYPE_OTHER;
- t->device_status = 1;
- t->device_type_instance = irq;
- t->segment_group_number = 0;
- t->bus_number = addr;
- t->function_number = 0;
- t->device_number = 0;
-
- len = t->length + smbios_string_table_len(t->eos);
- *current += len;
- *handle += 1;
- return len;
-}
-
static int parrot_onboard_smbios_data(device_t dev, int *handle,
unsigned long *current)
{
int len = 0;
u8 hardware_version = parrot_rev();
if (hardware_version < 0x2) { /* DVT vs PVT */
- len += parrot_smbios_type41(handle, current,
- PARROT_TRACKPAD_NAME,
- PARROT_TRACKPAD_IRQ_DVT,
- PARROT_TRACKPAD_I2C_ADDR);
+ len += smbios_write_type41(
+ current, handle,
+ PARROT_TRACKPAD_NAME, /* name */
+ PARROT_TRACKPAD_IRQ_DVT, /* instance */
+ 0, /* segment */
+ PARROT_TRACKPAD_I2C_ADDR, /* bus */
+ 0, /* device */
+ 0); /* function */
} else {
- len += parrot_smbios_type41(handle, current,
- PARROT_TRACKPAD_NAME,
- PARROT_TRACKPAD_IRQ_PVT,
- PARROT_TRACKPAD_I2C_ADDR);
+ len += smbios_write_type41(
+ current, handle,
+ PARROT_TRACKPAD_NAME, /* name */
+ PARROT_TRACKPAD_IRQ_PVT, /* instance */
+ 0, /* segment */
+ PARROT_TRACKPAD_I2C_ADDR, /* bus */
+ 0, /* device */
+ 0); /* function */
}
-
return len;
}