Commit bac01606 authored by Gustavo Sousa's avatar Gustavo Sousa Committed by Lucas De Marchi
Browse files

drm/xe: Make PPHWSP size explicit in xe_gt_lrc_size()



The context of each engine starts with a 4k memory space for the
"Per-process HW status page" (PPHWSP). In xe_gt_lrc_size(), we have been
implicitly accounting for that page in the switch statement on the
engine class.

Since the PPHWSP is common to all engines, let's extract that into it's
own assignment. That makes the context structure more explicit in the
code and aligns better with the descriptions in Bspec.

Another advantage of keeping it separate is that now the sizes used in
the switch statement match the sizes we calculate engine-specific
context images, which have their own Bspec pages.

Bspec: 67296, 60159, 45554
Signed-off-by: default avatarGustavo Sousa <gustavo.sousa@intel.com>
Reviewed-by: default avatarMatt Roper <matthew.d.roper@intel.com>
Link: https://lore.kernel.org/r/20250328-explicit-pphwsp-size-in-xe_gt_lrc_size-v1-1-ceb9ce7c8bc1@intel.com


Signed-off-by: default avatarLucas De Marchi <lucas.demarchi@intel.com>
parent 61672806
Loading
Loading
Loading
Loading
+10 −7
Original line number Diff line number Diff line
@@ -37,6 +37,7 @@
#define LRC_ENGINE_CLASS			GENMASK_ULL(63, 61)
#define LRC_ENGINE_INSTANCE			GENMASK_ULL(53, 48)

#define LRC_PPHWSP_SIZE				SZ_4K
#define LRC_INDIRECT_RING_STATE_SIZE		SZ_4K

static struct xe_device *
@@ -50,19 +51,22 @@ size_t xe_gt_lrc_size(struct xe_gt *gt, enum xe_engine_class class)
	struct xe_device *xe = gt_to_xe(gt);
	size_t size;

	/* Per-process HW status page (PPHWSP) */
	size = LRC_PPHWSP_SIZE;

	/* Engine context image */
	switch (class) {
	case XE_ENGINE_CLASS_RENDER:
		if (GRAPHICS_VER(xe) >= 20)
			size = 4 * SZ_4K;
			size += 3 * SZ_4K;
		else
			size = 14 * SZ_4K;
			size += 13 * SZ_4K;
		break;
	case XE_ENGINE_CLASS_COMPUTE:
		/* 14 pages since graphics_ver == 11 */
		if (GRAPHICS_VER(xe) >= 20)
			size = 3 * SZ_4K;
			size += 2 * SZ_4K;
		else
			size = 14 * SZ_4K;
			size += 13 * SZ_4K;
		break;
	default:
		WARN(1, "Unknown engine class: %d", class);
@@ -71,7 +75,7 @@ size_t xe_gt_lrc_size(struct xe_gt *gt, enum xe_engine_class class)
	case XE_ENGINE_CLASS_VIDEO_DECODE:
	case XE_ENGINE_CLASS_VIDEO_ENHANCE:
	case XE_ENGINE_CLASS_OTHER:
		size = 2 * SZ_4K;
		size += 1 * SZ_4K;
	}

	/* Add indirect ring state page */
@@ -650,7 +654,6 @@ u32 xe_lrc_pphwsp_offset(struct xe_lrc *lrc)
#define LRC_START_SEQNO_PPHWSP_OFFSET (LRC_SEQNO_PPHWSP_OFFSET + 8)
#define LRC_CTX_JOB_TIMESTAMP_OFFSET (LRC_START_SEQNO_PPHWSP_OFFSET + 8)
#define LRC_PARALLEL_PPHWSP_OFFSET 2048
#define LRC_PPHWSP_SIZE SZ_4K

u32 xe_lrc_regs_offset(struct xe_lrc *lrc)
{