Re: [PATCH v4 4/8] drm/i915/selftest_migrate: Check CCS meta data clear

2022-03-21 Thread Ramalingam C
On 2022-03-21 at 16:09:08 +0530, Hellstrom, Thomas wrote:
> On Sun, 2022-03-20 at 02:12 +0530, Ramalingam C wrote:
> > While clearing the Flat-CCS capable lmem object, we need to clear the
> > CCS
> > meta data corresponding to the memory.
> >
> > As part of live_migrate_clear add check for the ccs meta data clear
> > for
> > the Flat-CCS capable lmem object.
> >
> > Signed-off-by: Ramalingam C 
> > ---
> >  drivers/gpu/drm/i915/gt/intel_migrate.c|  32 +++
> >  drivers/gpu/drm/i915/gt/selftest_migrate.c | 274 ++-
> > --
> >  2 files changed, 278 insertions(+), 28 deletions(-)
> >
> > diff --git a/drivers/gpu/drm/i915/gt/intel_migrate.c
> > b/drivers/gpu/drm/i915/gt/intel_migrate.c
> > index c1db8daf994a..bbfea570c239 100644
> > --- a/drivers/gpu/drm/i915/gt/intel_migrate.c
> > +++ b/drivers/gpu/drm/i915/gt/intel_migrate.c
> > @@ -572,6 +572,38 @@ static u32 *_i915_ctrl_surf_copy_blt(u32 *cmd,
> > u64 src_addr, u64 dst_addr,
> > return cmd;
> >  }
> >
> > +static int emit_copy_ccs(struct i915_request *rq,
> > +u32 dst_offset, u8 dst_access,
> > +u32 src_offset, u8 src_access, int size)
> > +{
> > +   struct drm_i915_private *i915 = rq->engine->i915;
> > +   int mocs = rq->engine->gt->mocs.uc_index << 1;
> > +   u32 num_ccs_blks, ccs_ring_size;
> > +   u32 *cs;
> > +
> > +   ccs_ring_size = calc_ctrl_surf_instr_size(i915, size);
> > +   WARN_ON(!ccs_ring_size);
> > +
> > +   cs = intel_ring_begin(rq, round_up(ccs_ring_size, 2));
> > +   if (IS_ERR(cs))
> > +   return PTR_ERR(cs);
> > +
> > +   num_ccs_blks = DIV_ROUND_UP(GET_CCS_BYTES(i915, size),
> > +   NUM_CCS_BYTES_PER_BLOCK);
> > +
> > +   cs = i915_flush_dw(cs, MI_FLUSH_DW_LLC | MI_FLUSH_DW_CCS);
> > +   cs = _i915_ctrl_surf_copy_blt(cs, src_offset, dst_offset,
> > + src_access, dst_access,
> > + mocs, mocs, num_ccs_blks);
> > +   cs = i915_flush_dw(cs, MI_FLUSH_DW_LLC | MI_FLUSH_DW_CCS);
> > +   if (ccs_ring_size & 1)
> > +   *cs++ = MI_NOOP;
> > +
> > +   intel_ring_advance(rq, cs);
> > +
> > +   return 0;
> > +}
> 
> 
> This would be an unused function if selftests are not configured,
> right?
No Thomas. This is reused between selftest and eviction flow. in next
version i am reusing it for evict_clear too.

