All of lore.kernel.org
 help / color / mirror / Atom feed
From: "Kumar Valsan, Prathap" <prathap.kumar.valsan@intel.com>
To: Chris Wilson <chris@chris-wilson.co.uk>
Cc: igt-dev@lists.freedesktop.org,
	De Marchi Lucas <lucas.demarchi@intel.com>
Subject: Re: [igt-dev] [PATCH i-g-t v6] i915/gem_mocs_settings: Add mocs table for icelake
Date: Fri, 15 Mar 2019 15:28:29 -0400	[thread overview]
Message-ID: <20190315192829.GA30702@intel.com> (raw)
In-Reply-To: <155263959127.4168.5666016659107127104@skylake-alporthouse-com>

On Fri, Mar 15, 2019 at 08:46:31AM +0000, Chris Wilson wrote:
> Quoting Prathap Kumar Valsan (2019-03-14 17:28:52)
> > From: "Kumar Valsan, Prathap" <prathap.kumar.valsan@intel.com>
> > 
> > This patch adds mocs table for icelake with expected L3 and eDRAM
> > control values.
> > 
> > Signed-off-by: Kumar Valsan, Prathap <prathap.kumar.valsan@intel.com>
> > ---
> > Changes in v6:
> > - We need to test non-privileged write to MOCS
> >   is dropped by the hardware.(As suggested by Chris)
> > Changes in v5:
> > - As mocs table is global, test need not write
> >   mocs table. Below jira has the discussion. 
> >   https://jira.devtools.intel.com/browse/VLK-1567
> > Changes in v4:
> > - L3 control registers are global in icelake.
> >   Test validates that dirty writes from userspace
> >   to L3 control registers are being dropped. 
> > Changes in v3:
> > - There are holes in the mocs table(Lucas Pointed out).
> >   In icelake index 16 and 17 are reserved.
> >   So test shouldn't be checking them.
> > Changes in v2:
> > - Cleaned up the code based on review
> >   comments from Lucas and Chris
> > 
> >  tests/i915/gem_mocs_settings.c | 147 ++++++++++++++++++++++++---------
> >  1 file changed, 109 insertions(+), 38 deletions(-)
> > 
> > diff --git a/tests/i915/gem_mocs_settings.c b/tests/i915/gem_mocs_settings.c
> > index 5b3b6bc1..3acaa615 100644
> > --- a/tests/i915/gem_mocs_settings.c
> > +++ b/tests/i915/gem_mocs_settings.c
> > @@ -32,7 +32,9 @@
> >  #include "igt_perf.h"
> >  #include "igt_sysfs.h"
> >  
> > -#define MAX_NUMBER_MOCS_REGISTERS      (64)
> > +#define GEN9_NUM_MOCS_ENTRIES   62  /* 62 out of 64 - 63 & 64 are reserved. */
> > +#define GEN11_NUM_MOCS_ENTRIES  64  /* 63-64 are reserved, but configured. */
> > +
> >  enum {
> >         NONE,
> >         RESET,
> > @@ -52,8 +54,10 @@ static const char * const test_modes[] = {
> >  
> >  #define MOCS_NON_DEFAULT_CTX   (1<<0)
> >  #define MOCS_DIRTY_VALUES      (1<<1)
> > +#define MOCS_NONPRIVILEGED_DIRTY_VALUES        (1<<2)
> >  #define ALL_MOCS_FLAGS         (MOCS_NON_DEFAULT_CTX | \
> > -                                MOCS_DIRTY_VALUES)
> > +                                MOCS_DIRTY_VALUES | \
> > +                                MOCS_NONPRIVILEGED_DIRTY_VALUES)
> >  
> >  #define GEN9_LNCFCMOCS0                (0xB020)        /* L3 Cache Control base */
> >  #define GEN9_GFX_MOCS_0                (0xc800)        /* Graphics MOCS base register*/
> > @@ -61,10 +65,13 @@ static const char * const test_modes[] = {
> >  #define GEN9_MFX1_MOCS_0       (0xcA00)        /* Media 1 MOCS base register*/
> >  #define GEN9_VEBOX_MOCS_0      (0xcB00)        /* Video MOCS base register*/
> >  #define GEN9_BLT_MOCS_0                (0xcc00)        /* Blitter MOCS base register*/
> > +#define ICELAKE_MOCS_PTE       {0x00000004, 0x0030, 0x1}
> > +#define MOCS_PTE               {0x00000038, 0x0030, 0x1}
> >  
> >  struct mocs_entry {
> >         uint32_t        control_value;
> >         uint16_t        l3cc_value;
> > +       uint8_t         used;
> >  };
> >  
> >  struct mocs_table {
> > @@ -73,35 +80,58 @@ struct mocs_table {
> >  };
> >  
> >  /* The first entries in the MOCS tables are defined by uABI */
> > -static const struct mocs_entry skylake_mocs_table[] = {
> > -       { 0x00000009, 0x0010 },
> > -       { 0x00000038, 0x0030 },
> > -       { 0x0000003b, 0x0030 },
> > +static const struct mocs_entry icelake_mocs_table[GEN11_NUM_MOCS_ENTRIES] = {
> > +       [0]  = { 0x00000005, 0x0010, 0x1},
> > +       [1]  = ICELAKE_MOCS_PTE,
> > +       [2]  = { 0x00000037, 0x0030, 0x1},
> > +       [3]  = { 0x00000005, 0x0010, 0x1},
> > +       [4]  = { 0x00000005, 0x0030, 0x1},
> > +       [5]  = { 0x00000037, 0x0010, 0x1},
> > +       [6]  = { 0x00000017, 0x0010, 0x1},
> > +       [7]  = { 0x00000017, 0x0030, 0x1},
> > +       [8]  = { 0x00000027, 0x0010, 0x1},
> > +       [9]  = { 0x00000027, 0x0030, 0x1},
> > +       [10] = { 0x00000077, 0x0010, 0x1},
> > +       [11] = { 0x00000077, 0x0030, 0x1},
> > +       [12] = { 0x00000057, 0x0010, 0x1},
> > +       [13] = { 0x00000057, 0x0030, 0x1},
> > +       [14] = { 0x00000067, 0x0010, 0x1},
> > +       [15] = { 0x00000067, 0x0030, 0x1},
> > +       [18] = { 0x00060037, 0x0030, 0x1},
> > +       [19] = { 0x00000737, 0x0030, 0x1},
> > +       [20] = { 0x00000337, 0x0030, 0x1},
> > +       [21] = { 0x00000137, 0x0030, 0x1},
> > +       [22] = { 0x000003b7, 0x0030, 0x1},
> > +       [23] = { 0x000007b7, 0x0030, 0x1},
> > +       [24 ... 61] = ICELAKE_MOCS_PTE,
> > +       [62] = { 0x00000037, 0x0010, 0x1},
> > +       [63] = { 0x00000037, 0x0010, 0x1},
> > +};
> > +
> > +static const struct mocs_entry skylake_mocs_table[GEN9_NUM_MOCS_ENTRIES] = {
> > +       [0] = { 0x00000009, 0x0010, 0x1},
> > +       [1] = MOCS_PTE,
> > +       [2] = { 0x0000003b, 0x0030, 0x1},
> > +       [3 ... GEN9_NUM_MOCS_ENTRIES - 1] = MOCS_PTE,
> >  };
> >  
> > -static const struct mocs_entry dirty_skylake_mocs_table[] = {
> > -       { 0x00003FFF, 0x003F }, /* no snoop bit */
> > -       { 0x00003FFF, 0x003F },
> > -       { 0x00003FFF, 0x003F },
> > +static const struct mocs_entry dirty_skylake_mocs_table[GEN9_NUM_MOCS_ENTRIES] = {
> > +       [0 ... GEN9_NUM_MOCS_ENTRIES - 1] = { 0x00003FFF, 0x003F, 0x1 },
> >  };
> >  
> > -static const struct mocs_entry broxton_mocs_table[] = {
> > -       { 0x00000009, 0x0010 },
> > -       { 0x00000038, 0x0030 },
> > -       { 0x00000039, 0x0030 },
> > +static const struct mocs_entry broxton_mocs_table[GEN9_NUM_MOCS_ENTRIES] = {
> > +       [0] = { 0x00000009, 0x0010, 0x1},
> > +       [1] = MOCS_PTE,
> > +       [2] = { 0x00000039, 0x0030, 0x1},
> > +       [3 ... GEN9_NUM_MOCS_ENTRIES - 1] = MOCS_PTE,
> >  };
> >  
> > -static const struct mocs_entry dirty_broxton_mocs_table[] = {
> > -       { 0x00007FFF, 0x003F },
> > -       { 0x00007FFF, 0x003F },
> > -       { 0x00007FFF, 0x003F },
> > +static const struct mocs_entry dirty_broxton_mocs_table[GEN9_NUM_MOCS_ENTRIES] = {
> > +       [0 ... GEN9_NUM_MOCS_ENTRIES - 1] = { 0x00007FFF, 0x003F, 0x1 },
> >  };
> >  
> > -static const uint32_t write_values[] = {
> > -       0xFFFFFFFF,
> > -       0xFFFFFFFF,
> > -       0xFFFFFFFF,
> > -       0xFFFFFFFF
> > +static const uint32_t write_values[GEN9_NUM_MOCS_ENTRIES] = {
> > +       [0 ... GEN9_NUM_MOCS_ENTRIES - 1] = 0xFFFFFFFF,
> >  };
> >  
> >  static bool get_mocs_settings(int fd, struct mocs_table *table, bool dirty)
> > @@ -127,6 +157,10 @@ static bool get_mocs_settings(int fd, struct mocs_table *table, bool dirty)
> >                         table->table = broxton_mocs_table;
> >                 }
> >                 result = true;
> > +       } else if (IS_ICELAKE(devid)) {
> > +               table->size  = ARRAY_SIZE(icelake_mocs_table);
> > +               table->table = icelake_mocs_table;
> > +               result = true;
> >         }
> >  
> >         return result;
> > @@ -238,7 +272,8 @@ static void write_registers(int fd,
> >                             uint32_t reg_base,
> >                             const uint32_t *values,
> >                             uint32_t size,
> > -                           uint32_t engine_id)
> > +                           uint32_t engine_id,
> > +                           bool privileged)
> >  {
> >         struct drm_i915_gem_exec_object2 obj;
> >         struct drm_i915_gem_execbuffer2 execbuf;
> > @@ -254,7 +289,10 @@ static void write_registers(int fd,
> >         execbuf.buffer_count = 1;
> >         execbuf.batch_len = create_write_batch(batch, values, size, reg_base);
> >         i915_execbuffer2_set_context_id(execbuf, ctx_id);
> > -       execbuf.flags = I915_EXEC_SECURE | engine_id;
> > +       if (privileged)
> > +               execbuf.flags = I915_EXEC_SECURE | engine_id;
> > +       else
> > +               execbuf.flags = engine_id;
> >  
> >         gem_write(fd, handle, 0, batch, execbuf.batch_len);
> >         gem_execbuf(fd, &execbuf);
> > @@ -283,9 +321,12 @@ static void check_control_registers(int fd,
> >         read_regs = gem_mmap__cpu(fd, dst_handle, 0, 4096, PROT_READ);
> >  
> >         gem_set_domain(fd, dst_handle, I915_GEM_DOMAIN_CPU, 0);
> > -       for (int index = 0; index < table.size; index++)
> > +       for (int index = 0; index < table.size; index++) {
> > +               if (!table.table[index].used)
> > +                       continue;
> >                 igt_assert_eq_u32(read_regs[index],
> >                                   table.table[index].control_value);
> > +       }
> >  
> >         munmap(read_regs, 4096);
> >         gem_close(fd, dst_handle);
> > @@ -315,10 +356,14 @@ static void check_l3cc_registers(int fd,
> >         gem_set_domain(fd, dst_handle, I915_GEM_DOMAIN_CPU, 0);
> >  
> >         for (index = 0; index < table.size / 2; index++) {
> > -               igt_assert_eq_u32(read_regs[index] & 0xffff,
> > -                                 table.table[index * 2].l3cc_value);
> > -               igt_assert_eq_u32(read_regs[index] >> 16,
> > -                                 table.table[index * 2 + 1].l3cc_value);
> > +               if (table.table[index * 2].used) {
> > +                       igt_assert_eq_u32(read_regs[index] & 0xffff,
> > +                                         table.table[index * 2].l3cc_value);
> > +               }
> > +               if (table.table[index * 2 + 1].used) {
> > +                       igt_assert_eq_u32(read_regs[index] >> 16,
> > +                                         table.table[index * 2 + 1].l3cc_value);
> > +               }
> >         }
> >  
> >         if (table.size & 1)
> > @@ -372,16 +417,23 @@ static void check_mocs_values(int fd, unsigned engine, uint32_t ctx_id, bool dir
> >                 check_l3cc_registers(fd, engine, ctx_id, dirty);
> >  }
> >  
> > -static void write_dirty_mocs(int fd, unsigned engine, uint32_t ctx_id)
> > +static void write_dirty_mocs(int fd, unsigned engine, uint32_t ctx_id, bool privileged)
> >  {
> > +       int num_of_mocs_entries;
> > +
> > +       if (intel_gen(intel_get_drm_devid(fd)) >= 11)
> > +               num_of_mocs_entries = GEN11_NUM_MOCS_ENTRIES;
> > +       else
> > +               num_of_mocs_entries = GEN9_NUM_MOCS_ENTRIES;
> > +
> >         write_registers(fd, ctx_id, get_engine_base(engine),
> > -                       write_values, ARRAY_SIZE(write_values),
> > -                       engine);
> > +                       write_values, num_of_mocs_entries,
> > +                       engine, privileged);
> >  
> >         if (engine == I915_EXEC_RENDER)
> >                 write_registers(fd, ctx_id, GEN9_LNCFCMOCS0,
> > -                               write_values, ARRAY_SIZE(write_values),
> > -                               engine);
> > +                               write_values, num_of_mocs_entries/2,
> > +                               engine, privileged);
> >  }
> >  
> >  static void run_test(int fd, unsigned engine, unsigned flags, unsigned mode)
> > @@ -389,6 +441,14 @@ static void run_test(int fd, unsigned engine, unsigned flags, unsigned mode)
> >         uint32_t ctx_id = 0;
> >         uint32_t ctx_clean_id;
> >         uint32_t ctx_dirty_id;
> > +       uint32_t ctx_nonprivileged_dirty_id;
> > +
> > +       /* As mocs is global for GEN11+, trying privileged write to dirty
> > +        * the mocs and testing context save and restore of mocs between
> > +        * contexts is bound to fail.
> > +        */
> > +       if (flags & MOCS_DIRTY_VALUES)
> > +               igt_skip_on(intel_gen(intel_get_drm_devid(fd)) >= 11);
> >  
> >         gem_require_ring(fd, engine);
> >  
> > @@ -400,10 +460,20 @@ static void run_test(int fd, unsigned engine, unsigned flags, unsigned mode)
> >  
> >         if (flags & MOCS_DIRTY_VALUES) {
> >                 ctx_dirty_id = gem_context_create(fd);
> > -               write_dirty_mocs(fd, engine, ctx_dirty_id);
> > +               write_dirty_mocs(fd, engine, ctx_dirty_id, true);
> >                 check_mocs_values(fd, engine, ctx_dirty_id, true);
> >         }
> >  
> > +       /* Non-privileged write to dirty the mocs
> > +        * should be ignored by the hardware
> > +        */
> > +       if (flags & MOCS_NONPRIVILEGED_DIRTY_VALUES) {
> > +               ctx_nonprivileged_dirty_id = gem_context_create(fd);
> > +               write_dirty_mocs(fd, engine, ctx_nonprivileged_dirty_id, false);
> > +               check_mocs_values(fd, engine, ctx_nonprivileged_dirty_id, false);
> 
> Are we just creating a bunch of ctx and leaving them hanging? I hope we
> are least closing the fd between runs.
> 
> I would rename this test to focus on isolation:
> 	MOCS_ISOLATION, "-isolation"
> 
> if (flags & MOCS_ISOLATION) {
> 	uint32_t ctx[2] = { gem_context_create(fd), gem_context_create(fd) }
> 
> 	/* Any writes by one normal client should not affect a second client */
> 	write_dirty_mocs(fd, engine, ctx[0], false);
> 	check_mocs_values(fd, engine, ctx[1], false);
> 
> 	for (int i = 0; i < ARRAY_SIZE(ctx); i++)
> 		gem_context_destroy(fd, ctx[i]);
> }
> 
> This is just a standalone test that only needs to be checked per-engine;
> I would advise against stuffing it inside run_test().
> 
Moved to a standalone subtest.
> But other than that, I think the test is sound and exercises the uABI
> correctly (i.e. clients depend on the MOCS values being static). Bonus
> points for proving an invalid MOCS value without reading a register :)
Proving an invalid MOCS value without reading a register  wasn't
successful. One thing i tried is using I915_PARAM_HAS_CONTEXT_ISOLATION:
created a second context after writing to mocs using first context. Then
check the value returned by I915_PARAM_HAS_CONTEXT_ISOLATION. If the
second context inherited the mocs from the first context, then this
ioctl should return false for the respective engine? Not very sure i am
heading at the right direction. Will have to experiment further as TODO.
:)
- Prathap
> -Chris
_______________________________________________
igt-dev mailing list
igt-dev@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/igt-dev

  reply	other threads:[~2019-03-15 19:14 UTC|newest]

Thread overview: 41+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2019-02-15 21:46 [igt-dev] [PATCH i-g-t] i915/gem_mocs_settings: Add mocs table for icelake Prathap Kumar Valsan via igt-dev
2019-02-15 22:48 ` [igt-dev] ✓ Fi.CI.BAT: success for i915/gem_mocs_settings: Add mocs table for icelake (rev3) Patchwork
2019-02-16  6:07 ` [igt-dev] ✓ Fi.CI.IGT: " Patchwork
2019-02-20  8:33 ` [igt-dev] [PATCH i-g-t] i915/gem_mocs_settings: Add mocs table for icelake Szwichtenberg, Radoslaw
2019-02-21 22:48 ` Lucas De Marchi
2019-02-21 23:42   ` Chris Wilson
2019-02-22 17:49     ` Lucas De Marchi
2019-02-22 14:05 ` [igt-dev] ✗ Fi.CI.BAT: failure for i915/gem_mocs_settings: Add mocs table for icelake (rev4) Patchwork
2019-02-22 14:17 ` [igt-dev] [PATCH i-g-t v2] i915/gem_mocs_settings: Add mocs table for icelake Prathap Kumar Valsan
2019-02-22 15:17   ` Lis, Tomasz
2019-02-22 15:21     ` Chris Wilson
2019-02-22 21:32       ` Kumar Valsan, Prathap
2019-02-22 21:48         ` Chris Wilson
2019-02-25 13:17           ` Lis, Tomasz
2019-02-25  0:26     ` Kumar Valsan, Prathap
2019-02-22 21:16 ` [igt-dev] ✗ Fi.CI.BAT: failure for i915/gem_mocs_settings: Add mocs table for icelake (rev5) Patchwork
2019-02-22 21:20 ` [igt-dev] [PATCH i-g-t v3] i915/gem_mocs_settings: Add mocs table for icelake Prathap Kumar Valsan
2019-03-04 20:27 ` [igt-dev] [PATCH i-g-t v4] " Prathap Kumar Valsan
2019-03-04 20:37   ` Kumar Valsan, Prathap
2019-03-04 21:01 ` [igt-dev] ✓ Fi.CI.BAT: success for i915/gem_mocs_settings: Add mocs table for icelake (rev6) Patchwork
2019-03-05  2:11 ` [igt-dev] ✓ Fi.CI.IGT: " Patchwork
2019-03-12 15:14 ` [igt-dev] [PATCH i-g-t v5] i915/gem_mocs_settings: Add mocs table for icelake Prathap Kumar Valsan
2019-03-13 13:58   ` Kalamarz, Lukasz
2019-03-14  9:18     ` Chris Wilson
2019-03-14 11:03       ` Kalamarz, Lukasz
2019-03-13 12:12 ` [igt-dev] ✗ Fi.CI.BAT: failure for i915/gem_mocs_settings: Add mocs table for icelake (rev7) Patchwork
2019-03-14  0:12 ` [igt-dev] [PATCH i-g-t v5] i915/gem_mocs_settings: Add mocs table for icelake Prathap Kumar Valsan
2019-03-14  0:47 ` [igt-dev] ✗ Fi.CI.BAT: failure for i915/gem_mocs_settings: Add mocs table for icelake (rev8) Patchwork
2019-03-14 17:28 ` [igt-dev] [PATCH i-g-t v6] i915/gem_mocs_settings: Add mocs table for icelake Prathap Kumar Valsan
2019-03-15  8:46   ` Chris Wilson
2019-03-15 19:28     ` Kumar Valsan, Prathap [this message]
2019-03-15 21:11       ` Chris Wilson
2019-03-14 18:07 ` [igt-dev] ✓ Fi.CI.BAT: success for i915/gem_mocs_settings: Add mocs table for icelake (rev9) Patchwork
2019-03-15  2:54 ` [igt-dev] ✗ Fi.CI.IGT: failure " Patchwork
2019-03-15 19:15 ` [igt-dev] [PATCH i-g-t v7] i915/gem_mocs_settings: Add mocs table for icelake Prathap Kumar Valsan
2019-03-18 13:10   ` Kumar Valsan, Prathap
2019-03-18 13:06     ` Chris Wilson
2019-03-18 13:31       ` Kumar Valsan, Prathap
2019-03-18 13:27   ` Chris Wilson
2019-03-18 10:21 ` [igt-dev] ✓ Fi.CI.BAT: success for i915/gem_mocs_settings: Add mocs table for icelake (rev11) Patchwork
2019-03-18 12:37 ` [igt-dev] ✓ Fi.CI.IGT: " Patchwork

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20190315192829.GA30702@intel.com \
    --to=prathap.kumar.valsan@intel.com \
    --cc=chris@chris-wilson.co.uk \
    --cc=igt-dev@lists.freedesktop.org \
    --cc=lucas.demarchi@intel.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.