Skip to contentSkip to conversation

x86, dmi: Uninline dmi_get_bios_year()

PATCH In review Andy Shevchenko 2 participants 5 messages Mar 20, 2018 – Mar 27, 2018

Subsystems (4)
lore
Share & tools
lore
#0 lore raw

v4 cover x86, dmi: Uninline dmi_get_bios_year()

Introduce a new helper to extract a year from DMI BIOS date since there are most existing users do and newcomers would utilize as well.

This is a fix up series on top what had been applied already.

Since v3:
- address more comments from Jean
- add tags
- reverse the order of the patches in the series
- due to above add a Fixes tag to both of them

Since v2:
- resend as fix up series
- address comments from Bjorn, Jean, Lukas, Rafael

Since v1:
- move the helper to be regular function (Bjorn, Rafael)
- fix a potential regression introduced in pci_acpi_crs_quirks() (Jean)
- adjust subject lines and commit message bodies (Bjorn)
- add tags (Bjorn, Jean)

Andy Shevchenko (2):
firmware: dmi_scan: Uninline dmi_get_bios_year() helper x86/PCI: Fix a potential regression when use dmi_get_bios_year()

 arch/x86/pci/acpi.c         |  4 +++-
 drivers/firmware/dmi_scan.c | 20 ++++++++++++++++++++
 include/linux/dmi.h         | 11 ++---------
 3 files changed, 25 insertions(+), 10 deletions(-)
Signature · 1 line
2.16.2
#1 lore raw

PATCH v4 1/2 firmware: dmi_scan: Uninline dmi_get_bios_year() helper

Uninline dmi_get_bios_year() which, in particular, allows us to optimize it in the future.

While doing this, convert the function to return an error code when BIOS date is not present or not parsable, or CONFIG_DMI=n.

Additionally, during the move, add a bit of documentation.

Fixes 492a1abd61e4 ("dmi: Introduce the dmi_get_bios_year() helper function")
---
 drivers/firmware/dmi_scan.c | 20 ++++++++++++++++++++
 include/linux/dmi.h         | 11 ++---------
 2 files changed, 22 insertions(+), 9 deletions(-)
drivers/firmware/dmi_scan.c +20 -0
index ae4f1b181c23..bfb6ce6abc83 100644
@@ -1040,6 +1040,26 @@ bool dmi_get_date(int field, int *yearp, int *monthp, int *dayp)
 }
 EXPORT_SYMBOL(dmi_get_date);
 
+/**
+ *	dmi_get_bios_year - get a year out of DMI_BIOS_DATE field
+ *
+ *	Returns year on success, -ENXIO if DMI is not selected,
+ *	or a different negative error code if DMI field is not present
+ *	or not parsable.
+ */
+int dmi_get_bios_year(void)
+{
+	bool exists;
+	int year;
+
+	exists = dmi_get_date(DMI_BIOS_DATE, &year, NULL, NULL);
+	if (!exists)
+		return -ENODATA;
+
+	return year ? year : -ERANGE;
+}
+EXPORT_SYMBOL(dmi_get_bios_year);
+
 /**
  *	dmi_walk - Walk the DMI table and get called back for every record
  *	@decode: Callback function
include/linux/dmi.h +2 -9
index b5b8c26b04fb..c46fdb36700b 100644
@@ -106,6 +106,7 @@ extern void dmi_scan_machine(void);
 extern void dmi_memdev_walk(void);
 extern void dmi_set_dump_stack_arch_desc(void);
 extern bool dmi_get_date(int field, int *yearp, int *monthp, int *dayp);
+extern int dmi_get_bios_year(void);
 extern int dmi_name_in_vendors(const char *str);
 extern int dmi_name_in_serial(const char *str);
 extern int dmi_available;
@@ -134,6 +135,7 @@ static inline bool dmi_get_date(int field, int *yearp, int *monthp, int *dayp)
 		*dayp = 0;
 	return false;
 }
+static inline int dmi_get_bios_year(void) { return -ENXIO; }
 static inline int dmi_name_in_vendors(const char *s) { return 0; }
 static inline int dmi_name_in_serial(const char *s) { return 0; }
 #define dmi_available 0
@@ -149,13 +151,4 @@ static inline const struct dmi_system_id *
 
 #endif
 
-static inline int dmi_get_bios_year(void)
-{
-	int year;
-
-	dmi_get_date(DMI_BIOS_DATE, &year, NULL, NULL);
-
-	return year;
-}
-
 #endif	/* __DMI_H__ */
