• Jackie Li's avatar
    drm/i915/guc: Check the locking status of GuC WOPCM registers · f08e2035
    Jackie Li authored
    GuC WOPCM registers are write-once registers. Current driver code accesses
    these registers without checking the accessibility to these registers which
    will lead to unpredictable driver behaviors if these registers were touch
    by other components (such as faulty BIOS code).
    
    This patch moves the GuC WOPCM registers updating code into intel_wopcm.c
    and adds check before and after the update to GuC WOPCM registers so that
    we can make sure the driver is in a known state after writing to these
    write-once registers.
    
    v6:
     - Made sure module reloading won't bug the kernel while doing
       locking status checking
    
    v7:
     - Fixed patch format issues
    
    v8:
     - Fixed coding style issue on register lock bit macro definition (Sagar)
    
    v9:
     - Avoided to use redundant !! to cast uint to bool (Chris)
     - Return error code instead of GEM_BUG_ON for locked with invalid register
       values case (Sagar)
     - Updated guc_wopcm_hw_init to use guc_wopcm as first parameter (Michal)
     - Added code to set and validate the HuC_LOADING_AGENT_GUC bit in GuC
       WOPCM offset register based on the presence of HuC firmware (Michal)
     - Use bit fields instead of macros for GuC WOPCM flags (Michal)
    
    v10:
     - Refined variable names, removed redundant comments (Joonas)
     - Introduced lockable_reg to handle the write once register write and
       propagate the write error to caller (Joonas)
     - Used lockable_reg abstraction to avoid locking bit check on generic
       i915_reg_t (Michal)
     - Added log message for error paths (Michal)
     - Removed hw_updated flag and only relies on real hardware status
    
    v11:
     - Replaced lockable_reg with simplified function (Michal)
     - Used new macros for locking bits of WOPCM size/offset registers instead
       of using BIT(0) directly (Michal)
     - use intel_wopcm_init_hw() called from intel_gem_init_hw() to do GuC
       WOPCM register setup instead of calling from intel_uc_init_hw() (Michal)
    
    v12:
     - Updated function kernel-doc to align with code changes (Michal)
     - Updated code to use wopcm pointer directly (Michal)
    
    v13:
     - Updated the ordering of s-o-b/cc/r-b tags (Sagar)
    
    BSpec: 10875, 10833
    Signed-off-by: default avatarJackie Li <yaodong.li@intel.com>
    Cc: Michal Wajdeczko <michal.wajdeczko@intel.com>
    Cc: Chris Wilson <chris@chris-wilson.co.uk>
    Cc: Joonas Lahtinen <joonas.lahtinen@linux.intel.com>
    Reviewed-by: Michal Wajdeczko <michal.wajdeczko@intel.com> (v11)
    Reviewed-by: Joonas Lahtinen <joonas.lahtinen@linux.intel.com> (v12)
    Reviewed-by: default avatarJoonas Lahtinen <joonas.lahtinen@linux.intel.com>
    Signed-off-by: default avatarJoonas Lahtinen <joonas.lahtinen@linux.intel.com>
    Link: https://patchwork.freedesktop.org/patch/msgid/1520987574-19351-5-git-send-email-yaodong.li@intel.com
    f08e2035
i915_gem.c 160 KB