Re: [Intel-gfx] [PATCH v2 2/6] drm/i915/perf: Express OA register ranges with i915_range

2022-01-27 Thread Umesh Nerlige Ramappa

On Mon, Jan 24, 2022 at 06:08:22PM -0800, Matt Roper wrote:

Let's use 'struct i915_range' to express sets of b-counter and mux
registers in the perf code.  This makes the code more similar to how we
handle things like multicast register ranges, forcewake tables, shadow
tables, etc. and also lets us avoid needing symbolic register name
definitions for the various range end points.  With this change, many of
the OA register definitions are no longer used in the code, so we can
drop their #define's for simplicity.

v2:  Drop 'inline' from reg_in_range_table().  (Jani)

Cc: Jani Nikula 
Cc: Umesh Nerlige Ramappa 
Cc: Lionel Landwerlin 
Signed-off-by: Matt Roper 
---
drivers/gpu/drm/i915/i915_perf.c | 120 +---
drivers/gpu/drm/i915/i915_perf_oa_regs.h | 360 ---
2 files changed, 77 insertions(+), 403 deletions(-)

diff --git a/drivers/gpu/drm/i915/i915_perf.c b/drivers/gpu/drm/i915/i915_perf.c
index 20af83517cb1..804e87b6ed0c 100644
--- a/drivers/gpu/drm/i915/i915_perf.c
+++ b/drivers/gpu/drm/i915/i915_perf.c
@@ -3864,80 +3864,114 @@ static bool gen8_is_valid_flex_addr(struct i915_perf 
*perf, u32 addr)
return false;
}

-#define ADDR_IN_RANGE(addr, start, end) \
-   ((addr) >= (start) && \
-(addr) <= (end))
+static bool reg_in_range_table(u32 addr, const struct i915_range *table) {
+   while (table->start || table->end) {
+   if (addr >= table->start && addr <= table->end)
+   return true;
+
+   table++;
+   }

-#define REG_IN_RANGE(addr, start, end) \
-   ((addr) >= i915_mmio_reg_offset(start) && \
-(addr) <= i915_mmio_reg_offset(end))
+   return false;
+}

#define REG_EQUAL(addr, mmio) \
((addr) == i915_mmio_reg_offset(mmio))

-static bool gen7_is_valid_b_counter_addr(struct i915_perf *perf, u32 addr)
-{
-   return REG_IN_RANGE(addr, OASTARTTRIG1, OASTARTTRIG8) ||
-  REG_IN_RANGE(addr, OAREPORTTRIG1, OAREPORTTRIG8) ||
-  REG_IN_RANGE(addr, OACEC0_0, OACEC7_1);
-}
+static const struct i915_range gen7_oa_b_counters[] = {
+   { .start = 0x2710, .end = 0x272c }, /* OASTARTTRIG[1-8] */
+   { .start = 0x2740, .end = 0x275c }, /* OAREPORTTRIG[1-8] */
+   { .start = 0x2770, .end = 0x27ac }, /* OACEC[0-7][0-1] */
+   {}
+};
+
+static const struct i915_range gen12_oa_b_counters[] = {
+   { .start = 0x2b2c, .end = 0x2b2c }, /* GEN12_OAG_OA_PESS */
+   { .start = 0xd900, .end = 0xd91c }, /* GEN12_OAG_OASTARTTRIG[1-8] */
+   { .start = 0xd920, .end = 0xd93c }, /* GEN12_OAG_OAREPORTTRIG1[1-8] 
*/
+   { .start = 0xd940, .end = 0xd97c }, /* GEN12_OAG_CEC[0-7][0-1] */
+   { .start = 0xdc00, .end = 0xdc3c }, /* GEN12_OAG_SCEC[0-7][0-1] */
+   { .start = 0xdc40, .end = 0xdc40 }, /* GEN12_OAG_SPCTR_CNF */
+   { .start = 0xdc44, .end = 0xdc44 }, /* GEN12_OAA_DBG_REG */
+   {}
+};
+
+static const struct i915_range gen7_oa_mux_regs[] = {
+   { .start = 0x91b8, .end = 0x91cc }, /* OA_PERFCNT[1-2], 
OA_PERFMATRIX */
+   { .start = 0x9800, .end = 0x9888 }, /* MICRO_BP0_0 - NOA_WRITE */
+   { .start = 0xe180, .end = 0xe180 }, /* HALF_SLICE_CHICKEN2 */
+   {}
+};

