• Myron Stowe's avatar
    ACPI APEI: Convert atomicio routines · 700130b4
    Myron Stowe authored
    APEI needs memory access in interrupt context.  The obvious choice is
    acpi_read(), but originally it couldn't be used in interrupt context
    because it makes temporary mappings with ioremap().  Therefore, we added
    drivers/acpi/atomicio.c, which provides:
        acpi_pre_map_gar()     -- ioremap in process context
    	acpi_atomic_read()     -- memory access in interrupt context
    	acpi_post_unmap_gar()  -- iounmap
    
    Later we added acpi_os_map_generic_address() (29718521) and enhanced
    acpi_read() so it works in interrupt context as long as the address has
    been previously mapped (620242ae).  Now this sequence:
        acpi_os_map_generic_address()    -- ioremap in process context
        acpi_read()/apei_read()          -- now OK in interrupt context
        acpi_os_unmap_generic_address()
    is equivalent to what atomicio.c provides.
    
    This patch introduces apei_read() and apei_write(), which currently are
    functional equivalents of acpi_read() and acpi_write().  This is mainly
    proactive, to prevent APEI breakages if acpi_read() and acpi_write()
    are ever augmented to support the 'bit_offset' field of GAS, as APEI's
    __apei_exec_write_register() precludes splitting up functionality
    related to 'bit_offset' and APEI's 'mask' (see its
    APEI_EXEC_PRESERVE_REGISTER block).
    
    With apei_read() and apei_write() in place, usages of atomicio routines
    are converted to apei_read()/apei_write() and existing calls within
    osl.c and the CA, based on the re-factoring that was done in an earlier
    patch series - http://marc.info/?l=linux-acpi&m=128769263327206&w=2:
        acpi_pre_map_gar()     -->  acpi_os_map_generic_address()
        acpi_post_unmap_gar()  -->  acpi_os_unmap_generic_address()
        acpi_atomic_read()     -->  apei_read()
        acpi_atomic_write()    -->  apei_write()
    
    Note that acpi_read() and acpi_write() currently use 'bit_width'
    for accessing GARs which seems incorrect.  'bit_width' is the size of
    the register, while 'access_width' is the size of the access the
    processor must generate on the bus.  The 'access_width' may be larger,
    for example, if the hardware only supports 32-bit or 64-bit reads.  I
    wanted to minimize any possible impacts with this patch series so I
    did *not* change this behavior.
    Signed-off-by: default avatarMyron Stowe <myron.stowe@redhat.com>
    Signed-off-by: default avatarLen Brown <len.brown@intel.com>
    700130b4
ghes.c 29.3 KB