smbios: Add generic type41 write function

Mainboards were defining their own SMBIOS type41
write function.  Instead pull this into the generic
SMBIOS code and change the existing mainboards to
make use of it.

Change-Id: I3c8a95ca51fe2a3118dc8d1154011ccfed5fbcbc
Signed-off-by: Duncan Laurie <dlaurie@chromium.org>
Reviewed-on: https://gerrit.chromium.org/gerrit/56619
Reviewed-by: Stefan Reinauer <reinauer@google.com>
Reviewed-on: http://review.coreboot.org/4187
Tested-by: build bot (Jenkins)
Reviewed-by: Ronald G. Minnich <rminnich@gmail.com>
This commit is contained in:
Duncan Laurie 2013-05-23 14:17:05 -07:00 committed by Stefan Reinauer
parent 032be82a11
commit 21a78706ad
5 changed files with 80 additions and 100 deletions

View File

@ -303,6 +303,32 @@ static int smbios_write_type32(unsigned long *current, int handle)
return len; 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) static int smbios_write_type127(unsigned long *current, int handle)
{ {
struct smbios_type127 *t = (struct smbios_type127 *)*current; struct smbios_type127 *t = (struct smbios_type127 *)*current;

View File

@ -8,8 +8,14 @@ unsigned long smbios_write_tables(unsigned long start);
int smbios_add_string(char *start, const char *str); int smbios_add_string(char *start, const char *str);
int smbios_string_table_len(char *start); 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_manufacturer(void);
const char *smbios_mainboard_product_name(void); const char *smbios_mainboard_product_name(void);
const char *smbios_mainboard_serial_number(void); const char *smbios_mainboard_serial_number(void);
const char *smbios_mainboard_version(void); const char *smbios_mainboard_version(void);
void smbios_mainboard_set_uuid(u8 *uuid); void smbios_mainboard_set_uuid(u8 *uuid);

View File

@ -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, static int butterfly_onboard_smbios_data(device_t dev, int *handle,
unsigned long *current) unsigned long *current)
{ {
int len = 0; int len = 0;
len += butterfly_smbios_type41(handle, current, len += smbios_write_type41(
BUTTERFLY_TRACKPAD_NAME, current, handle,
BUTTERFLY_TRACKPAD_IRQ, BUTTERFLY_TRACKPAD_NAME, /* name */
BUTTERFLY_TRACKPAD_I2C_ADDR); BUTTERFLY_TRACKPAD_IRQ, /* instance */
0, /* segment */
BUTTERFLY_TRACKPAD_I2C_ADDR, /* bus */
0, /* device */
0); /* function */
return len; return len;
} }

View File

@ -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, static int link_onboard_smbios_data(device_t dev, int *handle,
unsigned long *current) unsigned long *current)
{ {
int len = 0; int len = 0;
len += link_smbios_type41(handle, current, len += smbios_write_type41(
LINK_LIGHTSENSOR_NAME, current, handle,
LINK_LIGHTSENSOR_IRQ, LINK_LIGHTSENSOR_NAME, /* name */
LINK_LIGHTSENSOR_I2C_ADDR); LINK_LIGHTSENSOR_IRQ, /* instance */
0, /* segment */
LINK_LIGHTSENSOR_I2C_ADDR, /* bus */
0, /* device */
0); /* function */
len += link_smbios_type41(handle, current, len += smbios_write_type41(
LINK_TRACKPAD_NAME, current, handle,
LINK_TRACKPAD_IRQ, LINK_TRACKPAD_NAME, /* name */
LINK_TRACKPAD_I2C_ADDR); LINK_TRACKPAD_IRQ, /* instance */
0, /* segment */
LINK_TRACKPAD_I2C_ADDR, /* bus */
0, /* device */
0); /* function */
len += link_smbios_type41(handle, current, len += smbios_write_type41(
LINK_TOUCHSCREEN_NAME, current, handle,
LINK_TOUCHSCREEN_IRQ, LINK_TOUCHSCREEN_NAME, /* name */
LINK_TOUCHSCREEN_I2C_ADDR); LINK_TOUCHSCREEN_IRQ, /* instance */
0, /* segment */
LINK_TOUCHSCREEN_I2C_ADDR, /* bus */
0, /* device */
0); /* function */
return len; return len;
} }

View File

@ -156,49 +156,31 @@ static void mainboard_init(device_t dev)
parrot_ec_init(); 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, static int parrot_onboard_smbios_data(device_t dev, int *handle,
unsigned long *current) unsigned long *current)
{ {
int len = 0; int len = 0;
u8 hardware_version = parrot_rev(); u8 hardware_version = parrot_rev();
if (hardware_version < 0x2) { /* DVT vs PVT */ if (hardware_version < 0x2) { /* DVT vs PVT */
len += parrot_smbios_type41(handle, current, len += smbios_write_type41(
PARROT_TRACKPAD_NAME, current, handle,
PARROT_TRACKPAD_IRQ_DVT, PARROT_TRACKPAD_NAME, /* name */
PARROT_TRACKPAD_I2C_ADDR); PARROT_TRACKPAD_IRQ_DVT, /* instance */
0, /* segment */
PARROT_TRACKPAD_I2C_ADDR, /* bus */
0, /* device */
0); /* function */
} else { } else {
len += parrot_smbios_type41(handle, current, len += smbios_write_type41(
PARROT_TRACKPAD_NAME, current, handle,
PARROT_TRACKPAD_IRQ_PVT, PARROT_TRACKPAD_NAME, /* name */
PARROT_TRACKPAD_I2C_ADDR); PARROT_TRACKPAD_IRQ_PVT, /* instance */
0, /* segment */
PARROT_TRACKPAD_I2C_ADDR, /* bus */
0, /* device */
0); /* function */
} }
return len; return len;
} }