summaryrefslogtreecommitdiffstats
path: root/src/interface
diff options
context:
space:
mode:
authorMichael Brown2008-12-04 05:04:54 +0100
committerMichael Brown2008-12-05 00:18:32 +0100
commit045a22764afd75a0b887c7da6828d683c303ebb4 (patch)
treeefc4200715d98d0b2bbfd167c1293ba7eb95669e /src/interface
parent[hermon] Add PCI ID for ConnectX QDR card (diff)
downloadipxe-045a22764afd75a0b887c7da6828d683c303ebb4.tar.gz
ipxe-045a22764afd75a0b887c7da6828d683c303ebb4.tar.xz
ipxe-045a22764afd75a0b887c7da6828d683c303ebb4.zip
[efi] Allow use of EFI configuration tables
EFI passes in copies of SMBIOS and other system configuration tables via the EFI system table. Allow configuration tables to be requested using a mechanism similar to the current method for requesting EFI protocols.
Diffstat (limited to 'src/interface')
-rw-r--r--src/interface/efi/efi_entry.c49
1 files changed, 45 insertions, 4 deletions
diff --git a/src/interface/efi/efi_entry.c b/src/interface/efi/efi_entry.c
index b00828ad..7b670f8e 100644
--- a/src/interface/efi/efi_entry.c
+++ b/src/interface/efi/efi_entry.c
@@ -17,6 +17,7 @@
*/
#include <stdlib.h>
+#include <string.h>
#include <gpxe/efi/efi.h>
#include <gpxe/uuid.h>
@@ -32,6 +33,30 @@ static struct efi_protocol efi_protocols[0] \
static struct efi_protocol efi_protocols_end[0] \
__table_end ( struct efi_protocol, efi_protocols );
+/** Declared used EFI configuration tables */
+static struct efi_config_table efi_config_tables[0] \
+ __table_start ( struct efi_config_table, efi_config_tables );
+static struct efi_config_table efi_config_tables_end[0] \
+ __table_end ( struct efi_config_table, efi_config_tables );
+
+/**
+ * Look up EFI configuration table
+ *
+ * @v guid Configuration table GUID
+ * @ret table Configuration table, or NULL
+ */
+static void * efi_find_table ( EFI_GUID *guid ) {
+ unsigned int i;
+
+ for ( i = 0 ; i < efi_systab->NumberOfTableEntries ; i++ ) {
+ if ( memcmp ( &efi_systab->ConfigurationTable[i].VendorGuid,
+ guid, sizeof ( *guid ) ) == 0 )
+ return efi_systab->ConfigurationTable[i].VendorTable;
+ }
+
+ return NULL;
+}
+
/**
* EFI entry point
*
@@ -43,6 +68,7 @@ EFI_STATUS EFIAPI efi_entry ( EFI_HANDLE image_handle,
EFI_SYSTEM_TABLE *systab ) {
EFI_BOOT_SERVICES *bs;
struct efi_protocol *prot;
+ struct efi_config_table *tab;
EFI_STATUS efirc;
/* Store image handle and system table pointer for future use */
@@ -65,17 +91,32 @@ EFI_STATUS EFIAPI efi_entry ( EFI_HANDLE image_handle,
}
DBGC ( systab, "EFI handle %p systab %p\n", image_handle, systab );
- /* Look up required protocols */
+ /* Look up used protocols */
bs = systab->BootServices;
for ( prot = efi_protocols ; prot < efi_protocols_end ; prot++ ) {
if ( ( efirc = bs->LocateProtocol ( &prot->u.guid, NULL,
- prot->protocol ) ) != 0 ) {
+ prot->protocol ) ) == 0 ) {
+ DBGC ( systab, "EFI protocol %s is at %p\n",
+ uuid_ntoa ( &prot->u.uuid ), *(prot->protocol));
+ } else {
DBGC ( systab, "EFI does not provide protocol %s\n",
uuid_ntoa ( &prot->u.uuid ) );
+ /* All protocols are required */
return efirc;
}
- DBGC ( systab, "EFI protocol %s is at %p\n",
- uuid_ntoa ( &prot->u.uuid ), *(prot->protocol) );
+ }
+
+ /* Look up used configuration tables */
+ for ( tab = efi_config_tables ; tab < efi_config_tables_end ; tab++ ) {
+ if ( ( *(tab->table) = efi_find_table ( &tab->u.guid ) ) ) {
+ DBGC ( systab, "EFI configuration table %s is at %p\n",
+ uuid_ntoa ( &tab->u.uuid ), *(tab->table) );
+ } else {
+ DBGC ( systab, "EFI does not provide configuration "
+ "table %s\n", uuid_ntoa ( &tab->u.uuid ) );
+ if ( tab->required )
+ return EFI_NOT_AVAILABLE_YET;
+ }
}
/* Call to main() */