From: John Harrison <John.C.Harrison@xxxxxxxxx> ATS has lots of extra media engines. This series adds support for them. Note, a recent GuC FW is required - 32.0.3 is known to be good. Version 31.0.1 causes a hang when i915 initialised the fifth VCS engine. v2: Clean up the I915_MAX_ENGINES define. Make assumptions about ATS engine counts. [Tvrtko Ursulin] v3: Rebase to a new location within the internal history and add a NOT_UPSTREAM patch to disable the extra engines if the GuC FW in use is too old to support them. [Daniele]. v4: Tweaks to GuC FW test (for module param overrides) and to interrupt enabling (to support fused parts). [Daniele] Signed-off-by: John Harrison <John.C.Harrison@xxxxxxxxx> CC: Daniele Ceraolo Spurio <daniele.ceraolospurio@xxxxxxxxx> CC: Tvrtko Ursulin <tvrtko.ursulin@xxxxxxxxx> --- baseline: 32a1e283d330638d2e5de8f89a9ff7c8512b75e8 pile-commit: 603f996d0b32c3733f4ce4e7263e9f40e0d263ce range-diff: -: ------------ > 142: ce1f037b197f drm/i915/selftests: Allow for larger engine counts -: ------------ > 143: 61e8501f5afe drm/i915: Extra media engines for ATS - Part 1 (engine definitions) -: ------------ > 144: eaf383e48944 drm/i915: Extra media engines for ATS - Part 2 (interrupts) -: ------------ > 145: 7d107e0cde94 drm/i915: Extra media engines for ATS - Part 3 (reset) -: ------------ > 146: 9d3d03cbd52d drm/i915: Extra media engines for ATS - Part 4 (FW) -: ------------ > 147: e37f175dd42e drm/i915: Extra media engines for ATS - Part 5 (UAPI) 217: af2ca7c68d46 ! 223: bfbff755e80c drm/i915/ats: ATS has MMIO doorbells -: ------------ > 239: facf506a7805 NOT_UPSTREAM: drm/i915: Disable extra engines on older GuC FW 275: 0ceb5bac58a5 < -: ------------ drm/i915/ats: Disable all display device information capabilities -: ------------ > 282: f0213ad8ede3 drm/i915/ats: Disable all display device information capabilities 301: 643dcaa8783f ! 308: 960d8a3acefe drm/i915/guc: Support for VFPF relay messages 317: 2a3a78301cee ! 324: 3ccd2e3fca85 drm/i915: Add has_remote_tiles to device info series | 7 + ...M-drm-i915-Disable-extra-engines-on-older.patch | 80 ++++++++ ...-i915-Add-has_remote_tiles-to-device-info.patch | 4 +- ...tra-media-engines-for-ATS-Part-1-engine-d.patch | 218 +++++++++++++++++++++ ...tra-media-engines-for-ATS-Part-2-interrup.patch | 97 +++++++++ ...-Extra-media-engines-for-ATS-Part-3-reset.patch | 54 +++++ ...915-Extra-media-engines-for-ATS-Part-4-FW.patch | 110 +++++++++++ ...5-Extra-media-engines-for-ATS-Part-5-UAPI.patch | 30 +++ 0001-drm-i915-ats-ATS-has-MMIO-doorbells.patch | 4 +- ...s-Disable-all-display-device-information-.patch | 8 +- ...-i915-guc-Support-for-VFPF-relay-messages.patch | 4 +- ...-selftests-Allow-for-larger-engine-counts.patch | 85 ++++++++ 12 files changed, 691 insertions(+), 10 deletions(-) diff --git a/series b/series index e8645e80dbf9..4a072408dad2 100644 --- a/series +++ b/series @@ -141,6 +141,12 @@ 0001-drm-i915-ats-ack-intr-through-master-control.patch 0001-FIXME-drm-i915-ats-context-status-and-descriptor-cha.patch 0001-drm-i915-ats-Handle-ATS-VDBOX-VEBOX-fusing-register.patch +0001-drm-i915-selftests-Allow-for-larger-engine-counts.patch +0001-drm-i915-Extra-media-engines-for-ATS-Part-1-engine-d.patch +0001-drm-i915-Extra-media-engines-for-ATS-Part-2-interrup.patch +0001-drm-i915-Extra-media-engines-for-ATS-Part-3-reset.patch +0001-drm-i915-Extra-media-engines-for-ATS-Part-4-FW.patch +0001-drm-i915-Extra-media-engines-for-ATS-Part-5-UAPI.patch 0001-NOTUPSTREAM-drm-i915-perf-Enable-large-OA-buffer-sup.patch 0001-NOTUPSTREAM-drm-i915-perf-complete-programming-white.patch 0001-drm-i915-support-1G-pages-for-the-48b-PPGTT.patch @@ -232,6 +238,7 @@ 0001-drm-i915-dg1-add-initial-DG-1-definitions.patch 0001-drm-i915-dg1-Add-DG1-PCI-IDs.patch 0001-DRM_INTEL_INTERNAL_PLATFORM_POINT-dg1.patch +0001-NOT_UPSTREAM-drm-i915-Disable-extra-engines-on-older.patch 0001-NOT_UPSTREAM-drm-i915-tgl-ack-master-control-on-all-.patch 0001-NOT_UPSTREAM-drm-i915-guc-add-H2G-to-ring-doorbells.patch 0001-NOT-UPSTREAM-drm-i915-guc-Workaround-ATS-GuC-31.0.0-.patch diff --git a/0001-NOT_UPSTREAM-drm-i915-Disable-extra-engines-on-older.patch b/0001-NOT_UPSTREAM-drm-i915-Disable-extra-engines-on-older.patch new file mode 100644 index 000000000000..05a7a12ca66c --- /dev/null +++ b/0001-NOT_UPSTREAM-drm-i915-Disable-extra-engines-on-older.patch @@ -0,0 +1,80 @@ +From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 +From: John Harrison <John.C.Harrison@xxxxxxxxx> +Date: Mon, 1 Apr 2019 12:24:50 -0700 +Subject: [PATCH] NOT_UPSTREAM: drm/i915: Disable extra engines on older GuC FW + +The current GuC FW release (31.0.1) dies when presented with too many +media engines. The issue was fixed by 32.0.3 (which is the next FW the +driver is intending to switch to). It is desirable to merge the the +patches which allow use of the new engines before the new GuC FW +patches can be merged. E.g. for running in non-GuC mode and/or running +with a locally patched driver for the newer FW. Hence this patch +disables the extra engines if the newer FW is not found. + +v2: Cope with GuC FWs loaded via the module param (by just ignoring it +and warning the user). [Daniele] + +Signed-off-by: John Harrison <John.C.Harrison@xxxxxxxxx> +CC: Daniele Ceraolo Spurio <daniele.ceraolospurio@xxxxxxxxx> +--- + drivers/gpu/drm/i915/intel_device_info.c | 24 ++++++++++++++++++++++++ + drivers/gpu/drm/i915/intel_guc_fw.c | 1 + + drivers/gpu/drm/i915/intel_uc_fw.h | 1 + + 3 files changed, 26 insertions(+) + +diff --git a/drivers/gpu/drm/i915/intel_device_info.c b/drivers/gpu/drm/i915/intel_device_info.c +--- a/drivers/gpu/drm/i915/intel_device_info.c ++++ b/drivers/gpu/drm/i915/intel_device_info.c +@@ -945,6 +945,30 @@ void intel_device_info_init_mmio(struct drm_i915_private *dev_priv) + vebox_mask = (media_fuse & GEN11_GT_VEBOX_DISABLE_MASK) >> + GEN11_GT_VEBOX_DISABLE_SHIFT; + ++ if (USES_GUC_SUBMISSION(dev_priv)) { ++ struct intel_guc *guc = &dev_priv->guc; ++ struct intel_uc_fw *guc_fw = &guc->fw; ++ u32 guc_ver, guc_req; ++ ++ /* GuC < 32.0.3 barfs on too many media engines */ ++ /* NB: *_ver_found is not available yet so need to use _ver_wanted. */ ++ ++ if (!guc_fw->major_ver_wanted && !guc_fw->minor_ver_wanted) { ++ DRM_INFO("GuC FW version unknown (overridden by module param?).\n"); ++ DRM_INFO("NB: FW earlier than 32.0.3 may break VCS4-7 and VECS2-3!\n"); ++ } else { ++ guc_ver = (guc_fw->major_ver_wanted << 16) | ++ (guc_fw->minor_ver_wanted << 8) | ++ guc_fw->patch_ver_wanted; ++ ++ guc_req = (32 << 16) | (0 << 8) | 3; ++ if (guc_ver < guc_req) { ++ vdbox_mask &= 0xF; ++ vebox_mask &= 0x3; ++ } ++ } ++ } ++ + for (i = 0; i < I915_MAX_VCS; i++) { + if (!HAS_ENGINE(dev_priv, _VCS(i))) + continue; +diff --git a/drivers/gpu/drm/i915/intel_guc_fw.c b/drivers/gpu/drm/i915/intel_guc_fw.c +--- a/drivers/gpu/drm/i915/intel_guc_fw.c ++++ b/drivers/gpu/drm/i915/intel_guc_fw.c +@@ -98,6 +98,7 @@ static void guc_fw_select(struct intel_uc_fw *guc_fw) + guc_fw->path = ATS_GUC_FIRMWARE_PATH; + guc_fw->major_ver_wanted = ATS_GUC_FW_MAJOR; + guc_fw->minor_ver_wanted = ATS_GUC_FW_MINOR; ++ guc_fw->patch_ver_wanted = ATS_GUC_FW_PATCH; + } else if (IS_TIGERLAKE(i915)) { + guc_fw->path = TGL_GUC_FIRMWARE_PATH; + guc_fw->major_ver_wanted = TGL_GUC_FW_MAJOR; +diff --git a/drivers/gpu/drm/i915/intel_uc_fw.h b/drivers/gpu/drm/i915/intel_uc_fw.h +--- a/drivers/gpu/drm/i915/intel_uc_fw.h ++++ b/drivers/gpu/drm/i915/intel_uc_fw.h +@@ -62,6 +62,7 @@ struct intel_uc_fw { + */ + u16 major_ver_wanted; + u16 minor_ver_wanted; ++ u16 patch_ver_wanted; + u16 major_ver_found; + u16 minor_ver_found; + diff --git a/0001-drm-i915-Add-has_remote_tiles-to-device-info.patch b/0001-drm-i915-Add-has_remote_tiles-to-device-info.patch index 25d2b969eef0..ed470e5c95b3 100644 --- a/0001-drm-i915-Add-has_remote_tiles-to-device-info.patch +++ b/0001-drm-i915-Add-has_remote_tiles-to-device-info.patch @@ -34,8 +34,8 @@ diff --git a/drivers/gpu/drm/i915/i915_pci.c b/drivers/gpu/drm/i915/i915_pci.c .has_guc_mmio_db = 1, + .has_remote_tiles = 1, .engine_mask = - BIT(RCS0) | BIT(BCS0) | BIT(VECS0) | BIT(VECS1) | BIT(VCS0) | - BIT(VCS1) | BIT(VCS2) | BIT(VCS3) | BIT(CCS0), + BIT(RCS0) | BIT(BCS0) | + BIT(VECS0) | BIT(VECS1) | BIT(VECS2) | BIT(VECS3) | diff --git a/drivers/gpu/drm/i915/intel_device_info.h b/drivers/gpu/drm/i915/intel_device_info.h --- a/drivers/gpu/drm/i915/intel_device_info.h +++ b/drivers/gpu/drm/i915/intel_device_info.h diff --git a/0001-drm-i915-Extra-media-engines-for-ATS-Part-1-engine-d.patch b/0001-drm-i915-Extra-media-engines-for-ATS-Part-1-engine-d.patch new file mode 100644 index 000000000000..e407230dacbe --- /dev/null +++ b/0001-drm-i915-Extra-media-engines-for-ATS-Part-1-engine-d.patch @@ -0,0 +1,218 @@ +From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 +From: John Harrison <John.C.Harrison@xxxxxxxxx> +Date: Fri, 22 Mar 2019 16:22:19 -0700 +Subject: [PATCH] drm/i915: Extra media engines for ATS - Part 1 (engine + definitions) + +ATS has lots of extra media engines. This patch adds the basic +definitions for them. + +Also, add a sentinel to the engine id enum. That way there is no need +to know which engine is the last in the list. + +v2: Clean up I915_MAX_ENGINES - it is now the sentinel enum value in +the engine id list rather than a separate define in a separate header. +[Tvrtko Ursulin] + +Signed-off-by: John Harrison <John.C.Harrison@xxxxxxxxx> +Cc: Tvrtko Ursulin <tvrtko.ursulin@xxxxxxxxx> +--- + drivers/gpu/drm/i915/i915_gem.h | 2 - + drivers/gpu/drm/i915/i915_reg.h | 8 ++- + drivers/gpu/drm/i915/i915_reset.c | 2 - + drivers/gpu/drm/i915/intel_engine_cs.c | 56 +++++++++++++++++++++ + drivers/gpu/drm/i915/intel_engine_types.h | 14 ++++-- + drivers/gpu/drm/i915/intel_guc.h | 1 + + drivers/gpu/drm/i915/intel_guc_submission.h | 2 +- + 7 files changed, 76 insertions(+), 9 deletions(-) + +diff --git a/drivers/gpu/drm/i915/i915_gem.h b/drivers/gpu/drm/i915/i915_gem.h +--- a/drivers/gpu/drm/i915/i915_gem.h ++++ b/drivers/gpu/drm/i915/i915_gem.h +@@ -73,8 +73,6 @@ struct drm_i915_private; + #define GEM_TRACE_DUMP_ON(expr) BUILD_BUG_ON_INVALID(expr) + #endif + +-#define I915_NUM_ENGINES 9 +- + #define I915_GEM_IDLE_TIMEOUT (HZ / 5) + + void i915_gem_park(struct drm_i915_private *i915); +diff --git a/drivers/gpu/drm/i915/i915_reg.h b/drivers/gpu/drm/i915/i915_reg.h +--- a/drivers/gpu/drm/i915/i915_reg.h ++++ b/drivers/gpu/drm/i915/i915_reg.h +@@ -294,7 +294,7 @@ static inline bool i915_mmio_reg_valid(i915_reg_t reg) + + #define OTHER_GUC_INSTANCE 0 + #define OTHER_GTPM_INSTANCE 1 +-#define MAX_ENGINE_INSTANCE 3 ++#define MAX_ENGINE_INSTANCE 7 + + /* PCI config space */ + +@@ -2536,9 +2536,15 @@ enum i915_power_well_id { + #define GEN11_BSD2_RING_BASE 0x1c4000 + #define GEN11_BSD3_RING_BASE 0x1d0000 + #define GEN11_BSD4_RING_BASE 0x1d4000 ++#define GEN12_BSD5_RING_BASE 0x1e0000 ++#define GEN12_BSD6_RING_BASE 0x1e4000 ++#define GEN12_BSD7_RING_BASE 0x1f0000 ++#define GEN12_BSD8_RING_BASE 0x1f4000 + #define VEBOX_RING_BASE 0x1a000 + #define GEN11_VEBOX_RING_BASE 0x1c8000 + #define GEN11_VEBOX2_RING_BASE 0x1d8000 ++#define GEN12_VEBOX3_RING_BASE 0x1e8000 ++#define GEN12_VEBOX4_RING_BASE 0x1f8000 + #define GEN12_COMPUTE0_RING_BASE 0x1a000 + #define BLT_RING_BASE 0x22000 + #define RING_TAIL(base) _MMIO((base) + 0x30) +diff --git a/drivers/gpu/drm/i915/i915_reset.c b/drivers/gpu/drm/i915/i915_reset.c +--- a/drivers/gpu/drm/i915/i915_reset.c ++++ b/drivers/gpu/drm/i915/i915_reset.c +@@ -448,8 +448,6 @@ static int gen11_reset_engines(struct drm_i915_private *i915, + u32 hw_mask; + int ret; + +- BUILD_BUG_ON(CCS0 + 1 != I915_NUM_ENGINES); +- + if (engine_mask == ALL_ENGINES) { + hw_mask = GEN11_GRDOM_FULL; + } else { +diff --git a/drivers/gpu/drm/i915/intel_engine_cs.c b/drivers/gpu/drm/i915/intel_engine_cs.c +--- a/drivers/gpu/drm/i915/intel_engine_cs.c ++++ b/drivers/gpu/drm/i915/intel_engine_cs.c +@@ -158,6 +158,42 @@ static const struct engine_info intel_engines[] = { + { .gen = 11, .base = GEN11_BSD4_RING_BASE } + }, + }, ++ [VCS4] = { ++ .hw_id = 0, /* not used in GEN12+, see MI_SEMAPHORE_SIGNAL */ ++ .class = VIDEO_DECODE_CLASS, ++ .guc_class = GUC_VIDEO_CLASS, ++ .instance = 4, ++ .mmio_bases = { ++ { .gen = 11, .base = GEN12_BSD5_RING_BASE } ++ }, ++ }, ++ [VCS5] = { ++ .hw_id = 0, /* not used in GEN12+, see MI_SEMAPHORE_SIGNAL */ ++ .class = VIDEO_DECODE_CLASS, ++ .guc_class = GUC_VIDEO_CLASS, ++ .instance = 5, ++ .mmio_bases = { ++ { .gen = 12, .base = GEN12_BSD6_RING_BASE } ++ }, ++ }, ++ [VCS6] = { ++ .hw_id = 0, /* not used in GEN12+, see MI_SEMAPHORE_SIGNAL */ ++ .class = VIDEO_DECODE_CLASS, ++ .guc_class = GUC_VIDEO_CLASS, ++ .instance = 6, ++ .mmio_bases = { ++ { .gen = 12, .base = GEN12_BSD7_RING_BASE } ++ }, ++ }, ++ [VCS7] = { ++ .hw_id = 0, /* not used in GEN12+, see MI_SEMAPHORE_SIGNAL */ ++ .class = VIDEO_DECODE_CLASS, ++ .guc_class = GUC_VIDEO_CLASS, ++ .instance = 7, ++ .mmio_bases = { ++ { .gen = 12, .base = GEN12_BSD8_RING_BASE } ++ }, ++ }, + [VECS0] = { + .hw_id = VECS0_HW, + .class = VIDEO_ENHANCEMENT_CLASS, +@@ -177,6 +213,24 @@ static const struct engine_info intel_engines[] = { + { .gen = 11, .base = GEN11_VEBOX2_RING_BASE } + }, + }, ++ [VECS2] = { ++ .hw_id = 0, /* not used in GEN12+, see MI_SEMAPHORE_SIGNAL */ ++ .class = VIDEO_ENHANCEMENT_CLASS, ++ .guc_class = GUC_VIDEOENHANCE_CLASS, ++ .instance = 2, ++ .mmio_bases = { ++ { .gen = 12, .base = GEN12_VEBOX3_RING_BASE } ++ }, ++ }, ++ [VECS3] = { ++ .hw_id = 0, /* not used in GEN12+, see MI_SEMAPHORE_SIGNAL */ ++ .class = VIDEO_ENHANCEMENT_CLASS, ++ .guc_class = GUC_VIDEOENHANCE_CLASS, ++ .instance = 3, ++ .mmio_bases = { ++ { .gen = 12, .base = GEN12_VEBOX4_RING_BASE } ++ }, ++ }, + [CCS0] = { + .hw_id = 0, /* not used in GEN12+, see MI_SEMAPHORE_SIGNAL */ + .class = COMPUTE_CLASS, +@@ -318,6 +372,8 @@ intel_engine_setup(struct drm_i915_private *dev_priv, + + BUILD_BUG_ON(MAX_ENGINE_CLASS >= BIT(GEN11_ENGINE_CLASS_WIDTH)); + BUILD_BUG_ON(MAX_ENGINE_INSTANCE >= BIT(GEN11_ENGINE_INSTANCE_WIDTH)); ++ BUILD_BUG_ON(I915_MAX_VCS > (MAX_ENGINE_INSTANCE + 1)); ++ BUILD_BUG_ON(I915_MAX_VECS > (MAX_ENGINE_INSTANCE + 1)); + + if (GEM_DEBUG_WARN_ON(info->class > MAX_ENGINE_CLASS)) + return -EINVAL; +diff --git a/drivers/gpu/drm/i915/intel_engine_types.h b/drivers/gpu/drm/i915/intel_engine_types.h +--- a/drivers/gpu/drm/i915/intel_engine_types.h ++++ b/drivers/gpu/drm/i915/intel_engine_types.h +@@ -89,8 +89,8 @@ struct i915_ctx_workarounds { + struct i915_vma *vma; + }; + +-#define I915_MAX_VCS 4 +-#define I915_MAX_VECS 2 ++#define I915_MAX_VCS 8 ++#define I915_MAX_VECS 4 + + /* + * Engine IDs definitions. +@@ -103,11 +103,19 @@ enum intel_engine_id { + VCS1, + VCS2, + VCS3, ++ VCS4, ++ VCS5, ++ VCS6, ++ VCS7, + #define _VCS(n) (VCS0 + (n)) + VECS0, + VECS1, ++ VECS2, ++ VECS3, + #define _VECS(n) (VECS0 + (n)) +- CCS0 ++ CCS0, ++ ++ I915_NUM_ENGINES + }; + + struct st_preempt_hang { +diff --git a/drivers/gpu/drm/i915/intel_guc.h b/drivers/gpu/drm/i915/intel_guc.h +--- a/drivers/gpu/drm/i915/intel_guc.h ++++ b/drivers/gpu/drm/i915/intel_guc.h +@@ -33,6 +33,7 @@ + #include "intel_guc_log.h" + #include "intel_guc_reg.h" + #include "intel_uc_fw.h" ++#include "intel_engine_types.h" + #include "i915_utils.h" + #include "i915_vma.h" + +diff --git a/drivers/gpu/drm/i915/intel_guc_submission.h b/drivers/gpu/drm/i915/intel_guc_submission.h +--- a/drivers/gpu/drm/i915/intel_guc_submission.h ++++ b/drivers/gpu/drm/i915/intel_guc_submission.h +@@ -27,7 +27,7 @@ + + #include <linux/spinlock.h> + +-#include "i915_gem.h" ++#include "intel_engine_types.h" + #include "i915_selftest.h" + + struct drm_i915_private; diff --git a/0001-drm-i915-Extra-media-engines-for-ATS-Part-2-interrup.patch b/0001-drm-i915-Extra-media-engines-for-ATS-Part-2-interrup.patch new file mode 100644 index 000000000000..ba449e18fbae --- /dev/null +++ b/0001-drm-i915-Extra-media-engines-for-ATS-Part-2-interrup.patch @@ -0,0 +1,97 @@ +From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 +From: John Harrison <John.C.Harrison@xxxxxxxxx> +Date: Fri, 22 Mar 2019 16:26:35 -0700 +Subject: [PATCH] drm/i915: Extra media engines for ATS - Part 2 (interrupts) + +ATS has lots of extra media engines. This patch adds the interrupt +handler support for them. + +v2: Changed debugfs to assume ATS always has VCSx8 + VECSx4 +irrespective of fusings. [Tvrtko Ursulin] + +v3: Changed interrupt masking to check for the presence of each pair +of engines to support fusings [Daniele]. + +Signed-off-by: John Harrison <John.C.Harrison@xxxxxxxxx> +CC: Tvrtko Ursulin <tvrtko.ursulin@xxxxxxxxx> +CC: Daniele Ceraolo Spurio <daniele.ceraolospurio@xxxxxxxxx> +--- + drivers/gpu/drm/i915/i915_debugfs.c | 10 +++++++++- + drivers/gpu/drm/i915/i915_irq.c | 12 ++++++++++++ + drivers/gpu/drm/i915/i915_reg.h | 3 +++ + 3 files changed, 24 insertions(+), 1 deletion(-) + +diff --git a/drivers/gpu/drm/i915/i915_debugfs.c b/drivers/gpu/drm/i915/i915_debugfs.c +--- a/drivers/gpu/drm/i915/i915_debugfs.c ++++ b/drivers/gpu/drm/i915/i915_debugfs.c +@@ -869,8 +869,17 @@ static int i915_interrupt_info(struct seq_file *m, void *data) + I915_READ(GEN11_VCS0_VCS1_INTR_MASK)); + seq_printf(m, "VCS2/VCS3 Intr Mask:\t %08x\n", + I915_READ(GEN11_VCS2_VCS3_INTR_MASK)); ++ if (IS_ARCTICSOUND(dev_priv)) { ++ seq_printf(m, "VCS4/VCS5 Intr Mask:\t %08x\n", ++ I915_READ(GEN12_VCS4_VCS5_INTR_MASK)); ++ seq_printf(m, "VCS6/VCS7 Intr Mask:\t %08x\n", ++ I915_READ(GEN12_VCS6_VCS7_INTR_MASK)); ++ } + seq_printf(m, "VECS0/VECS1 Intr Mask:\t %08x\n", + I915_READ(GEN11_VECS0_VECS1_INTR_MASK)); ++ if (IS_ARCTICSOUND(dev_priv)) ++ seq_printf(m, "VECS2/VECS3 Intr Mask:\t %08x\n", ++ I915_READ(GEN12_VECS2_VECS3_INTR_MASK)); + seq_printf(m, "GUC/SG Intr Mask:\t %08x\n", + I915_READ(GEN11_GUC_SG_INTR_MASK)); + seq_printf(m, "GPM/WGBOXPERF Intr Mask: %08x\n", +@@ -883,7 +892,6 @@ static int i915_interrupt_info(struct seq_file *m, void *data) + seq_printf(m, "CCS Intr Mask:\t %08x\n", + I915_READ(GEN12_CCS0_RSVD_INTR_MASK)); + } +- + } else if (INTEL_GEN(dev_priv) >= 6) { + for_each_engine(engine, dev_priv, id) { + seq_printf(m, +diff --git a/drivers/gpu/drm/i915/i915_irq.c b/drivers/gpu/drm/i915/i915_irq.c +--- a/drivers/gpu/drm/i915/i915_irq.c ++++ b/drivers/gpu/drm/i915/i915_irq.c +@@ -3630,7 +3630,13 @@ static void gen11_gt_irq_reset(struct drm_i915_private *dev_priv) + I915_WRITE(GEN11_BCS_RSVD_INTR_MASK, ~0); + I915_WRITE(GEN11_VCS0_VCS1_INTR_MASK, ~0); + I915_WRITE(GEN11_VCS2_VCS3_INTR_MASK, ~0); ++ if (HAS_ENGINE(dev_priv, VCS4) || HAS_ENGINE(dev_priv, VCS5)) ++ I915_WRITE(GEN12_VCS4_VCS5_INTR_MASK, ~0); ++ if (HAS_ENGINE(dev_priv, VCS6) || HAS_ENGINE(dev_priv, VCS7)) ++ I915_WRITE(GEN12_VCS6_VCS7_INTR_MASK, ~0); + I915_WRITE(GEN11_VECS0_VECS1_INTR_MASK, ~0); ++ if (HAS_ENGINE(dev_priv, VECS2) || (HAS_ENGINE(dev_priv, VECS3)) ++ I915_WRITE(GEN12_VECS2_VECS3_INTR_MASK, ~0); + if (HAS_ENGINE(dev_priv, CCS0)) + I915_WRITE(GEN12_CCS0_RSVD_INTR_MASK, ~0); + +@@ -4289,7 +4295,13 @@ static void gen11_gt_irq_postinstall(struct drm_i915_private *dev_priv) + I915_WRITE(GEN11_BCS_RSVD_INTR_MASK, ~(irqs << 16)); + I915_WRITE(GEN11_VCS0_VCS1_INTR_MASK, ~(irqs | irqs << 16)); + I915_WRITE(GEN11_VCS2_VCS3_INTR_MASK, ~(irqs | irqs << 16)); ++ if (HAS_ENGINE(dev_priv, VCS4) || HAS_ENGINE(dev_priv, VCS5)) ++ I915_WRITE(GEN12_VCS4_VCS5_INTR_MASK, ~(irqs | irqs << 16)); ++ if (HAS_ENGINE(dev_priv, VCS6) || HAS_ENGINE(dev_priv, VCS7)) ++ I915_WRITE(GEN12_VCS6_VCS7_INTR_MASK, ~(irqs | irqs << 16)); + I915_WRITE(GEN11_VECS0_VECS1_INTR_MASK, ~(irqs | irqs << 16)); ++ if (HAS_ENGINE(dev_priv, VECS2) || HAS_ENGINE(dev_priv, VECS3)) ++ I915_WRITE(GEN12_VECS2_VECS3_INTR_MASK, ~(irqs | irqs << 16)); + if (HAS_ENGINE(dev_priv, CCS0)) + I915_WRITE(GEN12_CCS0_RSVD_INTR_MASK, ~(irqs << 16)); + +diff --git a/drivers/gpu/drm/i915/i915_reg.h b/drivers/gpu/drm/i915/i915_reg.h +--- a/drivers/gpu/drm/i915/i915_reg.h ++++ b/drivers/gpu/drm/i915/i915_reg.h +@@ -7678,7 +7678,10 @@ enum { + #define GEN11_BCS_RSVD_INTR_MASK _MMIO(0x1900a0) + #define GEN11_VCS0_VCS1_INTR_MASK _MMIO(0x1900a8) + #define GEN11_VCS2_VCS3_INTR_MASK _MMIO(0x1900ac) ++#define GEN12_VCS4_VCS5_INTR_MASK _MMIO(0x1900b0) ++#define GEN12_VCS6_VCS7_INTR_MASK _MMIO(0x1900b4) + #define GEN11_VECS0_VECS1_INTR_MASK _MMIO(0x1900d0) ++#define GEN12_VECS2_VECS3_INTR_MASK _MMIO(0x1900d4) + #define GEN11_GUC_SG_INTR_MASK _MMIO(0x1900e8) + #define GEN11_GPM_WGBOXPERF_INTR_MASK _MMIO(0x1900ec) + #define GEN11_CRYPTO_RSVD_INTR_MASK _MMIO(0x1900f0) diff --git a/0001-drm-i915-Extra-media-engines-for-ATS-Part-3-reset.patch b/0001-drm-i915-Extra-media-engines-for-ATS-Part-3-reset.patch new file mode 100644 index 000000000000..a4bfed593bd3 --- /dev/null +++ b/0001-drm-i915-Extra-media-engines-for-ATS-Part-3-reset.patch @@ -0,0 +1,54 @@ +From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 +From: John Harrison <John.C.Harrison@xxxxxxxxx> +Date: Fri, 22 Mar 2019 16:31:30 -0700 +Subject: [PATCH] drm/i915: Extra media engines for ATS - Part 3 (reset) + +ATS has lots of extra media engines. This patch adds the reset support +for them. + +Signed-off-by: John Harrison <John.C.Harrison@xxxxxxxxx> +--- + drivers/gpu/drm/i915/i915_reg.h | 8 ++++++++ + drivers/gpu/drm/i915/i915_reset.c | 6 ++++++ + 2 files changed, 14 insertions(+) + +diff --git a/drivers/gpu/drm/i915/i915_reg.h b/drivers/gpu/drm/i915/i915_reg.h +--- a/drivers/gpu/drm/i915/i915_reg.h ++++ b/drivers/gpu/drm/i915/i915_reg.h +@@ -416,10 +416,18 @@ static inline bool i915_mmio_reg_valid(i915_reg_t reg) + #define GEN11_GRDOM_MEDIA2 (1 << 6) + #define GEN11_GRDOM_MEDIA3 (1 << 7) + #define GEN11_GRDOM_MEDIA4 (1 << 8) ++#define GEN11_GRDOM_MEDIA5 (1 << 9) ++#define GEN11_GRDOM_MEDIA6 (1 << 10) ++#define GEN11_GRDOM_MEDIA7 (1 << 11) ++#define GEN11_GRDOM_MEDIA8 (1 << 12) + #define GEN11_GRDOM_VECS (1 << 13) + #define GEN11_GRDOM_VECS2 (1 << 14) ++#define GEN11_GRDOM_VECS3 (1 << 15) ++#define GEN11_GRDOM_VECS4 (1 << 16) + #define GEN11_GRDOM_SFC0 (1 << 17) + #define GEN11_GRDOM_SFC1 (1 << 18) ++#define GEN11_GRDOM_SFC2 (1 << 19) ++#define GEN11_GRDOM_SFC3 (1 << 20) + + #define GEN11_VCS_SFC_RESET_BIT(instance) (GEN11_GRDOM_SFC0 << ((instance) >> 1)) + #define GEN11_VECS_SFC_RESET_BIT(instance) (GEN11_GRDOM_SFC0 << (instance)) +diff --git a/drivers/gpu/drm/i915/i915_reset.c b/drivers/gpu/drm/i915/i915_reset.c +--- a/drivers/gpu/drm/i915/i915_reset.c ++++ b/drivers/gpu/drm/i915/i915_reset.c +@@ -439,8 +439,14 @@ static int gen11_reset_engines(struct drm_i915_private *i915, + [VCS1] = GEN11_GRDOM_MEDIA2, + [VCS2] = GEN11_GRDOM_MEDIA3, + [VCS3] = GEN11_GRDOM_MEDIA4, ++ [VCS4] = GEN11_GRDOM_MEDIA5, ++ [VCS5] = GEN11_GRDOM_MEDIA6, ++ [VCS6] = GEN11_GRDOM_MEDIA7, ++ [VCS7] = GEN11_GRDOM_MEDIA8, + [VECS0] = GEN11_GRDOM_VECS, + [VECS1] = GEN11_GRDOM_VECS2, ++ [VECS2] = GEN11_GRDOM_VECS3, ++ [VECS3] = GEN11_GRDOM_VECS4, + [CCS0] = GEN11_GRDOM_RENDER, /* FIXME: RCS/CCS engine reset won't be as simple */ + }; + struct intel_engine_cs *engine; diff --git a/0001-drm-i915-Extra-media-engines-for-ATS-Part-4-FW.patch b/0001-drm-i915-Extra-media-engines-for-ATS-Part-4-FW.patch new file mode 100644 index 000000000000..d19ee8d326d6 --- /dev/null +++ b/0001-drm-i915-Extra-media-engines-for-ATS-Part-4-FW.patch @@ -0,0 +1,110 @@ +From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 +From: John Harrison <John.C.Harrison@xxxxxxxxx> +Date: Fri, 22 Mar 2019 17:10:55 -0700 +Subject: [PATCH] drm/i915: Extra media engines for ATS - Part 4 (FW) + +ATS has lots of extra media engines. This patch adds the forcewake +support for them. + +Signed-off-by: John Harrison <John.C.Harrison@xxxxxxxxx> +--- + drivers/gpu/drm/i915/intel_uncore.c | 28 +++++++++++++++++++++++++++- + drivers/gpu/drm/i915/intel_uncore.h | 12 ++++++++++++ + 2 files changed, 39 insertions(+), 1 deletion(-) + +diff --git a/drivers/gpu/drm/i915/intel_uncore.c b/drivers/gpu/drm/i915/intel_uncore.c +--- a/drivers/gpu/drm/i915/intel_uncore.c ++++ b/drivers/gpu/drm/i915/intel_uncore.c +@@ -41,8 +41,14 @@ static const char * const forcewake_domain_names[] = { + "vdbox1", + "vdbox2", + "vdbox3", ++ "vdbox4", ++ "vdbox5", ++ "vdbox6", ++ "vdbox7", + "vebox0", + "vebox1", ++ "vebox2", ++ "vebox3", + }; + + const char * +@@ -930,6 +936,12 @@ static const i915_reg_t gen12_shadowed_regs[] = { + RING_TAIL(GEN11_BSD3_RING_BASE), /* 0x1D0000 (base) */ + RING_TAIL(GEN11_BSD4_RING_BASE), /* 0x1D4000 (base) */ + RING_TAIL(GEN11_VEBOX2_RING_BASE), /* 0x1D8000 (base) */ ++ RING_TAIL(GEN12_BSD5_RING_BASE), /* 0x1E0000 (base) */ ++ RING_TAIL(GEN12_BSD6_RING_BASE), /* 0x1E4000 (base) */ ++ RING_TAIL(GEN12_VEBOX3_RING_BASE), /* 0x1E8000 (base) */ ++ RING_TAIL(GEN12_BSD7_RING_BASE), /* 0x1F0000 (base) */ ++ RING_TAIL(GEN12_BSD8_RING_BASE), /* 0x1F4000 (base) */ ++ RING_TAIL(GEN12_VEBOX4_RING_BASE), /* 0x1F8000 (base) */ + /* TODO: Other registers are not yet used */ + }; + +@@ -1119,7 +1131,15 @@ static const struct intel_forcewake_range __gen12_fw_ranges[] = { + GEN_FW_RANGE(0x1cc000, 0x1cffff, FORCEWAKE_BLITTER), + GEN_FW_RANGE(0x1d0000, 0x1d3fff, FORCEWAKE_MEDIA_VDBOX2), + GEN_FW_RANGE(0x1d4000, 0x1d7fff, FORCEWAKE_MEDIA_VDBOX3), +- GEN_FW_RANGE(0x1d8000, 0x1dbfff, FORCEWAKE_MEDIA_VEBOX1) ++ GEN_FW_RANGE(0x1d8000, 0x1dbfff, FORCEWAKE_MEDIA_VEBOX1), ++ GEN_FW_RANGE(0x1dc000, 0x1dffff, FORCEWAKE_BLITTER), ++ GEN_FW_RANGE(0x1e0000, 0x1e3fff, FORCEWAKE_MEDIA_VDBOX4), ++ GEN_FW_RANGE(0x1e4000, 0x1e7fff, FORCEWAKE_MEDIA_VDBOX5), ++ GEN_FW_RANGE(0x1e8000, 0x1ebfff, FORCEWAKE_MEDIA_VEBOX2), ++ GEN_FW_RANGE(0x1ec000, 0x1effff, FORCEWAKE_BLITTER), ++ GEN_FW_RANGE(0x1f0000, 0x1f3fff, FORCEWAKE_MEDIA_VDBOX6), ++ GEN_FW_RANGE(0x1f4000, 0x1f7fff, FORCEWAKE_MEDIA_VDBOX7), ++ GEN_FW_RANGE(0x1f8000, 0x1fbfff, FORCEWAKE_MEDIA_VEBOX3), + }; + + static void +@@ -1417,8 +1437,14 @@ static void fw_domain_init(struct intel_uncore *uncore, + BUILD_BUG_ON(FORCEWAKE_MEDIA_VDBOX1 != (1 << FW_DOMAIN_ID_MEDIA_VDBOX1)); + BUILD_BUG_ON(FORCEWAKE_MEDIA_VDBOX2 != (1 << FW_DOMAIN_ID_MEDIA_VDBOX2)); + BUILD_BUG_ON(FORCEWAKE_MEDIA_VDBOX3 != (1 << FW_DOMAIN_ID_MEDIA_VDBOX3)); ++ BUILD_BUG_ON(FORCEWAKE_MEDIA_VDBOX4 != (1 << FW_DOMAIN_ID_MEDIA_VDBOX4)); ++ BUILD_BUG_ON(FORCEWAKE_MEDIA_VDBOX5 != (1 << FW_DOMAIN_ID_MEDIA_VDBOX5)); ++ BUILD_BUG_ON(FORCEWAKE_MEDIA_VDBOX6 != (1 << FW_DOMAIN_ID_MEDIA_VDBOX6)); ++ BUILD_BUG_ON(FORCEWAKE_MEDIA_VDBOX7 != (1 << FW_DOMAIN_ID_MEDIA_VDBOX7)); + BUILD_BUG_ON(FORCEWAKE_MEDIA_VEBOX0 != (1 << FW_DOMAIN_ID_MEDIA_VEBOX0)); + BUILD_BUG_ON(FORCEWAKE_MEDIA_VEBOX1 != (1 << FW_DOMAIN_ID_MEDIA_VEBOX1)); ++ BUILD_BUG_ON(FORCEWAKE_MEDIA_VEBOX2 != (1 << FW_DOMAIN_ID_MEDIA_VEBOX2)); ++ BUILD_BUG_ON(FORCEWAKE_MEDIA_VEBOX3 != (1 << FW_DOMAIN_ID_MEDIA_VEBOX3)); + + + d->mask = BIT(domain_id); +diff --git a/drivers/gpu/drm/i915/intel_uncore.h b/drivers/gpu/drm/i915/intel_uncore.h +--- a/drivers/gpu/drm/i915/intel_uncore.h ++++ b/drivers/gpu/drm/i915/intel_uncore.h +@@ -44,8 +44,14 @@ enum forcewake_domain_id { + FW_DOMAIN_ID_MEDIA_VDBOX1, + FW_DOMAIN_ID_MEDIA_VDBOX2, + FW_DOMAIN_ID_MEDIA_VDBOX3, ++ FW_DOMAIN_ID_MEDIA_VDBOX4, ++ FW_DOMAIN_ID_MEDIA_VDBOX5, ++ FW_DOMAIN_ID_MEDIA_VDBOX6, ++ FW_DOMAIN_ID_MEDIA_VDBOX7, + FW_DOMAIN_ID_MEDIA_VEBOX0, + FW_DOMAIN_ID_MEDIA_VEBOX1, ++ FW_DOMAIN_ID_MEDIA_VEBOX2, ++ FW_DOMAIN_ID_MEDIA_VEBOX3, + + FW_DOMAIN_ID_COUNT + }; +@@ -58,8 +64,14 @@ enum forcewake_domains { + FORCEWAKE_MEDIA_VDBOX1 = BIT(FW_DOMAIN_ID_MEDIA_VDBOX1), + FORCEWAKE_MEDIA_VDBOX2 = BIT(FW_DOMAIN_ID_MEDIA_VDBOX2), + FORCEWAKE_MEDIA_VDBOX3 = BIT(FW_DOMAIN_ID_MEDIA_VDBOX3), ++ FORCEWAKE_MEDIA_VDBOX4 = BIT(FW_DOMAIN_ID_MEDIA_VDBOX4), ++ FORCEWAKE_MEDIA_VDBOX5 = BIT(FW_DOMAIN_ID_MEDIA_VDBOX5), ++ FORCEWAKE_MEDIA_VDBOX6 = BIT(FW_DOMAIN_ID_MEDIA_VDBOX6), ++ FORCEWAKE_MEDIA_VDBOX7 = BIT(FW_DOMAIN_ID_MEDIA_VDBOX7), + FORCEWAKE_MEDIA_VEBOX0 = BIT(FW_DOMAIN_ID_MEDIA_VEBOX0), + FORCEWAKE_MEDIA_VEBOX1 = BIT(FW_DOMAIN_ID_MEDIA_VEBOX1), ++ FORCEWAKE_MEDIA_VEBOX2 = BIT(FW_DOMAIN_ID_MEDIA_VEBOX2), ++ FORCEWAKE_MEDIA_VEBOX3 = BIT(FW_DOMAIN_ID_MEDIA_VEBOX3), + + FORCEWAKE_ALL = BIT(FW_DOMAIN_ID_COUNT) - 1 + }; diff --git a/0001-drm-i915-Extra-media-engines-for-ATS-Part-5-UAPI.patch b/0001-drm-i915-Extra-media-engines-for-ATS-Part-5-UAPI.patch new file mode 100644 index 000000000000..275437f27a23 --- /dev/null +++ b/0001-drm-i915-Extra-media-engines-for-ATS-Part-5-UAPI.patch @@ -0,0 +1,30 @@ +From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 +From: John Harrison <John.C.Harrison@xxxxxxxxx> +Date: Fri, 22 Mar 2019 17:12:56 -0700 +Subject: [PATCH] drm/i915: Extra media engines for ATS - Part 5 (UAPI) + +ATS has lots of extra media engines. This patch enables them in the +engine query UAPI so that they can actually be used. + +Signed-off-by: John Harrison <John.C.Harrison@xxxxxxxxx> +--- + drivers/gpu/drm/i915/i915_pci.c | 7 +++++-- + 1 file changed, 5 insertions(+), 2 deletions(-) + +diff --git a/drivers/gpu/drm/i915/i915_pci.c b/drivers/gpu/drm/i915/i915_pci.c +--- a/drivers/gpu/drm/i915/i915_pci.c ++++ b/drivers/gpu/drm/i915/i915_pci.c +@@ -780,8 +780,11 @@ static const struct intel_device_info intel_arcticsound_info = { + .is_alpha_support = 1, + .has_guc_dist_db = 0, + .engine_mask = +- BIT(RCS0) | BIT(BCS0) | BIT(VECS0) | BIT(VECS1) | BIT(VCS0) | +- BIT(VCS1) | BIT(VCS2) | BIT(VCS3) | BIT(CCS0), ++ BIT(RCS0) | BIT(BCS0) | ++ BIT(VECS0) | BIT(VECS1) | BIT(VECS2) | BIT(VECS3) | ++ BIT(VCS0) | BIT(VCS1) | BIT(VCS2) | BIT(VCS3) | ++ BIT(VCS4) | BIT(VCS5) | BIT(VCS6) | BIT(VCS7) | ++ BIT(CCS0), + }; + + #undef GEN diff --git a/0001-drm-i915-ats-ATS-has-MMIO-doorbells.patch b/0001-drm-i915-ats-ATS-has-MMIO-doorbells.patch index 1b216a7ea5b4..902179ce484d 100644 --- a/0001-drm-i915-ats-ATS-has-MMIO-doorbells.patch +++ b/0001-drm-i915-ats-ATS-has-MMIO-doorbells.patch @@ -21,5 +21,5 @@ diff --git a/drivers/gpu/drm/i915/i915_pci.c b/drivers/gpu/drm/i915/i915_pci.c .has_guc_dist_db = 0, + .has_guc_mmio_db = 1, .engine_mask = - BIT(RCS0) | BIT(BCS0) | BIT(VECS0) | BIT(VECS1) | BIT(VCS0) | - BIT(VCS1) | BIT(VCS2) | BIT(VCS3) | BIT(CCS0), + BIT(RCS0) | BIT(BCS0) | + BIT(VECS0) | BIT(VECS1) | BIT(VECS2) | BIT(VECS3) | diff --git a/0001-drm-i915-ats-Disable-all-display-device-information-.patch b/0001-drm-i915-ats-Disable-all-display-device-information-.patch index fa5435a374fe..15358a1e4ef0 100644 --- a/0001-drm-i915-ats-Disable-all-display-device-information-.patch +++ b/0001-drm-i915-ats-Disable-all-display-device-information-.patch @@ -19,10 +19,10 @@ Acked-by: Lucas De Marchi <lucas.demarchi@xxxxxxxxx> diff --git a/drivers/gpu/drm/i915/i915_pci.c b/drivers/gpu/drm/i915/i915_pci.c --- a/drivers/gpu/drm/i915/i915_pci.c +++ b/drivers/gpu/drm/i915/i915_pci.c -@@ -818,6 +818,7 @@ static const struct intel_device_info intel_arcticsound_info = { - .engine_mask = - BIT(RCS0) | BIT(BCS0) | BIT(VECS0) | BIT(VECS1) | BIT(VCS0) | - BIT(VCS1) | BIT(VCS2) | BIT(VCS3) | BIT(CCS0), +@@ -821,6 +821,7 @@ static const struct intel_device_info intel_arcticsound_info = { + BIT(VCS0) | BIT(VCS1) | BIT(VCS2) | BIT(VCS3) | + BIT(VCS4) | BIT(VCS5) | BIT(VCS6) | BIT(VCS7) | + BIT(CCS0), + .display = { 0 }, }; diff --git a/0001-drm-i915-guc-Support-for-VFPF-relay-messages.patch b/0001-drm-i915-guc-Support-for-VFPF-relay-messages.patch index 0873dd1ef112..8b2163a221db 100644 --- a/0001-drm-i915-guc-Support-for-VFPF-relay-messages.patch +++ b/0001-drm-i915-guc-Support-for-VFPF-relay-messages.patch @@ -59,9 +59,9 @@ diff --git a/drivers/gpu/drm/i915/intel_guc.h b/drivers/gpu/drm/i915/intel_guc.h #include "intel_guc_reg.h" +#include "intel_guc_relay.h" #include "intel_uc_fw.h" + #include "intel_engine_types.h" #include "i915_utils.h" - #include "i915_vma.h" -@@ -50,6 +51,7 @@ struct intel_guc { +@@ -51,6 +52,7 @@ struct intel_guc { struct intel_uc_fw fw; struct intel_guc_log log; struct intel_guc_ct ct; diff --git a/0001-drm-i915-selftests-Allow-for-larger-engine-counts.patch b/0001-drm-i915-selftests-Allow-for-larger-engine-counts.patch new file mode 100644 index 000000000000..dd97c611fc41 --- /dev/null +++ b/0001-drm-i915-selftests-Allow-for-larger-engine-counts.patch @@ -0,0 +1,85 @@ +From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 +From: John Harrison <John.C.Harrison@xxxxxxxxx> +Date: Fri, 22 Mar 2019 16:47:30 -0700 +Subject: [PATCH] drm/i915/selftests: Allow for larger engine counts + +Increasing the engine count causes a couple of local array variables +to exceed the kernel stack limit. So make them dynamic allocations +instead. + +Signed-off-by: John Harrison <John.C.Harrison@xxxxxxxxx> +--- + drivers/gpu/drm/i915/selftests/i915_request.c | 7 ++++++- + drivers/gpu/drm/i915/selftests/intel_lrc.c | 10 ++++++++-- + 2 files changed, 14 insertions(+), 3 deletions(-) + +diff --git a/drivers/gpu/drm/i915/selftests/i915_request.c b/drivers/gpu/drm/i915/selftests/i915_request.c +--- a/drivers/gpu/drm/i915/selftests/i915_request.c ++++ b/drivers/gpu/drm/i915/selftests/i915_request.c +@@ -1097,7 +1097,7 @@ max_batches(struct i915_gem_context *ctx, struct intel_engine_cs *engine) + static int live_breadcrumbs_smoketest(void *arg) + { + struct drm_i915_private *i915 = arg; +- struct smoketest t[I915_NUM_ENGINES]; ++ struct smoketest *t; + unsigned int ncpus = num_online_cpus(); + unsigned long num_waits, num_fences; + struct intel_engine_cs *engine; +@@ -1117,6 +1117,10 @@ static int live_breadcrumbs_smoketest(void *arg) + * On real hardware this time. + */ + ++ t = kmalloc_array(I915_NUM_ENGINES, sizeof(*t), GFP_KERNEL); ++ if (!t) ++ return -ENOMEM; ++ + wakeref = intel_runtime_pm_get(i915); + + file = mock_file(i915); +@@ -1226,6 +1230,7 @@ static int live_breadcrumbs_smoketest(void *arg) + out_rpm: + intel_runtime_pm_put(i915, wakeref); + ++ kfree(t); + return ret; + } + +diff --git a/drivers/gpu/drm/i915/selftests/intel_lrc.c b/drivers/gpu/drm/i915/selftests/intel_lrc.c +--- a/drivers/gpu/drm/i915/selftests/intel_lrc.c ++++ b/drivers/gpu/drm/i915/selftests/intel_lrc.c +@@ -964,12 +964,16 @@ static int smoke_crescendo(struct preempt_smoke *smoke, unsigned int flags) + #define BATCH BIT(0) + { + struct task_struct *tsk[I915_NUM_ENGINES] = {}; +- struct preempt_smoke arg[I915_NUM_ENGINES]; ++ struct preempt_smoke *arg; + struct intel_engine_cs *engine; + enum intel_engine_id id; + unsigned long count; + int err = 0; + ++ arg = kmalloc_array(I915_NUM_ENGINES, sizeof(*arg), GFP_KERNEL); ++ if (!arg) ++ return -ENOMEM; ++ + mutex_unlock(&smoke->i915->drm.struct_mutex); + + for_each_engine(engine, smoke->i915, id) { +@@ -979,7 +983,7 @@ static int smoke_crescendo(struct preempt_smoke *smoke, unsigned int flags) + arg[id].batch = NULL; + arg[id].count = 0; + +- tsk[id] = kthread_run(smoke_crescendo_thread, &arg, ++ tsk[id] = kthread_run(smoke_crescendo_thread, arg, + "igt/smoke:%d", id); + if (IS_ERR(tsk[id])) { + err = PTR_ERR(tsk[id]); +@@ -1009,6 +1013,8 @@ static int smoke_crescendo(struct preempt_smoke *smoke, unsigned int flags) + pr_info("Submitted %lu crescendo:%x requests across %d engines and %d contexts\n", + count, flags, + RUNTIME_INFO(smoke->i915)->num_engines, smoke->ncontext); ++ ++ kfree(arg); + return 0; + } + -- git-pile 0.91 _______________________________________________ Intel-gfx mailing list Intel-gfx@xxxxxxxxxxxxxxxxxxxxx https://lists.freedesktop.org/mailman/listinfo/intel-gfx