• Luben Tuikov's avatar
    drm/amd/pm: Fix a bug communicating with the SMU (v5) · 5810323b
    Luben Tuikov authored
    This fixes a bug which if we probe a non-existing
    I2C device, and the SMU returns 0xFF, from then on
    we can never communicate with the SMU, because the
    code before this patch reads and interprets 0xFF
    as a terminal error, and thus we never write 0
    into register 90 to clear the status (and
    subsequently send a new command to the SMU.)
    
    It is not an error that the SMU returns status
    0xFF. This means that the SMU executed the last
    command successfully (execution status), but the
    command result is an error of some sort (execution
    result), depending on what the command was.
    
    When doing a status check of the SMU, before we
    send a new command, the only status which
    precludes us from sending a new command is 0--the
    SMU hasn't finished executing a previous command,
    and 0xFC--the SMU is busy.
    
    This bug was seen as the following line in the
    kernel log,
    
    amdgpu: Msg issuing pre-check failed(0xff) and SMU may be not in the right state!
    
    when subsequent SMU commands, not necessarily
    related to I2C, were sent to the SMU.
    
    This patch fixes this bug.
    
    v2: Add a comment to the description of
    __smu_cmn_poll_stat() to explain why we're NOT
    defining the SMU FW return codes as macros, but
    are instead hard-coding them. Such a change, can
    be followed up by a subsequent patch.
    
    v3: The changes are,
    a) Add comments to break labels in
       __smu_cmn_reg2errno().
    
    b) When an unknown/unspecified/undefined result is
       returned back from the SMU, map that to
       -EREMOTEIO, to distinguish failure at the SMU
       FW.
    
    c) Add kernel-doc to
       smu_cmn_send_msg_without_waiting(),
       smu_cmn_wait_for_response(),
       smu_cmn_send_smc_msg_with_param().
    
    d) In smu_cmn_send_smc_msg_with_param(), since we
       wait for completion of the command, if the
       result of the completion is
       undefined/unknown/unspecified, we print that to
       the kernel log.
    
    v4: a) Add macros as requested, though redundant, to
        be removed when SMU consolidates for all
        ASICs--see comment in code.
        b) Get out if the SMU code is unknown.
    
    v5: Rename the macro names.
    
    Cc: Alex Deucher <Alexander.Deucher@amd.com>
    Cc: Evan Quan <evan.quan@amd.com>
    Cc: Lijo Lazar <Lijo.Lazar@amd.com>
    Fixes: fcb1fe9c ("drm/amd/powerplay: pre-check the SMU state before issuing message")
    Signed-off-by: default avatarLuben Tuikov <luben.tuikov@amd.com>
    Reviewed-by: default avatarAlex Deucher <Alexander.Deucher@amd.com>
    Signed-off-by: default avatarAlex Deucher <alexander.deucher@amd.com>
    5810323b
smu_cmn.c 26.6 KB