-static bool gen7_is_valid_mux_addr(struct i915_perf *perf, u32 addr)
+static const struct i915_range hsw_oa_mux_regs[] = {
+   { .start = 0x09e80, .end = 0x09ea4 }, /* HSW_MBVID2_NOA[0-9] */
+   { .start = 0x09ec0, .end = 0x09ec0 }, /* HSW_MBVID2_MISR0 */
+   { .start = 0x25100, .end = 0x2ff90 },
+   {}
+};
+
+static const struct i915_range chv_oa_mux_regs[] = {
+   { .start = 0x182300, .end = 0x1823a4 },
+   {}
+};
+
+static const struct i915_range gen8_oa_mux_regs[] = {
+   { .start = 0x0d00, .end = 0x0d2c }, /* RPM_CONFIG[0-1], 
NOA_CONFIG[0-8] */
+   { .start = 0x20cc, .end = 0x20cc }, /* WAIT_FOR_RC6_EXIT */
+   {}
+};
+
+static const struct i915_range gen11_oa_mux_regs[] = {
+   { .start = 0x91c8, .end = 0x91dc }, /* OA_PERFCNT[3-4] */
+   {}
+};
+
+static const struct i915_range gen12_oa_mux_regs[] = {
+   { .start = 0x0d00, .end = 0x0d2c }, /* RPM_CONFIG[0-1], 
NOA_CONFIG[0-8] */


The earlier code does not whitelist 0xd08, so I think we need to split the 
above.

{ .start = 0x0d00, .end = 0x0d04 }, /* RPM_CONFIG[0-1] */
{ .start = 0x0d0c, .end = 0x0d2c }, /* NOA_CONFIG[0-8] */

Everything else lgtm, With the above, this is

Reviewed-by: Umesh Nerlige Ramappa 

Thanks,
Umesh


+   { .start = 0x9840, .end = 0x9840 }, /* GDT_CHICKEN_BITS */
+   { .start = 0x9884, .end = 0x9888 }, /* NOA_WRITE */
+   { .start = 0x20cc, .end = 0x20cc }, /* WAIT_FOR_RC6_EXIT */
+   {}
+};
+
+static bool gen7_is_valid_b_counter_addr(struct i915_perf *perf, u32 addr)
{
-   return REG_EQUAL(addr, HALF_SLICE_CHICKEN2) ||
-  REG_IN_RANGE(addr, MICRO_BP0_0, NOA_WRITE) ||
-  

Re: [Intel-gfx] [PATCH v2 2/6] drm/i915/perf: Express OA register ranges with i915_range

2022-01-26 Thread Lucas De Marchi

On Mon, Jan 24, 2022 at 06:08:22PM -0800, Matt Roper wrote:

Let's use 'struct i915_range' to express sets of b-counter and mux
registers in the perf code.  This makes the code more similar to how we
handle things like multicast register ranges, forcewake tables, shadow
tables, etc. and also lets us avoid needing symbolic register name
definitions for the various range end points.  With this change, many of
the OA register definitions are no longer used in the code, so we can
drop their #define's for simplicity.

v2:  Drop 'inline' from reg_in_range_table().  (Jani)

Cc: Jani Nikula 
Cc: Umesh Nerlige Ramappa 
Cc: Lionel Landwerlin 
Signed-off-by: Matt Roper 



I didn't come up with an idea to review the table ranges, but agree with
the change:

Acked-by: Lucas De Marchi 

Lucas De Marchi


[Intel-gfx] [PATCH v2 2/6] drm/i915/perf: Express OA register ranges with i915_range

2022-01-24 Thread Matt Roper
Let's use 'struct i915_range' to express sets of b-counter and mux
registers in the perf code.  This makes the code more similar to how we
handle things like multicast register ranges, forcewake tables, shadow
tables, etc. and also lets us avoid needing symbolic register name
definitions for the various range end points.  With this change, many of
the OA register definitions are no longer used in the code, so we can
drop their #define's for simplicity.

v2:  Drop 'inline' from reg_in_range_table().  (Jani)

Cc: Jani Nikula 
Cc: Umesh Nerlige Ramappa 
Cc: Lionel Landwerlin 
Signed-off-by: Matt Roper 
---
 drivers/gpu/drm/i915/i915_perf.c | 120 +---
 drivers/gpu/drm/i915/i915_perf_oa_regs.h | 360 ---
 2 files changed, 77 insertions(+), 403 deletions(-)

diff --git a/drivers/gpu/drm/i915/i915_perf.c b/drivers/gpu/drm/i915/i915_perf.c
index 20af83517cb1..804e87b6ed0c 100644
--- a/drivers/gpu/drm/i915/i915_perf.c
+++ b/drivers/gpu/drm/i915/i915_perf.c
@@ -3864,80 +3864,114 @@ static bool gen8_is_valid_flex_addr(struct i915_perf 
*perf, u32 addr)
return false;
 }
 
-#define ADDR_IN_RANGE(addr, start, end) \
-   ((addr) >= (start) && \
-(addr) <= (end))
+static bool reg_in_range_table(u32 addr, const struct i915_range *table) {
+   while (table->start || table->end) {
+   if (addr >= table->start && addr <= table->end)
+   return true;
+
+   table++;
+   }
 
-#define REG_IN_RANGE(addr, start, end) \
-   ((addr) >= i915_mmio_reg_offset(start) && \
-(addr) <= i915_mmio_reg_offset(end))
+   return false;
+}
 
 #define REG_EQUAL(addr, mmio) \
