• Stanislav Lisovskiy's avatar
    drm/i915: Fix skl_pcode_try_request function · 9e0a1c3c
    Stanislav Lisovskiy authored
    Currently skl_pcode_try_request function doesn't
    properly handle return value it gets from
    snb_pcode_rw, but treats status != 0 as success,
    returning true, which basically doesn't allow
    to use retry/timeout mechanisms if PCode happens
    to be busy and returns EGAIN or some other status
    code not equal to 0.
    
    We saw this on real hw and also tried simulating this
    by always returning -EAGAIN from snb_pcode_rw for 6 times, which
    currently will just result in false success, while it should
    have tried until timeout is reached:
    
    [   22.357729] i915 0000:00:02.0: [drm:intel_cdclk_dump_config [i915]] Changing CDCLK to
    307200 kHz, VCO 614400 kHz, ref 38400 kHz, bypass 19200 kHz, voltage level 0
    [   22.357831] i915 0000:00:02.0: [drm:__snb_pcode_rw [i915]] Returning EAGAIN retry 1
    [   22.357892] i915 0000:00:02.0: [drm:skl_pcode_request [i915]] Success, exiting
    [   22.357936] i915 0000:00:02.0: [drm] ERROR Failed to inform PCU about cdclk change (err -11, freq 307200)
    
    We see en error because higher level api, still notices that status was wrong,
    however we still did try only once.
    
    We fix it by requiring _both_ the status to be 0 and
    request/reply match for success(true) and function
    should return failure(false) if either status turns
    out to be EAGAIN, EBUSY or whatever or reply/request
    masks do not match.
    
    So now we see this in the logs:
    
    [   22.318667] i915 0000:00:02.0: [drm:intel_cdclk_dump_config [i915]] Changing CDCLK to
    307200 kHz, VCO 614400 kHz, ref 38400 kHz, bypass 19200 kHz, voltage level 0
    [   22.318782] i915 0000:00:02.0: [drm:__snb_pcode_rw [i915]] Returning EAGAIN retry 1
    [   22.318849] i915 0000:00:02.0: [drm:__snb_pcode_rw [i915]] Returning EAGAIN retry 2
    [   22.319006] i915 0000:00:02.0: [drm:__snb_pcode_rw [i915]] Returning EAGAIN retry 3
    [   22.319091] i915 0000:00:02.0: [drm:__snb_pcode_rw [i915]] Returning EAGAIN retry 4
    [   22.319158] i915 0000:00:02.0: [drm:__snb_pcode_rw [i915]] Returning EAGAIN retry 5
    [   22.319224] i915 0000:00:02.0: [drm:__snb_pcode_rw [i915]] Returning EAGAIN retry 6
    Reviewed-by: default avatarVinod Govindapillai <vinod.govindapillai@intel.com>
    Signed-off-by: default avatarStanislav Lisovskiy <stanislav.lisovskiy@intel.com>
    Link: https://patchwork.freedesktop.org/patch/msgid/20220408125200.9069-2-stanislav.lisovskiy@intel.com
    9e0a1c3c
intel_pcode.c 6.17 KB