• Sudeep Holla's avatar
    ACPI: PCC: Implement OperationRegion handler for the PCC Type 3 subtype · 77e2a047
    Sudeep Holla authored
    PCC OpRegion provides a mechanism to communicate with the platform
    directly from the AML. PCCT provides the list of PCC channel available
    in the platform, a subset or all of them can be used in PCC Opregion.
    
    This patch registers the PCC OpRegion handler before ACPI tables are
    loaded. This relies on the special context data passed to identify and
    set up the PCC channel before the OpRegion handler is executed for the
    first time.
    
    Typical PCC Opregion declaration looks like this:
    
    OperationRegion (PFRM, PCC, 2, 0x74)
    Field (PFRM, ByteAcc, NoLock, Preserve)
    {
        SIGN,   32,
        FLGS,   32,
        LEN,    32,
        CMD,    32,
        DATA,   800
    }
    
    It contains four named double words followed by 100 bytes of buffer
    names DATA.
    
    ASL can fill out the buffer something like:
    
        /* Create global or local buffer */
        Name (BUFF, Buffer (0x0C){})
        /* Create double word fields over the buffer */
        CreateDWordField (BUFF, 0x0, WD0)
        CreateDWordField (BUFF, 0x04, WD1)
        CreateDWordField (BUFF, 0x08, WD2)
    
        /* Fill the named fields */
        WD0 = 0x50434300
        SIGN = BUFF
        WD0 = 1
        FLGS = BUFF
        WD0 = 0x10
        LEN = BUFF
    
        /* Fill the payload in the DATA buffer */
        WD0 = 0
        WD1 = 0x08
        WD2 = 0
        DATA = BUFF
    
        /* Write to CMD field to trigger handler */
        WD0 = 0x4404
        CMD = BUFF
    
    This buffer is received by acpi_pcc_opregion_space_handler. This
    handler will fetch the complete buffer via internal_pcc_buffer.
    
    The setup handler will receive the special PCC context data which will
    contain the PCC channel index which used to set up the channel. The
    buffer pointer and length is saved in region context which is then used
    in the handler.
    
    (kernel test robot: Build failure with CONFIG_ACPI_DEBUGGER)
    Link: https://lore.kernel.org/r/202201041539.feAV0l27-lkp@intel.comReported-by: default avatarkernel test robot <lkp@intel.com>
    Signed-off-by: default avatarSudeep Holla <sudeep.holla@arm.com>
    Signed-off-by: default avatarRafael J. Wysocki <rafael.j.wysocki@intel.com>
    77e2a047
acpi_pcc.c 3.29 KB