• Clément Léger's avatar
    ACPI: CPPC: Fix MASK_VAL() usage · 60949b7b
    Clément Léger authored
    MASK_VAL() was added as a way to handle bit_offset and bit_width for
    registers located in system memory address space. However, while suited
    for reading, it does not work for writing and result in corrupted
    registers when writing values with bit_offset > 0. Moreover, when a
    register is collocated with another one at the same address but with a
    different mask, the current code results in the other registers being
    overwritten with 0s. The write procedure for SYSTEM_MEMORY registers
    should actually read the value, mask it, update it and write it with the
    updated value. Moreover, since registers can be located in the same
    word, we must take care of locking the access before doing it. We should
    potentially use a global lock since we don't know in if register
    addresses aren't shared with another _CPC package but better not
    encourage vendors to do so. Assume that registers can use the same word
    inside a _CPC package and thus, use a per _CPC package lock.
    
    Fixes: 2f4a4d63 ("ACPI: CPPC: Use access_width over bit_width for system memory accesses")
    Signed-off-by: default avatarClément Léger <cleger@rivosinc.com>
    Link: https://patch.msgid.link/20240826101648.95654-1-cleger@rivosinc.com
    [ rjw: Dropped redundant semicolon ]
    Signed-off-by: default avatarRafael J. Wysocki <rafael.j.wysocki@intel.com>
    60949b7b
cppc_acpi.h 5.71 KB