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

Reply via email to