[Intel-gfx] [PATCH 3/5] drm/i915/wopcm: Try to use already locked WOPCM layout
Daniele Ceraolo Spurio
daniele.ceraolospurio at intel.com
Fri Aug 16 00:14:06 UTC 2019
On 8/15/19 10:12 AM, Michal Wajdeczko wrote:
> If WOPCM layout is already locked in HW we shouldn't continue
> with our own partitioning as it could be likely different and
> we will be unable to enforce it and fail. Instead we should try
> to reuse what is already programmed, maybe there will be a fit.
>
> This should enable us to reload driver with slightly different
> HuC firmware (or even without HuC) without need to reboot.
>
> v2: reordered/rebased
>
> Signed-off-by: Michal Wajdeczko <michal.wajdeczko at intel.com>
> Cc: Daniele Ceraolo Spurio <daniele.ceraolospurio at intel.com>
> Cc: Chris Wilson <chris at chris-wilson.co.uk>
> Cc: Michal Winiarski <michal.winiarski at intel.com>
Reviewed-by: Daniele Ceraolo Spurio <daniele.ceraolospurio at intel.com>
Daniele
> ---
> drivers/gpu/drm/i915/intel_wopcm.c | 29 +++++++++++++++++++++++++++--
> 1 file changed, 27 insertions(+), 2 deletions(-)
>
> diff --git a/drivers/gpu/drm/i915/intel_wopcm.c b/drivers/gpu/drm/i915/intel_wopcm.c
> index 3ac05055bb08..ea02efb653a7 100644
> --- a/drivers/gpu/drm/i915/intel_wopcm.c
> +++ b/drivers/gpu/drm/i915/intel_wopcm.c
> @@ -212,6 +212,21 @@ static inline bool __check_layout(struct drm_i915_private *i915, u32 wopcm_size,
> huc_fw_size);
> }
>
> +static bool __wopcm_regs_locked(struct intel_uncore *uncore,
> + u32 *guc_wopcm_base, u32 *guc_wopcm_size)
> +{
> + u32 reg_base = intel_uncore_read(uncore, DMA_GUC_WOPCM_OFFSET);
> + u32 reg_size = intel_uncore_read(uncore, GUC_WOPCM_SIZE);
> +
> + if (!(reg_size & GUC_WOPCM_SIZE_LOCKED) ||
> + !(reg_base & GUC_WOPCM_OFFSET_VALID))
> + return false;
> +
> + *guc_wopcm_base = reg_base & GUC_WOPCM_OFFSET_MASK;
> + *guc_wopcm_size = reg_size & GUC_WOPCM_SIZE_MASK;
> + return true;
> +}
> +
> /**
> * intel_wopcm_init() - Initialize the WOPCM structure.
> * @wopcm: pointer to intel_wopcm.
> @@ -225,8 +240,9 @@ static inline bool __check_layout(struct drm_i915_private *i915, u32 wopcm_size,
> void intel_wopcm_init(struct intel_wopcm *wopcm)
> {
> struct drm_i915_private *i915 = wopcm_to_i915(wopcm);
> - u32 guc_fw_size = intel_uc_fw_get_upload_size(&i915->gt.uc.guc.fw);
> - u32 huc_fw_size = intel_uc_fw_get_upload_size(&i915->gt.uc.huc.fw);
> + struct intel_gt *gt = &i915->gt;
> + u32 guc_fw_size = intel_uc_fw_get_upload_size(>->uc.guc.fw);
> + u32 huc_fw_size = intel_uc_fw_get_upload_size(>->uc.huc.fw);
> u32 ctx_rsvd = context_reserved_size(i915);
> u32 guc_wopcm_base;
> u32 guc_wopcm_size;
> @@ -244,6 +260,14 @@ void intel_wopcm_init(struct intel_wopcm *wopcm)
> if (i915_inject_probe_failure(i915))
> return;
>
> + if (__wopcm_regs_locked(gt->uncore, &guc_wopcm_base, &guc_wopcm_size)) {
> + DRM_DEV_DEBUG_DRIVER(i915->drm.dev,
> + "GuC WOPCM is already locked [%uK, %uK)\n",
> + guc_wopcm_base / SZ_1K,
> + guc_wopcm_size / SZ_1K);
> + goto check;
> + }
> +
> guc_wopcm_base = ALIGN(huc_fw_size + WOPCM_RESERVED_SIZE,
> GUC_WOPCM_OFFSET_ALIGNMENT);
> guc_wopcm_base = max(wopcm->size - ctx_rsvd, guc_wopcm_base);
> @@ -254,6 +278,7 @@ void intel_wopcm_init(struct intel_wopcm *wopcm)
> "Calculated GuC WOPCM Region: [%uKiB, %uKiB)\n",
> guc_wopcm_base / SZ_1K, guc_wopcm_size / SZ_1K);
>
> +check:
> if (__check_layout(i915, wopcm->size, guc_wopcm_base, guc_wopcm_size,
> guc_fw_size, huc_fw_size)) {
> wopcm->guc.base = guc_wopcm_base;
>
More information about the Intel-gfx
mailing list