• Rafael J. Wysocki's avatar
    ACPICA: Add support for using logical addresses of GPE blocks · 7a8379eb
    Rafael J. Wysocki authored
    The logical address of every GPE block in system memory must be
    known before passing it to acpi_ev_initialize_gpe_block(), because
    memory cannot be mapped on the fly from an interrupt handler.
    Accordingly, the host OS must map every GPE block in system
    memory upfront and it can store the logical addresses of GPE
    blocks for future use.
    
    If these logical addresses were known to ACPICA, it could use them
    instead of the corresponding physical addresses of GPE block for
    GPE register accesses and the memory mapping lookups carried out
    by acpi_os_read_memory() and acpi_os_write_memory() on every
    attempt to access a GPE register would not be necessary any more.
    
    To allow that to happen, introduce the ACPI_GPE_USE_LOGICAL_ADDRESSES
    symbol to indicate whether or not the host OS wants ACPICA to use the
    logical addresses of GPE registers in system memory directly (which
    is the case if this symbol is defined).  Moreover, conditional on
    whether ACPI_GPE_USE_LOGICAL_ADDRESSES is defined, introduce two new
    global variables for storing the logical addresses of the FADT GPE
    blocks 0 and 1, respectively, acpi_gbl_xgpe0_block_logical_address and
    acpi_gbl_xgpe1_block_logical_address, make acpi_ev_gpe_initialize()
    pass their values instead of the physical addresses of the GPE blocks
    in question to acpi_ev_create_gpe_block() and modify
    acpi_hw_gpe_read() and acpi_hw_gpe_write() to access memory directly
    via the addresses stored in the struct acpi_gpe_address objects,
    which are expected to be the logical addresses of GPE registers if
    ACPI_GPE_USE_LOGICAL_ADDRESSES is defined.
    
    With the above changes in place, a host OS wanting ACPICA to
    access GPE registers directly through their logical addresses
    needs to define the ACPI_GPE_USE_LOGICAL_ADDRESSES symbol and
    make sure that the logical addresses of the FADT GPE blocks 0
    and 1 are stored in acpi_gbl_xgpe0_block_logical_address and
    acpi_gbl_xgpe1_block_logical_address, respectively, prior to
    calling acpi_ev_gpe_initialize().
    
    [If such a host OS also uses acpi_install_gpe_block() to add
     non-FADT GPE register blocks located in system memory, it must
     pass their logical addresses instead of their physical addresses
     to this function.]
    Signed-off-by: default avatarRafael J. Wysocki <rafael.j.wysocki@intel.com>
    7a8379eb
hwgpe.c 18 KB