diff options
author | Michael Brown <mcb30@ipxe.org> | 2013-03-20 00:12:30 +0000 |
---|---|---|
committer | Michael Brown <mcb30@ipxe.org> | 2013-03-20 00:12:30 +0000 |
commit | 4f742bcd95373425fde52b0d3b354bb020446542 (patch) | |
tree | a04bc2e8d2874ca1d4b7b2ac236f6bfb0ed4f47e | |
parent | 2ec0c1ea48fa0244599c6b87da7838730dde585b (diff) | |
download | ipxe-4f742bcd95373425fde52b0d3b354bb020446542.tar.gz |
[smbios] Provide SMBIOS version number via smbios_version()
Signed-off-by: Michael Brown <mcb30@ipxe.org>
-rw-r--r-- | src/arch/i386/interface/pcbios/bios_smbios.c | 2 | ||||
-rw-r--r-- | src/include/ipxe/smbios.h | 12 | ||||
-rw-r--r-- | src/interface/efi/efi_smbios.c | 2 | ||||
-rw-r--r-- | src/interface/smbios/smbios.c | 17 |
4 files changed, 33 insertions, 0 deletions
diff --git a/src/arch/i386/interface/pcbios/bios_smbios.c b/src/arch/i386/interface/pcbios/bios_smbios.c index 2ecc24ea5..76a32e93d 100644 --- a/src/arch/i386/interface/pcbios/bios_smbios.c +++ b/src/arch/i386/interface/pcbios/bios_smbios.c @@ -77,6 +77,8 @@ static int bios_find_smbios ( struct smbios *smbios ) { smbios->address = phys_to_user ( u.entry.smbios_address ); smbios->len = u.entry.smbios_len; smbios->count = u.entry.smbios_count; + smbios->version = + SMBIOS_VERSION ( u.entry.major, u.entry.minor ); return 0; } diff --git a/src/include/ipxe/smbios.h b/src/include/ipxe/smbios.h index fcf149ea7..0765c4e4a 100644 --- a/src/include/ipxe/smbios.h +++ b/src/include/ipxe/smbios.h @@ -148,8 +148,19 @@ struct smbios { size_t len; /** Number of SMBIOS structures */ unsigned int count; + /** SMBIOS version */ + uint16_t version; }; +/** + * Calculate SMBIOS version + * + * @v major Major version + * @v minor Minor version + * @ret version SMBIOS version + */ +#define SMBIOS_VERSION( major, minor ) ( ( (major) << 8 ) | (minor) ) + extern int find_smbios ( struct smbios *smbios ); extern int find_smbios_structure ( unsigned int type, struct smbios_structure *structure ); @@ -158,5 +169,6 @@ extern int read_smbios_structure ( struct smbios_structure *structure, extern int read_smbios_string ( struct smbios_structure *structure, unsigned int index, void *data, size_t len ); +extern int smbios_version ( void ); #endif /* _IPXE_SMBIOS_H */ diff --git a/src/interface/efi/efi_smbios.c b/src/interface/efi/efi_smbios.c index 506b04e77..304f95a56 100644 --- a/src/interface/efi/efi_smbios.c +++ b/src/interface/efi/efi_smbios.c @@ -55,6 +55,8 @@ static int efi_find_smbios ( struct smbios *smbios ) { smbios->address = phys_to_user ( smbios_entry->smbios_address ); smbios->len = smbios_entry->smbios_len; smbios->count = smbios_entry->smbios_count; + smbios->version = + SMBIOS_VERSION ( smbios_entry->major, smbios_entry->minor ); DBG ( "Found SMBIOS v%d.%d entry point at %p (%x+%zx)\n", smbios_entry->major, smbios_entry->minor, smbios_entry, smbios_entry->smbios_address, smbios->len ); diff --git a/src/interface/smbios/smbios.c b/src/interface/smbios/smbios.c index 8ed24dd66..2adaa53d9 100644 --- a/src/interface/smbios/smbios.c +++ b/src/interface/smbios/smbios.c @@ -179,3 +179,20 @@ int read_smbios_string ( struct smbios_structure *structure, DBG ( "SMBIOS string index %d not found\n", index ); return -ENOENT; } + +/** + * Get SMBIOS version + * + * @ret version Version, or negative error + */ +int smbios_version ( void ) { + int rc; + + /* Find SMBIOS */ + if ( ( smbios.address == UNULL ) && + ( ( rc = find_smbios ( &smbios ) ) != 0 ) ) + return rc; + assert ( smbios.address != UNULL ); + + return smbios.version; +} |