> 
> 
> > +
> >  static int emit_copy(struct i915_request *rq,
> >  u32 dst_offset, u32 src_offset, int size)
> >  {
> > diff --git a/drivers/gpu/drm/i915/gt/selftest_migrate.c
> > b/drivers/gpu/drm/i915/gt/selftest_migrate.c
> > index b5da8b8cd039..e32cc994f4a2 100644
> > --- a/drivers/gpu/drm/i915/gt/selftest_migrate.c
> > +++ b/drivers/gpu/drm/i915/gt/selftest_migrate.c
> > @@ -132,6 +132,126 @@ static int copy(struct intel_migrate *migrate,
> > return err;
> >  }
> >
> > +static int intel_context_copy_ccs(struct intel_context *ce,
> > + const struct i915_deps *deps,
> > + struct scatterlist *sg,
> > + enum i915_cache_level cache_level,
> > + bool write_to_ccs,
> > + struct i915_request **out)
> > +{
> > +   u8 src_access = write_to_ccs ? DIRECT_ACCESS :
> > INDIRECT_ACCESS;
> > +   u8 dst_access = write_to_ccs ? INDIRECT_ACCESS :
> > DIRECT_ACCESS;
> > +   struct sgt_dma it = sg_sgt(sg);
> > +   struct i915_request *rq;
> > +   u32 offset;
> > +   int err;
> > +
> > +   GEM_BUG_ON(ce->vm != ce->engine->gt->migrate.context->vm);
> > +   *out = NULL;
> > +
> > +   GEM_BUG_ON(ce->ring->size < SZ_64K);
> > +
> > +   offset = 0;
> > +   if (HAS_64K_PAGES(ce->engine->i915))
> > +   offset = CHUNK_SZ;
> > +   offset += (u64)rq->engine->instance << 32;
> > +
> > +   do {
> > +   int len;
> > +
> > +   rq = i915_request_create(ce);
> > +   if (IS_ERR(rq)) {
> > +   err = PTR_ERR(rq);
> > +   goto out_ce;
> > +   }
> > +
> > +   if (deps) {
> > +   err = i915_request_await_deps(rq, deps);
> > +   if (err)
> > +   goto out_rq;
> > +
> > +   if (rq->engine->emit_init_breadcrumb) {
> > +   err = rq->engine-
> > >emit_init_breadcrumb(rq);
> > +   if (err)
> > +   goto out_rq;
> > +   }
> > +
> > +   deps = NULL;
> > +   }
> > +
> > +   /* The PTE updates + clear must not be interrupted.
> > */
> > +   err = emit_no_arbitration(rq);
> > +   if (err)
> > +   goto out_rq;

Re: [PATCH v4 4/8] drm/i915/selftest_migrate: Check CCS meta data clear

2022-03-21 Thread Hellstrom, Thomas
On Sun, 2022-03-20 at 02:12 +0530, Ramalingam C wrote:
> While clearing the Flat-CCS capable lmem object, we need to clear the
> CCS
> meta data corresponding to the memory.
> 
> As part of live_migrate_clear add check for the ccs meta data clear
> for
> the Flat-CCS capable lmem object.
> 
> Signed-off-by: Ramalingam C 
> ---
>  drivers/gpu/drm/i915/gt/intel_migrate.c    |  32 +++
>  drivers/gpu/drm/i915/gt/selftest_migrate.c | 274 ++-
> --
>  2 files changed, 278 insertions(+), 28 deletions(-)
> 
> diff --git a/drivers/gpu/drm/i915/gt/intel_migrate.c
> b/drivers/gpu/drm/i915/gt/intel_migrate.c
> index c1db8daf994a..bbfea570c239 100644
> --- a/drivers/gpu/drm/i915/gt/intel_migrate.c
> +++ b/drivers/gpu/drm/i915/gt/intel_migrate.c
> @@ -572,6 +572,38 @@ static u32 *_i915_ctrl_surf_copy_blt(u32 *cmd,
> u64 src_addr, u64 dst_addr,
> return cmd;
>  }
>  
> +static int emit_copy_ccs(struct i915_request *rq,
> +    u32 dst_offset, u8 dst_access,
> +    u32 src_offset, u8 src_access, int size)
> +{
> +   struct drm_i915_private *i915 = rq->engine->i915;
> +   int mocs = rq->engine->gt->mocs.uc_index << 1;
> +   u32 num_ccs_blks, ccs_ring_size;
> +   u32 *cs;
> +
> +   ccs_ring_size = calc_ctrl_surf_instr_size(i915, size);
> +   WARN_ON(!ccs_ring_size);
> +
> +   cs = intel_ring_begin(rq, round_up(ccs_ring_size, 2));
> +   if (IS_ERR(cs))
> +   return PTR_ERR(cs);
> +
> +   num_ccs_blks = DIV_ROUND_UP(GET_CCS_BYTES(i915, size),
> +   NUM_CCS_BYTES_PER_BLOCK);
> +
> +   cs = i915_flush_dw(cs, MI_FLUSH_DW_LLC | MI_FLUSH_DW_CCS);
> +   cs = _i915_ctrl_surf_copy_blt(cs, src_offset, dst_offset,
> + src_access, dst_access,
> + mocs, mocs, num_ccs_blks);
> +   cs = i915_flush_dw(cs, MI_FLUSH_DW_LLC | MI_FLUSH_DW_CCS);
> +   if (ccs_ring_size & 1)
> +   *cs++ = MI_NOOP;
> +
> +   intel_ring_advance(rq, cs);
> +
> +   return 0;
> +}


This would be an unused function if selftests are not configured,
right?


> +
>  static int emit_copy(struct i915_request *rq,
>  u32 dst_offset, u32 src_offset, int size)
>  {
> diff --git a/drivers/gpu/drm/i915/gt/selftest_migrate.c
> b/drivers/gpu/drm/i915/gt/selftest_migrate.c
> index b5da8b8cd039..e32cc994f4a2 100644
> --- a/drivers/gpu/drm/i915/gt/selftest_migrate.c
> +++ b/drivers/gpu/drm/i915/gt/selftest_migrate.c
> @@ -132,6 +132,126 @@ static int copy(struct intel_migrate *migrate,
> return err;
>  }
>  
> +static int intel_context_copy_ccs(struct intel_context *ce,
> + const struct i915_deps *deps,
> + struct scatterlist *sg,
> + enum i915_cache_level cache_level,
> + bool write_to_ccs,
> + struct i915_request **out)
> +{
> +   u8 src_access = write_to_ccs ? DIRECT_ACCESS :
> INDIRECT_ACCESS;
> +   u8 dst_access = write_to_ccs ? INDIRECT_ACCESS :
> DIRECT_ACCESS;
> +   struct sgt_dma it = sg_sgt(sg);
> +   struct i915_request *rq;
> +   u32 offset;
> +   int err;
> +
> +   GEM_BUG_ON(ce->vm != ce->engine->gt->migrate.context->vm);
> +   *out = NULL;
> +
> +   GEM_BUG_ON(ce->ring->size < SZ_64K);
> +
> +   offset = 0;
> +   if (HAS_64K_PAGES(ce->engine->i915))
> +   offset = CHUNK_SZ;
> +   offset += (u64)rq->engine->instance << 32;
> +
> +   do {
> +   int len;
> +
> +   rq = i915_request_create(ce);
> +   if (IS_ERR(rq)) {
> +   err = PTR_ERR(rq);
> +   goto out_ce;
> +   }
> +
> +   if (deps) {
> +   err = i915_request_await_deps(rq, deps);
> +   if (err)
> +   goto out_rq;
> +
> +   if (rq->engine->emit_init_breadcrumb) {
> +   err = rq->engine-
> >emit_init_breadcrumb(rq);
> +   if (err)
> +   goto out_rq;
> +   }
> +
> +   deps = NULL;
> +   }
> +
> +   /* The PTE updates + clear must not be interrupted.
> */
> +   err = emit_no_arbitration(rq);
> +   if (err)
> +   goto out_rq;
> +
> +   len = emit_pte(rq, , cache_level, true, offset,
> CHUNK_SZ);
> +   if (len <= 0) {
> +   err = len;
> +   goto out_rq;
> +   }
> +
> +   err = rq->engine->emit_flush(rq, EMIT_INVALIDATE);
> +   if (err)
> +   goto out_rq;
> +
> +   err = emit_copy_ccs(rq, offset, dst_access,
> +

Re: [Intel-gfx] [PATCH v4 4/8] drm/i915/selftest_migrate: Check CCS meta data clear

2022-03-19 Thread kernel test robot
Hi Ramalingam,

Thank you for the patch! Yet something to improve:

[auto build test ERROR on drm-intel/for-linux-next]
[also build test ERROR on drm/drm-next drm-tip/drm-tip next-20220318]
[cannot apply to v5.17-rc8]
[If your patch is applied to the wrong git tree, kindly drop us a note.
And when submitting patch, we suggest to use '--base' as documented in
https://git-scm.com/docs/git-format-patch]

url:
https://github.com/0day-ci/linux/commits/Ramalingam-C/drm-i915-ttm-Evict-and-restore-of-compressed-object/20220320-044242
base:   git://anongit.freedesktop.org/drm-intel for-linux-next
config: i386-allyesconfig 
(https://download.01.org/0day-ci/archive/20220320/202203200912.4mqfvte9-...@intel.com/config)
compiler: gcc-9 (Ubuntu 9.4.0-1ubuntu1~20.04) 9.4.0
reproduce (this is a W=1 build):
# 
https://github.com/0day-ci/linux/commit/afd58bdbf43437bf72ff2313776c3036ebf99a11
git remote add linux-review https://github.com/0day-ci/linux
git fetch --no-tags linux-review 
Ramalingam-C/drm-i915-ttm-Evict-and-restore-of-compressed-object/20220320-044242
git checkout afd58bdbf43437bf72ff2313776c3036ebf99a11
# save the config file to linux build tree
mkdir build_dir
make W=1 O=build_dir ARCH=i386 SHELL=/bin/bash

If you fix the issue, kindly add following tag as appropriate
Reported-by: kernel test robot 

All errors (new ones prefixed by >>):

   In file included from include/linux/kernel.h:29,
from arch/x86/include/asm/percpu.h:27,
from arch/x86/include/asm/current.h:6,
from arch/x86/include/asm/processor.h:17,
from arch/x86/include/asm/kvm_para.h:5,
from arch/x86/include/asm/hypervisor.h:37,
from drivers/gpu/drm/i915/i915_drv.h:35,
from drivers/gpu/drm/i915/gt/intel_migrate.c:6:
   drivers/gpu/drm/i915/gt/selftest_migrate.c: In function 'clear':
>> include/linux/kern_levels.h:5:18: error: format '%lu' expects argument of 
>> type 'long unsigned int', but argument 4 has type 'unsigned int' 
>> [-Werror=format=]
   5 | #define KERN_SOH "\001"  /* ASCII Start Of Header */
 |  ^~
   include/linux/printk.h:418:11: note: in definition of macro 
'printk_index_wrap'
 418 |   _p_func(_fmt, ##__VA_ARGS__);\
 |   ^~~~
   include/linux/printk.h:489:2: note: in expansion of macro 'printk'
 489 |  printk(KERN_ERR pr_fmt(fmt), ##__VA_ARGS__)
 |  ^~
   include/linux/kern_levels.h:11:18: note: in expansion of macro 'KERN_SOH'
  11 | #define KERN_ERR KERN_SOH "3" /* error conditions */
 |  ^~~~
   include/linux/printk.h:489:9: note: in expansion of macro 'KERN_ERR'
 489 |  printk(KERN_ERR pr_fmt(fmt), ##__VA_ARGS__)
 | ^~~~
   drivers/gpu/drm/i915/gt/selftest_migrate.c:403:6: note: in expansion of 
macro 'pr_err'
 403 |  pr_err("%ps ccs clearing failed, offset: %d/%lu\n",
 |  ^~
   In file included from drivers/gpu/drm/i915/gt/intel_migrate.c:1014:
   drivers/gpu/drm/i915/gt/selftest_migrate.c:403:52: note: format string is 
defined here
 403 |  pr_err("%ps ccs clearing failed, offset: %d/%lu\n",
 |  ~~^
 ||
 |long unsigned int
 |  %u
   drivers/gpu/drm/i915/gt/intel_migrate.c: In function 
'intel_context_copy_ccs':
>> drivers/gpu/drm/i915/gt/selftest_migrate.c:157:19: error: 'rq' is used 
>> uninitialized in this function [-Werror=uninitialized]
 157 |  offset += (u64)rq->engine->instance << 32;
 | ~~^~~~
   cc1: all warnings being treated as errors


vim +/rq +157 drivers/gpu/drm/i915/gt/selftest_migrate.c

   134  
   135  static int intel_context_copy_ccs(struct intel_context *ce,
   136const struct i915_deps *deps,
   137struct scatterlist *sg,
   138enum i915_cache_level cache_level,
   139bool write_to_ccs,
   140struct i915_request **out)
   141  {
   142  u8 src_access = write_to_ccs ? DIRECT_ACCESS : INDIRECT_ACCESS;
   143  u8 dst_access = write_to_ccs ? INDIRECT_ACCESS : DIRECT_ACCESS;
   144  struct sgt_dma it = sg_sgt(sg);
   145  struct i915_request *rq;
   146  u32 offset;
   147  int err;
   148  
   149  GEM_BUG_ON(ce->vm != ce->engine->gt->migrate.context->vm);
   150  *out = NULL;
   151  
   152  GEM_BUG_ON(ce->ring->size < SZ_64K);
   153  
   154  offset = 0;
   155  if (HAS_64K_PAGES(ce->engine->i915))
   156  offset 

[PATCH v4 4/8] drm/i915/selftest_migrate: Check CCS meta data clear

2022-03-19 Thread Ramalingam C
While clearing the Flat-CCS capable lmem object, we need to clear the CCS
meta data corresponding to the memory.

As part of live_migrate_clear add check for the ccs meta data clear for
the Flat-CCS capable lmem object.

Signed-off-by: Ramalingam C 
---
 drivers/gpu/drm/i915/gt/intel_migrate.c|  32 +++
 drivers/gpu/drm/i915/gt/selftest_migrate.c | 274 ++---
 2 files changed, 278 insertions(+), 28 deletions(-)

diff --git a/drivers/gpu/drm/i915/gt/intel_migrate.c 
b/drivers/gpu/drm/i915/gt/intel_migrate.c
index c1db8daf994a..bbfea570c239 100644
--- a/drivers/gpu/drm/i915/gt/intel_migrate.c
+++ b/drivers/gpu/drm/i915/gt/intel_migrate.c
@@ -572,6 +572,38 @@ static u32 *_i915_ctrl_surf_copy_blt(u32 *cmd, u64 
src_addr, u64 dst_addr,
return cmd;
 }
 
+static int emit_copy_ccs(struct i915_request *rq,
+u32 dst_offset, u8 dst_access,
+u32 src_offset, u8 src_access, int size)
+{
+   struct drm_i915_private *i915 = rq->engine->i915;
+   int mocs = rq->engine->gt->mocs.uc_index << 1;
+   u32 num_ccs_blks, ccs_ring_size;
+   u32 *cs;
+
+   ccs_ring_size = calc_ctrl_surf_instr_size(i915, size);
+   WARN_ON(!ccs_ring_size);
+
+   cs = intel_ring_begin(rq, round_up(ccs_ring_size, 2));
+   if (IS_ERR(cs))
+   return PTR_ERR(cs);
+
+   num_ccs_blks = DIV_ROUND_UP(GET_CCS_BYTES(i915, size),
+   NUM_CCS_BYTES_PER_BLOCK);
+
+   cs = i915_flush_dw(cs, MI_FLUSH_DW_LLC | MI_FLUSH_DW_CCS);
+   cs = _i915_ctrl_surf_copy_blt(cs, src_offset, dst_offset,
+ src_access, dst_access,
+ mocs, mocs, num_ccs_blks);
+   cs = i915_flush_dw(cs, MI_FLUSH_DW_LLC | MI_FLUSH_DW_CCS);
+   if (ccs_ring_size & 1)
+   *cs++ = MI_NOOP;
+
+   intel_ring_advance(rq, cs);
+
+   return 0;
+}
+
 static int emit_copy(struct i915_request *rq,
 u32 dst_offset, u32 src_offset, int size)
 {
diff --git a/drivers/gpu/drm/i915/gt/selftest_migrate.c 
b/drivers/gpu/drm/i915/gt/selftest_migrate.c
index b5da8b8cd039..e32cc994f4a2 100644
--- a/drivers/gpu/drm/i915/gt/selftest_migrate.c
+++ b/drivers/gpu/drm/i915/gt/selftest_migrate.c
@@ -132,6 +132,126 @@ static int copy(struct intel_migrate *migrate,
return err;
 }
 
+static int intel_context_copy_ccs(struct intel_context *ce,
+ const struct i915_deps *deps,
+ struct scatterlist *sg,
+ enum i915_cache_level cache_level,
+ bool write_to_ccs,
+ struct i915_request **out)
+{
+   u8 src_access = write_to_ccs ? DIRECT_ACCESS : INDIRECT_ACCESS;
+   u8 dst_access = write_to_ccs ? INDIRECT_ACCESS : DIRECT_ACCESS;
+   struct sgt_dma it = sg_sgt(sg);
+   struct i915_request *rq;
+   u32 offset;
+   int err;
+
+   GEM_BUG_ON(ce->vm != ce->engine->gt->migrate.context->vm);
+   *out = NULL;
+
+   GEM_BUG_ON(ce->ring->size < SZ_64K);
+
+   offset = 0;
+   if (HAS_64K_PAGES(ce->engine->i915))
+   offset = CHUNK_SZ;
+   offset += (u64)rq->engine->instance << 32;
+
+   do {
+   int len;
+
+   rq = i915_request_create(ce);
+   if (IS_ERR(rq)) {
+   err = PTR_ERR(rq);
+   goto out_ce;
+   }
+
+   if (deps) {
+   err = i915_request_await_deps(rq, deps);
+   if (err)
+   goto out_rq;
+
+   if (rq->engine->emit_init_breadcrumb) {
+   err = rq->engine->emit_init_breadcrumb(rq);
+   if (err)
+   goto out_rq;
+   }
+
+   deps = NULL;
+   }
+
+   /* The PTE updates + clear must not be interrupted. */
+   err = emit_no_arbitration(rq);
+   if (err)
+   goto out_rq;
+
+   len = emit_pte(rq, , cache_level, true, offset, CHUNK_SZ);
+   if (len <= 0) {
+   err = len;
+   goto out_rq;
+   }
+
+   err = rq->engine->emit_flush(rq, EMIT_INVALIDATE);
+   if (err)
+   goto out_rq;
+
+   err = emit_copy_ccs(rq, offset, dst_access,
+   offset, src_access, len);
+   if (err)
+   goto out_rq;
+
+   err = rq->engine->emit_flush(rq, EMIT_INVALIDATE |
+MI_FLUSH_DW_CCS);
+
+   /* Arbitration is re-enabled between requests. */
+out_rq:
+   if (*out)
+   i915_request_put(*out);
+