((addr) == i915_mmio_reg_offset(mmio))
 
-static bool gen7_is_valid_b_counter_addr(struct i915_perf *perf, u32 addr)
-{
-   return REG_IN_RANGE(addr, OASTARTTRIG1, OASTARTTRIG8) ||
-  REG_IN_RANGE(addr, OAREPORTTRIG1, OAREPORTTRIG8) ||
-  REG_IN_RANGE(addr, OACEC0_0, OACEC7_1);
-}
+static const struct i915_range gen7_oa_b_counters[] = {
+   { .start = 0x2710, .end = 0x272c }, /* OASTARTTRIG[1-8] */
+   { .start = 0x2740, .end = 0x275c }, /* OAREPORTTRIG[1-8] */
+   { .start = 0x2770, .end = 0x27ac }, /* OACEC[0-7][0-1] */
+   {}
+};
+
+static const struct i915_range gen12_oa_b_counters[] = {
+   { .start = 0x2b2c, .end = 0x2b2c }, /* GEN12_OAG_OA_PESS */
+   { .start = 0xd900, .end = 0xd91c }, /* GEN12_OAG_OASTARTTRIG[1-8] */
+   { .start = 0xd920, .end = 0xd93c }, /* GEN12_OAG_OAREPORTTRIG1[1-8] 
*/
+   { .start = 0xd940, .end = 0xd97c }, /* GEN12_OAG_CEC[0-7][0-1] */
+   { .start = 0xdc00, .end = 0xdc3c }, /* GEN12_OAG_SCEC[0-7][0-1] */
+   { .start = 0xdc40, .end = 0xdc40 }, /* GEN12_OAG_SPCTR_CNF */
+   { .start = 0xdc44, .end = 0xdc44 }, /* GEN12_OAA_DBG_REG */
+   {}
+};
+
+static const struct i915_range gen7_oa_mux_regs[] = {
+   { .start = 0x91b8, .end = 0x91cc }, /* OA_PERFCNT[1-2], 
OA_PERFMATRIX */
+   { .start = 0x9800, .end = 0x9888 }, /* MICRO_BP0_0 - NOA_WRITE */
+   { .start = 0xe180, .end = 0xe180 }, /* HALF_SLICE_CHICKEN2 */
+   {}
+};
 
-static bool gen7_is_valid_mux_addr(struct i915_perf *perf, u32 addr)
+static const struct i915_range hsw_oa_mux_regs[] = {
+   { .start = 0x09e80, .end = 0x09ea4 }, /* HSW_MBVID2_NOA[0-9] */
+   { .start = 0x09ec0, .end = 0x09ec0 }, /* HSW_MBVID2_MISR0 */
+   { .start = 0x25100, .end = 0x2ff90 },
+   {}
+};
+
+static const struct i915_range chv_oa_mux_regs[] = {
+   { .start = 0x182300, .end = 0x1823a4 },
+   {}
+};
+
+static const struct i915_range gen8_oa_mux_regs[] = {
+   { .start = 0x0d00, .end = 0x0d2c }, /* RPM_CONFIG[0-1], 
NOA_CONFIG[0-8] */
+   { .start = 0x20cc, .end = 0x20cc }, /* WAIT_FOR_RC6_EXIT */
+   {}
+};
+
+static const struct i915_range gen11_oa_mux_regs[] = {
+   { .start = 0x91c8, .end = 0x91dc }, /* OA_PERFCNT[3-4] */
+   {}
+};
+
+static const struct i915_range gen12_oa_mux_regs[] = {
+   { .start = 0x0d00, .end = 0x0d2c }, /* RPM_CONFIG[0-1], 
NOA_CONFIG[0-8] */
+   { .start = 0x9840, .end = 0x9840 }, /* GDT_CHICKEN_BITS */
+   { .start = 0x9884, .end = 0x9888 }, /* NOA_WRITE */
+   { .start = 0x20cc, .end = 0x20cc }, /* WAIT_FOR_RC6_EXIT */
+   {}
+};
+
+static bool gen7_is_valid_b_counter_addr(struct i915_perf *perf, u32 addr)
 {
-   return REG_EQUAL(addr, HALF_SLICE_CHICKEN2) ||
-  REG_IN_RANGE(addr, MICRO_BP0_0, NOA_WRITE) ||
-  REG_IN_RANGE(addr, OA_PERFCNT1_LO, OA_PERFCNT2_HI) ||
-  REG_IN_RANGE(addr, OA_PERFMATRIX_LO, OA_PERFMATRIX_HI);
+   return reg_in_range_table(addr, gen7_oa_b_counters);
 }
 
 static bool gen8_is_valid_mux_addr(struct i915_perf *perf, u32 addr)
 {
-   return gen7_is_valid_mux_addr(perf, addr) ||
-  REG_EQUAL(addr, WAIT_FOR_RC6_EXIT) ||
-