aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMichael Brown <mcb30@ipxe.org>2013-03-20 00:12:30 +0000
committerMichael Brown <mcb30@ipxe.org>2013-03-20 00:12:30 +0000
commit4f742bcd95373425fde52b0d3b354bb020446542 (patch)
treea04bc2e8d2874ca1d4b7b2ac236f6bfb0ed4f47e
parent2ec0c1ea48fa0244599c6b87da7838730dde585b (diff)
downloadipxe-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.c2
-rw-r--r--src/include/ipxe/smbios.h12
-rw-r--r--src/interface/efi/efi_smbios.c2
-rw-r--r--src/interface/smbios/smbios.c17
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;
+}