• Lv Zheng's avatar
    ACPICA / Hardware: Fix old register check in acpi_hw_get_access_bit_width() · 7f9bef9d
    Lv Zheng authored
    The address check in acpi_hw_get_access_bit_width() should be byte width
    based, not bit width based. This patch fixes this mistake.
    
    For those who want to review acpi_hw_access_bit_width(), here is the
    concerns and the design details of the function:
    
    It is supposed that the GAS Address field should be aligned to the byte
    width indicated by the GAS AccessSize field. Similarly, for the old non
    GAS register, it is supposed that its Address should be aligned to its
    Length.
    
    For the "AccessSize = 0 (meaning ANY)" case, we try to return the maximum
    instruction width (64 for MMIO or 32 for PIO) or the user expected access
    bit width (64 for acpi_read()/acpi_write() or 32 for acpi_hw_read()/
    acpi_hw_write()) and it is supposed that the GAS Address field should
    always be aligned to the maximum expected access bit width (otherwise it
    can't be accessed using ANY access bit width).
    
    The problem is in acpi_tb_init_generic_address(), where the non GAS
    register's Length is converted into the GAS BitWidth field, its Address is
    converted into the GAS Address field, and the GAS AccessSize field is left
    0 but most of the registers actually cannot be accessed using "ANY"
    accesses.
    
    As a conclusion, when AccessSize = 0 (ANY), the Address should either be
    aligned to the BitWidth (wrong conversion) or aligned to 32 for PIO or 64
    for MMIO (real GAS). Since currently, max_bit_width is 32, then:
    1. BitWidth for the wrong conversion is 8,16,32; and
    2. The Address of the real GAS should always be aligned to 8,16,32.
    The address alignment check to exclude false matched real GAS is not
    necessary. Thus this patch fixes the issue by removing the address
    alignment check.
    
    On the other hand, we in fact could use a simpler check of
    "reg->bit_width < max_bit_width" to exclude the "BitWidth=64 PIO" case that
    may be issued from acpi_read()/acpi_write() in the future.
    
    Fixes: b314a172 (ACPICA: Hardware: Add optimized access bit width support)
    Reported-and-tested-by: default avatarBoris Ostrovsky <boris.ostrovsky@oracle.com>
    Acked-by: default avatarMike Marshall <hubcap@omnibond.com>
    Suggested-by: default avatarJan Beulich <jbeulich@suse.com>
    Signed-off-by: default avatarLv Zheng <lv.zheng@intel.com>
    Signed-off-by: default avatarRafael J. Wysocki <rafael.j.wysocki@intel.com>
    7f9bef9d
hwregs.c 25 KB