This patch improves the i82830 MBI SMI Handler. It is now able to load
Intel vbios VBT and Flexaim modules. Build and boot tested.
Signed-off-by: Joseph Smith <[email protected]>
--
Thanks,
Joseph Smith
Set-Top-Linux
www.settoplinux.org
Index: src/northbridge/intel/i82830/i82830_smihandler.c
===================================================================
--- src/northbridge/intel/i82830/i82830_smihandler.c (revision 5575)
+++ src/northbridge/intel/i82830/i82830_smihandler.c (working copy)
@@ -32,7 +32,7 @@
extern unsigned char *mbi;
extern u32 mbi_len;
-// #define DEBUG_SMI_I82830
+#define DEBUG_SMI_I82830
/* If YABEL is enabled and it's not running at 0x00000000, we have to add some
* offset to all our mbi object memory accesses
@@ -196,6 +196,15 @@
}
mbi_header = (mbi_header_t *)&mbi[i];
+#ifdef DEBUG_SMI_I82830
+ printk(BIOS_DEBUG, "| |- header_id = %x\n", mbi_header->header_id);
+ printk(BIOS_DEBUG, "| |- attributes = %x\n", mbi_header->attributes);
+ printk(BIOS_DEBUG, "| |- size = %x\n", (mbi_header->size * 16));
+ printk(BIOS_DEBUG, "| |- name_len = %x\n", mbi_header->name_len);
+ printk(BIOS_DEBUG, "| |- type = %x\n", mbi_header->type);
+ printk(BIOS_DEBUG, "| |- header_ext = %x\n", mbi_header->header_ext);
+ printk(BIOS_DEBUG, "| |- name[0] = %x\n", mbi_header->name[0]);
+#endif
len = ALIGN((mbi_header->size * 16) + sizeof(mbi_header) + mbi_header->name_len, 16);
if (obj_header->objnum == count) {
@@ -205,19 +214,33 @@
break;
}
#endif
- int headerlen = ALIGN(sizeof(mbi_header) + mbi_header->name_len + 15, 16);
+ int headerlen;
+
+ switch(mbi_header->type) {
+ case 0x0203: {
+ headerlen = ALIGN(sizeof(mbi_header) + mbi_header->name_len + 15, 16);
+ break;
+ }
+ case 0x0204: {
+ headerlen = ALIGN(sizeof(mbi_header) + mbi_header->name_len, 16);
+ break;
+ }
+ default:
+ printk(BIOS_DEBUG, "| |-- Unknown MBI Header!\n");
+ break;
+ }
#ifdef DEBUG_SMI_I82830
printk(BIOS_DEBUG, "| |- headerlen = %d\n", headerlen);
#endif
memcpy(&obj_header->header, mbi_header, headerlen);
obj_header->banner.retsts = MSH_OK;
- printk(BIOS_DEBUG, "| |- MBI module '");
+ printk(BIOS_DEBUG, "| |- MBI module '");
int j;
for (j=0; j < mbi_header->name_len && mbi_header->name[j]; j++)
printk(BIOS_DEBUG, "%c", mbi_header->name[j]);
printk(BIOS_DEBUG, "' found.\n");
#ifdef DEBUG_SMI_I82830
- dump(banner_id, sizeof(obj_header_t) + 16);
+ dump(banner_id, sizeof(obj_header_t) + mbi_header->name_len);
#endif
break;
}
@@ -225,7 +248,7 @@
count++;
}
if (obj_header->banner.retsts == MSH_IF_NOT_FOUND)
- printk(BIOS_DEBUG, "| |- MBI object #%d not found.\n", obj_header->objnum);
+ printk(BIOS_DEBUG, "| |- MBI object #%d not found.\n", obj_header->objnum);
break;
}
case 0x0203: {
@@ -233,7 +256,7 @@
mbi_header_t *mbi_header = NULL;
printk(BIOS_DEBUG, "|- MBI_GetObject\n");
#ifdef DEBUG_SMI_I82830
- printk(BIOS_DEBUG, "| |- handle = %016lx\n", getobj->handle);
+ printk(BIOS_DEBUG, "| |- handle = %Lx\n", getobj->handle);
#endif
printk(BIOS_DEBUG, "| |- objnum = %d\n", getobj->objnum);
printk(BIOS_DEBUG, "| |- start = %x\n", getobj->start);
@@ -256,14 +279,30 @@
len = ALIGN((mbi_header->size * 16) + sizeof(mbi_header) + mbi_header->name_len, 16);
if (getobj->objnum == count) {
- printk(BIOS_DEBUG, "| |- len = %x\n", len);
- memcpy((void *)(getobj->buffer + OBJ_OFFSET),
- ((char *)mbi_header) + 0x20 , (len > getobj->buflen) ? getobj->buflen : len);
+ int objectlen = ALIGN((mbi_header->size * 16), 16);
+ printk(BIOS_DEBUG, "| |- objectlen = %x\n", objectlen);
+
+ switch(mbi_header->type) {
+ case 0x0203: {
+ memcpy((void *)(getobj->buffer + OBJ_OFFSET),
+ ((char *)mbi_header) + 0x20 , (objectlen > getobj->buflen) ? getobj->buflen : objectlen);
+ break;
+ }
+ case 0x0204: {
+ memcpy((void *)(getobj->buffer + OBJ_OFFSET),
+ ((char *)mbi_header) + (mbi_header->name_len + 0x10), (objectlen > getobj->buflen) ? getobj->buflen : objectlen);
+ break;
+ }
+ default:
+ printk(BIOS_DEBUG, "| |-- Unknown MBI Object!\n");
+ break;
+ }
+
getobj->banner.retsts = MSH_OK;
#ifdef DEBUG_SMI_I82830
dump(banner_id, sizeof(*getobj));
- dump(getobj->buffer + OBJ_OFFSET, len);
+ dump(getobj->buffer + OBJ_OFFSET, objectlen);
#endif
break;
}
--
coreboot mailing list: [email protected]
http://www.coreboot.org/mailman/listinfo/coreboot