Re: [Intel-gfx] [PATCH] drm/i915: Add Wa_14010733141

2021-04-06 Thread Daniele Ceraolo Spurio




On 4/1/2021 9:28 AM, Aditya Swarup wrote:

The WA requires the following procedure for VDBox SFC reset:

If (MFX-SFC usage is 1) {
1.Issue a MFX-SFC forced lock
2.Wait for MFX-SFC forced lock ack
3.Check the MFX-SFC usage bit
If (MFX-SFC usage bit is 1)
Reset VDBOX and SFC
else
Reset VDBOX
Release the force lock MFX-SFC
}
else if(HCP+SFC usage is 1) {
1.Issue a VE-SFC forced lock
2.Wait for SFC forced lock ack
3.Check the VE-SFC usage bit
If (VE-SFC usage bit is 1)
Reset VDBOX
else
Reset VDBOX and SFC
Release the force lock VE-SFC.
}
else
Reset VDBOX

- Restructure: the changes to the original code flow should stay
   relatively minimal; we only need to do an extra HCP check after the
   usual VD-MFX check and, if true, switch the register/bit we're
   performing the lock on.(MattR)

Bspec: 52890, 53509

Co-developed-by: Matt Roper 
Cc: Tvrtko Ursulin 
Cc: Matt Roper 
Cc: Daniele Ceraolo Spurio 
Cc: Lucas De Marchi 
Signed-off-by: Aditya Swarup 
Signed-off-by: Matt Roper 
---
  drivers/gpu/drm/i915/gt/intel_reset.c | 194 +-
  drivers/gpu/drm/i915/i915_reg.h   |   6 +
  2 files changed, 137 insertions(+), 63 deletions(-)

diff --git a/drivers/gpu/drm/i915/gt/intel_reset.c 
b/drivers/gpu/drm/i915/gt/intel_reset.c
index a377c4588aaa..bcb3d864db11 100644
--- a/drivers/gpu/drm/i915/gt/intel_reset.c
+++ b/drivers/gpu/drm/i915/gt/intel_reset.c
@@ -338,15 +338,69 @@ static int gen6_reset_engines(struct intel_gt *gt,
return gen6_hw_domain_reset(gt, hw_mask);
  }
  
-static int gen11_lock_sfc(struct intel_engine_cs *engine, u32 *hw_mask)

