mirror of
				https://github.com/torvalds/linux.git
				synced 2025-11-04 10:40:15 +02:00 
			
		
		
		
	firmware/dmi: Report DMI Bios & EC firmware release
Some vendors like HPe or Dell, encode the release version of their BIOS
in the "System BIOS {Major|Minor} Release" fields of Type 0.
This information is used to know which bios release actually runs.
It could be used for some quirks, debugging sessions or inventory tasks.
A typical output for a Dell system running the 65.27 bios is :
	[root@t1700 ~]# cat /sys/devices/virtual/dmi/id/bios_release
	65.27
	[root@t1700 ~]#
Servers that have a BMC encode the release version of their firmware in the
 "Embedded Controller Firmware {Major|Minor} Release" fields of Type 0.
This information is used to know which BMC release actually runs.
It could be used for some quirks, debugging sessions or inventory tasks.
A typical output for a Dell system running the 3.75 bmc release is :
    [root@t1700 ~]# cat /sys/devices/virtual/dmi/id/ec_firmware_release
    3.75
    [root@t1700 ~]#
Signed-off-by: Erwan Velu <e.velu@criteo.com>
Signed-off-by: Jean Delvare <jdelvare@suse.de>
			
			
This commit is contained in:
		
							parent
							
								
									3d77e6a880
								
							
						
					
					
						commit
						f5152f4ded
					
				
					 4 changed files with 40 additions and 0 deletions
				
			
		| 
						 | 
					@ -42,6 +42,8 @@ DEFINE_DMI_ATTR_WITH_SHOW(bios_vendor,		0444, DMI_BIOS_VENDOR);
 | 
				
			||||||
DEFINE_DMI_ATTR_WITH_SHOW(bios_version,		0444, DMI_BIOS_VERSION);
 | 
					DEFINE_DMI_ATTR_WITH_SHOW(bios_version,		0444, DMI_BIOS_VERSION);
 | 
				
			||||||
DEFINE_DMI_ATTR_WITH_SHOW(bios_date,		0444, DMI_BIOS_DATE);
 | 
					DEFINE_DMI_ATTR_WITH_SHOW(bios_date,		0444, DMI_BIOS_DATE);
 | 
				
			||||||
DEFINE_DMI_ATTR_WITH_SHOW(sys_vendor,		0444, DMI_SYS_VENDOR);
 | 
					DEFINE_DMI_ATTR_WITH_SHOW(sys_vendor,		0444, DMI_SYS_VENDOR);
 | 
				
			||||||
 | 
					DEFINE_DMI_ATTR_WITH_SHOW(bios_release,		0444, DMI_BIOS_RELEASE);
 | 
				
			||||||
 | 
					DEFINE_DMI_ATTR_WITH_SHOW(ec_firmware_release,	0444, DMI_EC_FIRMWARE_RELEASE);
 | 
				
			||||||
DEFINE_DMI_ATTR_WITH_SHOW(product_name,		0444, DMI_PRODUCT_NAME);
 | 
					DEFINE_DMI_ATTR_WITH_SHOW(product_name,		0444, DMI_PRODUCT_NAME);
 | 
				
			||||||
DEFINE_DMI_ATTR_WITH_SHOW(product_version,	0444, DMI_PRODUCT_VERSION);
 | 
					DEFINE_DMI_ATTR_WITH_SHOW(product_version,	0444, DMI_PRODUCT_VERSION);
 | 
				
			||||||
DEFINE_DMI_ATTR_WITH_SHOW(product_serial,	0400, DMI_PRODUCT_SERIAL);
 | 
					DEFINE_DMI_ATTR_WITH_SHOW(product_serial,	0400, DMI_PRODUCT_SERIAL);
 | 
				
			||||||
