• Gary Hade's avatar
    ACPI, APEI: Fix incorrect APEI register bit width check and usage · 15afae60
    Gary Hade authored
    The current code incorrectly assumes that
    (1) the APEI register bit width is always 8, 16, 32, or 64 and
    (2) the APEI register bit width is always equal to the APEI
        register access width.
    
    ERST serialization instructions entries such as:
    
    [030h 0048   1]                       Action : 00 [Begin Write Operation]
    [031h 0049   1]                  Instruction : 03 [Write Register Value]
    [032h 0050   1]        Flags (decoded below) : 01
                          Preserve Register Bits : 1
    [033h 0051   1]                     Reserved : 00
    
    [034h 0052  12]              Register Region : [Generic Address Structure]
    [034h 0052   1]                     Space ID : 00 [SystemMemory]
    [035h 0053   1]                    Bit Width : 03
    [036h 0054   1]                   Bit Offset : 00
    [037h 0055   1]         Encoded Access Width : 03 [DWord Access:32]
    [038h 0056   8]                      Address : 000000007F2D7038
    
    [040h 0064   8]                        Value : 0000000000000001
    [048h 0072   8]                         Mask : 0000000000000007
    
    break this assumption by yielding:
      [Firmware Bug]: APEI: Invalid bit width in GAR [0x7f2d7038/3/0]
    
    I have found no ACPI specification requirements corresponding
    with the above assumptions.  There is even a good example in
    the Serialization Instruction Entries section (ACPI 4.0 section
    17.4,1.2, ACPI 4.0a section 2.5.1.2, ACPI 5.0 section 18.5.1.2)
    that mentions a serialization instruction with a bit range of
    [6:2] which is 5 bits wide, _not_ 8, 16, 32, or 64 bits wide.
    
    Compile and boot tested with 3.3.0-rc7 on a IBM HX5.
    Signed-off-by: default avatarGary Hade <garyhade@us.ibm.com>
    Signed-off-by: default avatarLen Brown <len.brown@intel.com>
    15afae60
apei-base.c 18.3 KB