+static struct intel_engine_cs *find_sfc_paired_vecs_engine(struct 
intel_engine_cs *engine)
+{
+   int vecs_id;
+
+   GEM_BUG_ON(engine->class != VIDEO_DECODE_CLASS);
+
+   vecs_id = _VECS((engine->instance) / 2);
+
+   return engine->gt->engine[vecs_id];
+}
+
+struct sfc_lock_data {
+   i915_reg_t lock_reg;
+   i915_reg_t ack_reg;
+   i915_reg_t usage_reg;
+   u32 lock_bit;
+   u32 ack_bit;
+   u32 usage_bit;
+   u32 reset_bit;
+};
+
+static void get_sfc_forced_lock_data(struct intel_engine_cs *engine,
+struct sfc_lock_data *sfc_lock)
+{
+   switch (engine->class) {
+   default:
+   MISSING_CASE(engine->class);
+   fallthrough;
+   case VIDEO_DECODE_CLASS:
+   sfc_lock->lock_reg = GEN11_VCS_SFC_FORCED_LOCK(engine);
+   sfc_lock->lock_bit = GEN11_VCS_SFC_FORCED_LOCK_BIT;
+
+   sfc_lock->ack_reg = GEN11_VCS_SFC_LOCK_STATUS(engine);
+   sfc_lock->ack_bit  = GEN11_VCS_SFC_LOCK_ACK_BIT;
+
+   sfc_lock->usage_reg = GEN11_VCS_SFC_LOCK_STATUS(engine);
+   sfc_lock->usage_bit = GEN11_VCS_SFC_USAGE_BIT;
+   sfc_lock->reset_bit = GEN11_VCS_SFC_RESET_BIT(engine->instance);
+
+   break;
+   case VIDEO_ENHANCEMENT_CLASS:
+   sfc_lock->lock_reg = GEN11_VECS_SFC_FORCED_LOCK(engine);
+   sfc_lock->lock_bit = GEN11_VECS_SFC_FORCED_LOCK_BIT;
+
+   sfc_lock->ack_reg = GEN11_VECS_SFC_LOCK_ACK(engine);
+   sfc_lock->ack_bit  = GEN11_VECS_SFC_LOCK_ACK_BIT;
+
+   sfc_lock->usage_reg = GEN11_VECS_SFC_USAGE(engine);
+   sfc_lock->usage_bit = GEN11_VECS_SFC_USAGE_BIT;
+   sfc_lock->reset_bit = 
GEN11_VECS_SFC_RESET_BIT(engine->instance);
+
+   break;
+   }
+}
+
+static int gen11_lock_sfc(struct intel_engine_cs *engine,
+ u32 *reset_mask,
+ u32 *unlock_mask)
  {
struct intel_uncore *uncore = engine->uncore;
u8 vdbox_sfc_access = engine->gt->info.vdbox_sfc_access;
-   i915_reg_t sfc_forced_lock, sfc_forced_lock_ack;
-   u32 sfc_forced_lock_bit, sfc_forced_lock_ack_bit;
-   i915_reg_t sfc_usage;
-   u32 sfc_usage_bit;
-   u32 sfc_reset_bit;
+   struct sfc_lock_data sfc_lock;
+   bool lock_obtained, lock_to_other = false;
int ret;
  
  	switch (engine->class) {

@@ -354,53 +408,72 @@ static int gen11_lock_sfc(struct intel_engine_cs *engine, 
u32 *hw_mask)
if ((BIT(engine->instance) & vdbox_sfc_access) == 0)
return 0;
  
-		sfc_forced_lock = GEN11_VCS_SFC_FORCED_LOCK(engine);

-   sfc_forced_lock_bit = GEN11_VCS_SFC_FORCED_LOCK_BIT;
-
-   sfc_forced_lock_ack = GEN11_VCS_SFC_LOCK_STATUS(engine);
-   sfc_forced_lock_ack_bit  = GEN11_VCS_SFC_LOCK_ACK_BIT;
+   fallthrough;
+   case VIDEO_ENHANCEMENT_CLASS:
+   get_sfc_forced_lock_data(engine, _lock);
  
-		sfc_usage = GEN11_VCS_SFC_LOCK_STATUS(engine);

-   sfc_usage_bit = GEN11_VCS_SFC_USAGE_BIT;
-   sfc_reset_bit = 

[Intel-gfx] [PATCH] drm/i915: Add Wa_14010733141

2021-04-01 Thread Aditya Swarup
The WA requires the following procedure for VDBox SFC reset:

If (MFX-SFC usage is 1) {
1.Issue a MFX-SFC forced lock
2.Wait for MFX-SFC forced lock ack
3.Check the MFX-SFC usage bit
If (MFX-SFC usage bit is 1)
Reset VDBOX and SFC
else
Reset VDBOX
Release the force lock MFX-SFC
}
else if(HCP+SFC usage is 1) {
1.Issue a VE-SFC forced lock
2.Wait for SFC forced lock ack
3.Check the VE-SFC usage bit
If (VE-SFC usage bit is 1)
Reset VDBOX
else
Reset VDBOX and SFC
Release the force lock VE-SFC.
}
else
Reset VDBOX

- Restructure: the changes to the original code flow should stay
  relatively minimal; we only need to do an extra HCP check after the
  usual VD-MFX check and, if true, switch the register/bit we're
  performing the lock on.(MattR)

Bspec: 52890, 53509

Co-developed-by: Matt Roper 
Cc: Tvrtko Ursulin 
Cc: Matt Roper 
Cc: Daniele Ceraolo Spurio 
Cc: Lucas De Marchi 
Signed-off-by: Aditya Swarup 
Signed-off-by: Matt Roper 
---
 drivers/gpu/drm/i915/gt/intel_reset.c | 194 +-
 drivers/gpu/drm/i915/i915_reg.h   |   6 +
 2 files changed, 137 insertions(+), 63 deletions(-)

diff --git a/drivers/gpu/drm/i915/gt/intel_reset.c 
b/drivers/gpu/drm/i915/gt/intel_reset.c
index a377c4588aaa..bcb3d864db11 100644
--- a/drivers/gpu/drm/i915/gt/intel_reset.c
+++ b/drivers/gpu/drm/i915/gt/intel_reset.c
@@ -338,15 +338,69 @@ static int gen6_reset_engines(struct intel_gt *gt,
return gen6_hw_domain_reset(gt, hw_mask);
 }
 
-static int gen11_lock_sfc(struct intel_engine_cs *engine, u32 *hw_mask)
+static struct intel_engine_cs *find_sfc_paired_vecs_engine(struct 
intel_engine_cs *engine)
+{
+   int vecs_id;
+
+   GEM_BUG_ON(engine->class != VIDEO_DECODE_CLASS);
+
+   vecs_id = _VECS((engine->instance) / 2);
+
+   return engine->gt->engine[vecs_id];
+}
+
+struct sfc_lock_data {
+   i915_reg_t lock_reg;
+   i915_reg_t ack_reg;
+   i915_reg_t usage_reg;
+   u32 lock_bit;
+   u32 ack_bit;
+   u32 usage_bit;
+   u32 reset_bit;
+};
+
+static void get_sfc_forced_lock_data(struct intel_engine_cs *engine,
+struct sfc_lock_data *sfc_lock)
+{
+   switch (engine->class) {
+   default:
+   MISSING_CASE(engine->class);
+   fallthrough;
+   case VIDEO_DECODE_CLASS:
+   sfc_lock->lock_reg = GEN11_VCS_SFC_FORCED_LOCK(engine);
+   sfc_lock->lock_bit = GEN11_VCS_SFC_FORCED_LOCK_BIT;
+
+   sfc_lock->ack_reg = GEN11_VCS_SFC_LOCK_STATUS(engine);
+   sfc_lock->ack_bit  = GEN11_VCS_SFC_LOCK_ACK_BIT;
+
+   sfc_lock->usage_reg = GEN11_VCS_SFC_LOCK_STATUS(engine);
+   sfc_lock->usage_bit = GEN11_VCS_SFC_USAGE_BIT;
+   sfc_lock->reset_bit = GEN11_VCS_SFC_RESET_BIT(engine->instance);
+
+   break;
+   case VIDEO_ENHANCEMENT_CLASS:
+   sfc_lock->lock_reg = GEN11_VECS_SFC_FORCED_LOCK(engine);
+   sfc_lock->lock_bit = GEN11_VECS_SFC_FORCED_LOCK_BIT;
+
+   sfc_lock->ack_reg = GEN11_VECS_SFC_LOCK_ACK(engine);
+   sfc_lock->ack_bit  = GEN11_VECS_SFC_LOCK_ACK_BIT;
+
+   sfc_lock->usage_reg = GEN11_VECS_SFC_USAGE(engine);
+   sfc_lock->usage_bit = GEN11_VECS_SFC_USAGE_BIT;
+   sfc_lock->reset_bit = 
GEN11_VECS_SFC_RESET_BIT(engine->instance);
+
+   break;
+   }
+}
+
+static int gen11_lock_sfc(struct intel_engine_cs *engine,
+ u32 *reset_mask,
+ u32 *unlock_mask)
 {
struct intel_uncore *uncore = engine->uncore;
u8 vdbox_sfc_access = engine->gt->info.vdbox_sfc_access;
-   i915_reg_t sfc_forced_lock, sfc_forced_lock_ack;
-   u32 sfc_forced_lock_bit, sfc_forced_lock_ack_bit;
-   i915_reg_t sfc_usage;
-   u32 sfc_usage_bit;
-   u32 sfc_reset_bit;
+   struct sfc_lock_data sfc_lock;
+   bool lock_obtained, lock_to_other = false;
int ret;
 
switch (engine->class) {
@@ -354,53 +408,72 @@ static int gen11_lock_sfc(struct intel_engine_cs *engine, 
u32 *hw_mask)
if ((BIT(engine->instance) & vdbox_sfc_access) == 0)
return 0;
 
-   sfc_forced_lock = GEN11_VCS_SFC_FORCED_LOCK(engine);
-   sfc_forced_lock_bit = GEN11_VCS_SFC_FORCED_LOCK_BIT;
-
-   sfc_forced_lock_ack = GEN11_VCS_SFC_LOCK_STATUS(engine);
-   sfc_forced_lock_ack_bit  = GEN11_VCS_SFC_LOCK_ACK_BIT;
+   fallthrough;
+   case VIDEO_ENHANCEMENT_CLASS:
+   get_sfc_forced_lock_data(engine, _lock);
 
-   sfc_usage = GEN11_VCS_SFC_LOCK_STATUS(engine);
-   sfc_usage_bit = GEN11_VCS_SFC_USAGE_BIT;
-   sfc_reset_bit =