Signature · 1 line
2.16.2
#2 lore raw

Re: [PATCH v4 1/2] firmware: dmi_scan: Uninline dmi_get_bios_year() helper

Quoted 24 lines · Andy Shevchenko

Uninline dmi_get_bios_year() which, in particular, allows us to optimize it in the future.

While doing this, convert the function to return an error code when BIOS date is not present or not parsable, or CONFIG_DMI=n.

Additionally, during the move, add a bit of documentation.

Fixes 492a1abd61e4 ("dmi: Introduce the dmi_get_bios_year() helper function")
---
 drivers/firmware/dmi_scan.c | 20 ++++++++++++++++++++
 include/linux/dmi.h         | 11 ++---------
 2 files changed, 22 insertions(+), 9 deletions(-)
drivers/firmware/dmi_scan.c +0 -0
index ae4f1b181c23..bfb6ce6abc83 100644

drivers/firmware/dmi_scan.c bool dmi_get_date(int field, int *yearp, int *monthp, int *dayp) · line 1048

Quoted 9 lines
drivers/firmware/dmi_scan.c +6 -0
@@ -1040,6 +1040,26 @@ bool dmi_get_date(int field, int *yearp, int *monthp, int *dayp)
 }
 EXPORT_SYMBOL(dmi_get_date);
 
+/**
+ *	dmi_get_bios_year - get a year out of DMI_BIOS_DATE field
+ *
+ *	Returns year on success, -ENXIO if DMI is not selected,
+ *	or a different negative error code if DMI field is not present
+ *	or not parsable.

s/parsable/parseable

I have fixed this in the version I've applied - which I'll push out if it passes testing.

Thanks,

Ingo

#3 lore raw

PATCH v4 2/2 x86/PCI: Fix a potential regression when use dmi_get_bios_year()

In reply to Andy Shevchenko

dmi_get_bios_year() may return 0 when it is incapable to parse the BIOS date string. Previously this has been checked in pci_acpi_crs_quirks().

Update the code to restore old behaviour.

Fixes 69c42d493db4 ("x86/pci: Simplify code by using the new dmi_get_bios_year() helper")
---
 arch/x86/pci/acpi.c | 4 +++-
 1 file changed, 3 insertions(+), 1 deletion(-)
arch/x86/pci/acpi.c +3 -1
index 00e60de30328..5559dcaddd5e 100644
@@ -140,7 +140,9 @@ static const struct dmi_system_id pci_crs_quirks[] __initconst = {
 
 void __init pci_acpi_crs_quirks(void)
 {
-	if ((dmi_get_bios_year() < 2008) && (iomem_resource.end <= 0xffffffff))
+	int year = dmi_get_bios_year();
+
+	if (year >= 0 && year < 2008 && iomem_resource.end <= 0xffffffff)
 		pci_use_crs = false;
 
 	dmi_check_system(pci_crs_quirks);
Signature · 1 line
2.16.2
#4 lore raw
In reply to Andy Shevchenko
Quoted 6 lines · Andy Shevchenko

Introduce a new helper to extract a year from DMI BIOS date since there
are most existing users do and newcomers would utilize as well.

This is a fix up series on top what had been applied already.

Ingo, this is a fix up series like should be as you and Rafael pointed out.

Can we get it into next release, so, we will have no regression in between?

Quoted 26 lines

Since v3:
- address more comments from Jean
- add tags
- reverse the order of the patches in the series
- due to above add a Fixes tag to both of them

Since v2:
- resend as fix up series
- address comments from Bjorn, Jean, Lukas, Rafael

Since v1:
- move the helper to be regular function (Bjorn, Rafael)
- fix a potential regression introduced in pci_acpi_crs_quirks() (Jean)
- adjust subject lines and commit message bodies (Bjorn)
- add tags (Bjorn, Jean)

Andy Shevchenko (2):
firmware: dmi_scan: Uninline dmi_get_bios_year() helper x86/PCI: Fix a potential regression when use dmi_get_bios_year()

 arch/x86/pci/acpi.c         |  4 +++-
 drivers/firmware/dmi_scan.c | 20 ++++++++++++++++++++
 include/linux/dmi.h         | 11 ++---------
 3 files changed, 25 insertions(+), 10 deletions(-)
Signature · 2 lines
Andy Shevchenko <[email protected]>
Intel Finland Oy