[igt-dev] [PATCH i-g-t 1/2] lib/gpgpu_fill/xehpc: Adjust gpgpu_fillfunc for PVC

Zbigniew Kempczyński zbigniew.kempczynski at intel.com
Mon May 29 16:54:16 UTC 2023


From: Dominik Grzegorzek <dominik.grzegorzek at intel.com>

gpgpu_fillfunc for XEHPSDV can be reused for PVC with minor changes.
PVC COMPUTE_WALKER instruction has additional restriction. Message
SIMD(dw4:17) has to be equal to Thread SIMD.(SIMD16 in our case).
PVC also required a kernel recompilation.

Signed-off-by: Dominik Grzegorzek <dominik.grzegorzek at intel.com>
Signed-off-by: Zbigniew Kempczyński <zbigniew.kempczynski at intel.com>
Cc: Christoph Manszewski <christoph.manszewski at intel.com>
Cc: Kamil Konieczny <kamil.konieczny at linux.intel.com>
---
 lib/gpgpu_fill.c                              | 23 +++++++++++++++++++
 lib/gpgpu_fill.h                              |  8 +++++++
 lib/gpu_cmds.c                                |  3 ++-
 .../shaders/gpgpu/gen12p72_gpgpu_kernel.asm   | 12 ++++++++++
 lib/intel_batchbuffer.c                       |  4 +++-
 5 files changed, 48 insertions(+), 2 deletions(-)
 create mode 100644 lib/i915/shaders/gpgpu/gen12p72_gpgpu_kernel.asm

diff --git a/lib/gpgpu_fill.c b/lib/gpgpu_fill.c
index 4db8775145..d854fbf7a0 100644
--- a/lib/gpgpu_fill.c
+++ b/lib/gpgpu_fill.c
@@ -112,6 +112,18 @@ static const uint32_t xehp_gpgpu_kernel[][4] = {
 	{ 0x00030031, 0x00000004, 0x3000500c, 0x00000000 },
 };
 
+static const uint32_t xehpc_gpgpu_kernel[][4] = {
+	{ 0x00080061, 0x01050000, 0x00000104, 0x00000000 },
+	{ 0x00000069, 0x02058220, 0x02000014, 0x00000004 },
+	{ 0x00000061, 0x02150220, 0x00000064, 0x00000000 },
+	{ 0x000c0061, 0x04050220, 0x00460005, 0x00000000 },
+	{ 0x00041a61, 0x04050220, 0x00220205, 0x00000000 },
+	{ 0x00000061, 0x04254220, 0x00000000, 0x0000000f },
+	{ 0x00101e61, 0x05050220, 0x00000104, 0x00000000 },
+	{ 0x00132031, 0x00000000, 0xc0000414, 0x02a00000 },
+	{ 0x000c0031, 0x00000004, 0x3000500c, 0x00000000 },
+};
+
 /*
  * This sets up the gpgpu pipeline,
  *
@@ -377,3 +389,14 @@ void xehp_gpgpu_fillfunc(int i915,
 			      xehp_gpgpu_kernel,
 			      sizeof(xehp_gpgpu_kernel));
 }
+
+void xehpc_gpgpu_fillfunc(int i915,
+			  struct intel_buf *buf,
+			  unsigned int x, unsigned int y,
+			  unsigned int width, unsigned int height,
+			  uint8_t color)
+{
+	__xehp_gpgpu_fillfunc(i915, buf, x, y, width, height, color,
+			      xehpc_gpgpu_kernel,
+			      sizeof(xehpc_gpgpu_kernel));
+}
diff --git a/lib/gpgpu_fill.h b/lib/gpgpu_fill.h
index 3d199acd63..f81cd0b53c 100644
--- a/lib/gpgpu_fill.h
+++ b/lib/gpgpu_fill.h
@@ -67,4 +67,12 @@ xehp_gpgpu_fillfunc(int i915,
 		    unsigned int x, unsigned int y,
 		    unsigned int width, unsigned int height,
 		    uint8_t color);
+
+void
+xehpc_gpgpu_fillfunc(int i915,
+		     struct intel_buf *dst,
+		     unsigned int x, unsigned int y,
+		     unsigned int width, unsigned int height,
+		     uint8_t color);
+
 #endif /* GPGPU_FILL_H */
diff --git a/lib/gpu_cmds.c b/lib/gpu_cmds.c
index afb26d2990..1f321ae4a0 100644
--- a/lib/gpu_cmds.c
+++ b/lib/gpu_cmds.c
@@ -975,7 +975,8 @@ xehp_emit_compute_walk(struct intel_bb *ibb,
 	intel_bb_out(ibb, 0); /* indirect data offset */	//dw3
 
 	/* SIMD size */
-	intel_bb_out(ibb, 1 << 30 | 1 << 25); /* SIMD16 | enable inline */ //dw4
+	/* SIMD16 | enable inline | Message SIMD16 */
+	intel_bb_out(ibb, 1 << 30 | 1 << 25 | 1 << 17);		//dw4
 
 	/* Execution mask */
 	intel_bb_out(ibb, 0xffffffff);				//dw5
diff --git a/lib/i915/shaders/gpgpu/gen12p72_gpgpu_kernel.asm b/lib/i915/shaders/gpgpu/gen12p72_gpgpu_kernel.asm
new file mode 100644
index 0000000000..52699a475e
--- /dev/null
+++ b/lib/i915/shaders/gpgpu/gen12p72_gpgpu_kernel.asm
@@ -0,0 +1,12 @@
+L0:
+         mov (4|M0)               r1.0<1>:ub    r1.0<0;1,0>:ub
+         shl (1|M0)               r2.0<1>:ud    r0.1<0;1,0>:ud    0x4:ud
+         mov (1|M0)               r2.1<1>:ud    r0.6<0;1,0>:ud
+         mov (8|M0)               r4.0<1>:ud    r0.0<8;8,1>:ud
+         mov (2|M0)               r4.0<1>:ud    r2.0<2;2,1>:ud                   {I at 2}
+         mov (1|M0)               r4.2<1>:ud    0xF:ud
+         mov (16|M0)              r5.0<1>:ud    r1.0<0;1,0>:ud                   {I at 6}
+(W)      sync.nop                             null                             {I at 1}
+         send.dc1 (16|M0)         null     r4      null:0    0x0         0x40A8000  {$0} //    wr:2h+0, rd:0, Media Block Write msc:0, to #0
+         send.gtwy (8|M0)         null     r80     null:0    0x0         0x02000000 {EOT}
+L176:
diff --git a/lib/intel_batchbuffer.c b/lib/intel_batchbuffer.c
index dfccc4f4ac..9f65536173 100644
--- a/lib/intel_batchbuffer.c
+++ b/lib/intel_batchbuffer.c
@@ -755,7 +755,9 @@ igt_fillfunc_t igt_get_gpgpu_fillfunc(int devid)
 {
 	igt_fillfunc_t fill = NULL;
 
-	if (intel_graphics_ver(devid) >= IP_VER(12, 50))
+	if (intel_graphics_ver(devid) >= IP_VER(12, 60))
+		fill = xehpc_gpgpu_fillfunc;
+	else if (intel_graphics_ver(devid) >= IP_VER(12, 50))
 		fill = xehp_gpgpu_fillfunc;
 	else if (IS_GEN12(devid))
 		fill = gen12_gpgpu_fillfunc;
-- 
2.34.1



More information about the igt-dev mailing list