18 Jan, 2012

2 commits


17 Jan, 2012

38 commits

  • 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() (2971852) and enhanced
    acpi_read() so it works in interrupt context as long as the address has
    been previously mapped (620242a). 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: Myron Stowe
    Signed-off-by: Len Brown

    Myron Stowe
     
  • Export remapping and unmapping interfaces - acpi_os_map_generic_address()
    and acpi_os_unmap_generic_address() - for ACPI generic registers that are
    backed by memory mapped I/O (MMIO).

    The acpi_os_map_generic_address() and acpi_os_unmap_generic_address()
    declarations may more properly belong in include/acpi/acpiosxf.h next to
    acpi_os_read_memory() but I believe that would require the ACPI CA making
    them an official part of the ACPI CA - OS interface.

    ACPI Generic Address Structure (GAS) reference (ACPI's fixed/generic
    hardware registers use the GAS format):
    ACPI Specification, Revision 4.0, Section 5.2.3.1, "Generic Address
    Structure"

    Signed-off-by: Myron Stowe
    Acked-by: Rafael J. Wysocki
    Signed-off-by: Len Brown

    Myron Stowe
     
  • Generic Address Structures (GAS) may reside within ACPI tables which
    are byte aligned. This patch copies GAS 'address' references to a local
    variable, which will be naturally aligned, to be used going forward.

    ACPI Generic Address Structure (GAS) reference:
    ACPI Specification, Revision 4.0, Section 5.2.3.1, "Generic Address
    Structure"

    Signed-off-by: Myron Stowe
    Signed-off-by: Len Brown

    Myron Stowe
     
  • Some firmware will access memory in ACPI NVS region via APEI. That
    is, instructions in APEI ERST/EINJ table will read/write ACPI NVS
    region. The original resource conflict checking in APEI code will
    check memory/ioport accessed by APEI via general resource management
    mech. But ACPI NVS region is marked as busy already, so that the
    false resource conflict will prevent APEI ERST/EINJ to work.

    To fix this, this patch excludes ACPI NVS regions when APEI components
    request resources. So that they will not conflict with ACPI NVS
    regions.

    Reported-and-tested-by: Pavel Ivanov
    Signed-off-by: Huang Ying
    Signed-off-by: Len Brown

    Huang Ying
     
  • Some firmware will access memory in ACPI NVS region via APEI. That
    is, instructions in APEI ERST/EINJ table will read/write ACPI NVS
    region. The original resource conflict checking in APEI code will
    check memory/ioport accessed by APEI via general resource management
    mechanism. But ACPI NVS region is marked as busy already, so that the
    false resource conflict will prevent APEI ERST/EINJ to work.

    To fix this, this patch record ACPI NVS regions, so that we can avoid
    request resources for memory region inside it.

    Signed-off-by: Huang Ying
    Signed-off-by: Len Brown

    Huang Ying
     
  • Current fix for resource conflict is to remove the address region from trigger resource, which is highly relies on valid user
    input. This patch is trying to avoid such potential issues by fetching the
    exact address region from trigger action table entry.

    Signed-off-by: Xiao, Hui
    Signed-off-by: Huang Ying
    Signed-off-by: Len Brown

    Xiao, Hui
     
  • Some APEI firmware implementation will access injected address
    specified in param1 to trigger the error when injecting memory error.
    This will cause resource conflict with RAM.

    On one of our testing machine, if injecting at memory address
    0x10000000, the following error will be reported in dmesg:

    APEI: Can not request iomem region for GARs.

    This patch removes the injecting memory address range from trigger
    table resources to avoid conflict.

    Signed-off-by: Huang Ying
    Tested-by: Tony Luck
    Signed-off-by: Len Brown

    Huang Ying
     
  • On one of our testing machine, the following EINJ command lines:

    # echo 0x10000000 > param1
    # echo 0xfffffffffffff000 > param2
    # echo 0x8 > error_type
    # echo 1 > error_inject

    Will get:

    echo: write error: Input/output error

    The EIO comes from:

    rc = apei_exec_pre_map_gars(&trigger_ctx);

    The root cause is as follow. Normally, ACPI atomic IO support is used
    to access IO memory. But in EINJ of that machine, it is used to
    access RAM to trigger the injected error. And the ioremap() called by
    apei_exec_pre_map_gars() can not map the RAM.

    This patch add RAM mapping support to ACPI atomic IO support to
    satisfy EINJ requirement.

    Signed-off-by: Huang Ying
    Tested-by: Tony Luck
    Signed-off-by: Len Brown

    Huang Ying
     
  • Because printk is not safe inside NMI handler, the recoverable error
    records received in NMI handler will be queued to be printked in a
    delayed IRQ context via irq_work. If a fatal error occurs after the
    recoverable error and before the irq_work processed, we lost a error
    report.

    To solve the issue, the queued error records are printked in NMI
    handler if system will go panic.

    Signed-off-by: Huang Ying
    Signed-off-by: Len Brown

    Huang Ying
     
  • In most cases, printk only guarantees messages from different printk
    calling will not be interleaved between each other. But, one APEI
    GHES hardware error report will involve multiple printk calling,
    normally each for one line. So it is possible that the hardware error
    report comes from different generic hardware error source will be
    interleaved.

    In this patch, a sequence number is prefixed to each line of error
    report. So that, even if they are interleaved, they still can be
    distinguished by the prefixed sequence number.

    Signed-off-by: Huang Ying
    Signed-off-by: Len Brown

    Huang Ying
     
  • Because APEI tables are optional, these message may confuse users, for
    example,

    https://bugs.launchpad.net/ubuntu/+source/linux/+bug/599715

    Reported-by: Bjorn Helgaas
    Signed-off-by: Huang Ying
    Signed-off-by: Len Brown

    Huang Ying
     
  • Use the normal %pR-like format for MMIO and I/O port ranges.

    Signed-off-by: Bjorn Helgaas
    Signed-off-by: Huang Ying
    Signed-off-by: Len Brown

    Bjorn Helgaas
     
  • aer_recover_queue() is called when recoverable PCIe AER errors are
    notified by firmware to do the recovery work.

    Signed-off-by: Huang Ying
    Signed-off-by: Len Brown

    Huang Ying
     
  • There is no 64bit read/write support in ACPI atomicio because
    readq/writeq is used to implement 64bit read/write, but readq/writeq
    is not available on i386. This patch implement 64bit read/write
    support in atomicio via two readl/writel.

    Signed-off-by: Huang Ying
    Signed-off-by: Len Brown

    Huang Ying
     
  • Version 20120111.

    Signed-off-by: Bob Moore
    Signed-off-by: Lin Ming
    Signed-off-by: Len Brown

    Bob Moore
     
  • Update all copyrights to 2012.

    Signed-off-by: Bob Moore
    Signed-off-by: Lin Ming
    Signed-off-by: Len Brown

    Bob Moore
     
  • Allows drivers to determine if any memory or I/O addresses
    will conflict with addresses used by ACPI operation regions.
    Introduces a new interface, acpi_check_address_range.

    http://marc.info/?t=132251388700002&r=1&w=2

    Reported-and-tested-by: Luca Tettamanti
    Signed-off-by: Lin Ming
    Signed-off-by: Bob Moore
    Signed-off-by: Len Brown

    Lin Ming
     
  • FADT is now larger than 256 bytes, so all FADT offsets must be
    changed from 8 bits to 16 bits.

    Signed-off-by: Bob Moore
    Signed-off-by: Lin Ming
    Signed-off-by: Len Brown

    Bob Moore
     
  • This version contains full support for the ACPI 5.0 specification.

    Signed-off-by: Bob Moore
    Signed-off-by: Lin Ming
    Signed-off-by: Len Brown

    Bob Moore
     
  • Make the various files in alphabetical order to simplify
    addition of new files.

    Signed-off-by: Lin Ming
    Signed-off-by: Len Brown

    Lin Ming
     
  • _AEI contains a resource template, this change adds support for
    the walk resources function.

    Signed-off-by: Zhang Rui
    Signed-off-by: Bob Moore
    Signed-off-by: Lin Ming
    Signed-off-by: Len Brown

    Zhang Rui
     
  • Signed-off-by: Bob Moore
    Signed-off-by: Lin Ming
    Signed-off-by: Len Brown

    Bob Moore
     
  • This interface converts an AML buffer to an internal ACPI_RESOURCE.

    Signed-off-by: Bob Moore
    Signed-off-by: Lin Ming
    Signed-off-by: Len Brown

    Bob Moore
     
  • Executes _AEI and formats the result, similar to acpi_get_current_resources, etc.

    Signed-off-by: Bob Moore
    Signed-off-by: Lin Ming
    Signed-off-by: Len Brown

    Bob Moore
     
  • FixedDMA, GPIO descriptors, SerialBus descriptors

    Signed-off-by: Lin Ming
    Signed-off-by: Bob Moore
    Signed-off-by: Len Brown

    Lin Ming
     
  • Signed-off-by: Bob Moore
    Signed-off-by: Lin Ming
    Signed-off-by: Len Brown

    Bob Moore
     
  • Support within the interpreter and operation region dispatch.

    Signed-off-by: Bob Moore
    Signed-off-by: Lin Ming
    Signed-off-by: Len Brown

    Bob Moore
     
  • Adds acpi_acquire_mutex, acpi_release_mutex external interfaces.
    New file, utxfmutex.c.

    Signed-off-by: Lin Ming
    Signed-off-by: Bob Moore
    Signed-off-by: Len Brown

    Lin Ming
     
  • Adds new file, actbl3.h

    Signed-off-by: Bob Moore
    Signed-off-by: Lin Ming
    Signed-off-by: Len Brown

    Bob Moore
     
  • If HW-reduced flag is set in the FADT, do not attempt to access
    or initialize any ACPI hardware, including SCI and global lock.
    No FACS will be present.

    Signed-off-by: Bob Moore
    Signed-off-by: Lin Ming
    Signed-off-by: Len Brown

    Bob Moore
     
  • Signed-off-by: Bob Moore
    Signed-off-by: Lin Ming
    Signed-off-by: Len Brown

    Bob Moore
     
  • Ignore an invalid space ID during a table load. Instead, detect it
    if a control method attempts access - then abort the method.

    http://www.acpica.org/bugzilla/show_bug.cgi?id=925

    Signed-off-by: Bob Moore
    Signed-off-by: Lin Ming
    Signed-off-by: Len Brown

    Bob Moore
     
  • Supplement the exception code with an actual message.

    Found during ACPICA debugging.

    Signed-off-by: Bob Moore
    Signed-off-by: Lin Ming
    Signed-off-by: Len Brown

    Bob Moore
     
  • Found during ACPICA debugging.

    Signed-off-by: Bob Moore
    Signed-off-by: Lin Ming
    Signed-off-by: Len Brown

    Bob Moore
     
  • Allow referenced objects to be in a different scope.

    http://www.acpica.org/bugzilla/show_bug.cgi?id=937
    http://marc.info/?l=linux-acpi&m=131636632718222&w=2

    ACPI Error: [RAMB] Namespace lookup failure, AE_NOT_FOUND (20110112/psargs-359)
    ACPI Exception: AE_NOT_FOUND, Could not execute arguments for [RAMW] (Region) (20110112/nsinit-349)

    Scope (_SB)
    {
    Name (RAMB, 0xDF5A1018)
    OperationRegion (\RAMW, SystemMemory, RAMB, 0x00010000)
    }

    For above ASL code, we need to save scope node(\_SB) to lookup
    the argument node(\_SB.RAMB).

    Reported-by: Jim Green
    Signed-off-by: Lin Ming
    Signed-off-by: Bob Moore
    Signed-off-by: Len Brown

    Lin Ming
     
  • Fixes several issues with GCC 4.6 related to the new checks for
    unused variables.

    http://www.acpica.org/bugzilla/show_bug.cgi?id=935

    Signed-off-by: Bob Moore
    Signed-off-by: Lin Ming
    Signed-off-by: Len Brown

    Bob Moore
     
  • Len Brown
     
  • The call to acpi_os_validate_address in acpi_ds_get_region_arguments was
    removed by mistake in commit 9ad19ac(ACPICA: Split large dsopcode and
    dsload.c files).

    Put it back.

    Cc: stable@vger.kernel.org # 2.6.38+
    Reported-and-bisected-by: Luca Tettamanti
    Signed-off-by: Lin Ming
    Signed-off-by: Len Brown

    Lin Ming