From: Jean Delvare <jdelvare@suse.de>
To: <Narendra.K@dell.com>
Cc: <x86@kernel.org>, <linux-pci@vger.kernel.org>,
<Jordan.Hargrave@dell.com>, <Shyam.Iyer@dell.com>,
<bhelgaas@google.com>
Subject: Re: dmi type 0xB1 record - unknown flag
Date: Fri, 2 Jun 2017 16:13:11 +0200 [thread overview]
Message-ID: <20170602161311.27eab72d@endymion> (raw)
In-Reply-To: <68181b62786540ed8ca6ab877151a98b@BLRX13MDC105.AMER.DELL.COM>
Hi Narendra,
Thanks for your answer.
On Thu, 1 Jun 2017 13:28:31 +0000, Narendra.K@dell.com wrote:
> > -----Original Message-----
> > From: Jean Delvare [mailto:jdelvare@suse.de]
> > I see the following message in my kernel log:
> >
> > dmi type 0xB1 record - unknown flag
> >
> > This is on a Dell Optiplex 9020 workstation. I see the message comes
> > from:
> >
> > static void __init read_dmi_type_b1(const struct dmi_header *dm,
> > void *private_data) {
> > (...)
> > switch (((*(u32 *)d) >> 9) & 0x03) {
> > case 0x00:
> > printk(KERN_INFO "dmi type 0xB1 record - unknown flag\n");
> > break;
> >
> > What is the value of this message? Is there anything which needs to be done
> > to properly support such systems?
>
> This function was added to avoid adding systems to the 'pciprobe_dmi_table' and set breadth first sorting in a generic way.
>
> This flag is a hint to indicate the sort method to be used. The value 0x01 indicates that PCI breadth first sort be used.
> ' find_sort_method' function checks if smbios_type_b1_flag is set to 1 and if yes, calls 'set_bf_sort '. This function sets ' pci_bf_sort' to 'pci_dmi_bf'.
I can read the code, thank you ;-)
> The value 0x00 is not a valid value. When the flag is 0x00, the sort method will be the default that is decided by the kernel.
How can it be invalid? I have DMI dumps of several Dell systems with a
type 0xB1 DMI structure, with value 0x00 for these bits. If Dell ships
such systems, then this is valid by definition.
> There is no additional handling required for such a system.
I don't understand the complexity of the code. There are 4 possible
values for these bits, the code treats all of them differently:
* 0x01, you set smbios_type_b1_flag to 1 and this later triggers a call
to set_bf_sort().
* 0x02, you set smbios_type_b1_flag to 2 but this has no effect.
* 0x00, you print a rather cryptic info message which serves no purpose.
* 0x03, you do nothing.
On top of that, I can't see the value of the intermediate variable
smbios_type_b1_flag. The only situations where it would make a
difference is if multiple type 0xB1 structures with conflicting
information were present; but I don't think this is supposed to happen
in the first place.
Lastly I'm not sure why you continue processing the list of DMI
matches, when smbios_type_b1_flag == 1, and stop processing it if not.
This seems needlessly inconsistent.
I think the whole thing can be simplified like this:
From: Jean Delvare <jdelvare@suse.de>
Subject: x86/PCI: Simplify Dell DMI B1 quirk
No need for such convoluted code, when all we need is to call one
function in one specific case.
Signed-off-by: Jean Delvare <jdelvare@suse.de>
---
arch/x86/pci/common.c | 27 +++++----------------------
1 file changed, 5 insertions(+), 22 deletions(-)
--- linux-4.11.orig/arch/x86/pci/common.c 2017-05-01 04:47:48.000000000 +0200
+++ linux-4.11/arch/x86/pci/common.c 2017-06-02 16:04:05.737889598 +0200
@@ -24,7 +24,6 @@ unsigned int pci_probe = PCI_PROBE_BIOS
unsigned int pci_early_dump_regs;
static int pci_bf_sort;
-static int smbios_type_b1_flag;
int pci_routeirq;
int noioapicquirk;
#ifdef CONFIG_X86_REROUTE_FOR_BROKEN_BOOT_IRQS
@@ -197,34 +196,18 @@ static int __init set_bf_sort(const stru
static void __init read_dmi_type_b1(const struct dmi_header *dm,
void *private_data)
{
- u8 *d = (u8 *)dm + 4;
+ u8 *data = (u8 *)dm + 4;
if (dm->type != 0xB1)
return;
- switch (((*(u32 *)d) >> 9) & 0x03) {
- case 0x00:
- printk(KERN_INFO "dmi type 0xB1 record - unknown flag\n");
- break;
- case 0x01: /* set pci=bfsort */
- smbios_type_b1_flag = 1;
- break;
- case 0x02: /* do not set pci=bfsort */
- smbios_type_b1_flag = 2;
- break;
- default:
- break;
- }
+ if ((((*(u32 *)data) >> 9) & 0x03) == 0x01)
+ set_bf_sort((const struct dmi_system_id *)private_data);
}
static int __init find_sort_method(const struct dmi_system_id *d)
{
- dmi_walk(read_dmi_type_b1, NULL);
-
- if (smbios_type_b1_flag == 1) {
- set_bf_sort(d);
- return 0;
- }
- return -1;
+ dmi_walk(read_dmi_type_b1, (void *)d);
+ return 0;
}
/*
What do you think?
Thanks,
--
Jean Delvare
SUSE L3 Support
next prev parent reply other threads:[~2017-06-02 14:13 UTC|newest]
Thread overview: 9+ messages / expand[flat|nested] mbox.gz Atom feed top
2017-06-01 12:38 dmi type 0xB1 record - unknown flag Jean Delvare
2017-06-01 13:28 ` Narendra.K
2017-06-01 16:59 ` Bjorn Helgaas
2017-06-02 9:47 ` Narendra.K
2017-06-02 14:13 ` Jean Delvare [this message]
2017-06-06 8:02 ` Narendra.K
2017-06-15 21:39 ` Bjorn Helgaas
2017-06-16 9:36 ` Narendra.K
2017-06-16 13:25 ` Jean Delvare
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20170602161311.27eab72d@endymion \
--to=jdelvare@suse.de \
--cc=Jordan.Hargrave@dell.com \
--cc=Narendra.K@dell.com \
--cc=Shyam.Iyer@dell.com \
--cc=bhelgaas@google.com \
--cc=linux-pci@vger.kernel.org \
--cc=x86@kernel.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox