On Wed, Feb 12, 2020 at 12:56:05PM +0100, Jean Delvare wrote: > On Wed, 12 Feb 2020 14:05:39 +0300, Mika Westerberg wrote: > > ACPI Generic Address Structure (GAS) access_width field is not in bytes > > as the driver seems to expect in few places so fix this by using the > > newly introduced macro ACPI_ACCESS_BIT_WIDTH(). > > > > Reported-by: Jean Delvare <jdelvare@xxxxxxx> > > Signed-off-by: Mika Westerberg <mika.westerberg@xxxxxxxxxxxxxxx> > > --- > > Not sure if this is stable material since there is no user visible issues > > without the fix. If this needs to go stable then the ACPICA change need to > > be taken there as well (or we make separate fix for stable without the > > macro). > > I thought about it too and I don't think it qualifies for stable > because we have no proof it affects any user in pratcice. You may want > to add a "Fixes:" tag though to track where the bug was introduced and > let distributions backport the fix if they want to. OK. > > drivers/acpi/acpi_watchdog.c | 3 +-- > > drivers/watchdog/wdat_wdt.c | 2 +- > > 2 files changed, 2 insertions(+), 3 deletions(-) > > > > diff --git a/drivers/acpi/acpi_watchdog.c b/drivers/acpi/acpi_watchdog.c > > index b5516b04ffc0..ef0832999892 100644 > > --- a/drivers/acpi/acpi_watchdog.c > > +++ b/drivers/acpi/acpi_watchdog.c > > @@ -126,12 +126,11 @@ void __init acpi_watchdog_init(void) > > gas = &entries[i].register_region; > > > > res.start = gas->address; > > + res.end = res.start + ACPI_ACCESS_BIT_WIDTH(gas->access_width) - 1; > > if (gas->space_id == ACPI_ADR_SPACE_SYSTEM_MEMORY) { > > res.flags = IORESOURCE_MEM; > > - res.end = res.start + ALIGN(gas->access_width, 4) - 1; > > } else if (gas->space_id == ACPI_ADR_SPACE_SYSTEM_IO) { > > res.flags = IORESOURCE_IO; > > - res.end = res.start + gas->access_width - 1; > > } else { > > pr_warn("Unsupported address space: %u\n", > > gas->space_id); > > diff --git a/drivers/watchdog/wdat_wdt.c b/drivers/watchdog/wdat_wdt.c > > index b069349b52f5..2132018f031d 100644 > > --- a/drivers/watchdog/wdat_wdt.c > > +++ b/drivers/watchdog/wdat_wdt.c > > @@ -389,7 +389,7 @@ static int wdat_wdt_probe(struct platform_device *pdev) > > > > memset(&r, 0, sizeof(r)); > > r.start = gas->address; > > - r.end = r.start + gas->access_width - 1; > > + r.end = r.start + ACPI_ACCESS_BIT_WIDTH(gas->access_width) - 1; > > if (gas->space_id == ACPI_ADR_SPACE_SYSTEM_MEMORY) { > > r.flags = IORESOURCE_MEM; > > } else if (gas->space_id == ACPI_ADR_SPACE_SYSTEM_IO) { > > You are using ACPI_ACCESS_BIT_WIDTH() where you clearly meant to use > ACPI_ACCESS_BYTE_WIDTH(). Oops! Indeed it was supposed to be ACPI_ACCESS_BYTE_WIDTH(). I'll fix this and the other comments in v2.