Re: [PATCH] ACPI, APEI: Fixup common access width firmware bug

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



On Thu, Jun 14, 2012 at 10:35:11AM +0200, Jean Delvare wrote:
> Hi Gary,
> 
> Le mercredi 13 juin 2012 à 18:09 -0700, Gary Hade a écrit :
> > On Tue, Jun 12, 2012 at 10:43:28AM +0200, Jean Delvare wrote:
> > > Many firmwares have a common register definition bug where 8-bit
> > > access width is specified for a 32-bit register. Ideally this should
> > > be fixed in the BIOS, but earlier versions of the kernel did not
> > > complain, so fix that up silently.
> > > 
> > > This closes kernel bug #43282:
> > > https://bugzilla.kernel.org/show_bug.cgi?id=43282
> > > 
> > > Signed-off-by: Jean Delvare <jdelvare@xxxxxxx>
> > > Cc: Gary Hade <garyhade@xxxxxxxxxx>
> > > Cc: Len Brown <len.brown@xxxxxxxxx>
> > > Cc: stable@xxxxxxxxxxxxxxx [3.4+]
> > > ---
> > >  drivers/acpi/apei/apei-base.c |    5 +++++
> > >  1 file changed, 5 insertions(+)
> > > 
> > > --- linux-3.4.orig/drivers/acpi/apei/apei-base.c	2012-06-08 10:02:06.000000000 +0200
> > > +++ linux-3.4/drivers/acpi/apei/apei-base.c	2012-06-08 10:04:16.503779775 +0200
> > > @@ -586,6 +586,11 @@ static int apei_check_gar(struct acpi_ge
> > >  	}
> > >  	*access_bit_width = 1UL << (access_size_code + 2);
> > > 
> > > +	/* Fixup common BIOS bug */
> > > +	if (bit_width == 32 && bit_offset == 0 && (*paddr & 0x03) == 0 &&
> > > +	    *access_bit_width < 32)
> > > +		*access_bit_width = 32;
> > > +
> > >  	if ((bit_width + bit_offset) > *access_bit_width) {
> > >  		pr_warning(FW_BUG APEI_PFX
> > >  			   "Invalid bit width + offset in GAR [0x%llx/%u/%u/%u/%u]\n",
> > 
> > This seems reasonable but since the "Access Size < Register Bit Width"
> > condition has apparently been seen on a number of systems I have been
> > wondering if this might simply be a BIOS writer's way of telling us
> > not to touch some of the high bits in the register.  Reducing the
> > width of the register seems like a better way, but maybe not the
> > only way?
> 
> I see it as a firmware bug, nothing else

That was my strong feeling but since the number of sightings
seems to be on the increase, I thought it might be good to talk
about whether our interpretation is actually correct.

> (although I am still waiting
> for Asus to reply on this.) And if it really isn't a bug, I can only
> read it as "we have a 32-bit register that can only be read 8-bit at a
> time so please issue 4 8-bit reads and build up a 32-bit value out of
> these." And certainly not as "don't touch the upper 24-bits."

It will definitely be interesting to see what you hear from Asus.

Multiple reads or writes to access all the bits in a register
does _not_ sound like a reasonable interpretation of the ACPI
spec to me.

> 
> As I mentioned in another discussion thread, the 1-bit granularity of
> bit_width and bit_offset clearly means that these are the fields the
> vendor must use to tell us which part of a register we should touch -
> they are the "what". "Access Size" is there for the hardware constraints
> - it is the "how".
> 
> > Jean, What do you (and others that are listening who know more
> > about this than I do) think about a change to sanity check only
> > the bit offset and not complain (at least for now) about cases
> > where an access using the specified access size will not address
> > every bit in the register?  
> > 
> > Perhaps something like:
> > --- linux-3.5-rc2/drivers/acpi/apei/apei-base.c.ORIG	2012-06-08 18:40:09.000000000 -0700
> > +++ linux-3.5-rc2/drivers/acpi/apei/apei-base.c	2012-06-13 16:32:49.000000000 -0700
> > @@ -586,9 +586,9 @@ static int apei_check_gar(struct acpi_ge
> >  	}
> >  	*access_bit_width = 1UL << (access_size_code + 2);
> >  
> > -	if ((bit_width + bit_offset) > *access_bit_width) {
> > +	if (bit_offset >= *access_bit_width) {
> >  		pr_warning(FW_BUG APEI_PFX
> > -			   "Invalid bit width + offset in GAR [0x%llx/%u/%u/%u/%u]\n",
> > +			   "Invalid bit offset in GAR [0x%llx/%u/%u/%u/%u]\n",
> >  			   *paddr, bit_width, bit_offset, access_size_code,
> >  			   space_id);
> >  		return -EINVAL;
> 
> Doesn't make much sense to me, as I don't think it will catch much.
> Also, your original patch (ACPI, APEI: Fix incorrect APEI register bit
> width check and usage) was not only reporting new errors, it also
> changed the width parameter passed to ACPI read and write functions. It
> was the register width and it is now (correctly, I believe) the access
> width. So if the access width is wrong, and we don't fix it up (as my
> proposed patch does) we might have a regression on some systems. Even if
> the firmware is at fault, regressions are always bad.

Agreed.  Your patch looks fine to me.
Acked-by: Gary Hade <garyhade@xxxxxxxxxx>

Gary

-- 
Gary Hade
System x Enablement
IBM Linux Technology Center
503-578-4503  IBM T/L: 775-4503
garyhade@xxxxxxxxxx
http://www.ibm.com/linux/ltc

--
To unsubscribe from this list: send the line "unsubscribe linux-acpi" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at  http://vger.kernel.org/majordomo-info.html


[Index of Archives]     [Linux IBM ACPI]     [Linux Power Management]     [Linux Kernel]     [Linux Laptop]     [Kernel Newbies]     [Share Photos]     [Security]     [Netfilter]     [Bugtraq]     [Yosemite News]     [MIPS Linux]     [ARM Linux]     [Linux Security]     [Linux RAID]     [Samba]     [Video 4 Linux]     [Device Mapper]     [Linux Resources]

  Powered by Linux