| 
						 | 
					@ -78,6 +80,8 @@ static ssize_t get_modalias(char *buffer, size_t buffer_size)
 | 
				
			||||||
		{ "bvn", DMI_BIOS_VENDOR },
 | 
							{ "bvn", DMI_BIOS_VENDOR },
 | 
				
			||||||
		{ "bvr", DMI_BIOS_VERSION },
 | 
							{ "bvr", DMI_BIOS_VERSION },
 | 
				
			||||||
		{ "bd",  DMI_BIOS_DATE },
 | 
							{ "bd",  DMI_BIOS_DATE },
 | 
				
			||||||
 | 
							{ "br",  DMI_BIOS_RELEASE },
 | 
				
			||||||
 | 
							{ "efr", DMI_EC_FIRMWARE_RELEASE },
 | 
				
			||||||
		{ "svn", DMI_SYS_VENDOR },
 | 
							{ "svn", DMI_SYS_VENDOR },
 | 
				
			||||||
		{ "pn",  DMI_PRODUCT_NAME },
 | 
							{ "pn",  DMI_PRODUCT_NAME },
 | 
				
			||||||
		{ "pvr", DMI_PRODUCT_VERSION },
 | 
							{ "pvr", DMI_PRODUCT_VERSION },
 | 
				
			||||||
| 
						 | 
					@ -187,6 +191,8 @@ static void __init dmi_id_init_attr_table(void)
 | 
				
			||||||
	ADD_DMI_ATTR(bios_vendor,       DMI_BIOS_VENDOR);
 | 
						ADD_DMI_ATTR(bios_vendor,       DMI_BIOS_VENDOR);
 | 
				
			||||||
	ADD_DMI_ATTR(bios_version,      DMI_BIOS_VERSION);
 | 
						ADD_DMI_ATTR(bios_version,      DMI_BIOS_VERSION);
 | 
				
			||||||
	ADD_DMI_ATTR(bios_date,         DMI_BIOS_DATE);
 | 
						ADD_DMI_ATTR(bios_date,         DMI_BIOS_DATE);
 | 
				
			||||||
 | 
						ADD_DMI_ATTR(bios_release,      DMI_BIOS_RELEASE);
 | 
				
			||||||
 | 
						ADD_DMI_ATTR(ec_firmware_release, DMI_EC_FIRMWARE_RELEASE);
 | 
				
			||||||
	ADD_DMI_ATTR(sys_vendor,        DMI_SYS_VENDOR);
 | 
						ADD_DMI_ATTR(sys_vendor,        DMI_SYS_VENDOR);
 | 
				
			||||||
	ADD_DMI_ATTR(product_name,      DMI_PRODUCT_NAME);
 | 
						ADD_DMI_ATTR(product_name,      DMI_PRODUCT_NAME);
 | 
				
			||||||
	ADD_DMI_ATTR(product_version,   DMI_PRODUCT_VERSION);
 | 
						ADD_DMI_ATTR(product_version,   DMI_PRODUCT_VERSION);
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -186,6 +186,34 @@ static void __init dmi_save_ident(const struct dmi_header *dm, int slot,
 | 
				
			||||||
	dmi_ident[slot] = p;
 | 
						dmi_ident[slot] = p;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					static void __init dmi_save_release(const struct dmi_header *dm, int slot,
 | 
				
			||||||
 | 
							int index)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
						const u8 *minor, *major;
 | 
				
			||||||
 | 
						char *s;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						/* If the table doesn't have the field, let's return */
 | 
				
			||||||
 | 
						if (dmi_ident[slot] || dm->length < index)
 | 
				
			||||||
 | 
							return;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						minor = (u8 *) dm + index;
 | 
				
			||||||
 | 
						major = (u8 *) dm + index - 1;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						/* As per the spec, if the system doesn't support this field,
 | 
				
			||||||
 | 
						 * the value is FF
 | 
				
			||||||
 | 
						 */
 | 
				
			||||||
 | 
						if (*major == 0xFF && *minor == 0xFF)
 | 
				
			||||||
 | 
							return;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						s = dmi_alloc(8);
 | 
				
			||||||
 | 
						if (!s)
 | 
				
			||||||
 | 
							return;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						sprintf(s, "%u.%u", *major, *minor);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						dmi_ident[slot] = s;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static void __init dmi_save_uuid(const struct dmi_header *dm, int slot,
 | 
					static void __init dmi_save_uuid(const struct dmi_header *dm, int slot,
 | 
				
			||||||
		int index)
 | 
							int index)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
| 
						 | 
					@ -444,6 +472,8 @@ static void __init dmi_decode(const struct dmi_header *dm, void *dummy)
 | 
				
			||||||
		dmi_save_ident(dm, DMI_BIOS_VENDOR, 4);
 | 
							dmi_save_ident(dm, DMI_BIOS_VENDOR, 4);
 | 
				
			||||||
		dmi_save_ident(dm, DMI_BIOS_VERSION, 5);
 | 
							dmi_save_ident(dm, DMI_BIOS_VERSION, 5);
 | 
				
			||||||
		dmi_save_ident(dm, DMI_BIOS_DATE, 8);
 | 
							dmi_save_ident(dm, DMI_BIOS_DATE, 8);
 | 
				
			||||||
 | 
							dmi_save_release(dm, DMI_BIOS_RELEASE, 21);
 | 
				
			||||||
 | 
							dmi_save_release(dm, DMI_EC_FIRMWARE_RELEASE, 23);
 | 
				
			||||||
		break;
 | 
							break;
 | 
				
			||||||
	case 1:		/* System Information */
 | 
						case 1:		/* System Information */
 | 
				
			||||||
		dmi_save_ident(dm, DMI_SYS_VENDOR, 4);
 | 
							dmi_save_ident(dm, DMI_SYS_VENDOR, 4);
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -532,6 +532,8 @@ enum dmi_field {
 | 
				
			||||||
	DMI_BIOS_VENDOR,
 | 
						DMI_BIOS_VENDOR,
 | 
				
			||||||
	DMI_BIOS_VERSION,
 | 
						DMI_BIOS_VERSION,
 | 
				
			||||||
	DMI_BIOS_DATE,
 | 
						DMI_BIOS_DATE,
 | 
				
			||||||
 | 
						DMI_BIOS_RELEASE,
 | 
				
			||||||
 | 
						DMI_EC_FIRMWARE_RELEASE,
 | 
				
			||||||
	DMI_SYS_VENDOR,
 | 
						DMI_SYS_VENDOR,
 | 
				
			||||||
	DMI_PRODUCT_NAME,
 | 
						DMI_PRODUCT_NAME,
 | 
				
			||||||
	DMI_PRODUCT_VERSION,
 | 
						DMI_PRODUCT_VERSION,
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -954,6 +954,8 @@ static const struct dmifield {
 | 
				
			||||||
	{ "bvn", DMI_BIOS_VENDOR },
 | 
						{ "bvn", DMI_BIOS_VENDOR },
 | 
				
			||||||
	{ "bvr", DMI_BIOS_VERSION },
 | 
						{ "bvr", DMI_BIOS_VERSION },
 | 
				
			||||||
	{ "bd",  DMI_BIOS_DATE },
 | 
						{ "bd",  DMI_BIOS_DATE },
 | 
				
			||||||
 | 
						{ "br",  DMI_BIOS_RELEASE },
 | 
				
			||||||
 | 
						{ "efr", DMI_EC_FIRMWARE_RELEASE },
 | 
				
			||||||
	{ "svn", DMI_SYS_VENDOR },
 | 
						{ "svn", DMI_SYS_VENDOR },
 | 
				
			||||||
	{ "pn",  DMI_PRODUCT_NAME },
 | 
						{ "pn",  DMI_PRODUCT_NAME },
 | 
				
			||||||
	{ "pvr", DMI_PRODUCT_VERSION },
 | 
						{ "pvr", DMI_PRODUCT_VERSION },
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
		Loading…
	
		Reference in a new issue