All of lore.kernel.org
 help / color / mirror / Atom feed
* [PATCH 1/8] drm/i915/icl: Check for fused-off VDBOX and VEBOX instances
@ 2018-03-16 12:14 Mika Kuoppala
  2018-03-16 12:14 ` [PATCH 2/8] drm/i915/icl: Enable the extra video decode and enhancement boxes for Icelake 11 Mika Kuoppala
                   ` (10 more replies)
  0 siblings, 11 replies; 27+ messages in thread
From: Mika Kuoppala @ 2018-03-16 12:14 UTC (permalink / raw)
  To: intel-gfx; +Cc: Paulo Zanoni, Rodrigo Vivi

From: Oscar Mateo <oscar.mateo@intel.com>

In Gen11, the Video Decode engines (aka VDBOX, aka VCS, aka BSD) and the
Video Enhancement engines (aka VEBOX, aka VECS) could be fused off. Also,
each VDBOX and VEBOX has its own power well, which only exist if the related
engine exists in the HW.

Unfortunately, we have a Catch-22 situation going on: we need the blitter
forcewake to read the register with the fuse info, but we cannot initialize
the forcewake domains without knowin about the engines present in the HW.
We workaround this problem by allowing the initialization of all forcewake
domains and then pruning the fused off ones, as per the fuse information.

Bspec: 20680

v2: We were shifting incorrectly for vebox disable (Vinay)

v3: Assert mmio is ready and warn if we have attempted to initialize
    forcewake for fused-off engines (Paulo)

v4:
  - Use INTEL_GEN in new code (Tvrtko)
  - Shorter local variable (Tvrtko, Michal)
  - Keep "if (!...) continue" style (Tvrtko)
  - No unnecessary BUG_ON (Tvrtko)
  - WARN_ON and cleanup if wrong mask (Tvrtko, Michal)
  - Use I915_READ_FW (Michal)
  - Use I915_MAX_VCS/VECS macros (Michal)

v5: Rebased by Rodrigo fixing conflicts on top of:
    commit 33def1ff7b0 ("drm/i915: Simplify intel_engines_init")

v6: Fix v5. Remove info->num_rings. (by Oscar)

v7: Rebase (Rodrigo).

v8:
  - s/intel_device_info_fused_off_engines/intel_device_info_init_mmio (Chris)
  - Make vdbox_disable & vebox_disable local variables (Chris)

v9:
  - Move function declaration to intel_device_info.h (Michal)
  - Missing indent in bit fields definitions (Michal)
  - When RC6 is enabled by BIOS, the fuse register cannot be read until
    the blitter powerwell is awake. Shuffle where the fuse is read, prune
    the forcewake domains after the fact and change the commit message
    accordingly (Vinay, Sagar, Chris).

v10:
  - Improved commit message (Sagar)
  - New line in header file (Sagar)
  - Specify the message in fw_domain_reset applies to ICL+ (Sagar)

Cc: Paulo Zanoni <paulo.r.zanoni@intel.com>
Cc: Vinay Belgaumkar <vinay.belgaumkar@intel.com>
Cc: Tvrtko Ursulin <tvrtko.ursulin@intel.com>
Cc: Michal Wajdeczko <michal.wajdeczko@intel.com>
Cc: Chris Wilson <chris@chris-wilson.co.uk>
Cc: Daniele Ceraolo Spurio <daniele.ceraolospurio@intel.com>
Cc: Sagar Arun Kamble <sagar.a.kamble@intel.com>
Signed-off-by: Rodrigo Vivi <rodrigo.vivi@intel.com>
Signed-off-by: Oscar Mateo <oscar.mateo@intel.com>
---
 drivers/gpu/drm/i915/i915_drv.c          |  4 +++
 drivers/gpu/drm/i915/i915_reg.h          |  5 +++
 drivers/gpu/drm/i915/intel_device_info.c | 47 +++++++++++++++++++++++++++
 drivers/gpu/drm/i915/intel_device_info.h |  2 ++
 drivers/gpu/drm/i915/intel_uncore.c      | 56 ++++++++++++++++++++++++++++++++
 drivers/gpu/drm/i915/intel_uncore.h      |  1 +
 6 files changed, 115 insertions(+)

diff --git a/drivers/gpu/drm/i915/i915_drv.c b/drivers/gpu/drm/i915/i915_drv.c
index 3df5193487f3..83df8e21cec0 100644
--- a/drivers/gpu/drm/i915/i915_drv.c
+++ b/drivers/gpu/drm/i915/i915_drv.c
@@ -1033,6 +1033,10 @@ static int i915_driver_init_mmio(struct drm_i915_private *dev_priv)
 
 	intel_uncore_init(dev_priv);
 
+	intel_device_info_init_mmio(dev_priv);
+
+	intel_uncore_prune(dev_priv);
+
 	intel_uc_init_mmio(dev_priv);
 
 	ret = intel_engines_init_mmio(dev_priv);
diff --git a/drivers/gpu/drm/i915/i915_reg.h b/drivers/gpu/drm/i915/i915_reg.h
index cf7c837d6a09..982e72e73e99 100644
--- a/drivers/gpu/drm/i915/i915_reg.h
+++ b/drivers/gpu/drm/i915/i915_reg.h
@@ -2545,6 +2545,11 @@ enum i915_power_well_id {
 #define GEN10_EU_DISABLE3		_MMIO(0x9140)
 #define   GEN10_EU_DIS_SS_MASK		0xff
 
+#define GEN11_GT_VEBOX_VDBOX_DISABLE	_MMIO(0x9140)
+#define   GEN11_GT_VDBOX_DISABLE_MASK	0xff
+#define   GEN11_GT_VEBOX_DISABLE_SHIFT	16
+#define   GEN11_GT_VEBOX_DISABLE_MASK	(0xff << GEN11_GT_VEBOX_DISABLE_SHIFT)
+
 #define GEN6_BSD_SLEEP_PSMI_CONTROL	_MMIO(0x12050)
 #define   GEN6_BSD_SLEEP_MSG_DISABLE	(1 << 0)
 #define   GEN6_BSD_SLEEP_FLUSH_DISABLE	(1 << 2)
diff --git a/drivers/gpu/drm/i915/intel_device_info.c b/drivers/gpu/drm/i915/intel_device_info.c
index 3dd350f7b8e6..4babfc6ee45b 100644
--- a/drivers/gpu/drm/i915/intel_device_info.c
+++ b/drivers/gpu/drm/i915/intel_device_info.c
@@ -780,3 +780,50 @@ void intel_driver_caps_print(const struct intel_driver_caps *caps,
 {
 	drm_printf(p, "scheduler: %x\n", caps->scheduler);
 }
+
+/*
+ * Determine which engines are fused off in our particular hardware. Since the
+ * fuse register is in the blitter powerwell, we need forcewake to be ready at
+ * this point (but later we need to prune the forcewake domains for engines that
+ * are indeed fused off).
+ */
+void intel_device_info_init_mmio(struct drm_i915_private *dev_priv)
+{
+	struct intel_device_info *info = mkwrite_device_info(dev_priv);
+	u8 vdbox_disable, vebox_disable;
+	u32 media_fuse;
+	int i;
+
+	if (INTEL_GEN(dev_priv) < 11)
+		return;
+
+	media_fuse = I915_READ(GEN11_GT_VEBOX_VDBOX_DISABLE);
+
+	vdbox_disable = media_fuse & GEN11_GT_VDBOX_DISABLE_MASK;
+	vebox_disable = (media_fuse & GEN11_GT_VEBOX_DISABLE_MASK) >>
+			GEN11_GT_VEBOX_DISABLE_SHIFT;
+
+	DRM_DEBUG_DRIVER("vdbox disable: %04x\n", vdbox_disable);
+	for (i = 0; i < I915_MAX_VCS; i++) {
+		if (!HAS_ENGINE(dev_priv, _VCS(i)))
+			continue;
+
+		if (!(BIT(i) & vdbox_disable))
+			continue;
+
+		info->ring_mask &= ~ENGINE_MASK(_VCS(i));
+		DRM_DEBUG_DRIVER("vcs%u fused off\n", i);
+	}
+
+	DRM_DEBUG_DRIVER("vebox disable: %04x\n", vebox_disable);
+	for (i = 0; i < I915_MAX_VECS; i++) {
+		if (!HAS_ENGINE(dev_priv, _VECS(i)))
+			continue;
+
+		if (!(BIT(i) & vebox_disable))
+			continue;
+
+		info->ring_mask &= ~ENGINE_MASK(_VECS(i));
+		DRM_DEBUG_DRIVER("vecs%u fused off\n", i);
+	}
+}
diff --git a/drivers/gpu/drm/i915/intel_device_info.h b/drivers/gpu/drm/i915/intel_device_info.h
index 0835752c8b22..0cbb92223013 100644
--- a/drivers/gpu/drm/i915/intel_device_info.h
+++ b/drivers/gpu/drm/i915/intel_device_info.h
@@ -247,6 +247,8 @@ void intel_device_info_dump_runtime(const struct intel_device_info *info,
 void intel_device_info_dump_topology(const struct sseu_dev_info *sseu,
 				     struct drm_printer *p);
 
+void intel_device_info_init_mmio(struct drm_i915_private *dev_priv);
+
 void intel_driver_caps_print(const struct intel_driver_caps *caps,
 			     struct drm_printer *p);
 
diff --git a/drivers/gpu/drm/i915/intel_uncore.c b/drivers/gpu/drm/i915/intel_uncore.c
index 4df7c2ef8576..4c616d074a97 100644
--- a/drivers/gpu/drm/i915/intel_uncore.c
+++ b/drivers/gpu/drm/i915/intel_uncore.c
@@ -62,6 +62,11 @@ static inline void
 fw_domain_reset(struct drm_i915_private *i915,
 		const struct intel_uncore_forcewake_domain *d)
 {
+	/*
+	 * We don't really know if the powerwell for the forcewake domain we are
+	 * trying to reset here does exist at this point (engines could be fused
+	 * off in ICL+), so no waiting for acks
+	 */
 	__raw_i915_write32(i915, d->reg_set, i915->uncore.fw_reset);
 }
 
@@ -1353,6 +1358,23 @@ static void fw_domain_init(struct drm_i915_private *dev_priv,
 	fw_domain_reset(dev_priv, d);
 }
 
+static void fw_domain_fini(struct drm_i915_private *dev_priv,
+			   enum forcewake_domain_id domain_id)
+{
+	struct intel_uncore_forcewake_domain *d;
+
+	if (WARN_ON(domain_id >= FW_DOMAIN_ID_COUNT))
+		return;
+
+	d = &dev_priv->uncore.fw_domain[domain_id];
+
+	WARN_ON(d->wake_count);
+	WARN_ON(hrtimer_cancel(&d->timer));
+	memset(d, 0, sizeof(*d));
+
+	dev_priv->uncore.fw_domains &= ~BIT(domain_id);
+}
+
 static void intel_uncore_fw_domains_init(struct drm_i915_private *dev_priv)
 {
 	if (INTEL_GEN(dev_priv) <= 5 || intel_vgpu_active(dev_priv))
@@ -1565,6 +1587,40 @@ void intel_uncore_init(struct drm_i915_private *dev_priv)
 		&dev_priv->uncore.pmic_bus_access_nb);
 }
 
+/*
+ * We might have detected that some engines are fused off after we initialized
+ * the forcewake domains. Prune them, to make sure they only reference existing
+ * engines.
+ */
+void intel_uncore_prune(struct drm_i915_private *dev_priv)
+{
+	if (INTEL_GEN(dev_priv) >= 11) {
+		enum forcewake_domains fw_domains = dev_priv->uncore.fw_domains;
+		enum forcewake_domain_id domain_id;
+		int i;
+
+		for (i = 0; i < I915_MAX_VCS; i++) {
+			domain_id = FW_DOMAIN_ID_MEDIA_VDBOX0 + i;
+
+			if (HAS_ENGINE(dev_priv, _VCS(i)))
+				continue;
+
+			if (fw_domains & BIT(domain_id))
+				fw_domain_fini(dev_priv, domain_id);
+		}
+
+		for (i = 0; i < I915_MAX_VECS; i++) {
+			domain_id = FW_DOMAIN_ID_MEDIA_VEBOX0 + i;
+
+			if (HAS_ENGINE(dev_priv, _VECS(i)))
+				continue;
+
+			if (fw_domains & BIT(domain_id))
+				fw_domain_fini(dev_priv, domain_id);
+		}
+	}
+}
+
 void intel_uncore_fini(struct drm_i915_private *dev_priv)
 {
 	/* Paranoia: make sure we have disabled everything before we exit. */
diff --git a/drivers/gpu/drm/i915/intel_uncore.h b/drivers/gpu/drm/i915/intel_uncore.h
index dfdf444e4bcc..47478d609630 100644
--- a/drivers/gpu/drm/i915/intel_uncore.h
+++ b/drivers/gpu/drm/i915/intel_uncore.h
@@ -140,6 +140,7 @@ struct intel_uncore {
 
 void intel_uncore_sanitize(struct drm_i915_private *dev_priv);
 void intel_uncore_init(struct drm_i915_private *dev_priv);
+void intel_uncore_prune(struct drm_i915_private *dev_priv);
 bool intel_uncore_unclaimed_mmio(struct drm_i915_private *dev_priv);
 bool intel_uncore_arm_unclaimed_mmio_detection(struct drm_i915_private *dev_priv);
 void intel_uncore_fini(struct drm_i915_private *dev_priv);
-- 
2.14.1

_______________________________________________
Intel-gfx mailing list
Intel-gfx@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/intel-gfx

^ permalink raw reply related	[flat|nested] 27+ messages in thread

* [PATCH 2/8] drm/i915/icl: Enable the extra video decode and enhancement boxes for Icelake 11
  2018-03-16 12:14 [PATCH 1/8] drm/i915/icl: Check for fused-off VDBOX and VEBOX instances Mika Kuoppala
@ 2018-03-16 12:14 ` Mika Kuoppala
  2018-03-16 12:14 ` [PATCH 3/8] drm/i915/icl: Update subslice define for ICL 11 Mika Kuoppala
                   ` (9 subsequent siblings)
  10 siblings, 0 replies; 27+ messages in thread
From: Mika Kuoppala @ 2018-03-16 12:14 UTC (permalink / raw)
  To: intel-gfx

From: Oscar Mateo <oscar.mateo@intel.com>

Icelake 11 has one vebox and two vdboxes (0 and 2).

Bspec: 21140

v2: Split out in two (Daniele)

Cc: Daniele Ceraolo Spurio <daniele.ceraolospurio@intel.com>
Signed-off-by: Oscar Mateo <oscar.mateo@intel.com>
Reviewed-by: Michel Thierry <michel.thierry@intel.com>
---
 drivers/gpu/drm/i915/i915_pci.c | 1 +
 1 file changed, 1 insertion(+)

diff --git a/drivers/gpu/drm/i915/i915_pci.c b/drivers/gpu/drm/i915/i915_pci.c
index 062e91b39085..4364922e935d 100644
--- a/drivers/gpu/drm/i915/i915_pci.c
+++ b/drivers/gpu/drm/i915/i915_pci.c
@@ -602,6 +602,7 @@ static const struct intel_device_info intel_icelake_11_info = {
 	PLATFORM(INTEL_ICELAKE),
 	.is_alpha_support = 1,
 	.has_resource_streamer = 0,
+	.ring_mask = RENDER_RING | BLT_RING | VEBOX_RING | BSD_RING | BSD3_RING,
 };
 
 #undef GEN
-- 
2.14.1

_______________________________________________
Intel-gfx mailing list
Intel-gfx@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/intel-gfx

^ permalink raw reply related	[flat|nested] 27+ messages in thread

* [PATCH 3/8] drm/i915/icl: Update subslice define for ICL 11
  2018-03-16 12:14 [PATCH 1/8] drm/i915/icl: Check for fused-off VDBOX and VEBOX instances Mika Kuoppala
  2018-03-16 12:14 ` [PATCH 2/8] drm/i915/icl: Enable the extra video decode and enhancement boxes for Icelake 11 Mika Kuoppala
@ 2018-03-16 12:14 ` Mika Kuoppala
  2018-03-20 14:34   ` Mika Kuoppala
  2018-03-16 12:14 ` [PATCH 4/8] drm/i915/icl: Added ICL 11 slice, subslice and EU fuse detection Mika Kuoppala
                   ` (8 subsequent siblings)
  10 siblings, 1 reply; 27+ messages in thread
From: Mika Kuoppala @ 2018-03-16 12:14 UTC (permalink / raw)
  To: intel-gfx

From: Kelvin Gardiner <kelvin.gardiner@intel.com>

ICL 11 has a greater number of maximum subslices. This patch
reflects this.

v2: GEN11 updates to MCR_SELECTOR (Oscar)
v3: Copypasta error in the new defines (Lionel)

Bspec: 21139
BSpec: 21108

Signed-off-by: Kelvin Gardiner <kelvin.gardiner@intel.com>
Reviewed-by: Oscar Mateo <oscar.mateo@intel.com> (v1)
Reviewed-by: Daniele Ceraolo Spurio <daniele.ceraolospurio@intel.com> (v1)
Signed-off-by: Oscar Mateo <oscar.mateo@intel.com>
Reviewed-by: Lionel Landwerlin <lionel.g.landwerlin@intel.com>
---
 drivers/gpu/drm/i915/i915_reg.h         |  4 ++++
 drivers/gpu/drm/i915/intel_engine_cs.c  | 22 ++++++++++++++++++----
 drivers/gpu/drm/i915/intel_ringbuffer.h |  2 +-
 3 files changed, 23 insertions(+), 5 deletions(-)

diff --git a/drivers/gpu/drm/i915/i915_reg.h b/drivers/gpu/drm/i915/i915_reg.h
index 982e72e73e99..e29ff9dd967e 100644
--- a/drivers/gpu/drm/i915/i915_reg.h
+++ b/drivers/gpu/drm/i915/i915_reg.h
@@ -2151,6 +2151,10 @@ enum i915_power_well_id {
 #define   GEN8_MCR_SLICE_MASK		GEN8_MCR_SLICE(3)
 #define   GEN8_MCR_SUBSLICE(subslice)	(((subslice) & 3) << 24)
 #define   GEN8_MCR_SUBSLICE_MASK	GEN8_MCR_SUBSLICE(3)
+#define   GEN11_MCR_SLICE(slice)	(((slice) & 0xf) << 27)
+#define   GEN11_MCR_SLICE_MASK		GEN11_MCR_SLICE(0xf)
+#define   GEN11_MCR_SUBSLICE(subslice)	(((subslice) & 0x7) << 24)
+#define   GEN11_MCR_SUBSLICE_MASK	GEN11_MCR_SUBSLICE(0x7)
 #define RING_IPEIR(base)	_MMIO((base)+0x64)
 #define RING_IPEHR(base)	_MMIO((base)+0x68)
 /*
diff --git a/drivers/gpu/drm/i915/intel_engine_cs.c b/drivers/gpu/drm/i915/intel_engine_cs.c
index 337dfa56a738..de09fa42a509 100644
--- a/drivers/gpu/drm/i915/intel_engine_cs.c
+++ b/drivers/gpu/drm/i915/intel_engine_cs.c
@@ -800,10 +800,24 @@ static inline uint32_t
 read_subslice_reg(struct drm_i915_private *dev_priv, int slice,
 		  int subslice, i915_reg_t reg)
 {
+	uint32_t mcr_slice_subslice_mask;
+	uint32_t mcr_slice_subslice_select;
 	uint32_t mcr;
 	uint32_t ret;
 	enum forcewake_domains fw_domains;
 
+	if (INTEL_GEN(dev_priv) >= 11) {
+		mcr_slice_subslice_mask = GEN11_MCR_SLICE_MASK |
+					  GEN11_MCR_SUBSLICE_MASK;
+		mcr_slice_subslice_select = GEN11_MCR_SLICE(slice) |
+					    GEN11_MCR_SUBSLICE(subslice);
+	} else {
+		mcr_slice_subslice_mask = GEN8_MCR_SLICE_MASK |
+					  GEN8_MCR_SUBSLICE_MASK;
+		mcr_slice_subslice_select = GEN8_MCR_SLICE(slice) |
+					    GEN8_MCR_SUBSLICE(subslice);
+	}
+
 	fw_domains = intel_uncore_forcewake_for_reg(dev_priv, reg,
 						    FW_REG_READ);
 	fw_domains |= intel_uncore_forcewake_for_reg(dev_priv,
@@ -818,14 +832,14 @@ read_subslice_reg(struct drm_i915_private *dev_priv, int slice,
 	 * The HW expects the slice and sublice selectors to be reset to 0
 	 * after reading out the registers.
 	 */
-	WARN_ON_ONCE(mcr & (GEN8_MCR_SLICE_MASK | GEN8_MCR_SUBSLICE_MASK));
-	mcr &= ~(GEN8_MCR_SLICE_MASK | GEN8_MCR_SUBSLICE_MASK);
-	mcr |= GEN8_MCR_SLICE(slice) | GEN8_MCR_SUBSLICE(subslice);
+	WARN_ON_ONCE(mcr & mcr_slice_subslice_mask);
+	mcr &= ~mcr_slice_subslice_mask;
+	mcr |= mcr_slice_subslice_select;
 	I915_WRITE_FW(GEN8_MCR_SELECTOR, mcr);
 
 	ret = I915_READ_FW(reg);
 
-	mcr &= ~(GEN8_MCR_SLICE_MASK | GEN8_MCR_SUBSLICE_MASK);
+	mcr &= ~mcr_slice_subslice_mask;
 	I915_WRITE_FW(GEN8_MCR_SELECTOR, mcr);
 
 	intel_uncore_forcewake_put__locked(dev_priv, fw_domains);
diff --git a/drivers/gpu/drm/i915/intel_ringbuffer.h b/drivers/gpu/drm/i915/intel_ringbuffer.h
index 1f50727a5ddb..a02c7b3b9d55 100644
--- a/drivers/gpu/drm/i915/intel_ringbuffer.h
+++ b/drivers/gpu/drm/i915/intel_ringbuffer.h
@@ -86,7 +86,7 @@ hangcheck_action_to_str(const enum intel_engine_hangcheck_action a)
 }
 
 #define I915_MAX_SLICES	3
-#define I915_MAX_SUBSLICES 3
+#define I915_MAX_SUBSLICES 8
 
 #define instdone_slice_mask(dev_priv__) \
 	(INTEL_GEN(dev_priv__) == 7 ? \
-- 
2.14.1

_______________________________________________
Intel-gfx mailing list
Intel-gfx@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/intel-gfx

^ permalink raw reply related	[flat|nested] 27+ messages in thread

* [PATCH 4/8] drm/i915/icl: Added ICL 11 slice, subslice and EU fuse detection
  2018-03-16 12:14 [PATCH 1/8] drm/i915/icl: Check for fused-off VDBOX and VEBOX instances Mika Kuoppala
  2018-03-16 12:14 ` [PATCH 2/8] drm/i915/icl: Enable the extra video decode and enhancement boxes for Icelake 11 Mika Kuoppala
  2018-03-16 12:14 ` [PATCH 3/8] drm/i915/icl: Update subslice define for ICL 11 Mika Kuoppala
@ 2018-03-16 12:14 ` Mika Kuoppala
  2018-03-16 12:18   ` Lionel Landwerlin
  2018-03-16 13:06   ` [PATCH v2 " Lionel Landwerlin
  2018-03-16 12:14 ` [PATCH 5/8] drm/i915/icl: Add reset control register changes Mika Kuoppala
                   ` (7 subsequent siblings)
  10 siblings, 2 replies; 27+ messages in thread
From: Mika Kuoppala @ 2018-03-16 12:14 UTC (permalink / raw)
  To: intel-gfx

From: Kelvin Gardiner <kelvin.gardiner@intel.com>

This patch adds support to detect ICL, slice, subslice and EU fuse
settings.

Add addresses for ICL 11 slice, subslice and EU fuses registers.
These register addresses are the same as previous platforms but the
format and / or the meaning of the information is different. Therefore
Gen11 defines for these registers are added.

v2 (James): Rebase

Bspec: 9731
Bspec: 20643
Bspec: 20673

Signed-off-by: Kelvin Gardiner <kelvin.gardiner@intel.com>
Signed-off-by: James Ausmus <james.ausmus@intel.com>
---
 drivers/gpu/drm/i915/i915_reg.h          |  9 +++++++++
 drivers/gpu/drm/i915/intel_device_info.c | 25 ++++++++++++++++++++++++-
 2 files changed, 33 insertions(+), 1 deletion(-)

diff --git a/drivers/gpu/drm/i915/i915_reg.h b/drivers/gpu/drm/i915/i915_reg.h
index e29ff9dd967e..9eaaa96287ec 100644
--- a/drivers/gpu/drm/i915/i915_reg.h
+++ b/drivers/gpu/drm/i915/i915_reg.h
@@ -2554,6 +2554,15 @@ enum i915_power_well_id {
 #define   GEN11_GT_VEBOX_DISABLE_SHIFT	16
 #define   GEN11_GT_VEBOX_DISABLE_MASK	(0xff << GEN11_GT_VEBOX_DISABLE_SHIFT)
 
+#define GEN11_EU_DISABLE _MMIO(0x9134)
+#define GEN11_EU_DIS_MASK 0xFF
+
+#define GEN11_GT_SLICE_ENABLE _MMIO(0x9138)
+#define GEN11_GT_S_ENA_MASK 0xFF
+
+#define GEN11_GT_SUBSLICE_DISABLE _MMIO(0x913C)
+#define GEN11_GT_SS_DIS_MASK 0xFF
+
 #define GEN6_BSD_SLEEP_PSMI_CONTROL	_MMIO(0x12050)
 #define   GEN6_BSD_SLEEP_MSG_DISABLE	(1 << 0)
 #define   GEN6_BSD_SLEEP_FLUSH_DISABLE	(1 << 2)
diff --git a/drivers/gpu/drm/i915/intel_device_info.c b/drivers/gpu/drm/i915/intel_device_info.c
index 4babfc6ee45b..750e5c4c6bc1 100644
--- a/drivers/gpu/drm/i915/intel_device_info.c
+++ b/drivers/gpu/drm/i915/intel_device_info.c
@@ -158,6 +158,27 @@ static u16 compute_eu_total(const struct sseu_dev_info *sseu)
 	return total;
 }
 
+static void gen11_sseu_info_init(struct drm_i915_private *dev_priv)
+{
+	struct sseu_dev_info *sseu = &mkwrite_device_info(dev_priv)->sseu;
+	int eu_max = 8;
+	u32 eu_disable;
+
+	sseu->slice_mask = I915_READ(GEN11_GT_SLICE_ENABLE) &
+				GEN11_GT_S_ENA_MASK;
+	sseu->subslice_mask[0] = ~(I915_READ(GEN11_GT_SUBSLICE_DISABLE) &
+				GEN11_GT_SS_DIS_MASK);
+	eu_disable = I915_READ(GEN11_EU_DISABLE) & GEN11_GT_S_ENA_MASK;
+
+	sseu->eu_per_subslice = eu_max - hweight32(eu_disable);
+	sseu->eu_total = sseu->eu_per_subslice * hweight32(sseu->subslice_mask[0]);
+
+	/* ICL has no power gating restrictions. */
+	sseu->has_slice_pg = 1;
+	sseu->has_subslice_pg = 1;
+	sseu->has_eu_pg = 1;
+}
+
 static void gen10_sseu_info_init(struct drm_i915_private *dev_priv)
 {
 	struct sseu_dev_info *sseu = &mkwrite_device_info(dev_priv)->sseu;
@@ -768,8 +789,10 @@ void intel_device_info_runtime_init(struct intel_device_info *info)
 		broadwell_sseu_info_init(dev_priv);
 	else if (INTEL_GEN(dev_priv) == 9)
 		gen9_sseu_info_init(dev_priv);
-	else if (INTEL_GEN(dev_priv) >= 10)
+	else if (INTEL_GEN(dev_priv) == 10)
 		gen10_sseu_info_init(dev_priv);
+	else if (INTEL_INFO(dev_priv)->gen >= 11)
+		gen11_sseu_info_init(dev_priv);
 
 	/* Initialize command stream timestamp frequency */
 	info->cs_timestamp_frequency_khz = read_timestamp_frequency(dev_priv);
-- 
2.14.1

_______________________________________________
Intel-gfx mailing list
Intel-gfx@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/intel-gfx

^ permalink raw reply related	[flat|nested] 27+ messages in thread

* [PATCH 5/8] drm/i915/icl: Add reset control register changes
  2018-03-16 12:14 [PATCH 1/8] drm/i915/icl: Check for fused-off VDBOX and VEBOX instances Mika Kuoppala
                   ` (2 preceding siblings ...)
  2018-03-16 12:14 ` [PATCH 4/8] drm/i915/icl: Added ICL 11 slice, subslice and EU fuse detection Mika Kuoppala
@ 2018-03-16 12:14 ` Mika Kuoppala
  2018-03-16 12:22   ` Mika Kuoppala
                     ` (2 more replies)
  2018-03-16 12:14 ` [PATCH 6/8] drm/i915/icl: Handle RPS interrupts correctly for Gen11 Mika Kuoppala
                   ` (6 subsequent siblings)
  10 siblings, 3 replies; 27+ messages in thread
From: Mika Kuoppala @ 2018-03-16 12:14 UTC (permalink / raw)
  To: intel-gfx; +Cc: Paulo Zanoni

From: Michel Thierry <michel.thierry@intel.com>

The bits used to reset the different engines/domains have changed in
GEN11, this patch maps the reset engine mask bits with the new bits
in the reset control register.

v2: Use shift-left instead of BIT macro to match the file style (Paulo).
v3: Reuse gen8_reset_engines (Daniele).
v4: Do not call intel_uncore_forcewake_reset after reset, we may be
using the forcewake to read protected registers elsewhere and those
results may be clobbered by the concurrent dropping of forcewake.

bspec: 19212
Cc: Oscar Mateo <oscar.mateo@intel.com>
Cc: Antonio Argenziano <antonio.argenziano@intel.com>
Cc: Paulo Zanoni <paulo.r.zanoni@intel.com>
Cc: Daniele Ceraolo Spurio <daniele.ceraolospurio@intel.com>
Acked-by: Daniele Ceraolo Spurio <daniele.ceraolospurio@intel.com>
Signed-off-by: Michel Thierry <michel.thierry@intel.com>
---
 drivers/gpu/drm/i915/i915_reg.h     | 11 ++++++++
 drivers/gpu/drm/i915/intel_uncore.c | 53 +++++++++++++++++++++++++++++++++++--
 2 files changed, 62 insertions(+), 2 deletions(-)

diff --git a/drivers/gpu/drm/i915/i915_reg.h b/drivers/gpu/drm/i915/i915_reg.h
index 9eaaa96287ec..f3cc77690124 100644
--- a/drivers/gpu/drm/i915/i915_reg.h
+++ b/drivers/gpu/drm/i915/i915_reg.h
@@ -301,6 +301,17 @@ static inline bool i915_mmio_reg_valid(i915_reg_t reg)
 #define  GEN6_GRDOM_VECS		(1 << 4)
 #define  GEN9_GRDOM_GUC			(1 << 5)
 #define  GEN8_GRDOM_MEDIA2		(1 << 7)
+/* GEN11 changed all bit defs except for FULL & RENDER */
+#define  GEN11_GRDOM_FULL		GEN6_GRDOM_FULL
+#define  GEN11_GRDOM_RENDER		GEN6_GRDOM_RENDER
+#define  GEN11_GRDOM_BLT		(1 << 2)
+#define  GEN11_GRDOM_GUC		(1 << 3)
+#define  GEN11_GRDOM_MEDIA		(1 << 5)
+#define  GEN11_GRDOM_MEDIA2		(1 << 6)
+#define  GEN11_GRDOM_MEDIA3		(1 << 7)
+#define  GEN11_GRDOM_MEDIA4		(1 << 8)
+#define  GEN11_GRDOM_VECS		(1 << 13)
+#define  GEN11_GRDOM_VECS2		(1 << 14)
 
 #define RING_PP_DIR_BASE(engine)	_MMIO((engine)->mmio_base+0x228)
 #define RING_PP_DIR_BASE_READ(engine)	_MMIO((engine)->mmio_base+0x518)
diff --git a/drivers/gpu/drm/i915/intel_uncore.c b/drivers/gpu/drm/i915/intel_uncore.c
index 4c616d074a97..cabbf0e682e7 100644
--- a/drivers/gpu/drm/i915/intel_uncore.c
+++ b/drivers/gpu/drm/i915/intel_uncore.c
@@ -1909,6 +1909,50 @@ static int gen6_reset_engines(struct drm_i915_private *dev_priv,
 	return gen6_hw_domain_reset(dev_priv, hw_mask);
 }
 
+/**
+ * gen11_reset_engines - reset individual engines
+ * @dev_priv: i915 device
+ * @engine_mask: mask of intel_ring_flag() engines or ALL_ENGINES for full reset
+ *
+ * This function will reset the individual engines that are set in engine_mask.
+ * If you provide ALL_ENGINES as mask, full global domain reset will be issued.
+ *
+ * Note: It is responsibility of the caller to handle the difference between
+ * asking full domain reset versus reset for all available individual engines.
+ *
+ * Returns 0 on success, nonzero on error.
+ */
+static int gen11_reset_engines(struct drm_i915_private *dev_priv,
+			       unsigned engine_mask)
+{
+	struct intel_engine_cs *engine;
+	const u32 hw_engine_mask[I915_NUM_ENGINES] = {
+		[RCS] = GEN11_GRDOM_RENDER,
+		[BCS] = GEN11_GRDOM_BLT,
+		[VCS] = GEN11_GRDOM_MEDIA,
+		[VCS2] = GEN11_GRDOM_MEDIA2,
+		[VCS3] = GEN11_GRDOM_MEDIA3,
+		[VCS4] = GEN11_GRDOM_MEDIA4,
+		[VECS] = GEN11_GRDOM_VECS,
+		[VECS2] = GEN11_GRDOM_VECS2,
+	};
+	u32 hw_mask;
+
+	BUILD_BUG_ON(VECS2 + 1 != I915_NUM_ENGINES);
+
+	if (engine_mask == ALL_ENGINES) {
+		hw_mask = GEN11_GRDOM_FULL;
+	} else {
+		unsigned int tmp;
+
+		hw_mask = 0;
+		for_each_engine_masked(engine, dev_priv, engine_mask, tmp)
+			hw_mask |= hw_engine_mask[engine->id];
+	}
+
+	return gen6_hw_domain_reset(dev_priv, hw_mask);
+}
+
 /**
  * __intel_wait_for_register_fw - wait until register matches expected state
  * @dev_priv: the i915 device
@@ -2056,7 +2100,10 @@ static int gen8_reset_engines(struct drm_i915_private *dev_priv,
 		if (gen8_reset_engine_start(engine))
 			goto not_ready;
 
-	return gen6_reset_engines(dev_priv, engine_mask);
+	if (INTEL_GEN(dev_priv) >= 11)
+		return gen11_reset_engines(dev_priv, engine_mask);
+	else
+		return gen6_reset_engines(dev_priv, engine_mask);
 
 not_ready:
 	for_each_engine_masked(engine, dev_priv, engine_mask, tmp)
@@ -2141,12 +2188,14 @@ bool intel_has_reset_engine(struct drm_i915_private *dev_priv)
 
 int intel_reset_guc(struct drm_i915_private *dev_priv)
 {
+	u32 guc_domain = INTEL_GEN(dev_priv) >= 11 ? GEN11_GRDOM_GUC :
+						     GEN9_GRDOM_GUC;
 	int ret;
 
 	GEM_BUG_ON(!HAS_GUC(dev_priv));
 
 	intel_uncore_forcewake_get(dev_priv, FORCEWAKE_ALL);
-	ret = gen6_hw_domain_reset(dev_priv, GEN9_GRDOM_GUC);
+	ret = gen6_hw_domain_reset(dev_priv, guc_domain);
 	intel_uncore_forcewake_put(dev_priv, FORCEWAKE_ALL);
 
 	return ret;
-- 
2.14.1

_______________________________________________
Intel-gfx mailing list
Intel-gfx@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/intel-gfx

^ permalink raw reply related	[flat|nested] 27+ messages in thread

* [PATCH 6/8] drm/i915/icl: Handle RPS interrupts correctly for Gen11
  2018-03-16 12:14 [PATCH 1/8] drm/i915/icl: Check for fused-off VDBOX and VEBOX instances Mika Kuoppala
                   ` (3 preceding siblings ...)
  2018-03-16 12:14 ` [PATCH 5/8] drm/i915/icl: Add reset control register changes Mika Kuoppala
@ 2018-03-16 12:14 ` Mika Kuoppala
  2018-03-16 12:14 ` [PATCH 7/8] drm/i915/icl: Enable RC6 and RPS in Gen11 Mika Kuoppala
                   ` (5 subsequent siblings)
  10 siblings, 0 replies; 27+ messages in thread
From: Mika Kuoppala @ 2018-03-16 12:14 UTC (permalink / raw)
  To: intel-gfx; +Cc: Paulo Zanoni

From: Oscar Mateo <oscar.mateo@intel.com>

Using the new hierarchical interrupt infrastructure.

v2: Rebase
v3: Rebase

Cc: Tvrtko Ursulin <tvrtko.ursulin@intel.com>
Cc: Daniele Ceraolo Spurio <daniele.ceraolospurio@intel.com>
Cc: Sagar Arun Kamble <sagar.a.kamble@intel.com>
Cc: Paulo Zanoni <paulo.r.zanoni@intel.com>
Signed-off-by: Oscar Mateo <oscar.mateo@intel.com>
---
 drivers/gpu/drm/i915/i915_irq.c  | 73 ++++++++++++++++++++++++++++++++++------
 drivers/gpu/drm/i915/intel_drv.h |  1 +
 drivers/gpu/drm/i915/intel_pm.c  |  6 ++--
 3 files changed, 66 insertions(+), 14 deletions(-)

diff --git a/drivers/gpu/drm/i915/i915_irq.c b/drivers/gpu/drm/i915/i915_irq.c
index 828f3104488c..8c4510ffe625 100644
--- a/drivers/gpu/drm/i915/i915_irq.c
+++ b/drivers/gpu/drm/i915/i915_irq.c
@@ -308,17 +308,29 @@ void gen5_disable_gt_irq(struct drm_i915_private *dev_priv, uint32_t mask)
 
 static i915_reg_t gen6_pm_iir(struct drm_i915_private *dev_priv)
 {
+	WARN_ON_ONCE(INTEL_GEN(dev_priv) >= 11);
+
 	return INTEL_GEN(dev_priv) >= 8 ? GEN8_GT_IIR(2) : GEN6_PMIIR;
 }
 
 static i915_reg_t gen6_pm_imr(struct drm_i915_private *dev_priv)
 {
-	return INTEL_GEN(dev_priv) >= 8 ? GEN8_GT_IMR(2) : GEN6_PMIMR;
+	if (INTEL_GEN(dev_priv) >= 11)
+		return GEN11_GPM_WGBOXPERF_INTR_MASK;
+	else if (INTEL_GEN(dev_priv) >= 8)
+		return GEN8_GT_IMR(2);
+	else
+		return GEN6_PMIMR;
 }
 
 static i915_reg_t gen6_pm_ier(struct drm_i915_private *dev_priv)
 {
-	return INTEL_GEN(dev_priv) >= 8 ? GEN8_GT_IER(2) : GEN6_PMIER;
+	if (INTEL_GEN(dev_priv) >= 11)
+		return GEN11_GPM_WGBOXPERF_INTR_ENABLE;
+	else if (INTEL_GEN(dev_priv) >= 8)
+		return GEN8_GT_IER(2);
+	else
+		return GEN6_PMIER;
 }
 
 /**
@@ -400,6 +412,32 @@ static void gen6_disable_pm_irq(struct drm_i915_private *dev_priv, u32 disable_m
 	/* though a barrier is missing here, but don't really need a one */
 }
 
+static u32
+gen11_gt_engine_intr(struct drm_i915_private * const i915,
+		     const unsigned int bank, const unsigned int bit);
+
+void gen11_reset_rps_interrupts(struct drm_i915_private *dev_priv)
+{
+	u32 dw;
+
+	spin_lock_irq(&dev_priv->irq_lock);
+
+	/*
+	 * According to the BSpec, DW_IIR bits cannot be cleared without
+	 * first servicing the Selector & Shared IIR registers.
+	 */
+	dw = I915_READ_FW(GEN11_GT_INTR_DW0);
+	while (dw & BIT(GEN11_GTPM)) {
+		gen11_gt_engine_intr(dev_priv, 0, GEN11_GTPM);
+		I915_WRITE_FW(GEN11_GT_INTR_DW0, BIT(GEN11_GTPM));
+		dw = I915_READ_FW(GEN11_GT_INTR_DW0);
+	}
+
+	dev_priv->gt_pm.rps.pm_iir = 0;
+
+	spin_unlock_irq(&dev_priv->irq_lock);
+}
+
 void gen6_reset_rps_interrupts(struct drm_i915_private *dev_priv)
 {
 	spin_lock_irq(&dev_priv->irq_lock);
@@ -415,12 +453,12 @@ void gen6_enable_rps_interrupts(struct drm_i915_private *dev_priv)
 	if (READ_ONCE(rps->interrupts_enabled))
 		return;
 
-	if (WARN_ON_ONCE(IS_GEN11(dev_priv)))
-		return;
-
 	spin_lock_irq(&dev_priv->irq_lock);
 	WARN_ON_ONCE(rps->pm_iir);
-	WARN_ON_ONCE(I915_READ(gen6_pm_iir(dev_priv)) & dev_priv->pm_rps_events);
+	if (INTEL_GEN(dev_priv) >= 11)
+		WARN_ON_ONCE(I915_READ_FW(GEN11_GT_INTR_DW0) & BIT(GEN11_GTPM));
+	else
+		WARN_ON_ONCE(I915_READ(gen6_pm_iir(dev_priv)) & dev_priv->pm_rps_events);
 	rps->interrupts_enabled = true;
 	gen6_enable_pm_irq(dev_priv, dev_priv->pm_rps_events);
 
@@ -434,9 +472,6 @@ void gen6_disable_rps_interrupts(struct drm_i915_private *dev_priv)
 	if (!READ_ONCE(rps->interrupts_enabled))
 		return;
 
-	if (WARN_ON_ONCE(IS_GEN11(dev_priv)))
-		return;
-
 	spin_lock_irq(&dev_priv->irq_lock);
 	rps->interrupts_enabled = false;
 
@@ -453,7 +488,10 @@ void gen6_disable_rps_interrupts(struct drm_i915_private *dev_priv)
 	 * state of the worker can be discarded.
 	 */
 	cancel_work_sync(&rps->work);
-	gen6_reset_rps_interrupts(dev_priv);
+	if (INTEL_GEN(dev_priv) >= 11)
+		gen11_reset_rps_interrupts(dev_priv);
+	else
+		gen6_reset_rps_interrupts(dev_priv);
 }
 
 void gen9_reset_guc_interrupts(struct drm_i915_private *dev_priv)
@@ -2750,6 +2788,9 @@ gen11_gt_engine_irq_handler(struct drm_i915_private * const i915,
 
 		case GEN11_BCS:
 			return gen8_cs_irq_handler(engine[BCS], iir);
+
+		case GEN11_GTPM:
+			return gen6_rps_irq_handler(i915, iir);
 		}
 	case 1:
 		switch (engine_n) {
@@ -3314,6 +3355,9 @@ static void gen11_gt_irq_reset(struct drm_i915_private *dev_priv)
 	I915_WRITE(GEN11_VCS0_VCS1_INTR_MASK,	~0);
 	I915_WRITE(GEN11_VCS2_VCS3_INTR_MASK,	~0);
 	I915_WRITE(GEN11_VECS0_VECS1_INTR_MASK,	~0);
+
+	I915_WRITE(GEN11_GPM_WGBOXPERF_INTR_ENABLE, 0);
+	I915_WRITE(GEN11_GPM_WGBOXPERF_INTR_MASK,  ~0);
 }
 
 static void gen11_irq_reset(struct drm_device *dev)
@@ -3852,7 +3896,14 @@ static void gen11_gt_irq_postinstall(struct drm_i915_private *dev_priv)
 	I915_WRITE(GEN11_VCS2_VCS3_INTR_MASK,	~(irqs | irqs << 16));
 	I915_WRITE(GEN11_VECS0_VECS1_INTR_MASK,	~(irqs | irqs << 16));
 
-	dev_priv->pm_imr = 0xffffffff; /* TODO */
+	/*
+	 * RPS interrupts will get enabled/disabled on demand when RPS itself
+	 * is enabled/disabled.
+	 */
+	dev_priv->pm_ier = 0x0;
+	dev_priv->pm_imr = ~dev_priv->pm_ier;
+	I915_WRITE(GEN11_GPM_WGBOXPERF_INTR_ENABLE, 0);
+	I915_WRITE(GEN11_GPM_WGBOXPERF_INTR_MASK,  ~0);
 }
 
 static int gen11_irq_postinstall(struct drm_device *dev)
diff --git a/drivers/gpu/drm/i915/intel_drv.h b/drivers/gpu/drm/i915/intel_drv.h
index a215aa78b0be..465b741420cf 100644
--- a/drivers/gpu/drm/i915/intel_drv.h
+++ b/drivers/gpu/drm/i915/intel_drv.h
@@ -1325,6 +1325,7 @@ void gen5_enable_gt_irq(struct drm_i915_private *dev_priv, uint32_t mask);
 void gen5_disable_gt_irq(struct drm_i915_private *dev_priv, uint32_t mask);
 void gen6_mask_pm_irq(struct drm_i915_private *dev_priv, u32 mask);
 void gen6_unmask_pm_irq(struct drm_i915_private *dev_priv, u32 mask);
+void gen11_reset_rps_interrupts(struct drm_i915_private *dev_priv);
 void gen6_reset_rps_interrupts(struct drm_i915_private *dev_priv);
 void gen6_enable_rps_interrupts(struct drm_i915_private *dev_priv);
 void gen6_disable_rps_interrupts(struct drm_i915_private *dev_priv);
diff --git a/drivers/gpu/drm/i915/intel_pm.c b/drivers/gpu/drm/i915/intel_pm.c
index dd5ddb77b306..7f24c884ac36 100644
--- a/drivers/gpu/drm/i915/intel_pm.c
+++ b/drivers/gpu/drm/i915/intel_pm.c
@@ -8025,10 +8025,10 @@ void intel_sanitize_gt_powersave(struct drm_i915_private *dev_priv)
 	dev_priv->gt_pm.rc6.enabled = true; /* force RC6 disabling */
 	intel_disable_gt_powersave(dev_priv);
 
-	if (INTEL_GEN(dev_priv) < 11)
-		gen6_reset_rps_interrupts(dev_priv);
+	if (INTEL_GEN(dev_priv) >= 11)
+		gen11_reset_rps_interrupts(dev_priv);
 	else
-		WARN_ON_ONCE(1);
+		gen6_reset_rps_interrupts(dev_priv);
 }
 
 static inline void intel_disable_llc_pstate(struct drm_i915_private *i915)
-- 
2.14.1

_______________________________________________
Intel-gfx mailing list
Intel-gfx@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/intel-gfx

^ permalink raw reply related	[flat|nested] 27+ messages in thread

* [PATCH 7/8] drm/i915/icl: Enable RC6 and RPS in Gen11
  2018-03-16 12:14 [PATCH 1/8] drm/i915/icl: Check for fused-off VDBOX and VEBOX instances Mika Kuoppala
                   ` (4 preceding siblings ...)
  2018-03-16 12:14 ` [PATCH 6/8] drm/i915/icl: Handle RPS interrupts correctly for Gen11 Mika Kuoppala
@ 2018-03-16 12:14 ` Mika Kuoppala
  2018-03-16 12:14 ` [PATCH 8/8] drm/i915/icl: Use hw engine class, instance to find irq handler Mika Kuoppala
                   ` (4 subsequent siblings)
  10 siblings, 0 replies; 27+ messages in thread
From: Mika Kuoppala @ 2018-03-16 12:14 UTC (permalink / raw)
  To: intel-gfx; +Cc: Paulo Zanoni

From: Oscar Mateo <oscar.mateo@intel.com>

AFAICT, once the new interrupt is in place, the rest should behave the
same as Gen10.

v2: Update ring frequencies (Sagar)
v3: Rebase.

Cc: Daniele Ceraolo Spurio <daniele.ceraolospurio@intel.com>
Cc: Sagar Arun Kamble <sagar.a.kamble@intel.com>
Cc: Paulo Zanoni <paulo.r.zanoni@intel.com>
Signed-off-by: Oscar Mateo <oscar.mateo@intel.com>
---
 drivers/gpu/drm/i915/i915_debugfs.c | 10 +++++-----
 drivers/gpu/drm/i915/intel_pm.c     | 10 ++++------
 2 files changed, 9 insertions(+), 11 deletions(-)

diff --git a/drivers/gpu/drm/i915/i915_debugfs.c b/drivers/gpu/drm/i915/i915_debugfs.c
index 298a3aa9513b..24cc11195da4 100644
--- a/drivers/gpu/drm/i915/i915_debugfs.c
+++ b/drivers/gpu/drm/i915/i915_debugfs.c
@@ -1215,20 +1215,20 @@ static int i915_frequency_info(struct seq_file *m, void *unused)
 		max_freq = (IS_GEN9_LP(dev_priv) ? rp_state_cap >> 0 :
 			    rp_state_cap >> 16) & 0xff;
 		max_freq *= (IS_GEN9_BC(dev_priv) ||
-			     IS_CANNONLAKE(dev_priv) ? GEN9_FREQ_SCALER : 1);
+			     INTEL_GEN(dev_priv) >= 10 ? GEN9_FREQ_SCALER : 1);
 		seq_printf(m, "Lowest (RPN) frequency: %dMHz\n",
 			   intel_gpu_freq(dev_priv, max_freq));
 
 		max_freq = (rp_state_cap & 0xff00) >> 8;
 		max_freq *= (IS_GEN9_BC(dev_priv) ||
-			     IS_CANNONLAKE(dev_priv) ? GEN9_FREQ_SCALER : 1);
+			     INTEL_GEN(dev_priv) >= 10 ? GEN9_FREQ_SCALER : 1);
 		seq_printf(m, "Nominal (RP1) frequency: %dMHz\n",
 			   intel_gpu_freq(dev_priv, max_freq));
 
 		max_freq = (IS_GEN9_LP(dev_priv) ? rp_state_cap >> 16 :
 			    rp_state_cap >> 0) & 0xff;
 		max_freq *= (IS_GEN9_BC(dev_priv) ||
-			     IS_CANNONLAKE(dev_priv) ? GEN9_FREQ_SCALER : 1);
+			     INTEL_GEN(dev_priv) >= 10 ? GEN9_FREQ_SCALER : 1);
 		seq_printf(m, "Max non-overclocked (RP0) frequency: %dMHz\n",
 			   intel_gpu_freq(dev_priv, max_freq));
 		seq_printf(m, "Max overclocked frequency: %dMHz\n",
@@ -1811,7 +1811,7 @@ static int i915_ring_freq_table(struct seq_file *m, void *unused)
 
 	min_gpu_freq = rps->min_freq;
 	max_gpu_freq = rps->max_freq;
-	if (IS_GEN9_BC(dev_priv) || IS_CANNONLAKE(dev_priv)) {
+	if (IS_GEN9_BC(dev_priv) || INTEL_GEN(dev_priv) >= 10) {
 		/* Convert GT frequency to 50 HZ units */
 		min_gpu_freq /= GEN9_FREQ_SCALER;
 		max_gpu_freq /= GEN9_FREQ_SCALER;
@@ -1827,7 +1827,7 @@ static int i915_ring_freq_table(struct seq_file *m, void *unused)
 		seq_printf(m, "%d\t\t%d\t\t\t\t%d\n",
 			   intel_gpu_freq(dev_priv, (gpu_freq *
 						     (IS_GEN9_BC(dev_priv) ||
-						      IS_CANNONLAKE(dev_priv) ?
+						      INTEL_GEN(dev_priv) >= 10 ?
 						      GEN9_FREQ_SCALER : 1))),
 			   ((ia_freq >> 0) & 0xff) * 100,
 			   ((ia_freq >> 8) & 0xff) * 100);
diff --git a/drivers/gpu/drm/i915/intel_pm.c b/drivers/gpu/drm/i915/intel_pm.c
index 7f24c884ac36..d29a59857939 100644
--- a/drivers/gpu/drm/i915/intel_pm.c
+++ b/drivers/gpu/drm/i915/intel_pm.c
@@ -6572,7 +6572,7 @@ static void gen6_init_rps_frequencies(struct drm_i915_private *dev_priv)
 
 	rps->efficient_freq = rps->rp1_freq;
 	if (IS_HASWELL(dev_priv) || IS_BROADWELL(dev_priv) ||
-	    IS_GEN9_BC(dev_priv) || IS_CANNONLAKE(dev_priv)) {
+	    IS_GEN9_BC(dev_priv) || INTEL_GEN(dev_priv) >= 10) {
 		u32 ddcc_status = 0;
 
 		if (sandybridge_pcode_read(dev_priv,
@@ -6585,7 +6585,7 @@ static void gen6_init_rps_frequencies(struct drm_i915_private *dev_priv)
 					rps->max_freq);
 	}
 
-	if (IS_GEN9_BC(dev_priv) || IS_CANNONLAKE(dev_priv)) {
+	if (IS_GEN9_BC(dev_priv) || INTEL_GEN(dev_priv) >= 10) {
 		/* Store the frequency values in 16.66 MHZ units, which is
 		 * the natural hardware unit for SKL
 		 */
@@ -6920,7 +6920,7 @@ static void gen6_update_ring_freq(struct drm_i915_private *dev_priv)
 
 	min_gpu_freq = rps->min_freq;
 	max_gpu_freq = rps->max_freq;
-	if (IS_GEN9_BC(dev_priv) || IS_CANNONLAKE(dev_priv)) {
+	if (IS_GEN9_BC(dev_priv) || INTEL_GEN(dev_priv) >= 10) {
 		/* Convert GT frequency to 50 HZ units */
 		min_gpu_freq /= GEN9_FREQ_SCALER;
 		max_gpu_freq /= GEN9_FREQ_SCALER;
@@ -6935,7 +6935,7 @@ static void gen6_update_ring_freq(struct drm_i915_private *dev_priv)
 		int diff = max_gpu_freq - gpu_freq;
 		unsigned int ia_freq = 0, ring_freq = 0;
 
-		if (IS_GEN9_BC(dev_priv) || IS_CANNONLAKE(dev_priv)) {
+		if (IS_GEN9_BC(dev_priv) || INTEL_GEN(dev_priv) >= 10) {
 			/*
 			 * ring_freq = 2 * GT. ring_freq is in 100MHz units
 			 * No floor required for ring frequency on SKL.
@@ -8141,8 +8141,6 @@ static void intel_enable_rps(struct drm_i915_private *dev_priv)
 		cherryview_enable_rps(dev_priv);
 	} else if (IS_VALLEYVIEW(dev_priv)) {
 		valleyview_enable_rps(dev_priv);
-	} else if (WARN_ON_ONCE(INTEL_GEN(dev_priv) >= 11)) {
-		/* TODO */
 	} else if (INTEL_GEN(dev_priv) >= 9) {
 		gen9_enable_rps(dev_priv);
 	} else if (IS_BROADWELL(dev_priv)) {
-- 
2.14.1

_______________________________________________
Intel-gfx mailing list
Intel-gfx@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/intel-gfx

^ permalink raw reply related	[flat|nested] 27+ messages in thread

* [PATCH 8/8] drm/i915/icl: Use hw engine class, instance to find irq handler
  2018-03-16 12:14 [PATCH 1/8] drm/i915/icl: Check for fused-off VDBOX and VEBOX instances Mika Kuoppala
                   ` (5 preceding siblings ...)
  2018-03-16 12:14 ` [PATCH 7/8] drm/i915/icl: Enable RC6 and RPS in Gen11 Mika Kuoppala
@ 2018-03-16 12:14 ` Mika Kuoppala
  2018-03-16 18:28   ` Michel Thierry
  2018-03-16 13:53 ` ✓ Fi.CI.BAT: success for series starting with [1/8] drm/i915/icl: Check for fused-off VDBOX and VEBOX instances (rev2) Patchwork
                   ` (3 subsequent siblings)
  10 siblings, 1 reply; 27+ messages in thread
From: Mika Kuoppala @ 2018-03-16 12:14 UTC (permalink / raw)
  To: intel-gfx

Interrupt identity register we already read from hardware
contains engine class and instance fields. Leverage
these fields to find correct engine to handle the interrupt.

v3: rebase on top of rps intr
    use correct class / instance limits (Michel)

Suggested-by: Daniele Ceraolo Spurio <daniele.ceraolospurio@intel.com>
Cc: Daniele Ceraolo Spurio <daniele.ceraolospurio@intel.com>
Cc: Chris Wilson <chris@chris-wilson.co.uk>
Cc: Tvrtko Ursulin <tvrtko.ursulin@intel.com>
Cc: Michel Thierry <michel.thierry@intel.com>
Signed-off-by: Mika Kuoppala <mika.kuoppala@linux.intel.com>
---
 drivers/gpu/drm/i915/i915_irq.c | 80 +++++++++++++++--------------------------
 drivers/gpu/drm/i915/i915_reg.h |  4 ++-
 2 files changed, 31 insertions(+), 53 deletions(-)

diff --git a/drivers/gpu/drm/i915/i915_irq.c b/drivers/gpu/drm/i915/i915_irq.c
index 8c4510ffe625..dd2fb2d0457f 100644
--- a/drivers/gpu/drm/i915/i915_irq.c
+++ b/drivers/gpu/drm/i915/i915_irq.c
@@ -413,8 +413,8 @@ static void gen6_disable_pm_irq(struct drm_i915_private *dev_priv, u32 disable_m
 }
 
 static u32
-gen11_gt_engine_intr(struct drm_i915_private * const i915,
-		     const unsigned int bank, const unsigned int bit);
+gen11_gt_engine_identity(struct drm_i915_private * const i915,
+			 const unsigned int bank, const unsigned int bit);
 
 void gen11_reset_rps_interrupts(struct drm_i915_private *dev_priv)
 {
@@ -428,7 +428,7 @@ void gen11_reset_rps_interrupts(struct drm_i915_private *dev_priv)
 	 */
 	dw = I915_READ_FW(GEN11_GT_INTR_DW0);
 	while (dw & BIT(GEN11_GTPM)) {
-		gen11_gt_engine_intr(dev_priv, 0, GEN11_GTPM);
+		gen11_gt_engine_identity(dev_priv, 0, GEN11_GTPM);
 		I915_WRITE_FW(GEN11_GT_INTR_DW0, BIT(GEN11_GTPM));
 		dw = I915_READ_FW(GEN11_GT_INTR_DW0);
 	}
@@ -2771,50 +2771,9 @@ static void __fini_wedge(struct wedge_me *w)
 	     (W)->i915;							\
 	     __fini_wedge((W)))
 
-static void
-gen11_gt_engine_irq_handler(struct drm_i915_private * const i915,
-			    const unsigned int bank,
-			    const unsigned int engine_n,
-			    const u16 iir)
-{
-	struct intel_engine_cs ** const engine = i915->engine;
-
-	switch (bank) {
-	case 0:
-		switch (engine_n) {
-
-		case GEN11_RCS0:
-			return gen8_cs_irq_handler(engine[RCS], iir);
-
-		case GEN11_BCS:
-			return gen8_cs_irq_handler(engine[BCS], iir);
-
-		case GEN11_GTPM:
-			return gen6_rps_irq_handler(i915, iir);
-		}
-	case 1:
-		switch (engine_n) {
-
-		case GEN11_VCS(0):
-			return gen8_cs_irq_handler(engine[_VCS(0)], iir);
-		case GEN11_VCS(1):
-			return gen8_cs_irq_handler(engine[_VCS(1)], iir);
-		case GEN11_VCS(2):
-			return gen8_cs_irq_handler(engine[_VCS(2)], iir);
-		case GEN11_VCS(3):
-			return gen8_cs_irq_handler(engine[_VCS(3)], iir);
-
-		case GEN11_VECS(0):
-			return gen8_cs_irq_handler(engine[_VECS(0)], iir);
-		case GEN11_VECS(1):
-			return gen8_cs_irq_handler(engine[_VECS(1)], iir);
-		}
-	}
-}
-
 static u32
-gen11_gt_engine_intr(struct drm_i915_private * const i915,
-		     const unsigned int bank, const unsigned int bit)
+gen11_gt_engine_identity(struct drm_i915_private * const i915,
+			 const unsigned int bank, const unsigned int bit)
 {
 	void __iomem * const regs = i915->regs;
 	u32 timeout_ts;
@@ -2841,7 +2800,26 @@ gen11_gt_engine_intr(struct drm_i915_private * const i915,
 	raw_reg_write(regs, GEN11_INTR_IDENTITY_REG(bank),
 		      GEN11_INTR_DATA_VALID);
 
-	return ident & GEN11_INTR_ENGINE_MASK;
+	return ident;
+}
+
+static void
+gen11_gt_identity_handler(struct drm_i915_private * const i915,
+			  const u32 identity)
+{
+	const u8 class = GEN11_INTR_ENGINE_CLASS(identity);
+	const u8 instance = GEN11_INTR_ENGINE_INSTANCE(identity);
+	const u16 iir = GEN11_INTR_ENGINE_MASK(identity);
+
+	if (unlikely(!iir))
+		return;
+
+	if (class <= MAX_ENGINE_CLASS && instance <= MAX_ENGINE_INSTANCE)
+		return gen8_cs_irq_handler(i915->engine_class[class][instance],
+					   iir);
+
+	if (class == GEN11_GTPM)
+		return gen6_rps_irq_handler(i915, iir);
 }
 
 static void
@@ -2866,12 +2844,10 @@ gen11_gt_irq_handler(struct drm_i915_private * const i915,
 		}
 
 		for_each_set_bit(bit, &intr_dw, 32) {
-			const u16 iir = gen11_gt_engine_intr(i915, bank, bit);
-
-			if (unlikely(!iir))
-				continue;
+			const u32 ident = gen11_gt_engine_identity(i915,
+								   bank, bit);
 
-			gen11_gt_engine_irq_handler(i915, bank, bit, iir);
+			gen11_gt_identity_handler(i915, ident);
 		}
 
 		/* Clear must be after shared has been served for engine */
diff --git a/drivers/gpu/drm/i915/i915_reg.h b/drivers/gpu/drm/i915/i915_reg.h
index f3cc77690124..74a8f454e8a0 100644
--- a/drivers/gpu/drm/i915/i915_reg.h
+++ b/drivers/gpu/drm/i915/i915_reg.h
@@ -6826,7 +6826,9 @@ enum {
 #define GEN11_INTR_IDENTITY_REG0	_MMIO(0x190060)
 #define GEN11_INTR_IDENTITY_REG1	_MMIO(0x190064)
 #define  GEN11_INTR_DATA_VALID		(1 << 31)
-#define  GEN11_INTR_ENGINE_MASK		(0xffff)
+#define  GEN11_INTR_ENGINE_MASK(x)	((x) & 0xffff)
+#define  GEN11_INTR_ENGINE_CLASS(x)	(((x) & GENMASK(18, 16)) >> 16)
+#define  GEN11_INTR_ENGINE_INSTANCE(x)	(((x) & GENMASK(25, 20)) >> 20)
 
 #define GEN11_INTR_IDENTITY_REG(x)	_MMIO(0x190060 + (x * 4))
 
-- 
2.14.1

_______________________________________________
Intel-gfx mailing list
Intel-gfx@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/intel-gfx

^ permalink raw reply related	[flat|nested] 27+ messages in thread

* Re: [PATCH 4/8] drm/i915/icl: Added ICL 11 slice, subslice and EU fuse detection
  2018-03-16 12:14 ` [PATCH 4/8] drm/i915/icl: Added ICL 11 slice, subslice and EU fuse detection Mika Kuoppala
@ 2018-03-16 12:18   ` Lionel Landwerlin
  2018-03-16 13:06   ` [PATCH v2 " Lionel Landwerlin
  1 sibling, 0 replies; 27+ messages in thread
From: Lionel Landwerlin @ 2018-03-16 12:18 UTC (permalink / raw)
  To: Mika Kuoppala, intel-gfx

On 16/03/18 12:14, Mika Kuoppala wrote:
> From: Kelvin Gardiner <kelvin.gardiner@intel.com>
>
> This patch adds support to detect ICL, slice, subslice and EU fuse
> settings.
>
> Add addresses for ICL 11 slice, subslice and EU fuses registers.
> These register addresses are the same as previous platforms but the
> format and / or the meaning of the information is different. Therefore
> Gen11 defines for these registers are added.
>
> v2 (James): Rebase
>
> Bspec: 9731
> Bspec: 20643
> Bspec: 20673
>
> Signed-off-by: Kelvin Gardiner <kelvin.gardiner@intel.com>
> Signed-off-by: James Ausmus <james.ausmus@intel.com>
> ---
>   drivers/gpu/drm/i915/i915_reg.h          |  9 +++++++++
>   drivers/gpu/drm/i915/intel_device_info.c | 25 ++++++++++++++++++++++++-
>   2 files changed, 33 insertions(+), 1 deletion(-)
>
> diff --git a/drivers/gpu/drm/i915/i915_reg.h b/drivers/gpu/drm/i915/i915_reg.h
> index e29ff9dd967e..9eaaa96287ec 100644
> --- a/drivers/gpu/drm/i915/i915_reg.h
> +++ b/drivers/gpu/drm/i915/i915_reg.h
> @@ -2554,6 +2554,15 @@ enum i915_power_well_id {
>   #define   GEN11_GT_VEBOX_DISABLE_SHIFT	16
>   #define   GEN11_GT_VEBOX_DISABLE_MASK	(0xff << GEN11_GT_VEBOX_DISABLE_SHIFT)
>   
> +#define GEN11_EU_DISABLE _MMIO(0x9134)
> +#define GEN11_EU_DIS_MASK 0xFF
> +
> +#define GEN11_GT_SLICE_ENABLE _MMIO(0x9138)
> +#define GEN11_GT_S_ENA_MASK 0xFF
> +
> +#define GEN11_GT_SUBSLICE_DISABLE _MMIO(0x913C)
> +#define GEN11_GT_SS_DIS_MASK 0xFF
> +
>   #define GEN6_BSD_SLEEP_PSMI_CONTROL	_MMIO(0x12050)
>   #define   GEN6_BSD_SLEEP_MSG_DISABLE	(1 << 0)
>   #define   GEN6_BSD_SLEEP_FLUSH_DISABLE	(1 << 2)
> diff --git a/drivers/gpu/drm/i915/intel_device_info.c b/drivers/gpu/drm/i915/intel_device_info.c
> index 4babfc6ee45b..750e5c4c6bc1 100644
> --- a/drivers/gpu/drm/i915/intel_device_info.c
> +++ b/drivers/gpu/drm/i915/intel_device_info.c
> @@ -158,6 +158,27 @@ static u16 compute_eu_total(const struct sseu_dev_info *sseu)
>   	return total;
>   }
>   
> +static void gen11_sseu_info_init(struct drm_i915_private *dev_priv)
> +{
> +	struct sseu_dev_info *sseu = &mkwrite_device_info(dev_priv)->sseu;
> +	int eu_max = 8;
> +	u32 eu_disable;
> +
> +	sseu->slice_mask = I915_READ(GEN11_GT_SLICE_ENABLE) &
> +				GEN11_GT_S_ENA_MASK;
> +	sseu->subslice_mask[0] = ~(I915_READ(GEN11_GT_SUBSLICE_DISABLE) &
> +				GEN11_GT_SS_DIS_MASK);
> +	eu_disable = I915_READ(GEN11_EU_DISABLE) & GEN11_GT_S_ENA_MASK;
> +
> +	sseu->eu_per_subslice = eu_max - hweight32(eu_disable);
> +	sseu->eu_total = sseu->eu_per_subslice * hweight32(sseu->subslice_mask[0]);
> +
> +	/* ICL has no power gating restrictions. */
> +	sseu->has_slice_pg = 1;
> +	sseu->has_subslice_pg = 1;
> +	sseu->has_eu_pg = 1;
> +}

Storing the available slice/subslices/EUs has changed a bit.
This patch will most likely fail on the i915_query tests from IGT.

I've updated this patch here : 
https://github.com/djdeath/linux/commit/ad46d70ee757c943e98472e18d841cb631df09b9

> +
>   static void gen10_sseu_info_init(struct drm_i915_private *dev_priv)
>   {
>   	struct sseu_dev_info *sseu = &mkwrite_device_info(dev_priv)->sseu;
> @@ -768,8 +789,10 @@ void intel_device_info_runtime_init(struct intel_device_info *info)
>   		broadwell_sseu_info_init(dev_priv);
>   	else if (INTEL_GEN(dev_priv) == 9)
>   		gen9_sseu_info_init(dev_priv);
> -	else if (INTEL_GEN(dev_priv) >= 10)
> +	else if (INTEL_GEN(dev_priv) == 10)
>   		gen10_sseu_info_init(dev_priv);
> +	else if (INTEL_INFO(dev_priv)->gen >= 11)
> +		gen11_sseu_info_init(dev_priv);
>   
>   	/* Initialize command stream timestamp frequency */
>   	info->cs_timestamp_frequency_khz = read_timestamp_frequency(dev_priv);


_______________________________________________
Intel-gfx mailing list
Intel-gfx@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/intel-gfx

^ permalink raw reply	[flat|nested] 27+ messages in thread

* Re: [PATCH 5/8] drm/i915/icl: Add reset control register changes
  2018-03-16 12:14 ` [PATCH 5/8] drm/i915/icl: Add reset control register changes Mika Kuoppala
@ 2018-03-16 12:22   ` Mika Kuoppala
  2018-03-16 12:45   ` Chris Wilson
  2018-03-16 20:28   ` Daniele Ceraolo Spurio
  2 siblings, 0 replies; 27+ messages in thread
From: Mika Kuoppala @ 2018-03-16 12:22 UTC (permalink / raw)
  To: intel-gfx; +Cc: Paulo Zanoni

Mika Kuoppala <mika.kuoppala@linux.intel.com> writes:

> From: Michel Thierry <michel.thierry@intel.com>
>
> The bits used to reset the different engines/domains have changed in
> GEN11, this patch maps the reset engine mask bits with the new bits
> in the reset control register.
>
> v2: Use shift-left instead of BIT macro to match the file style (Paulo).
> v3: Reuse gen8_reset_engines (Daniele).
> v4: Do not call intel_uncore_forcewake_reset after reset, we may be
> using the forcewake to read protected registers elsewhere and those
> results may be clobbered by the concurrent dropping of forcewake.
>
> bspec: 19212
> Cc: Oscar Mateo <oscar.mateo@intel.com>
> Cc: Antonio Argenziano <antonio.argenziano@intel.com>
> Cc: Paulo Zanoni <paulo.r.zanoni@intel.com>
> Cc: Daniele Ceraolo Spurio <daniele.ceraolospurio@intel.com>
> Acked-by: Daniele Ceraolo Spurio <daniele.ceraolospurio@intel.com>
> Signed-off-by: Michel Thierry <michel.thierry@intel.com>
> ---
>  drivers/gpu/drm/i915/i915_reg.h     | 11 ++++++++
>  drivers/gpu/drm/i915/intel_uncore.c | 53 +++++++++++++++++++++++++++++++++++--
>  2 files changed, 62 insertions(+), 2 deletions(-)
>
> diff --git a/drivers/gpu/drm/i915/i915_reg.h b/drivers/gpu/drm/i915/i915_reg.h
> index 9eaaa96287ec..f3cc77690124 100644
> --- a/drivers/gpu/drm/i915/i915_reg.h
> +++ b/drivers/gpu/drm/i915/i915_reg.h
> @@ -301,6 +301,17 @@ static inline bool i915_mmio_reg_valid(i915_reg_t reg)
>  #define  GEN6_GRDOM_VECS		(1 << 4)
>  #define  GEN9_GRDOM_GUC			(1 << 5)
>  #define  GEN8_GRDOM_MEDIA2		(1 << 7)
> +/* GEN11 changed all bit defs except for FULL & RENDER */
> +#define  GEN11_GRDOM_FULL		GEN6_GRDOM_FULL
> +#define  GEN11_GRDOM_RENDER		GEN6_GRDOM_RENDER
> +#define  GEN11_GRDOM_BLT		(1 << 2)
> +#define  GEN11_GRDOM_GUC		(1 << 3)
> +#define  GEN11_GRDOM_MEDIA		(1 << 5)
> +#define  GEN11_GRDOM_MEDIA2		(1 << 6)
> +#define  GEN11_GRDOM_MEDIA3		(1 << 7)
> +#define  GEN11_GRDOM_MEDIA4		(1 << 8)

I would like these to be named like they are in bspec.
First being MEDIA0.

> +#define  GEN11_GRDOM_VECS		(1 << 13)
> +#define  GEN11_GRDOM_VECS2		(1 << 14)

And same to these, VECS0 and VECS1.

-Mika

>
>  #define RING_PP_DIR_BASE(engine)	_MMIO((engine)->mmio_base+0x228)
>  #define RING_PP_DIR_BASE_READ(engine)	_MMIO((engine)->mmio_base+0x518)
> diff --git a/drivers/gpu/drm/i915/intel_uncore.c b/drivers/gpu/drm/i915/intel_uncore.c
> index 4c616d074a97..cabbf0e682e7 100644
> --- a/drivers/gpu/drm/i915/intel_uncore.c
> +++ b/drivers/gpu/drm/i915/intel_uncore.c
> @@ -1909,6 +1909,50 @@ static int gen6_reset_engines(struct drm_i915_private *dev_priv,
>  	return gen6_hw_domain_reset(dev_priv, hw_mask);
>  }
>  
> +/**
> + * gen11_reset_engines - reset individual engines
> + * @dev_priv: i915 device
> + * @engine_mask: mask of intel_ring_flag() engines or ALL_ENGINES for full reset
> + *
> + * This function will reset the individual engines that are set in engine_mask.
> + * If you provide ALL_ENGINES as mask, full global domain reset will be issued.
> + *
> + * Note: It is responsibility of the caller to handle the difference between
> + * asking full domain reset versus reset for all available individual engines.
> + *
> + * Returns 0 on success, nonzero on error.
> + */
> +static int gen11_reset_engines(struct drm_i915_private *dev_priv,
> +			       unsigned engine_mask)
> +{
> +	struct intel_engine_cs *engine;
> +	const u32 hw_engine_mask[I915_NUM_ENGINES] = {
> +		[RCS] = GEN11_GRDOM_RENDER,
> +		[BCS] = GEN11_GRDOM_BLT,
> +		[VCS] = GEN11_GRDOM_MEDIA,
> +		[VCS2] = GEN11_GRDOM_MEDIA2,
> +		[VCS3] = GEN11_GRDOM_MEDIA3,
> +		[VCS4] = GEN11_GRDOM_MEDIA4,
> +		[VECS] = GEN11_GRDOM_VECS,
> +		[VECS2] = GEN11_GRDOM_VECS2,
> +	};
> +	u32 hw_mask;
> +
> +	BUILD_BUG_ON(VECS2 + 1 != I915_NUM_ENGINES);
> +
> +	if (engine_mask == ALL_ENGINES) {
> +		hw_mask = GEN11_GRDOM_FULL;
> +	} else {
> +		unsigned int tmp;
> +
> +		hw_mask = 0;
> +		for_each_engine_masked(engine, dev_priv, engine_mask, tmp)
> +			hw_mask |= hw_engine_mask[engine->id];
> +	}
> +
> +	return gen6_hw_domain_reset(dev_priv, hw_mask);
> +}
> +
>  /**
>   * __intel_wait_for_register_fw - wait until register matches expected state
>   * @dev_priv: the i915 device
> @@ -2056,7 +2100,10 @@ static int gen8_reset_engines(struct drm_i915_private *dev_priv,
>  		if (gen8_reset_engine_start(engine))
>  			goto not_ready;
>  
> -	return gen6_reset_engines(dev_priv, engine_mask);
> +	if (INTEL_GEN(dev_priv) >= 11)
> +		return gen11_reset_engines(dev_priv, engine_mask);
> +	else
> +		return gen6_reset_engines(dev_priv, engine_mask);
>  
>  not_ready:
>  	for_each_engine_masked(engine, dev_priv, engine_mask, tmp)
> @@ -2141,12 +2188,14 @@ bool intel_has_reset_engine(struct drm_i915_private *dev_priv)
>  
>  int intel_reset_guc(struct drm_i915_private *dev_priv)
>  {
> +	u32 guc_domain = INTEL_GEN(dev_priv) >= 11 ? GEN11_GRDOM_GUC :
> +						     GEN9_GRDOM_GUC;
>  	int ret;
>  
>  	GEM_BUG_ON(!HAS_GUC(dev_priv));
>  
>  	intel_uncore_forcewake_get(dev_priv, FORCEWAKE_ALL);
> -	ret = gen6_hw_domain_reset(dev_priv, GEN9_GRDOM_GUC);
> +	ret = gen6_hw_domain_reset(dev_priv, guc_domain);
>  	intel_uncore_forcewake_put(dev_priv, FORCEWAKE_ALL);
>  
>  	return ret;
> -- 
> 2.14.1
>
> _______________________________________________
> Intel-gfx mailing list
> Intel-gfx@lists.freedesktop.org
> https://lists.freedesktop.org/mailman/listinfo/intel-gfx
_______________________________________________
Intel-gfx mailing list
Intel-gfx@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/intel-gfx

^ permalink raw reply	[flat|nested] 27+ messages in thread

* Re: [PATCH 5/8] drm/i915/icl: Add reset control register changes
  2018-03-16 12:14 ` [PATCH 5/8] drm/i915/icl: Add reset control register changes Mika Kuoppala
  2018-03-16 12:22   ` Mika Kuoppala
@ 2018-03-16 12:45   ` Chris Wilson
  2018-03-16 20:28   ` Daniele Ceraolo Spurio
  2 siblings, 0 replies; 27+ messages in thread
From: Chris Wilson @ 2018-03-16 12:45 UTC (permalink / raw)
  To: Mika Kuoppala, intel-gfx; +Cc: Paulo Zanoni

Quoting Mika Kuoppala (2018-03-16 12:14:53)
> +static int gen11_reset_engines(struct drm_i915_private *dev_priv,
> +                              unsigned engine_mask)
> +{
> +       struct intel_engine_cs *engine;
> +       const u32 hw_engine_mask[I915_NUM_ENGINES] = {
> +               [RCS] = GEN11_GRDOM_RENDER,
> +               [BCS] = GEN11_GRDOM_BLT,
> +               [VCS] = GEN11_GRDOM_MEDIA,
> +               [VCS2] = GEN11_GRDOM_MEDIA2,
> +               [VCS3] = GEN11_GRDOM_MEDIA3,
> +               [VCS4] = GEN11_GRDOM_MEDIA4,
> +               [VECS] = GEN11_GRDOM_VECS,
> +               [VECS2] = GEN11_GRDOM_VECS2,
> +       };

No gratuitously decorating Christmas trees.

> +       u32 hw_mask;
> +
> +       BUILD_BUG_ON(VECS2 + 1 != I915_NUM_ENGINES);
> +
> +       if (engine_mask == ALL_ENGINES) {
> +               hw_mask = GEN11_GRDOM_FULL;
> +       } else {

Plonk struct intel_engine_cs *engine; here instead.

> +               unsigned int tmp;
> +
> +               hw_mask = 0;
> +               for_each_engine_masked(engine, dev_priv, engine_mask, tmp)
> +                       hw_mask |= hw_engine_mask[engine->id];
> +       }
_______________________________________________
Intel-gfx mailing list
Intel-gfx@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/intel-gfx

^ permalink raw reply	[flat|nested] 27+ messages in thread

* [PATCH v2 4/8] drm/i915/icl: Added ICL 11 slice, subslice and EU fuse detection
  2018-03-16 12:14 ` [PATCH 4/8] drm/i915/icl: Added ICL 11 slice, subslice and EU fuse detection Mika Kuoppala
  2018-03-16 12:18   ` Lionel Landwerlin
@ 2018-03-16 13:06   ` Lionel Landwerlin
  1 sibling, 0 replies; 27+ messages in thread
From: Lionel Landwerlin @ 2018-03-16 13:06 UTC (permalink / raw)
  To: intel-gfx

From: Kelvin Gardiner <kelvin.gardiner@intel.com>

This patch adds support to detect ICL, slice, subslice and EU fuse
settings.

Add addresses for ICL 11 slice, subslice and EU fuses registers.
These register addresses are the same as previous platforms but the
format and / or the meaning of the information is different. Therefore
Gen11 defines for these registers are added.

Bspec: 9731
Bspec: 20643
Bspec: 20673

v2: Update fusing information storage after introducing the new query
    uAPI (Lionel)

Signed-off-by: Kelvin Gardiner <kelvin.gardiner@intel.com>
Signed-off-by: Lionel Landwerlin <lionel.g.landwerlin@intel.com>
---
 drivers/gpu/drm/i915/i915_reg.h          |  9 +++++++
 drivers/gpu/drm/i915/intel_device_info.c | 42 +++++++++++++++++++++++++++++++-
 2 files changed, 50 insertions(+), 1 deletion(-)

diff --git a/drivers/gpu/drm/i915/i915_reg.h b/drivers/gpu/drm/i915/i915_reg.h
index 3119099af057..e8a965d1bc87 100644
--- a/drivers/gpu/drm/i915/i915_reg.h
+++ b/drivers/gpu/drm/i915/i915_reg.h
@@ -2876,6 +2876,15 @@ enum i915_power_well_id {
 #define   GEN11_GT_VEBOX_DISABLE_SHIFT	16
 #define   GEN11_GT_VEBOX_DISABLE_MASK	(0xff << GEN11_GT_VEBOX_DISABLE_SHIFT)
 
+#define GEN11_EU_DISABLE _MMIO(0x9134)
+#define GEN11_EU_DIS_MASK 0xFF
+
+#define GEN11_GT_SLICE_ENABLE _MMIO(0x9138)
+#define GEN11_GT_S_ENA_MASK 0xFF
+
+#define GEN11_GT_SUBSLICE_DISABLE _MMIO(0x913C)
+#define GEN11_GT_SS_DIS_MASK 0xFF
+
 #define GEN6_BSD_SLEEP_PSMI_CONTROL	_MMIO(0x12050)
 #define   GEN6_BSD_SLEEP_MSG_DISABLE	(1 << 0)
 #define   GEN6_BSD_SLEEP_FLUSH_DISABLE	(1 << 2)
diff --git a/drivers/gpu/drm/i915/intel_device_info.c b/drivers/gpu/drm/i915/intel_device_info.c
index 4babfc6ee45b..3938c8fd833d 100644
--- a/drivers/gpu/drm/i915/intel_device_info.c
+++ b/drivers/gpu/drm/i915/intel_device_info.c
@@ -158,6 +158,44 @@ static u16 compute_eu_total(const struct sseu_dev_info *sseu)
 	return total;
 }
 
+static void gen11_sseu_info_init(struct drm_i915_private *dev_priv)
+{
+	struct sseu_dev_info *sseu = &mkwrite_device_info(dev_priv)->sseu;
+	u8 subslices_enabled;
+	u8 eus_enabled;
+	int s, ss;
+
+	sseu->max_eus_per_subslice = 8;
+	sseu->max_slices = 8;
+	sseu->max_subslices = 8;
+
+	subslices_enabled = ~(I915_READ(GEN11_GT_SUBSLICE_DISABLE) &
+			      GEN11_GT_SS_DIS_MASK);
+	eus_enabled = ~(I915_READ(GEN11_EU_DISABLE) & GEN11_GT_S_ENA_MASK);
+
+	sseu->eu_per_subslice = hweight8(eus_enabled);
+
+	sseu->slice_mask = I915_READ(GEN11_GT_SLICE_ENABLE) &
+		GEN11_GT_S_ENA_MASK;
+
+	for (s = 0; s < sseu->max_slices; s++) {
+		if ((sseu->slice_mask & BIT(s)) == 0)
+			continue;
+		sseu->subslice_mask[s] = subslices_enabled;
+
+		for (ss = 0; ss < sseu->max_subslices; ss++) {
+			if (sseu->subslice_mask[s] & BIT(ss))
+				sseu_set_eus(sseu, s, ss, eus_enabled);
+		}
+	}
+	sseu->eu_total = compute_eu_total(sseu);
+
+	/* ICL has no power gating restrictions. */
+	sseu->has_slice_pg = 1;
+	sseu->has_subslice_pg = 1;
+	sseu->has_eu_pg = 1;
+}
+
 static void gen10_sseu_info_init(struct drm_i915_private *dev_priv)
 {
 	struct sseu_dev_info *sseu = &mkwrite_device_info(dev_priv)->sseu;
@@ -768,8 +806,10 @@ void intel_device_info_runtime_init(struct intel_device_info *info)
 		broadwell_sseu_info_init(dev_priv);
 	else if (INTEL_GEN(dev_priv) == 9)
 		gen9_sseu_info_init(dev_priv);
-	else if (INTEL_GEN(dev_priv) >= 10)
+	else if (INTEL_GEN(dev_priv) == 10)
 		gen10_sseu_info_init(dev_priv);
+	else if (INTEL_INFO(dev_priv)->gen >= 11)
+		gen11_sseu_info_init(dev_priv);
 
 	/* Initialize command stream timestamp frequency */
 	info->cs_timestamp_frequency_khz = read_timestamp_frequency(dev_priv);
-- 
2.16.2

_______________________________________________
Intel-gfx mailing list
Intel-gfx@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/intel-gfx

^ permalink raw reply related	[flat|nested] 27+ messages in thread

* ✓ Fi.CI.BAT: success for series starting with [1/8] drm/i915/icl: Check for fused-off VDBOX and VEBOX instances (rev2)
  2018-03-16 12:14 [PATCH 1/8] drm/i915/icl: Check for fused-off VDBOX and VEBOX instances Mika Kuoppala
                   ` (6 preceding siblings ...)
  2018-03-16 12:14 ` [PATCH 8/8] drm/i915/icl: Use hw engine class, instance to find irq handler Mika Kuoppala
@ 2018-03-16 13:53 ` Patchwork
  2018-03-16 17:01 ` ✓ Fi.CI.IGT: " Patchwork
                   ` (2 subsequent siblings)
  10 siblings, 0 replies; 27+ messages in thread
From: Patchwork @ 2018-03-16 13:53 UTC (permalink / raw)
  To: Lionel Landwerlin; +Cc: intel-gfx

== Series Details ==

Series: series starting with [1/8] drm/i915/icl: Check for fused-off VDBOX and VEBOX instances (rev2)
URL   : https://patchwork.freedesktop.org/series/40093/
State : success

== Summary ==

Series 40093v2 series starting with [1/8] drm/i915/icl: Check for fused-off VDBOX and VEBOX instances
https://patchwork.freedesktop.org/api/1.0/series/40093/revisions/2/mbox/

---- Known issues:

Test gem_exec_suspend:
        Subgroup basic-s3:
                incomplete -> PASS       (fi-cnl-y3) fdo#105086
Test gem_mmap_gtt:
        Subgroup basic-small-bo-tiledx:
                fail       -> PASS       (fi-gdg-551) fdo#102575
Test kms_flip:
        Subgroup basic-flip-vs-wf_vblank:
                pass       -> FAIL       (fi-cfl-s2) fdo#100368
Test kms_pipe_crc_basic:
        Subgroup suspend-read-crc-pipe-b:
                incomplete -> PASS       (fi-snb-2520m) fdo#103713
        Subgroup suspend-read-crc-pipe-c:
                pass       -> INCOMPLETE (fi-bxt-dsi) fdo#103927

fdo#105086 https://bugs.freedesktop.org/show_bug.cgi?id=105086
fdo#102575 https://bugs.freedesktop.org/show_bug.cgi?id=102575
fdo#100368 https://bugs.freedesktop.org/show_bug.cgi?id=100368
fdo#103713 https://bugs.freedesktop.org/show_bug.cgi?id=103713
fdo#103927 https://bugs.freedesktop.org/show_bug.cgi?id=103927

fi-bdw-5557u     total:285  pass:264  dwarn:0   dfail:0   fail:0   skip:21  time:431s
fi-bdw-gvtdvm    total:285  pass:261  dwarn:0   dfail:0   fail:0   skip:24  time:441s
fi-blb-e6850     total:285  pass:220  dwarn:1   dfail:0   fail:0   skip:64  time:380s
fi-bsw-n3050     total:285  pass:239  dwarn:0   dfail:0   fail:0   skip:46  time:539s
fi-bwr-2160      total:285  pass:180  dwarn:0   dfail:0   fail:0   skip:105 time:296s
fi-bxt-dsi       total:243  pass:216  dwarn:0   dfail:0   fail:0   skip:26 
fi-bxt-j4205     total:285  pass:256  dwarn:0   dfail:0   fail:0   skip:29  time:512s
fi-byt-j1900     total:285  pass:250  dwarn:0   dfail:0   fail:0   skip:35  time:515s
fi-byt-n2820     total:285  pass:246  dwarn:0   dfail:0   fail:0   skip:39  time:510s
fi-cfl-8700k     total:285  pass:257  dwarn:0   dfail:0   fail:0   skip:28  time:410s
fi-cfl-s2        total:285  pass:258  dwarn:0   dfail:0   fail:1   skip:26  time:574s
fi-cfl-u         total:285  pass:259  dwarn:0   dfail:0   fail:0   skip:26  time:512s
fi-cnl-drrs      total:285  pass:254  dwarn:3   dfail:0   fail:0   skip:28  time:525s
fi-cnl-y3        total:285  pass:259  dwarn:0   dfail:0   fail:0   skip:26  time:586s
fi-elk-e7500     total:285  pass:225  dwarn:1   dfail:0   fail:0   skip:59  time:430s
fi-gdg-551       total:285  pass:177  dwarn:0   dfail:0   fail:0   skip:108 time:315s
fi-glk-1         total:285  pass:257  dwarn:0   dfail:0   fail:0   skip:28  time:537s
fi-hsw-4770      total:285  pass:258  dwarn:0   dfail:0   fail:0   skip:27  time:402s
fi-ilk-650       total:285  pass:225  dwarn:0   dfail:0   fail:0   skip:60  time:418s
fi-ivb-3520m     total:285  pass:256  dwarn:0   dfail:0   fail:0   skip:29  time:467s
fi-ivb-3770      total:285  pass:252  dwarn:0   dfail:0   fail:0   skip:33  time:426s
fi-kbl-7500u     total:285  pass:260  dwarn:1   dfail:0   fail:0   skip:24  time:479s
fi-kbl-7567u     total:285  pass:265  dwarn:0   dfail:0   fail:0   skip:20  time:470s
fi-kbl-r         total:285  pass:258  dwarn:0   dfail:0   fail:0   skip:27  time:513s
fi-pnv-d510      total:285  pass:219  dwarn:1   dfail:0   fail:0   skip:65  time:653s
fi-skl-6260u     total:285  pass:265  dwarn:0   dfail:0   fail:0   skip:20  time:442s
fi-skl-6600u     total:285  pass:258  dwarn:0   dfail:0   fail:0   skip:27  time:535s
fi-skl-6700hq    total:285  pass:259  dwarn:0   dfail:0   fail:0   skip:26  time:541s
fi-skl-6700k2    total:285  pass:261  dwarn:0   dfail:0   fail:0   skip:24  time:502s
fi-skl-6770hq    total:285  pass:265  dwarn:0   dfail:0   fail:0   skip:20  time:498s
fi-skl-guc       total:285  pass:257  dwarn:0   dfail:0   fail:0   skip:28  time:430s
fi-skl-gvtdvm    total:285  pass:262  dwarn:0   dfail:0   fail:0   skip:23  time:445s
fi-snb-2520m     total:285  pass:245  dwarn:0   dfail:0   fail:0   skip:40  time:571s
fi-snb-2600      total:285  pass:245  dwarn:0   dfail:0   fail:0   skip:40  time:398s

b8d045232d3b836e7a203cda08a1bd3353658b5b drm-tip: 2018y-03m-16d-12h-56m-11s UTC integration manifest
8a3e383e6156 drm/i915/icl: Use hw engine class, instance to find irq handler
3bbfd755c401 drm/i915/icl: Enable RC6 and RPS in Gen11
4cb245e55bce drm/i915/icl: Handle RPS interrupts correctly for Gen11
ea4b36ea4c40 drm/i915/icl: Add reset control register changes
aeef5a6bb95f drm/i915/icl: Added ICL 11 slice, subslice and EU fuse detection
862027777456 drm/i915/icl: Update subslice define for ICL 11
9b6257a28af3 drm/i915/icl: Enable the extra video decode and enhancement boxes for Icelake 11
4e674c6f5ff5 drm/i915/icl: Check for fused-off VDBOX and VEBOX instances

== Logs ==

For more details see: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_8374/issues.html
_______________________________________________
Intel-gfx mailing list
Intel-gfx@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/intel-gfx

^ permalink raw reply	[flat|nested] 27+ messages in thread

* ✓ Fi.CI.IGT: success for series starting with [1/8] drm/i915/icl: Check for fused-off VDBOX and VEBOX instances (rev2)
  2018-03-16 12:14 [PATCH 1/8] drm/i915/icl: Check for fused-off VDBOX and VEBOX instances Mika Kuoppala
                   ` (7 preceding siblings ...)
  2018-03-16 13:53 ` ✓ Fi.CI.BAT: success for series starting with [1/8] drm/i915/icl: Check for fused-off VDBOX and VEBOX instances (rev2) Patchwork
@ 2018-03-16 17:01 ` Patchwork
  2018-03-19 15:26 ` [PATCH 1/8] drm/i915/icl: Check for fused-off VDBOX and VEBOX instances Sagar Arun Kamble
  2018-03-23 16:28 ` Lionel Landwerlin
  10 siblings, 0 replies; 27+ messages in thread
From: Patchwork @ 2018-03-16 17:01 UTC (permalink / raw)
  To: Lionel Landwerlin; +Cc: intel-gfx

== Series Details ==

Series: series starting with [1/8] drm/i915/icl: Check for fused-off VDBOX and VEBOX instances (rev2)
URL   : https://patchwork.freedesktop.org/series/40093/
State : success

== Summary ==

---- Possible new issues:

Test gem_fenced_exec_thrash:
        Subgroup 2-spare-fences:
                dmesg-warn -> PASS       (shard-hsw)
Test kms_busy:
        Subgroup basic-modeset-a:
                dmesg-warn -> PASS       (shard-hsw)

---- Known issues:

Test kms_flip:
        Subgroup 2x-plain-flip-fb-recreate-interruptible:
                fail       -> PASS       (shard-hsw) fdo#100368
Test kms_rotation_crc:
        Subgroup sprite-rotation-180:
                fail       -> PASS       (shard-hsw) fdo#105185
Test prime_vgem:
        Subgroup basic-fence-flip:
                fail       -> PASS       (shard-apl) fdo#104008

fdo#100368 https://bugs.freedesktop.org/show_bug.cgi?id=100368
fdo#105185 https://bugs.freedesktop.org/show_bug.cgi?id=105185
fdo#104008 https://bugs.freedesktop.org/show_bug.cgi?id=104008

shard-apl        total:3442 pass:1814 dwarn:1   dfail:0   fail:7   skip:1619 time:13092s
shard-hsw        total:3442 pass:1768 dwarn:1   dfail:0   fail:1   skip:1671 time:11920s
shard-snb        total:3442 pass:1355 dwarn:1   dfail:0   fail:4   skip:2081 time:7228s
Blacklisted hosts:
shard-kbl        total:3442 pass:1939 dwarn:1   dfail:0   fail:9   skip:1493 time:9916s

== Logs ==

For more details see: https://intel-gfx-ci.01.org/tree/drm-tip/Patchwork_8374/shards.html
_______________________________________________
Intel-gfx mailing list
Intel-gfx@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/intel-gfx

^ permalink raw reply	[flat|nested] 27+ messages in thread

* Re: [PATCH 8/8] drm/i915/icl: Use hw engine class, instance to find irq handler
  2018-03-16 12:14 ` [PATCH 8/8] drm/i915/icl: Use hw engine class, instance to find irq handler Mika Kuoppala
@ 2018-03-16 18:28   ` Michel Thierry
  2018-03-16 19:37     ` Daniele Ceraolo Spurio
  0 siblings, 1 reply; 27+ messages in thread
From: Michel Thierry @ 2018-03-16 18:28 UTC (permalink / raw)
  To: Mika Kuoppala, intel-gfx

On 3/16/2018 5:14 AM, Mika Kuoppala wrote:
> Interrupt identity register we already read from hardware
> contains engine class and instance fields. Leverage
> these fields to find correct engine to handle the interrupt.
> 
> v3: rebase on top of rps intr
>      use correct class / instance limits (Michel)
> 
> Suggested-by: Daniele Ceraolo Spurio <daniele.ceraolospurio@intel.com>
> Cc: Daniele Ceraolo Spurio <daniele.ceraolospurio@intel.com>
> Cc: Chris Wilson <chris@chris-wilson.co.uk>
> Cc: Tvrtko Ursulin <tvrtko.ursulin@intel.com>
> Cc: Michel Thierry <michel.thierry@intel.com>
> Signed-off-by: Mika Kuoppala <mika.kuoppala@linux.intel.com>
> ---
>   drivers/gpu/drm/i915/i915_irq.c | 80 +++++++++++++++--------------------------
>   drivers/gpu/drm/i915/i915_reg.h |  4 ++-
>   2 files changed, 31 insertions(+), 53 deletions(-)
> 
> diff --git a/drivers/gpu/drm/i915/i915_irq.c b/drivers/gpu/drm/i915/i915_irq.c
> index 8c4510ffe625..dd2fb2d0457f 100644
> --- a/drivers/gpu/drm/i915/i915_irq.c
> +++ b/drivers/gpu/drm/i915/i915_irq.c
> @@ -413,8 +413,8 @@ static void gen6_disable_pm_irq(struct drm_i915_private *dev_priv, u32 disable_m
>   }
>   
>   static u32
> -gen11_gt_engine_intr(struct drm_i915_private * const i915,
> -		     const unsigned int bank, const unsigned int bit);
> +gen11_gt_engine_identity(struct drm_i915_private * const i915,
> +			 const unsigned int bank, const unsigned int bit);
>   
>   void gen11_reset_rps_interrupts(struct drm_i915_private *dev_priv)
>   {
> @@ -428,7 +428,7 @@ void gen11_reset_rps_interrupts(struct drm_i915_private *dev_priv)
>   	 */
>   	dw = I915_READ_FW(GEN11_GT_INTR_DW0);
>   	while (dw & BIT(GEN11_GTPM)) {
> -		gen11_gt_engine_intr(dev_priv, 0, GEN11_GTPM);
> +		gen11_gt_engine_identity(dev_priv, 0, GEN11_GTPM);
>   		I915_WRITE_FW(GEN11_GT_INTR_DW0, BIT(GEN11_GTPM));
>   		dw = I915_READ_FW(GEN11_GT_INTR_DW0);
>   	}
> @@ -2771,50 +2771,9 @@ static void __fini_wedge(struct wedge_me *w)
>   	     (W)->i915;							\
>   	     __fini_wedge((W)))
>   
> -static void
> -gen11_gt_engine_irq_handler(struct drm_i915_private * const i915,
> -			    const unsigned int bank,
> -			    const unsigned int engine_n,
> -			    const u16 iir)
> -{
> -	struct intel_engine_cs ** const engine = i915->engine;
> -
> -	switch (bank) {
> -	case 0:
> -		switch (engine_n) {
> -
> -		case GEN11_RCS0:
> -			return gen8_cs_irq_handler(engine[RCS], iir);
> -
> -		case GEN11_BCS:
> -			return gen8_cs_irq_handler(engine[BCS], iir);
> -
> -		case GEN11_GTPM:
> -			return gen6_rps_irq_handler(i915, iir);
> -		}
> -	case 1:
> -		switch (engine_n) {
> -
> -		case GEN11_VCS(0):
> -			return gen8_cs_irq_handler(engine[_VCS(0)], iir);
> -		case GEN11_VCS(1):
> -			return gen8_cs_irq_handler(engine[_VCS(1)], iir);
> -		case GEN11_VCS(2):
> -			return gen8_cs_irq_handler(engine[_VCS(2)], iir);
> -		case GEN11_VCS(3):
> -			return gen8_cs_irq_handler(engine[_VCS(3)], iir);
> -
> -		case GEN11_VECS(0):
> -			return gen8_cs_irq_handler(engine[_VECS(0)], iir);
> -		case GEN11_VECS(1):
> -			return gen8_cs_irq_handler(engine[_VECS(1)], iir);
> -		}
> -	}
> -}
> -
>   static u32
> -gen11_gt_engine_intr(struct drm_i915_private * const i915,
> -		     const unsigned int bank, const unsigned int bit)
> +gen11_gt_engine_identity(struct drm_i915_private * const i915,
> +			 const unsigned int bank, const unsigned int bit)
>   {
>   	void __iomem * const regs = i915->regs;
>   	u32 timeout_ts;
> @@ -2841,7 +2800,26 @@ gen11_gt_engine_intr(struct drm_i915_private * const i915,
>   	raw_reg_write(regs, GEN11_INTR_IDENTITY_REG(bank),
>   		      GEN11_INTR_DATA_VALID);
>   
> -	return ident & GEN11_INTR_ENGINE_MASK;
> +	return ident;
> +}
> +
> +static void
> +gen11_gt_identity_handler(struct drm_i915_private * const i915,
> +			  const u32 identity)
> +{
> +	const u8 class = GEN11_INTR_ENGINE_CLASS(identity);
> +	const u8 instance = GEN11_INTR_ENGINE_INSTANCE(identity);
> +	const u16 iir = GEN11_INTR_ENGINE_MASK(identity);
> +
> +	if (unlikely(!iir))
> +		return;
> +
> +	if (class <= MAX_ENGINE_CLASS && instance <= MAX_ENGINE_INSTANCE)
> +		return gen8_cs_irq_handler(i915->engine_class[class][instance],
> +					   iir);
> +
> +	if (class == GEN11_GTPM)
> +		return gen6_rps_irq_handler(i915, iir);

Hi,

GEN11_GTPM should be
	[Class ID] == 'OTHER_CLASS (4)', and
	[Engine Id] == 1.
(I'm looking at bspec 20944)

So not only the GPTM check needs to be before the
   if (class <= MAX_ENGINE_CLASS),

but it can't use GEN11_GTPM either.

-Michel


>   }
>   
>   static void
> @@ -2866,12 +2844,10 @@ gen11_gt_irq_handler(struct drm_i915_private * const i915,
>   		}
>   
>   		for_each_set_bit(bit, &intr_dw, 32) {
> -			const u16 iir = gen11_gt_engine_intr(i915, bank, bit);
> -
> -			if (unlikely(!iir))
> -				continue;
> +			const u32 ident = gen11_gt_engine_identity(i915,
> +								   bank, bit);
>   
> -			gen11_gt_engine_irq_handler(i915, bank, bit, iir);
> +			gen11_gt_identity_handler(i915, ident);
>   		}
>   
>   		/* Clear must be after shared has been served for engine */
> diff --git a/drivers/gpu/drm/i915/i915_reg.h b/drivers/gpu/drm/i915/i915_reg.h
> index f3cc77690124..74a8f454e8a0 100644
> --- a/drivers/gpu/drm/i915/i915_reg.h
> +++ b/drivers/gpu/drm/i915/i915_reg.h
> @@ -6826,7 +6826,9 @@ enum {
>   #define GEN11_INTR_IDENTITY_REG0	_MMIO(0x190060)
>   #define GEN11_INTR_IDENTITY_REG1	_MMIO(0x190064)
>   #define  GEN11_INTR_DATA_VALID		(1 << 31)
> -#define  GEN11_INTR_ENGINE_MASK		(0xffff)
> +#define  GEN11_INTR_ENGINE_MASK(x)	((x) & 0xffff)
> +#define  GEN11_INTR_ENGINE_CLASS(x)	(((x) & GENMASK(18, 16)) >> 16)
> +#define  GEN11_INTR_ENGINE_INSTANCE(x)	(((x) & GENMASK(25, 20)) >> 20)
>   
>   #define GEN11_INTR_IDENTITY_REG(x)	_MMIO(0x190060 + (x * 4))
>   
> 
_______________________________________________
Intel-gfx mailing list
Intel-gfx@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/intel-gfx

^ permalink raw reply	[flat|nested] 27+ messages in thread

* Re: [PATCH 8/8] drm/i915/icl: Use hw engine class, instance to find irq handler
  2018-03-16 18:28   ` Michel Thierry
@ 2018-03-16 19:37     ` Daniele Ceraolo Spurio
  2018-03-19 15:14       ` Daniele Ceraolo Spurio
  0 siblings, 1 reply; 27+ messages in thread
From: Daniele Ceraolo Spurio @ 2018-03-16 19:37 UTC (permalink / raw)
  To: Michel Thierry, Mika Kuoppala, intel-gfx



On 16/03/18 11:28, Michel Thierry wrote:
> On 3/16/2018 5:14 AM, Mika Kuoppala wrote:
>> Interrupt identity register we already read from hardware
>> contains engine class and instance fields. Leverage
>> these fields to find correct engine to handle the interrupt.
>>
>> v3: rebase on top of rps intr
>>      use correct class / instance limits (Michel)
>>
>> Suggested-by: Daniele Ceraolo Spurio <daniele.ceraolospurio@intel.com>
>> Cc: Daniele Ceraolo Spurio <daniele.ceraolospurio@intel.com>
>> Cc: Chris Wilson <chris@chris-wilson.co.uk>
>> Cc: Tvrtko Ursulin <tvrtko.ursulin@intel.com>
>> Cc: Michel Thierry <michel.thierry@intel.com>
>> Signed-off-by: Mika Kuoppala <mika.kuoppala@linux.intel.com>
>> ---
>>   drivers/gpu/drm/i915/i915_irq.c | 80 
>> +++++++++++++++--------------------------
>>   drivers/gpu/drm/i915/i915_reg.h |  4 ++-
>>   2 files changed, 31 insertions(+), 53 deletions(-)
>>
>> diff --git a/drivers/gpu/drm/i915/i915_irq.c 
>> b/drivers/gpu/drm/i915/i915_irq.c
>> index 8c4510ffe625..dd2fb2d0457f 100644
>> --- a/drivers/gpu/drm/i915/i915_irq.c
>> +++ b/drivers/gpu/drm/i915/i915_irq.c
>> @@ -413,8 +413,8 @@ static void gen6_disable_pm_irq(struct 
>> drm_i915_private *dev_priv, u32 disable_m
>>   }
>>   static u32
>> -gen11_gt_engine_intr(struct drm_i915_private * const i915,
>> -             const unsigned int bank, const unsigned int bit);
>> +gen11_gt_engine_identity(struct drm_i915_private * const i915,
>> +             const unsigned int bank, const unsigned int bit);
>>   void gen11_reset_rps_interrupts(struct drm_i915_private *dev_priv)
>>   {
>> @@ -428,7 +428,7 @@ void gen11_reset_rps_interrupts(struct 
>> drm_i915_private *dev_priv)
>>        */
>>       dw = I915_READ_FW(GEN11_GT_INTR_DW0);
>>       while (dw & BIT(GEN11_GTPM)) {
>> -        gen11_gt_engine_intr(dev_priv, 0, GEN11_GTPM);
>> +        gen11_gt_engine_identity(dev_priv, 0, GEN11_GTPM);
>>           I915_WRITE_FW(GEN11_GT_INTR_DW0, BIT(GEN11_GTPM));
>>           dw = I915_READ_FW(GEN11_GT_INTR_DW0);
>>       }
>> @@ -2771,50 +2771,9 @@ static void __fini_wedge(struct wedge_me *w)
>>            (W)->i915;                            \
>>            __fini_wedge((W)))
>> -static void
>> -gen11_gt_engine_irq_handler(struct drm_i915_private * const i915,
>> -                const unsigned int bank,
>> -                const unsigned int engine_n,
>> -                const u16 iir)
>> -{
>> -    struct intel_engine_cs ** const engine = i915->engine;
>> -
>> -    switch (bank) {
>> -    case 0:
>> -        switch (engine_n) {
>> -
>> -        case GEN11_RCS0:
>> -            return gen8_cs_irq_handler(engine[RCS], iir);
>> -
>> -        case GEN11_BCS:
>> -            return gen8_cs_irq_handler(engine[BCS], iir);
>> -
>> -        case GEN11_GTPM:
>> -            return gen6_rps_irq_handler(i915, iir);
>> -        }
>> -    case 1:
>> -        switch (engine_n) {
>> -
>> -        case GEN11_VCS(0):
>> -            return gen8_cs_irq_handler(engine[_VCS(0)], iir);
>> -        case GEN11_VCS(1):
>> -            return gen8_cs_irq_handler(engine[_VCS(1)], iir);
>> -        case GEN11_VCS(2):
>> -            return gen8_cs_irq_handler(engine[_VCS(2)], iir);
>> -        case GEN11_VCS(3):
>> -            return gen8_cs_irq_handler(engine[_VCS(3)], iir);
>> -
>> -        case GEN11_VECS(0):
>> -            return gen8_cs_irq_handler(engine[_VECS(0)], iir);
>> -        case GEN11_VECS(1):
>> -            return gen8_cs_irq_handler(engine[_VECS(1)], iir);
>> -        }
>> -    }
>> -}
>> -
>>   static u32
>> -gen11_gt_engine_intr(struct drm_i915_private * const i915,
>> -             const unsigned int bank, const unsigned int bit)
>> +gen11_gt_engine_identity(struct drm_i915_private * const i915,
>> +             const unsigned int bank, const unsigned int bit)
>>   {
>>       void __iomem * const regs = i915->regs;
>>       u32 timeout_ts;
>> @@ -2841,7 +2800,26 @@ gen11_gt_engine_intr(struct drm_i915_private * 
>> const i915,
>>       raw_reg_write(regs, GEN11_INTR_IDENTITY_REG(bank),
>>                 GEN11_INTR_DATA_VALID);
>> -    return ident & GEN11_INTR_ENGINE_MASK;
>> +    return ident;
>> +}
>> +
>> +static void
>> +gen11_gt_identity_handler(struct drm_i915_private * const i915,
>> +              const u32 identity)
>> +{
>> +    const u8 class = GEN11_INTR_ENGINE_CLASS(identity);
>> +    const u8 instance = GEN11_INTR_ENGINE_INSTANCE(identity);
>> +    const u16 iir = GEN11_INTR_ENGINE_MASK(identity);
>> +
>> +    if (unlikely(!iir))
>> +        return;
>> +
>> +    if (class <= MAX_ENGINE_CLASS && instance <= MAX_ENGINE_INSTANCE)
>> +        return gen8_cs_irq_handler(i915->engine_class[class][instance],
>> +                       iir);
>> +
>> +    if (class == GEN11_GTPM)
>> +        return gen6_rps_irq_handler(i915, iir);
> 
> Hi,
> 
> GEN11_GTPM should be
>      [Class ID] == 'OTHER_CLASS (4)', and
>      [Engine Id] == 1.
> (I'm looking at bspec 20944)
> 
> So not only the GPTM check needs to be before the
>    if (class <= MAX_ENGINE_CLASS),
> 
> but it can't use GEN11_GTPM either.
> 
> -Michel
> 

I'm not fully convinced about checking against MAX_ENGINE_CLASS or 
MAX_ENGINE_INSTANCE, since we do have cases that are within those values 
but are still invalid (e.g. VCS1). Maybe we can just do something 
simpler (that should still be safe) like:

	/* OTHER_CLASS is for interrupts not comings from an engine */
	if (class != OTHER_CLASS) {
		engine = i915->engine_class[class][instance];
		if (likely(engine))
			return gen8_cs_irq_handler(...);
	} else {
		if (instance == 1)
			return gen6_rps_irq_handler(...);

		/* more cases incoming (e.g. GuC) */
	}

> 
>>   }
>>   static void
>> @@ -2866,12 +2844,10 @@ gen11_gt_irq_handler(struct drm_i915_private * 
>> const i915,
>>           }
>>           for_each_set_bit(bit, &intr_dw, 32) {
>> -            const u16 iir = gen11_gt_engine_intr(i915, bank, bit);
>> -
>> -            if (unlikely(!iir))
>> -                continue;
>> +            const u32 ident = gen11_gt_engine_identity(i915,
>> +                                   bank, bit);
>> -            gen11_gt_engine_irq_handler(i915, bank, bit, iir);
>> +            gen11_gt_identity_handler(i915, ident);
>>           }
>>           /* Clear must be after shared has been served for engine */
>> diff --git a/drivers/gpu/drm/i915/i915_reg.h 
>> b/drivers/gpu/drm/i915/i915_reg.h
>> index f3cc77690124..74a8f454e8a0 100644
>> --- a/drivers/gpu/drm/i915/i915_reg.h
>> +++ b/drivers/gpu/drm/i915/i915_reg.h
>> @@ -6826,7 +6826,9 @@ enum {
>>   #define GEN11_INTR_IDENTITY_REG0    _MMIO(0x190060)
>>   #define GEN11_INTR_IDENTITY_REG1    _MMIO(0x190064)
>>   #define  GEN11_INTR_DATA_VALID        (1 << 31)
>> -#define  GEN11_INTR_ENGINE_MASK        (0xffff)
>> +#define  GEN11_INTR_ENGINE_MASK(x)    ((x) & 0xffff)
>> +#define  GEN11_INTR_ENGINE_CLASS(x)    (((x) & GENMASK(18, 16)) >> 16)
>> +#define  GEN11_INTR_ENGINE_INSTANCE(x)    (((x) & GENMASK(25, 20)) >> 
>> 20)
>>   #define GEN11_INTR_IDENTITY_REG(x)    _MMIO(0x190060 + (x * 4))
>>
_______________________________________________
Intel-gfx mailing list
Intel-gfx@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/intel-gfx

^ permalink raw reply	[flat|nested] 27+ messages in thread

* Re: [PATCH 5/8] drm/i915/icl: Add reset control register changes
  2018-03-16 12:14 ` [PATCH 5/8] drm/i915/icl: Add reset control register changes Mika Kuoppala
  2018-03-16 12:22   ` Mika Kuoppala
  2018-03-16 12:45   ` Chris Wilson
@ 2018-03-16 20:28   ` Daniele Ceraolo Spurio
  2018-03-16 21:55     ` Chris Wilson
  2018-03-27 16:26     ` Michel Thierry
  2 siblings, 2 replies; 27+ messages in thread
From: Daniele Ceraolo Spurio @ 2018-03-16 20:28 UTC (permalink / raw)
  To: Mika Kuoppala, intel-gfx; +Cc: Paulo Zanoni



On 16/03/18 05:14, Mika Kuoppala wrote:
> From: Michel Thierry <michel.thierry@intel.com>
> 
> The bits used to reset the different engines/domains have changed in
> GEN11, this patch maps the reset engine mask bits with the new bits
> in the reset control register.
> 
> v2: Use shift-left instead of BIT macro to match the file style (Paulo).
> v3: Reuse gen8_reset_engines (Daniele).
> v4: Do not call intel_uncore_forcewake_reset after reset, we may be
> using the forcewake to read protected registers elsewhere and those
> results may be clobbered by the concurrent dropping of forcewake.
> 
> bspec: 19212
> Cc: Oscar Mateo <oscar.mateo@intel.com>
> Cc: Antonio Argenziano <antonio.argenziano@intel.com>
> Cc: Paulo Zanoni <paulo.r.zanoni@intel.com>
> Cc: Daniele Ceraolo Spurio <daniele.ceraolospurio@intel.com>
> Acked-by: Daniele Ceraolo Spurio <daniele.ceraolospurio@intel.com>
> Signed-off-by: Michel Thierry <michel.thierry@intel.com>
> ---
>   drivers/gpu/drm/i915/i915_reg.h     | 11 ++++++++
>   drivers/gpu/drm/i915/intel_uncore.c | 53 +++++++++++++++++++++++++++++++++++--
>   2 files changed, 62 insertions(+), 2 deletions(-)
> 
> diff --git a/drivers/gpu/drm/i915/i915_reg.h b/drivers/gpu/drm/i915/i915_reg.h
> index 9eaaa96287ec..f3cc77690124 100644
> --- a/drivers/gpu/drm/i915/i915_reg.h
> +++ b/drivers/gpu/drm/i915/i915_reg.h
> @@ -301,6 +301,17 @@ static inline bool i915_mmio_reg_valid(i915_reg_t reg)
>   #define  GEN6_GRDOM_VECS		(1 << 4)
>   #define  GEN9_GRDOM_GUC			(1 << 5)
>   #define  GEN8_GRDOM_MEDIA2		(1 << 7)
> +/* GEN11 changed all bit defs except for FULL & RENDER */
> +#define  GEN11_GRDOM_FULL		GEN6_GRDOM_FULL
> +#define  GEN11_GRDOM_RENDER		GEN6_GRDOM_RENDER
> +#define  GEN11_GRDOM_BLT		(1 << 2)
> +#define  GEN11_GRDOM_GUC		(1 << 3)
> +#define  GEN11_GRDOM_MEDIA		(1 << 5)
> +#define  GEN11_GRDOM_MEDIA2		(1 << 6)
> +#define  GEN11_GRDOM_MEDIA3		(1 << 7)
> +#define  GEN11_GRDOM_MEDIA4		(1 << 8)
> +#define  GEN11_GRDOM_VECS		(1 << 13)
> +#define  GEN11_GRDOM_VECS2		(1 << 14)
>   
>   #define RING_PP_DIR_BASE(engine)	_MMIO((engine)->mmio_base+0x228)
>   #define RING_PP_DIR_BASE_READ(engine)	_MMIO((engine)->mmio_base+0x518)
> diff --git a/drivers/gpu/drm/i915/intel_uncore.c b/drivers/gpu/drm/i915/intel_uncore.c
> index 4c616d074a97..cabbf0e682e7 100644
> --- a/drivers/gpu/drm/i915/intel_uncore.c
> +++ b/drivers/gpu/drm/i915/intel_uncore.c
> @@ -1909,6 +1909,50 @@ static int gen6_reset_engines(struct drm_i915_private *dev_priv,
>   	return gen6_hw_domain_reset(dev_priv, hw_mask);
>   }
>   
> +/**
> + * gen11_reset_engines - reset individual engines
> + * @dev_priv: i915 device
> + * @engine_mask: mask of intel_ring_flag() engines or ALL_ENGINES for full reset
> + *
> + * This function will reset the individual engines that are set in engine_mask.
> + * If you provide ALL_ENGINES as mask, full global domain reset will be issued.
> + *
> + * Note: It is responsibility of the caller to handle the difference between
> + * asking full domain reset versus reset for all available individual engines.
> + *
> + * Returns 0 on success, nonzero on error.
> + */
> +static int gen11_reset_engines(struct drm_i915_private *dev_priv,
> +			       unsigned engine_mask)
> +{
> +	struct intel_engine_cs *engine;
> +	const u32 hw_engine_mask[I915_NUM_ENGINES] = {
> +		[RCS] = GEN11_GRDOM_RENDER,
> +		[BCS] = GEN11_GRDOM_BLT,
> +		[VCS] = GEN11_GRDOM_MEDIA,
> +		[VCS2] = GEN11_GRDOM_MEDIA2,
> +		[VCS3] = GEN11_GRDOM_MEDIA3,
> +		[VCS4] = GEN11_GRDOM_MEDIA4,
> +		[VECS] = GEN11_GRDOM_VECS,
> +		[VECS2] = GEN11_GRDOM_VECS2,
> +	};

Just a thought, but since this function is a copy of gen6_reset_engines 
with the only difference being the array (GEN11_GRDOM_FULL is also the 
same as GEN6_GRDOM_FULL), would it make sense to just add the array to 
the gen6 function? e.g.:

	const u32 gen6_hw_engine_mask[] = {
	....
	}
	const u32 gen11_hw_engine_mask[] = {
	....
	}

	const u32 *hw_engine_mask = INTEL_GEN(dev_priv) >= 11 ?
		gen11_hw_engine_mask : gen6_hw_engine_mask;


My Ack still stands regardless and I also agree with renaming the 
defines to be closer to the specs.

Daniele

> +	u32 hw_mask;
> +
> +	BUILD_BUG_ON(VECS2 + 1 != I915_NUM_ENGINES);
> +
> +	if (engine_mask == ALL_ENGINES) {
> +		hw_mask = GEN11_GRDOM_FULL;
> +	} else {
> +		unsigned int tmp;
> +
> +		hw_mask = 0;
> +		for_each_engine_masked(engine, dev_priv, engine_mask, tmp)
> +			hw_mask |= hw_engine_mask[engine->id];
> +	}
> +
> +	return gen6_hw_domain_reset(dev_priv, hw_mask);
> +}
> +
>   /**
>    * __intel_wait_for_register_fw - wait until register matches expected state
>    * @dev_priv: the i915 device
> @@ -2056,7 +2100,10 @@ static int gen8_reset_engines(struct drm_i915_private *dev_priv,
>   		if (gen8_reset_engine_start(engine))
>   			goto not_ready;
>   
> -	return gen6_reset_engines(dev_priv, engine_mask);
> +	if (INTEL_GEN(dev_priv) >= 11)
> +		return gen11_reset_engines(dev_priv, engine_mask);
> +	else
> +		return gen6_reset_engines(dev_priv, engine_mask);
>   
>   not_ready:
>   	for_each_engine_masked(engine, dev_priv, engine_mask, tmp)
> @@ -2141,12 +2188,14 @@ bool intel_has_reset_engine(struct drm_i915_private *dev_priv)
>   
>   int intel_reset_guc(struct drm_i915_private *dev_priv)
>   {
> +	u32 guc_domain = INTEL_GEN(dev_priv) >= 11 ? GEN11_GRDOM_GUC :
> +						     GEN9_GRDOM_GUC;
>   	int ret;
>   
>   	GEM_BUG_ON(!HAS_GUC(dev_priv));
>   
>   	intel_uncore_forcewake_get(dev_priv, FORCEWAKE_ALL);
> -	ret = gen6_hw_domain_reset(dev_priv, GEN9_GRDOM_GUC);
> +	ret = gen6_hw_domain_reset(dev_priv, guc_domain);
>   	intel_uncore_forcewake_put(dev_priv, FORCEWAKE_ALL);
>   
>   	return ret;
> 
_______________________________________________
Intel-gfx mailing list
Intel-gfx@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/intel-gfx

^ permalink raw reply	[flat|nested] 27+ messages in thread

* Re: [PATCH 5/8] drm/i915/icl: Add reset control register changes
  2018-03-16 20:28   ` Daniele Ceraolo Spurio
@ 2018-03-16 21:55     ` Chris Wilson
  2018-03-27 16:26     ` Michel Thierry
  1 sibling, 0 replies; 27+ messages in thread
From: Chris Wilson @ 2018-03-16 21:55 UTC (permalink / raw)
  To: Daniele Ceraolo Spurio, Mika Kuoppala, intel-gfx; +Cc: Paulo Zanoni

Quoting Daniele Ceraolo Spurio (2018-03-16 20:28:25)
> 
> 
> On 16/03/18 05:14, Mika Kuoppala wrote:
> > From: Michel Thierry <michel.thierry@intel.com>
> > 
> > The bits used to reset the different engines/domains have changed in
> > GEN11, this patch maps the reset engine mask bits with the new bits
> > in the reset control register.
> > 
> > v2: Use shift-left instead of BIT macro to match the file style (Paulo).
> > v3: Reuse gen8_reset_engines (Daniele).
> > v4: Do not call intel_uncore_forcewake_reset after reset, we may be
> > using the forcewake to read protected registers elsewhere and those
> > results may be clobbered by the concurrent dropping of forcewake.
> > 
> > bspec: 19212
> > Cc: Oscar Mateo <oscar.mateo@intel.com>
> > Cc: Antonio Argenziano <antonio.argenziano@intel.com>
> > Cc: Paulo Zanoni <paulo.r.zanoni@intel.com>
> > Cc: Daniele Ceraolo Spurio <daniele.ceraolospurio@intel.com>
> > Acked-by: Daniele Ceraolo Spurio <daniele.ceraolospurio@intel.com>
> > Signed-off-by: Michel Thierry <michel.thierry@intel.com>
> > ---
> >   drivers/gpu/drm/i915/i915_reg.h     | 11 ++++++++
> >   drivers/gpu/drm/i915/intel_uncore.c | 53 +++++++++++++++++++++++++++++++++++--
> >   2 files changed, 62 insertions(+), 2 deletions(-)
> > 
> > diff --git a/drivers/gpu/drm/i915/i915_reg.h b/drivers/gpu/drm/i915/i915_reg.h
> > index 9eaaa96287ec..f3cc77690124 100644
> > --- a/drivers/gpu/drm/i915/i915_reg.h
> > +++ b/drivers/gpu/drm/i915/i915_reg.h
> > @@ -301,6 +301,17 @@ static inline bool i915_mmio_reg_valid(i915_reg_t reg)
> >   #define  GEN6_GRDOM_VECS            (1 << 4)
> >   #define  GEN9_GRDOM_GUC                     (1 << 5)
> >   #define  GEN8_GRDOM_MEDIA2          (1 << 7)
> > +/* GEN11 changed all bit defs except for FULL & RENDER */
> > +#define  GEN11_GRDOM_FULL            GEN6_GRDOM_FULL
> > +#define  GEN11_GRDOM_RENDER          GEN6_GRDOM_RENDER
> > +#define  GEN11_GRDOM_BLT             (1 << 2)
> > +#define  GEN11_GRDOM_GUC             (1 << 3)
> > +#define  GEN11_GRDOM_MEDIA           (1 << 5)
> > +#define  GEN11_GRDOM_MEDIA2          (1 << 6)
> > +#define  GEN11_GRDOM_MEDIA3          (1 << 7)
> > +#define  GEN11_GRDOM_MEDIA4          (1 << 8)
> > +#define  GEN11_GRDOM_VECS            (1 << 13)
> > +#define  GEN11_GRDOM_VECS2           (1 << 14)
> >   
> >   #define RING_PP_DIR_BASE(engine)    _MMIO((engine)->mmio_base+0x228)
> >   #define RING_PP_DIR_BASE_READ(engine)       _MMIO((engine)->mmio_base+0x518)
> > diff --git a/drivers/gpu/drm/i915/intel_uncore.c b/drivers/gpu/drm/i915/intel_uncore.c
> > index 4c616d074a97..cabbf0e682e7 100644
> > --- a/drivers/gpu/drm/i915/intel_uncore.c
> > +++ b/drivers/gpu/drm/i915/intel_uncore.c
> > @@ -1909,6 +1909,50 @@ static int gen6_reset_engines(struct drm_i915_private *dev_priv,
> >       return gen6_hw_domain_reset(dev_priv, hw_mask);
> >   }
> >   
> > +/**
> > + * gen11_reset_engines - reset individual engines
> > + * @dev_priv: i915 device
> > + * @engine_mask: mask of intel_ring_flag() engines or ALL_ENGINES for full reset
> > + *
> > + * This function will reset the individual engines that are set in engine_mask.
> > + * If you provide ALL_ENGINES as mask, full global domain reset will be issued.
> > + *
> > + * Note: It is responsibility of the caller to handle the difference between
> > + * asking full domain reset versus reset for all available individual engines.
> > + *
> > + * Returns 0 on success, nonzero on error.
> > + */
> > +static int gen11_reset_engines(struct drm_i915_private *dev_priv,
> > +                            unsigned engine_mask)
> > +{
> > +     struct intel_engine_cs *engine;
> > +     const u32 hw_engine_mask[I915_NUM_ENGINES] = {
> > +             [RCS] = GEN11_GRDOM_RENDER,
> > +             [BCS] = GEN11_GRDOM_BLT,
> > +             [VCS] = GEN11_GRDOM_MEDIA,
> > +             [VCS2] = GEN11_GRDOM_MEDIA2,
> > +             [VCS3] = GEN11_GRDOM_MEDIA3,
> > +             [VCS4] = GEN11_GRDOM_MEDIA4,
> > +             [VECS] = GEN11_GRDOM_VECS,
> > +             [VECS2] = GEN11_GRDOM_VECS2,
> > +     };
> 
> Just a thought, but since this function is a copy of gen6_reset_engines 
> with the only difference being the array (GEN11_GRDOM_FULL is also the 
> same as GEN6_GRDOM_FULL), would it make sense to just add the array to 
> the gen6 function? e.g.:
> 
>         const u32 gen6_hw_engine_mask[] = {
>         ....
>         }
>         const u32 gen11_hw_engine_mask[] = {
>         ....
>         }
> 
>         const u32 *hw_engine_mask = INTEL_GEN(dev_priv) >= 11 ?
>                 gen11_hw_engine_mask : gen6_hw_engine_mask;
> 

Oh, and we are definitely in the territory where static const should
result in a smaller binary (.text + .data).
-Chris
_______________________________________________
Intel-gfx mailing list
Intel-gfx@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/intel-gfx

^ permalink raw reply	[flat|nested] 27+ messages in thread

* Re: [PATCH 8/8] drm/i915/icl: Use hw engine class, instance to find irq handler
  2018-03-16 19:37     ` Daniele Ceraolo Spurio
@ 2018-03-19 15:14       ` Daniele Ceraolo Spurio
  0 siblings, 0 replies; 27+ messages in thread
From: Daniele Ceraolo Spurio @ 2018-03-19 15:14 UTC (permalink / raw)
  To: Michel Thierry, Mika Kuoppala, intel-gfx



On 16/03/18 12:37, Daniele Ceraolo Spurio wrote:
> 
> 
> On 16/03/18 11:28, Michel Thierry wrote:
>> On 3/16/2018 5:14 AM, Mika Kuoppala wrote:
>>> Interrupt identity register we already read from hardware
>>> contains engine class and instance fields. Leverage
>>> these fields to find correct engine to handle the interrupt.
>>>
>>> v3: rebase on top of rps intr
>>>      use correct class / instance limits (Michel)
>>>
>>> Suggested-by: Daniele Ceraolo Spurio <daniele.ceraolospurio@intel.com>
>>> Cc: Daniele Ceraolo Spurio <daniele.ceraolospurio@intel.com>
>>> Cc: Chris Wilson <chris@chris-wilson.co.uk>
>>> Cc: Tvrtko Ursulin <tvrtko.ursulin@intel.com>
>>> Cc: Michel Thierry <michel.thierry@intel.com>
>>> Signed-off-by: Mika Kuoppala <mika.kuoppala@linux.intel.com>
>>> ---
>>>   drivers/gpu/drm/i915/i915_irq.c | 80 
>>> +++++++++++++++--------------------------
>>>   drivers/gpu/drm/i915/i915_reg.h |  4 ++-
>>>   2 files changed, 31 insertions(+), 53 deletions(-)
>>>
>>> diff --git a/drivers/gpu/drm/i915/i915_irq.c 
>>> b/drivers/gpu/drm/i915/i915_irq.c
>>> index 8c4510ffe625..dd2fb2d0457f 100644
>>> --- a/drivers/gpu/drm/i915/i915_irq.c
>>> +++ b/drivers/gpu/drm/i915/i915_irq.c
>>> @@ -413,8 +413,8 @@ static void gen6_disable_pm_irq(struct 
>>> drm_i915_private *dev_priv, u32 disable_m
>>>   }
>>>   static u32
>>> -gen11_gt_engine_intr(struct drm_i915_private * const i915,
>>> -             const unsigned int bank, const unsigned int bit);
>>> +gen11_gt_engine_identity(struct drm_i915_private * const i915,
>>> +             const unsigned int bank, const unsigned int bit);
>>>   void gen11_reset_rps_interrupts(struct drm_i915_private *dev_priv)
>>>   {
>>> @@ -428,7 +428,7 @@ void gen11_reset_rps_interrupts(struct 
>>> drm_i915_private *dev_priv)
>>>        */
>>>       dw = I915_READ_FW(GEN11_GT_INTR_DW0);
>>>       while (dw & BIT(GEN11_GTPM)) {
>>> -        gen11_gt_engine_intr(dev_priv, 0, GEN11_GTPM);
>>> +        gen11_gt_engine_identity(dev_priv, 0, GEN11_GTPM);
>>>           I915_WRITE_FW(GEN11_GT_INTR_DW0, BIT(GEN11_GTPM));
>>>           dw = I915_READ_FW(GEN11_GT_INTR_DW0);
>>>       }
>>> @@ -2771,50 +2771,9 @@ static void __fini_wedge(struct wedge_me *w)
>>>            (W)->i915;                            \
>>>            __fini_wedge((W)))
>>> -static void
>>> -gen11_gt_engine_irq_handler(struct drm_i915_private * const i915,
>>> -                const unsigned int bank,
>>> -                const unsigned int engine_n,
>>> -                const u16 iir)
>>> -{
>>> -    struct intel_engine_cs ** const engine = i915->engine;
>>> -
>>> -    switch (bank) {
>>> -    case 0:
>>> -        switch (engine_n) {
>>> -
>>> -        case GEN11_RCS0:
>>> -            return gen8_cs_irq_handler(engine[RCS], iir);
>>> -
>>> -        case GEN11_BCS:
>>> -            return gen8_cs_irq_handler(engine[BCS], iir);
>>> -
>>> -        case GEN11_GTPM:
>>> -            return gen6_rps_irq_handler(i915, iir);
>>> -        }
>>> -    case 1:
>>> -        switch (engine_n) {
>>> -
>>> -        case GEN11_VCS(0):
>>> -            return gen8_cs_irq_handler(engine[_VCS(0)], iir);
>>> -        case GEN11_VCS(1):
>>> -            return gen8_cs_irq_handler(engine[_VCS(1)], iir);
>>> -        case GEN11_VCS(2):
>>> -            return gen8_cs_irq_handler(engine[_VCS(2)], iir);
>>> -        case GEN11_VCS(3):
>>> -            return gen8_cs_irq_handler(engine[_VCS(3)], iir);
>>> -
>>> -        case GEN11_VECS(0):
>>> -            return gen8_cs_irq_handler(engine[_VECS(0)], iir);
>>> -        case GEN11_VECS(1):
>>> -            return gen8_cs_irq_handler(engine[_VECS(1)], iir);
>>> -        }
>>> -    }
>>> -}
>>> -
>>>   static u32
>>> -gen11_gt_engine_intr(struct drm_i915_private * const i915,
>>> -             const unsigned int bank, const unsigned int bit)
>>> +gen11_gt_engine_identity(struct drm_i915_private * const i915,
>>> +             const unsigned int bank, const unsigned int bit)
>>>   {
>>>       void __iomem * const regs = i915->regs;
>>>       u32 timeout_ts;
>>> @@ -2841,7 +2800,26 @@ gen11_gt_engine_intr(struct drm_i915_private * 
>>> const i915,
>>>       raw_reg_write(regs, GEN11_INTR_IDENTITY_REG(bank),
>>>                 GEN11_INTR_DATA_VALID);
>>> -    return ident & GEN11_INTR_ENGINE_MASK;
>>> +    return ident;
>>> +}
>>> +
>>> +static void
>>> +gen11_gt_identity_handler(struct drm_i915_private * const i915,
>>> +              const u32 identity)
>>> +{
>>> +    const u8 class = GEN11_INTR_ENGINE_CLASS(identity);
>>> +    const u8 instance = GEN11_INTR_ENGINE_INSTANCE(identity);
>>> +    const u16 iir = GEN11_INTR_ENGINE_MASK(identity);
>>> +
>>> +    if (unlikely(!iir))
>>> +        return;
>>> +
>>> +    if (class <= MAX_ENGINE_CLASS && instance <= MAX_ENGINE_INSTANCE)
>>> +        return gen8_cs_irq_handler(i915->engine_class[class][instance],
>>> +                       iir);
>>> +
>>> +    if (class == GEN11_GTPM)
>>> +        return gen6_rps_irq_handler(i915, iir);
>>
>> Hi,
>>
>> GEN11_GTPM should be
>>      [Class ID] == 'OTHER_CLASS (4)', and
>>      [Engine Id] == 1.
>> (I'm looking at bspec 20944)
>>
>> So not only the GPTM check needs to be before the
>>    if (class <= MAX_ENGINE_CLASS),
>>
>> but it can't use GEN11_GTPM either.
>>
>> -Michel
>>
> 
> I'm not fully convinced about checking against MAX_ENGINE_CLASS or 
> MAX_ENGINE_INSTANCE, since we do have cases that are within those values 
> but are still invalid (e.g. VCS1). Maybe we can just do something 
> simpler (that should still be safe) like:
>

Thinking about this again you were right, we do need a check for 
MAX_ENGINE_CLASS and MAX_ENGINE_INSTANCE to avoid overflowing the 
engine_class array. However, while the MAX_ENGINE_CLASS check applies to 
all cases, the MAX_ENGINE_INSTANCE one only applies for class != 
OTHER_CLASS, so we may need to split them accordingly.

Daniele
  >      /* OTHER_CLASS is for interrupts not comings from an engine */
>      if (class != OTHER_CLASS) {
>          engine = i915->engine_class[class][instance];
>          if (likely(engine))
>              return gen8_cs_irq_handler(...);
>      } else {
>          if (instance == 1)
>              return gen6_rps_irq_handler(...);
> 
>          /* more cases incoming (e.g. GuC) */
>      }
> 
>>
>>>   }
>>>   static void
>>> @@ -2866,12 +2844,10 @@ gen11_gt_irq_handler(struct drm_i915_private 
>>> * const i915,
>>>           }
>>>           for_each_set_bit(bit, &intr_dw, 32) {
>>> -            const u16 iir = gen11_gt_engine_intr(i915, bank, bit);
>>> -
>>> -            if (unlikely(!iir))
>>> -                continue;
>>> +            const u32 ident = gen11_gt_engine_identity(i915,
>>> +                                   bank, bit);
>>> -            gen11_gt_engine_irq_handler(i915, bank, bit, iir);
>>> +            gen11_gt_identity_handler(i915, ident);
>>>           }
>>>           /* Clear must be after shared has been served for engine */
>>> diff --git a/drivers/gpu/drm/i915/i915_reg.h 
>>> b/drivers/gpu/drm/i915/i915_reg.h
>>> index f3cc77690124..74a8f454e8a0 100644
>>> --- a/drivers/gpu/drm/i915/i915_reg.h
>>> +++ b/drivers/gpu/drm/i915/i915_reg.h
>>> @@ -6826,7 +6826,9 @@ enum {
>>>   #define GEN11_INTR_IDENTITY_REG0    _MMIO(0x190060)
>>>   #define GEN11_INTR_IDENTITY_REG1    _MMIO(0x190064)
>>>   #define  GEN11_INTR_DATA_VALID        (1 << 31)
>>> -#define  GEN11_INTR_ENGINE_MASK        (0xffff)
>>> +#define  GEN11_INTR_ENGINE_MASK(x)    ((x) & 0xffff)
>>> +#define  GEN11_INTR_ENGINE_CLASS(x)    (((x) & GENMASK(18, 16)) >> 16)
>>> +#define  GEN11_INTR_ENGINE_INSTANCE(x)    (((x) & GENMASK(25, 20)) 
>>> >> 20)
>>>   #define GEN11_INTR_IDENTITY_REG(x)    _MMIO(0x190060 + (x * 4))
>>>
> _______________________________________________
> Intel-gfx mailing list
> Intel-gfx@lists.freedesktop.org
> https://lists.freedesktop.org/mailman/listinfo/intel-gfx
_______________________________________________
Intel-gfx mailing list
Intel-gfx@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/intel-gfx

^ permalink raw reply	[flat|nested] 27+ messages in thread

* Re: [PATCH 1/8] drm/i915/icl: Check for fused-off VDBOX and VEBOX instances
  2018-03-16 12:14 [PATCH 1/8] drm/i915/icl: Check for fused-off VDBOX and VEBOX instances Mika Kuoppala
                   ` (8 preceding siblings ...)
  2018-03-16 17:01 ` ✓ Fi.CI.IGT: " Patchwork
@ 2018-03-19 15:26 ` Sagar Arun Kamble
  2018-10-18  9:47   ` Tvrtko Ursulin
  2018-03-23 16:28 ` Lionel Landwerlin
  10 siblings, 1 reply; 27+ messages in thread
From: Sagar Arun Kamble @ 2018-03-19 15:26 UTC (permalink / raw)
  To: Mika Kuoppala, intel-gfx; +Cc: Paulo Zanoni, Rodrigo Vivi



On 3/16/2018 5:44 PM, Mika Kuoppala wrote:
> From: Oscar Mateo <oscar.mateo@intel.com>
>
> In Gen11, the Video Decode engines (aka VDBOX, aka VCS, aka BSD) and the
> Video Enhancement engines (aka VEBOX, aka VECS) could be fused off. Also,
> each VDBOX and VEBOX has its own power well, which only exist if the related
> engine exists in the HW.
>
> Unfortunately, we have a Catch-22 situation going on: we need the blitter
> forcewake to read the register with the fuse info, but we cannot initialize
> the forcewake domains without knowin about the engines present in the HW.
> We workaround this problem by allowing the initialization of all forcewake
> domains and then pruning the fused off ones, as per the fuse information.
>
> Bspec: 20680
>
> v2: We were shifting incorrectly for vebox disable (Vinay)
>
> v3: Assert mmio is ready and warn if we have attempted to initialize
>      forcewake for fused-off engines (Paulo)
>
> v4:
>    - Use INTEL_GEN in new code (Tvrtko)
>    - Shorter local variable (Tvrtko, Michal)
>    - Keep "if (!...) continue" style (Tvrtko)
>    - No unnecessary BUG_ON (Tvrtko)
>    - WARN_ON and cleanup if wrong mask (Tvrtko, Michal)
>    - Use I915_READ_FW (Michal)
>    - Use I915_MAX_VCS/VECS macros (Michal)
>
> v5: Rebased by Rodrigo fixing conflicts on top of:
>      commit 33def1ff7b0 ("drm/i915: Simplify intel_engines_init")
>
> v6: Fix v5. Remove info->num_rings. (by Oscar)
>
> v7: Rebase (Rodrigo).
>
> v8:
>    - s/intel_device_info_fused_off_engines/intel_device_info_init_mmio (Chris)
>    - Make vdbox_disable & vebox_disable local variables (Chris)
>
> v9:
>    - Move function declaration to intel_device_info.h (Michal)
>    - Missing indent in bit fields definitions (Michal)
>    - When RC6 is enabled by BIOS, the fuse register cannot be read until
>      the blitter powerwell is awake. Shuffle where the fuse is read, prune
>      the forcewake domains after the fact and change the commit message
>      accordingly (Vinay, Sagar, Chris).
>
> v10:
>    - Improved commit message (Sagar)
>    - New line in header file (Sagar)
>    - Specify the message in fw_domain_reset applies to ICL+ (Sagar)
>
> Cc: Paulo Zanoni <paulo.r.zanoni@intel.com>
> Cc: Vinay Belgaumkar <vinay.belgaumkar@intel.com>
> Cc: Tvrtko Ursulin <tvrtko.ursulin@intel.com>
> Cc: Michal Wajdeczko <michal.wajdeczko@intel.com>
> Cc: Chris Wilson <chris@chris-wilson.co.uk>
> Cc: Daniele Ceraolo Spurio <daniele.ceraolospurio@intel.com>
> Cc: Sagar Arun Kamble <sagar.a.kamble@intel.com>
> Signed-off-by: Rodrigo Vivi <rodrigo.vivi@intel.com>
> Signed-off-by: Oscar Mateo <oscar.mateo@intel.com>
Reviewed-by: Sagar Arun Kamble <sagar.a.kamble@intel.com>
> ---
>   drivers/gpu/drm/i915/i915_drv.c          |  4 +++
>   drivers/gpu/drm/i915/i915_reg.h          |  5 +++
>   drivers/gpu/drm/i915/intel_device_info.c | 47 +++++++++++++++++++++++++++
>   drivers/gpu/drm/i915/intel_device_info.h |  2 ++
>   drivers/gpu/drm/i915/intel_uncore.c      | 56 ++++++++++++++++++++++++++++++++
>   drivers/gpu/drm/i915/intel_uncore.h      |  1 +
>   6 files changed, 115 insertions(+)
>
> diff --git a/drivers/gpu/drm/i915/i915_drv.c b/drivers/gpu/drm/i915/i915_drv.c
> index 3df5193487f3..83df8e21cec0 100644
> --- a/drivers/gpu/drm/i915/i915_drv.c
> +++ b/drivers/gpu/drm/i915/i915_drv.c
> @@ -1033,6 +1033,10 @@ static int i915_driver_init_mmio(struct drm_i915_private *dev_priv)
>   
>   	intel_uncore_init(dev_priv);
>   
> +	intel_device_info_init_mmio(dev_priv);
> +
> +	intel_uncore_prune(dev_priv);
> +
>   	intel_uc_init_mmio(dev_priv);
>   
>   	ret = intel_engines_init_mmio(dev_priv);
> diff --git a/drivers/gpu/drm/i915/i915_reg.h b/drivers/gpu/drm/i915/i915_reg.h
> index cf7c837d6a09..982e72e73e99 100644
> --- a/drivers/gpu/drm/i915/i915_reg.h
> +++ b/drivers/gpu/drm/i915/i915_reg.h
> @@ -2545,6 +2545,11 @@ enum i915_power_well_id {
>   #define GEN10_EU_DISABLE3		_MMIO(0x9140)
>   #define   GEN10_EU_DIS_SS_MASK		0xff
>   
> +#define GEN11_GT_VEBOX_VDBOX_DISABLE	_MMIO(0x9140)
> +#define   GEN11_GT_VDBOX_DISABLE_MASK	0xff
> +#define   GEN11_GT_VEBOX_DISABLE_SHIFT	16
> +#define   GEN11_GT_VEBOX_DISABLE_MASK	(0xff << GEN11_GT_VEBOX_DISABLE_SHIFT)
> +
>   #define GEN6_BSD_SLEEP_PSMI_CONTROL	_MMIO(0x12050)
>   #define   GEN6_BSD_SLEEP_MSG_DISABLE	(1 << 0)
>   #define   GEN6_BSD_SLEEP_FLUSH_DISABLE	(1 << 2)
> diff --git a/drivers/gpu/drm/i915/intel_device_info.c b/drivers/gpu/drm/i915/intel_device_info.c
> index 3dd350f7b8e6..4babfc6ee45b 100644
> --- a/drivers/gpu/drm/i915/intel_device_info.c
> +++ b/drivers/gpu/drm/i915/intel_device_info.c
> @@ -780,3 +780,50 @@ void intel_driver_caps_print(const struct intel_driver_caps *caps,
>   {
>   	drm_printf(p, "scheduler: %x\n", caps->scheduler);
>   }
> +
> +/*
> + * Determine which engines are fused off in our particular hardware. Since the
> + * fuse register is in the blitter powerwell, we need forcewake to be ready at
> + * this point (but later we need to prune the forcewake domains for engines that
> + * are indeed fused off).
> + */
> +void intel_device_info_init_mmio(struct drm_i915_private *dev_priv)
> +{
> +	struct intel_device_info *info = mkwrite_device_info(dev_priv);
> +	u8 vdbox_disable, vebox_disable;
> +	u32 media_fuse;
> +	int i;
> +
> +	if (INTEL_GEN(dev_priv) < 11)
> +		return;
> +
> +	media_fuse = I915_READ(GEN11_GT_VEBOX_VDBOX_DISABLE);
> +
> +	vdbox_disable = media_fuse & GEN11_GT_VDBOX_DISABLE_MASK;
> +	vebox_disable = (media_fuse & GEN11_GT_VEBOX_DISABLE_MASK) >>
> +			GEN11_GT_VEBOX_DISABLE_SHIFT;
> +
> +	DRM_DEBUG_DRIVER("vdbox disable: %04x\n", vdbox_disable);
> +	for (i = 0; i < I915_MAX_VCS; i++) {
> +		if (!HAS_ENGINE(dev_priv, _VCS(i)))
> +			continue;
> +
> +		if (!(BIT(i) & vdbox_disable))
> +			continue;
> +
> +		info->ring_mask &= ~ENGINE_MASK(_VCS(i));
> +		DRM_DEBUG_DRIVER("vcs%u fused off\n", i);
> +	}
> +
> +	DRM_DEBUG_DRIVER("vebox disable: %04x\n", vebox_disable);
> +	for (i = 0; i < I915_MAX_VECS; i++) {
> +		if (!HAS_ENGINE(dev_priv, _VECS(i)))
> +			continue;
> +
> +		if (!(BIT(i) & vebox_disable))
> +			continue;
> +
> +		info->ring_mask &= ~ENGINE_MASK(_VECS(i));
> +		DRM_DEBUG_DRIVER("vecs%u fused off\n", i);
> +	}
> +}
> diff --git a/drivers/gpu/drm/i915/intel_device_info.h b/drivers/gpu/drm/i915/intel_device_info.h
> index 0835752c8b22..0cbb92223013 100644
> --- a/drivers/gpu/drm/i915/intel_device_info.h
> +++ b/drivers/gpu/drm/i915/intel_device_info.h
> @@ -247,6 +247,8 @@ void intel_device_info_dump_runtime(const struct intel_device_info *info,
>   void intel_device_info_dump_topology(const struct sseu_dev_info *sseu,
>   				     struct drm_printer *p);
>   
> +void intel_device_info_init_mmio(struct drm_i915_private *dev_priv);
> +
>   void intel_driver_caps_print(const struct intel_driver_caps *caps,
>   			     struct drm_printer *p);
>   
> diff --git a/drivers/gpu/drm/i915/intel_uncore.c b/drivers/gpu/drm/i915/intel_uncore.c
> index 4df7c2ef8576..4c616d074a97 100644
> --- a/drivers/gpu/drm/i915/intel_uncore.c
> +++ b/drivers/gpu/drm/i915/intel_uncore.c
> @@ -62,6 +62,11 @@ static inline void
>   fw_domain_reset(struct drm_i915_private *i915,
>   		const struct intel_uncore_forcewake_domain *d)
>   {
> +	/*
> +	 * We don't really know if the powerwell for the forcewake domain we are
> +	 * trying to reset here does exist at this point (engines could be fused
> +	 * off in ICL+), so no waiting for acks
> +	 */
>   	__raw_i915_write32(i915, d->reg_set, i915->uncore.fw_reset);
>   }
>   
> @@ -1353,6 +1358,23 @@ static void fw_domain_init(struct drm_i915_private *dev_priv,
>   	fw_domain_reset(dev_priv, d);
>   }
>   
> +static void fw_domain_fini(struct drm_i915_private *dev_priv,
> +			   enum forcewake_domain_id domain_id)
> +{
> +	struct intel_uncore_forcewake_domain *d;
> +
> +	if (WARN_ON(domain_id >= FW_DOMAIN_ID_COUNT))
> +		return;
> +
> +	d = &dev_priv->uncore.fw_domain[domain_id];
> +
> +	WARN_ON(d->wake_count);
> +	WARN_ON(hrtimer_cancel(&d->timer));
> +	memset(d, 0, sizeof(*d));
> +
> +	dev_priv->uncore.fw_domains &= ~BIT(domain_id);
> +}
> +
>   static void intel_uncore_fw_domains_init(struct drm_i915_private *dev_priv)
>   {
>   	if (INTEL_GEN(dev_priv) <= 5 || intel_vgpu_active(dev_priv))
> @@ -1565,6 +1587,40 @@ void intel_uncore_init(struct drm_i915_private *dev_priv)
>   		&dev_priv->uncore.pmic_bus_access_nb);
>   }
>   
> +/*
> + * We might have detected that some engines are fused off after we initialized
> + * the forcewake domains. Prune them, to make sure they only reference existing
> + * engines.
> + */
> +void intel_uncore_prune(struct drm_i915_private *dev_priv)
> +{
> +	if (INTEL_GEN(dev_priv) >= 11) {
> +		enum forcewake_domains fw_domains = dev_priv->uncore.fw_domains;
> +		enum forcewake_domain_id domain_id;
> +		int i;
> +
> +		for (i = 0; i < I915_MAX_VCS; i++) {
> +			domain_id = FW_DOMAIN_ID_MEDIA_VDBOX0 + i;
> +
> +			if (HAS_ENGINE(dev_priv, _VCS(i)))
> +				continue;
> +
> +			if (fw_domains & BIT(domain_id))
> +				fw_domain_fini(dev_priv, domain_id);
> +		}
> +
> +		for (i = 0; i < I915_MAX_VECS; i++) {
> +			domain_id = FW_DOMAIN_ID_MEDIA_VEBOX0 + i;
> +
> +			if (HAS_ENGINE(dev_priv, _VECS(i)))
> +				continue;
> +
> +			if (fw_domains & BIT(domain_id))
> +				fw_domain_fini(dev_priv, domain_id);
> +		}
> +	}
> +}
> +
>   void intel_uncore_fini(struct drm_i915_private *dev_priv)
>   {
>   	/* Paranoia: make sure we have disabled everything before we exit. */
> diff --git a/drivers/gpu/drm/i915/intel_uncore.h b/drivers/gpu/drm/i915/intel_uncore.h
> index dfdf444e4bcc..47478d609630 100644
> --- a/drivers/gpu/drm/i915/intel_uncore.h
> +++ b/drivers/gpu/drm/i915/intel_uncore.h
> @@ -140,6 +140,7 @@ struct intel_uncore {
>   
>   void intel_uncore_sanitize(struct drm_i915_private *dev_priv);
>   void intel_uncore_init(struct drm_i915_private *dev_priv);
> +void intel_uncore_prune(struct drm_i915_private *dev_priv);
>   bool intel_uncore_unclaimed_mmio(struct drm_i915_private *dev_priv);
>   bool intel_uncore_arm_unclaimed_mmio_detection(struct drm_i915_private *dev_priv);
>   void intel_uncore_fini(struct drm_i915_private *dev_priv);

-- 
Thanks,
Sagar

_______________________________________________
Intel-gfx mailing list
Intel-gfx@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/intel-gfx

^ permalink raw reply	[flat|nested] 27+ messages in thread

* Re: [PATCH 3/8] drm/i915/icl: Update subslice define for ICL 11
  2018-03-16 12:14 ` [PATCH 3/8] drm/i915/icl: Update subslice define for ICL 11 Mika Kuoppala
@ 2018-03-20 14:34   ` Mika Kuoppala
  0 siblings, 0 replies; 27+ messages in thread
From: Mika Kuoppala @ 2018-03-20 14:34 UTC (permalink / raw)
  To: intel-gfx

Mika Kuoppala <mika.kuoppala@linux.intel.com> writes:

> From: Kelvin Gardiner <kelvin.gardiner@intel.com>
>
> ICL 11 has a greater number of maximum subslices. This patch
> reflects this.
>
> v2: GEN11 updates to MCR_SELECTOR (Oscar)
> v3: Copypasta error in the new defines (Lionel)
>
> Bspec: 21139
> BSpec: 21108
>
> Signed-off-by: Kelvin Gardiner <kelvin.gardiner@intel.com>
> Reviewed-by: Oscar Mateo <oscar.mateo@intel.com> (v1)
> Reviewed-by: Daniele Ceraolo Spurio <daniele.ceraolospurio@intel.com> (v1)
> Signed-off-by: Oscar Mateo <oscar.mateo@intel.com>
> Reviewed-by: Lionel Landwerlin <lionel.g.landwerlin@intel.com>

Pushed up-to this one.
Thanks for patches and review.
-Mika

> ---
>  drivers/gpu/drm/i915/i915_reg.h         |  4 ++++
>  drivers/gpu/drm/i915/intel_engine_cs.c  | 22 ++++++++++++++++++----
>  drivers/gpu/drm/i915/intel_ringbuffer.h |  2 +-
>  3 files changed, 23 insertions(+), 5 deletions(-)
>
> diff --git a/drivers/gpu/drm/i915/i915_reg.h b/drivers/gpu/drm/i915/i915_reg.h
> index 982e72e73e99..e29ff9dd967e 100644
> --- a/drivers/gpu/drm/i915/i915_reg.h
> +++ b/drivers/gpu/drm/i915/i915_reg.h
> @@ -2151,6 +2151,10 @@ enum i915_power_well_id {
>  #define   GEN8_MCR_SLICE_MASK		GEN8_MCR_SLICE(3)
>  #define   GEN8_MCR_SUBSLICE(subslice)	(((subslice) & 3) << 24)
>  #define   GEN8_MCR_SUBSLICE_MASK	GEN8_MCR_SUBSLICE(3)
> +#define   GEN11_MCR_SLICE(slice)	(((slice) & 0xf) << 27)
> +#define   GEN11_MCR_SLICE_MASK		GEN11_MCR_SLICE(0xf)
> +#define   GEN11_MCR_SUBSLICE(subslice)	(((subslice) & 0x7) << 24)
> +#define   GEN11_MCR_SUBSLICE_MASK	GEN11_MCR_SUBSLICE(0x7)
>  #define RING_IPEIR(base)	_MMIO((base)+0x64)
>  #define RING_IPEHR(base)	_MMIO((base)+0x68)
>  /*
> diff --git a/drivers/gpu/drm/i915/intel_engine_cs.c b/drivers/gpu/drm/i915/intel_engine_cs.c
> index 337dfa56a738..de09fa42a509 100644
> --- a/drivers/gpu/drm/i915/intel_engine_cs.c
> +++ b/drivers/gpu/drm/i915/intel_engine_cs.c
> @@ -800,10 +800,24 @@ static inline uint32_t
>  read_subslice_reg(struct drm_i915_private *dev_priv, int slice,
>  		  int subslice, i915_reg_t reg)
>  {
> +	uint32_t mcr_slice_subslice_mask;
> +	uint32_t mcr_slice_subslice_select;
>  	uint32_t mcr;
>  	uint32_t ret;
>  	enum forcewake_domains fw_domains;
>  
> +	if (INTEL_GEN(dev_priv) >= 11) {
> +		mcr_slice_subslice_mask = GEN11_MCR_SLICE_MASK |
> +					  GEN11_MCR_SUBSLICE_MASK;
> +		mcr_slice_subslice_select = GEN11_MCR_SLICE(slice) |
> +					    GEN11_MCR_SUBSLICE(subslice);
> +	} else {
> +		mcr_slice_subslice_mask = GEN8_MCR_SLICE_MASK |
> +					  GEN8_MCR_SUBSLICE_MASK;
> +		mcr_slice_subslice_select = GEN8_MCR_SLICE(slice) |
> +					    GEN8_MCR_SUBSLICE(subslice);
> +	}
> +
>  	fw_domains = intel_uncore_forcewake_for_reg(dev_priv, reg,
>  						    FW_REG_READ);
>  	fw_domains |= intel_uncore_forcewake_for_reg(dev_priv,
> @@ -818,14 +832,14 @@ read_subslice_reg(struct drm_i915_private *dev_priv, int slice,
>  	 * The HW expects the slice and sublice selectors to be reset to 0
>  	 * after reading out the registers.
>  	 */
> -	WARN_ON_ONCE(mcr & (GEN8_MCR_SLICE_MASK | GEN8_MCR_SUBSLICE_MASK));
> -	mcr &= ~(GEN8_MCR_SLICE_MASK | GEN8_MCR_SUBSLICE_MASK);
> -	mcr |= GEN8_MCR_SLICE(slice) | GEN8_MCR_SUBSLICE(subslice);
> +	WARN_ON_ONCE(mcr & mcr_slice_subslice_mask);
> +	mcr &= ~mcr_slice_subslice_mask;
> +	mcr |= mcr_slice_subslice_select;
>  	I915_WRITE_FW(GEN8_MCR_SELECTOR, mcr);
>  
>  	ret = I915_READ_FW(reg);
>  
> -	mcr &= ~(GEN8_MCR_SLICE_MASK | GEN8_MCR_SUBSLICE_MASK);
> +	mcr &= ~mcr_slice_subslice_mask;
>  	I915_WRITE_FW(GEN8_MCR_SELECTOR, mcr);
>  
>  	intel_uncore_forcewake_put__locked(dev_priv, fw_domains);
> diff --git a/drivers/gpu/drm/i915/intel_ringbuffer.h b/drivers/gpu/drm/i915/intel_ringbuffer.h
> index 1f50727a5ddb..a02c7b3b9d55 100644
> --- a/drivers/gpu/drm/i915/intel_ringbuffer.h
> +++ b/drivers/gpu/drm/i915/intel_ringbuffer.h
> @@ -86,7 +86,7 @@ hangcheck_action_to_str(const enum intel_engine_hangcheck_action a)
>  }
>  
>  #define I915_MAX_SLICES	3
> -#define I915_MAX_SUBSLICES 3
> +#define I915_MAX_SUBSLICES 8
>  
>  #define instdone_slice_mask(dev_priv__) \
>  	(INTEL_GEN(dev_priv__) == 7 ? \
> -- 
> 2.14.1
>
> _______________________________________________
> Intel-gfx mailing list
> Intel-gfx@lists.freedesktop.org
> https://lists.freedesktop.org/mailman/listinfo/intel-gfx
_______________________________________________
Intel-gfx mailing list
Intel-gfx@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/intel-gfx

^ permalink raw reply	[flat|nested] 27+ messages in thread

* Re: [PATCH 1/8] drm/i915/icl: Check for fused-off VDBOX and VEBOX instances
  2018-03-16 12:14 [PATCH 1/8] drm/i915/icl: Check for fused-off VDBOX and VEBOX instances Mika Kuoppala
                   ` (9 preceding siblings ...)
  2018-03-19 15:26 ` [PATCH 1/8] drm/i915/icl: Check for fused-off VDBOX and VEBOX instances Sagar Arun Kamble
@ 2018-03-23 16:28 ` Lionel Landwerlin
  2018-03-27 22:42   ` Paulo Zanoni
  10 siblings, 1 reply; 27+ messages in thread
From: Lionel Landwerlin @ 2018-03-23 16:28 UTC (permalink / raw)
  To: Mika Kuoppala, intel-gfx; +Cc: Paulo Zanoni, Rodrigo Vivi

Hi Mika,

Even after this series, we're still missing support for reading the 
timestamp frequency (read_timestamp_frequency in intel_device_info.c).
I'm pretty sure someone wrote a patch for it. Do you any idea?

If not, I can send something.

Thanks,

-
Lionel

On 16/03/18 12:14, Mika Kuoppala wrote:
> From: Oscar Mateo <oscar.mateo@intel.com>
>
> In Gen11, the Video Decode engines (aka VDBOX, aka VCS, aka BSD) and the
> Video Enhancement engines (aka VEBOX, aka VECS) could be fused off. Also,
> each VDBOX and VEBOX has its own power well, which only exist if the related
> engine exists in the HW.
>
> Unfortunately, we have a Catch-22 situation going on: we need the blitter
> forcewake to read the register with the fuse info, but we cannot initialize
> the forcewake domains without knowin about the engines present in the HW.
> We workaround this problem by allowing the initialization of all forcewake
> domains and then pruning the fused off ones, as per the fuse information.
>
> Bspec: 20680
>
> v2: We were shifting incorrectly for vebox disable (Vinay)
>
> v3: Assert mmio is ready and warn if we have attempted to initialize
>      forcewake for fused-off engines (Paulo)
>
> v4:
>    - Use INTEL_GEN in new code (Tvrtko)
>    - Shorter local variable (Tvrtko, Michal)
>    - Keep "if (!...) continue" style (Tvrtko)
>    - No unnecessary BUG_ON (Tvrtko)
>    - WARN_ON and cleanup if wrong mask (Tvrtko, Michal)
>    - Use I915_READ_FW (Michal)
>    - Use I915_MAX_VCS/VECS macros (Michal)
>
> v5: Rebased by Rodrigo fixing conflicts on top of:
>      commit 33def1ff7b0 ("drm/i915: Simplify intel_engines_init")
>
> v6: Fix v5. Remove info->num_rings. (by Oscar)
>
> v7: Rebase (Rodrigo).
>
> v8:
>    - s/intel_device_info_fused_off_engines/intel_device_info_init_mmio (Chris)
>    - Make vdbox_disable & vebox_disable local variables (Chris)
>
> v9:
>    - Move function declaration to intel_device_info.h (Michal)
>    - Missing indent in bit fields definitions (Michal)
>    - When RC6 is enabled by BIOS, the fuse register cannot be read until
>      the blitter powerwell is awake. Shuffle where the fuse is read, prune
>      the forcewake domains after the fact and change the commit message
>      accordingly (Vinay, Sagar, Chris).
>
> v10:
>    - Improved commit message (Sagar)
>    - New line in header file (Sagar)
>    - Specify the message in fw_domain_reset applies to ICL+ (Sagar)
>
> Cc: Paulo Zanoni <paulo.r.zanoni@intel.com>
> Cc: Vinay Belgaumkar <vinay.belgaumkar@intel.com>
> Cc: Tvrtko Ursulin <tvrtko.ursulin@intel.com>
> Cc: Michal Wajdeczko <michal.wajdeczko@intel.com>
> Cc: Chris Wilson <chris@chris-wilson.co.uk>
> Cc: Daniele Ceraolo Spurio <daniele.ceraolospurio@intel.com>
> Cc: Sagar Arun Kamble <sagar.a.kamble@intel.com>
> Signed-off-by: Rodrigo Vivi <rodrigo.vivi@intel.com>
> Signed-off-by: Oscar Mateo <oscar.mateo@intel.com>
> ---
>   drivers/gpu/drm/i915/i915_drv.c          |  4 +++
>   drivers/gpu/drm/i915/i915_reg.h          |  5 +++
>   drivers/gpu/drm/i915/intel_device_info.c | 47 +++++++++++++++++++++++++++
>   drivers/gpu/drm/i915/intel_device_info.h |  2 ++
>   drivers/gpu/drm/i915/intel_uncore.c      | 56 ++++++++++++++++++++++++++++++++
>   drivers/gpu/drm/i915/intel_uncore.h      |  1 +
>   6 files changed, 115 insertions(+)
>
> diff --git a/drivers/gpu/drm/i915/i915_drv.c b/drivers/gpu/drm/i915/i915_drv.c
> index 3df5193487f3..83df8e21cec0 100644
> --- a/drivers/gpu/drm/i915/i915_drv.c
> +++ b/drivers/gpu/drm/i915/i915_drv.c
> @@ -1033,6 +1033,10 @@ static int i915_driver_init_mmio(struct drm_i915_private *dev_priv)
>   
>   	intel_uncore_init(dev_priv);
>   
> +	intel_device_info_init_mmio(dev_priv);
> +
> +	intel_uncore_prune(dev_priv);
> +
>   	intel_uc_init_mmio(dev_priv);
>   
>   	ret = intel_engines_init_mmio(dev_priv);
> diff --git a/drivers/gpu/drm/i915/i915_reg.h b/drivers/gpu/drm/i915/i915_reg.h
> index cf7c837d6a09..982e72e73e99 100644
> --- a/drivers/gpu/drm/i915/i915_reg.h
> +++ b/drivers/gpu/drm/i915/i915_reg.h
> @@ -2545,6 +2545,11 @@ enum i915_power_well_id {
>   #define GEN10_EU_DISABLE3		_MMIO(0x9140)
>   #define   GEN10_EU_DIS_SS_MASK		0xff
>   
> +#define GEN11_GT_VEBOX_VDBOX_DISABLE	_MMIO(0x9140)
> +#define   GEN11_GT_VDBOX_DISABLE_MASK	0xff
> +#define   GEN11_GT_VEBOX_DISABLE_SHIFT	16
> +#define   GEN11_GT_VEBOX_DISABLE_MASK	(0xff << GEN11_GT_VEBOX_DISABLE_SHIFT)
> +
>   #define GEN6_BSD_SLEEP_PSMI_CONTROL	_MMIO(0x12050)
>   #define   GEN6_BSD_SLEEP_MSG_DISABLE	(1 << 0)
>   #define   GEN6_BSD_SLEEP_FLUSH_DISABLE	(1 << 2)
> diff --git a/drivers/gpu/drm/i915/intel_device_info.c b/drivers/gpu/drm/i915/intel_device_info.c
> index 3dd350f7b8e6..4babfc6ee45b 100644
> --- a/drivers/gpu/drm/i915/intel_device_info.c
> +++ b/drivers/gpu/drm/i915/intel_device_info.c
> @@ -780,3 +780,50 @@ void intel_driver_caps_print(const struct intel_driver_caps *caps,
>   {
>   	drm_printf(p, "scheduler: %x\n", caps->scheduler);
>   }
> +
> +/*
> + * Determine which engines are fused off in our particular hardware. Since the
> + * fuse register is in the blitter powerwell, we need forcewake to be ready at
> + * this point (but later we need to prune the forcewake domains for engines that
> + * are indeed fused off).
> + */
> +void intel_device_info_init_mmio(struct drm_i915_private *dev_priv)
> +{
> +	struct intel_device_info *info = mkwrite_device_info(dev_priv);
> +	u8 vdbox_disable, vebox_disable;
> +	u32 media_fuse;
> +	int i;
> +
> +	if (INTEL_GEN(dev_priv) < 11)
> +		return;
> +
> +	media_fuse = I915_READ(GEN11_GT_VEBOX_VDBOX_DISABLE);
> +
> +	vdbox_disable = media_fuse & GEN11_GT_VDBOX_DISABLE_MASK;
> +	vebox_disable = (media_fuse & GEN11_GT_VEBOX_DISABLE_MASK) >>
> +			GEN11_GT_VEBOX_DISABLE_SHIFT;
> +
> +	DRM_DEBUG_DRIVER("vdbox disable: %04x\n", vdbox_disable);
> +	for (i = 0; i < I915_MAX_VCS; i++) {
> +		if (!HAS_ENGINE(dev_priv, _VCS(i)))
> +			continue;
> +
> +		if (!(BIT(i) & vdbox_disable))
> +			continue;
> +
> +		info->ring_mask &= ~ENGINE_MASK(_VCS(i));
> +		DRM_DEBUG_DRIVER("vcs%u fused off\n", i);
> +	}
> +
> +	DRM_DEBUG_DRIVER("vebox disable: %04x\n", vebox_disable);
> +	for (i = 0; i < I915_MAX_VECS; i++) {
> +		if (!HAS_ENGINE(dev_priv, _VECS(i)))
> +			continue;
> +
> +		if (!(BIT(i) & vebox_disable))
> +			continue;
> +
> +		info->ring_mask &= ~ENGINE_MASK(_VECS(i));
> +		DRM_DEBUG_DRIVER("vecs%u fused off\n", i);
> +	}
> +}
> diff --git a/drivers/gpu/drm/i915/intel_device_info.h b/drivers/gpu/drm/i915/intel_device_info.h
> index 0835752c8b22..0cbb92223013 100644
> --- a/drivers/gpu/drm/i915/intel_device_info.h
> +++ b/drivers/gpu/drm/i915/intel_device_info.h
> @@ -247,6 +247,8 @@ void intel_device_info_dump_runtime(const struct intel_device_info *info,
>   void intel_device_info_dump_topology(const struct sseu_dev_info *sseu,
>   				     struct drm_printer *p);
>   
> +void intel_device_info_init_mmio(struct drm_i915_private *dev_priv);
> +
>   void intel_driver_caps_print(const struct intel_driver_caps *caps,
>   			     struct drm_printer *p);
>   
> diff --git a/drivers/gpu/drm/i915/intel_uncore.c b/drivers/gpu/drm/i915/intel_uncore.c
> index 4df7c2ef8576..4c616d074a97 100644
> --- a/drivers/gpu/drm/i915/intel_uncore.c
> +++ b/drivers/gpu/drm/i915/intel_uncore.c
> @@ -62,6 +62,11 @@ static inline void
>   fw_domain_reset(struct drm_i915_private *i915,
>   		const struct intel_uncore_forcewake_domain *d)
>   {
> +	/*
> +	 * We don't really know if the powerwell for the forcewake domain we are
> +	 * trying to reset here does exist at this point (engines could be fused
> +	 * off in ICL+), so no waiting for acks
> +	 */
>   	__raw_i915_write32(i915, d->reg_set, i915->uncore.fw_reset);
>   }
>   
> @@ -1353,6 +1358,23 @@ static void fw_domain_init(struct drm_i915_private *dev_priv,
>   	fw_domain_reset(dev_priv, d);
>   }
>   
> +static void fw_domain_fini(struct drm_i915_private *dev_priv,
> +			   enum forcewake_domain_id domain_id)
> +{
> +	struct intel_uncore_forcewake_domain *d;
> +
> +	if (WARN_ON(domain_id >= FW_DOMAIN_ID_COUNT))
> +		return;
> +
> +	d = &dev_priv->uncore.fw_domain[domain_id];
> +
> +	WARN_ON(d->wake_count);
> +	WARN_ON(hrtimer_cancel(&d->timer));
> +	memset(d, 0, sizeof(*d));
> +
> +	dev_priv->uncore.fw_domains &= ~BIT(domain_id);
> +}
> +
>   static void intel_uncore_fw_domains_init(struct drm_i915_private *dev_priv)
>   {
>   	if (INTEL_GEN(dev_priv) <= 5 || intel_vgpu_active(dev_priv))
> @@ -1565,6 +1587,40 @@ void intel_uncore_init(struct drm_i915_private *dev_priv)
>   		&dev_priv->uncore.pmic_bus_access_nb);
>   }
>   
> +/*
> + * We might have detected that some engines are fused off after we initialized
> + * the forcewake domains. Prune them, to make sure they only reference existing
> + * engines.
> + */
> +void intel_uncore_prune(struct drm_i915_private *dev_priv)
> +{
> +	if (INTEL_GEN(dev_priv) >= 11) {
> +		enum forcewake_domains fw_domains = dev_priv->uncore.fw_domains;
> +		enum forcewake_domain_id domain_id;
> +		int i;
> +
> +		for (i = 0; i < I915_MAX_VCS; i++) {
> +			domain_id = FW_DOMAIN_ID_MEDIA_VDBOX0 + i;
> +
> +			if (HAS_ENGINE(dev_priv, _VCS(i)))
> +				continue;
> +
> +			if (fw_domains & BIT(domain_id))
> +				fw_domain_fini(dev_priv, domain_id);
> +		}
> +
> +		for (i = 0; i < I915_MAX_VECS; i++) {
> +			domain_id = FW_DOMAIN_ID_MEDIA_VEBOX0 + i;
> +
> +			if (HAS_ENGINE(dev_priv, _VECS(i)))
> +				continue;
> +
> +			if (fw_domains & BIT(domain_id))
> +				fw_domain_fini(dev_priv, domain_id);
> +		}
> +	}
> +}
> +
>   void intel_uncore_fini(struct drm_i915_private *dev_priv)
>   {
>   	/* Paranoia: make sure we have disabled everything before we exit. */
> diff --git a/drivers/gpu/drm/i915/intel_uncore.h b/drivers/gpu/drm/i915/intel_uncore.h
> index dfdf444e4bcc..47478d609630 100644
> --- a/drivers/gpu/drm/i915/intel_uncore.h
> +++ b/drivers/gpu/drm/i915/intel_uncore.h
> @@ -140,6 +140,7 @@ struct intel_uncore {
>   
>   void intel_uncore_sanitize(struct drm_i915_private *dev_priv);
>   void intel_uncore_init(struct drm_i915_private *dev_priv);
> +void intel_uncore_prune(struct drm_i915_private *dev_priv);
>   bool intel_uncore_unclaimed_mmio(struct drm_i915_private *dev_priv);
>   bool intel_uncore_arm_unclaimed_mmio_detection(struct drm_i915_private *dev_priv);
>   void intel_uncore_fini(struct drm_i915_private *dev_priv);


_______________________________________________
Intel-gfx mailing list
Intel-gfx@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/intel-gfx

^ permalink raw reply	[flat|nested] 27+ messages in thread

* Re: [PATCH 5/8] drm/i915/icl: Add reset control register changes
  2018-03-16 20:28   ` Daniele Ceraolo Spurio
  2018-03-16 21:55     ` Chris Wilson
@ 2018-03-27 16:26     ` Michel Thierry
  1 sibling, 0 replies; 27+ messages in thread
From: Michel Thierry @ 2018-03-27 16:26 UTC (permalink / raw)
  To: Daniele Ceraolo Spurio, Mika Kuoppala, intel-gfx; +Cc: Paulo Zanoni

On 3/16/2018 1:28 PM, Daniele Ceraolo Spurio wrote:
> 
> 
> On 16/03/18 05:14, Mika Kuoppala wrote:
>> From: Michel Thierry <michel.thierry@intel.com>
>>
>> The bits used to reset the different engines/domains have changed in
>> GEN11, this patch maps the reset engine mask bits with the new bits
>> in the reset control register.
>>
>> v2: Use shift-left instead of BIT macro to match the file style (Paulo).
>> v3: Reuse gen8_reset_engines (Daniele).
>> v4: Do not call intel_uncore_forcewake_reset after reset, we may be
>> using the forcewake to read protected registers elsewhere and those
>> results may be clobbered by the concurrent dropping of forcewake.
>>
>> bspec: 19212
>> Cc: Oscar Mateo <oscar.mateo@intel.com>
>> Cc: Antonio Argenziano <antonio.argenziano@intel.com>
>> Cc: Paulo Zanoni <paulo.r.zanoni@intel.com>
>> Cc: Daniele Ceraolo Spurio <daniele.ceraolospurio@intel.com>
>> Acked-by: Daniele Ceraolo Spurio <daniele.ceraolospurio@intel.com>
>> Signed-off-by: Michel Thierry <michel.thierry@intel.com>
>> ---
>>   drivers/gpu/drm/i915/i915_reg.h     | 11 ++++++++
>>   drivers/gpu/drm/i915/intel_uncore.c | 53 
>> +++++++++++++++++++++++++++++++++++--
>>   2 files changed, 62 insertions(+), 2 deletions(-)
>>
>> diff --git a/drivers/gpu/drm/i915/i915_reg.h 
>> b/drivers/gpu/drm/i915/i915_reg.h
>> index 9eaaa96287ec..f3cc77690124 100644
>> --- a/drivers/gpu/drm/i915/i915_reg.h
>> +++ b/drivers/gpu/drm/i915/i915_reg.h
>> @@ -301,6 +301,17 @@ static inline bool i915_mmio_reg_valid(i915_reg_t 
>> reg)
>>   #define  GEN6_GRDOM_VECS        (1 << 4)
>>   #define  GEN9_GRDOM_GUC            (1 << 5)
>>   #define  GEN8_GRDOM_MEDIA2        (1 << 7)
>> +/* GEN11 changed all bit defs except for FULL & RENDER */
>> +#define  GEN11_GRDOM_FULL        GEN6_GRDOM_FULL
>> +#define  GEN11_GRDOM_RENDER        GEN6_GRDOM_RENDER
>> +#define  GEN11_GRDOM_BLT        (1 << 2)
>> +#define  GEN11_GRDOM_GUC        (1 << 3)
>> +#define  GEN11_GRDOM_MEDIA        (1 << 5)
>> +#define  GEN11_GRDOM_MEDIA2        (1 << 6)
>> +#define  GEN11_GRDOM_MEDIA3        (1 << 7)
>> +#define  GEN11_GRDOM_MEDIA4        (1 << 8)
>> +#define  GEN11_GRDOM_VECS        (1 << 13)
>> +#define  GEN11_GRDOM_VECS2        (1 << 14)
>>   #define RING_PP_DIR_BASE(engine)    _MMIO((engine)->mmio_base+0x228)
>>   #define RING_PP_DIR_BASE_READ(engine)    
>> _MMIO((engine)->mmio_base+0x518)
>> diff --git a/drivers/gpu/drm/i915/intel_uncore.c 
>> b/drivers/gpu/drm/i915/intel_uncore.c
>> index 4c616d074a97..cabbf0e682e7 100644
>> --- a/drivers/gpu/drm/i915/intel_uncore.c
>> +++ b/drivers/gpu/drm/i915/intel_uncore.c
>> @@ -1909,6 +1909,50 @@ static int gen6_reset_engines(struct 
>> drm_i915_private *dev_priv,
>>       return gen6_hw_domain_reset(dev_priv, hw_mask);
>>   }
>> +/**
>> + * gen11_reset_engines - reset individual engines
>> + * @dev_priv: i915 device
>> + * @engine_mask: mask of intel_ring_flag() engines or ALL_ENGINES for 
>> full reset
>> + *
>> + * This function will reset the individual engines that are set in 
>> engine_mask.
>> + * If you provide ALL_ENGINES as mask, full global domain reset will 
>> be issued.
>> + *
>> + * Note: It is responsibility of the caller to handle the difference 
>> between
>> + * asking full domain reset versus reset for all available individual 
>> engines.
>> + *
>> + * Returns 0 on success, nonzero on error.
>> + */
>> +static int gen11_reset_engines(struct drm_i915_private *dev_priv,
>> +                   unsigned engine_mask)
>> +{
>> +    struct intel_engine_cs *engine;
>> +    const u32 hw_engine_mask[I915_NUM_ENGINES] = {
>> +        [RCS] = GEN11_GRDOM_RENDER,
>> +        [BCS] = GEN11_GRDOM_BLT,
>> +        [VCS] = GEN11_GRDOM_MEDIA,
>> +        [VCS2] = GEN11_GRDOM_MEDIA2,
>> +        [VCS3] = GEN11_GRDOM_MEDIA3,
>> +        [VCS4] = GEN11_GRDOM_MEDIA4,
>> +        [VECS] = GEN11_GRDOM_VECS,
>> +        [VECS2] = GEN11_GRDOM_VECS2,
>> +    };
> 
> Just a thought, but since this function is a copy of gen6_reset_engines 
> with the only difference being the array (GEN11_GRDOM_FULL is also the 
> same as GEN6_GRDOM_FULL), would it make sense to just add the array to 
> the gen6 function? e.g.:

There are more changes for gen11 coming (locking/unlocking the shared 
SFC units), so I don't think it's a good idea to combine them.

> 
>      const u32 gen6_hw_engine_mask[] = {
>      ....
>      }
>      const u32 gen11_hw_engine_mask[] = {
>      ....
>      }
> 
>      const u32 *hw_engine_mask = INTEL_GEN(dev_priv) >= 11 ?
>          gen11_hw_engine_mask : gen6_hw_engine_mask;
> 
> 
> My Ack still stands regardless and I also agree with renaming the 
> defines to be closer to the specs.
> 
> Daniele
> 
>> +    u32 hw_mask;
>> +
>> +    BUILD_BUG_ON(VECS2 + 1 != I915_NUM_ENGINES);
>> +
>> +    if (engine_mask == ALL_ENGINES) {
>> +        hw_mask = GEN11_GRDOM_FULL;
>> +    } else {
>> +        unsigned int tmp;
>> +
>> +        hw_mask = 0;
>> +        for_each_engine_masked(engine, dev_priv, engine_mask, tmp)
>> +            hw_mask |= hw_engine_mask[engine->id];
>> +    }
>> +
>> +    return gen6_hw_domain_reset(dev_priv, hw_mask);
>> +}
>> +
>>   /**
>>    * __intel_wait_for_register_fw - wait until register matches 
>> expected state
>>    * @dev_priv: the i915 device
>> @@ -2056,7 +2100,10 @@ static int gen8_reset_engines(struct 
>> drm_i915_private *dev_priv,
>>           if (gen8_reset_engine_start(engine))
>>               goto not_ready;
>> -    return gen6_reset_engines(dev_priv, engine_mask);
>> +    if (INTEL_GEN(dev_priv) >= 11)
>> +        return gen11_reset_engines(dev_priv, engine_mask);
>> +    else
>> +        return gen6_reset_engines(dev_priv, engine_mask);
>>   not_ready:
>>       for_each_engine_masked(engine, dev_priv, engine_mask, tmp)
>> @@ -2141,12 +2188,14 @@ bool intel_has_reset_engine(struct 
>> drm_i915_private *dev_priv)
>>   int intel_reset_guc(struct drm_i915_private *dev_priv)
>>   {
>> +    u32 guc_domain = INTEL_GEN(dev_priv) >= 11 ? GEN11_GRDOM_GUC :
>> +                             GEN9_GRDOM_GUC;
>>       int ret;
>>       GEM_BUG_ON(!HAS_GUC(dev_priv));
>>       intel_uncore_forcewake_get(dev_priv, FORCEWAKE_ALL);
>> -    ret = gen6_hw_domain_reset(dev_priv, GEN9_GRDOM_GUC);
>> +    ret = gen6_hw_domain_reset(dev_priv, guc_domain);
>>       intel_uncore_forcewake_put(dev_priv, FORCEWAKE_ALL);
>>       return ret;
>>
_______________________________________________
Intel-gfx mailing list
Intel-gfx@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/intel-gfx

^ permalink raw reply	[flat|nested] 27+ messages in thread

* Re: [PATCH 1/8] drm/i915/icl: Check for fused-off VDBOX and VEBOX instances
  2018-03-23 16:28 ` Lionel Landwerlin
@ 2018-03-27 22:42   ` Paulo Zanoni
  2018-03-27 23:39     ` Paulo Zanoni
  0 siblings, 1 reply; 27+ messages in thread
From: Paulo Zanoni @ 2018-03-27 22:42 UTC (permalink / raw)
  To: Lionel Landwerlin, Mika Kuoppala, intel-gfx; +Cc: Rodrigo Vivi

Em Sex, 2018-03-23 às 16:28 +0000, Lionel Landwerlin escreveu:
> Hi Mika,
> 
> Even after this series, we're still missing support for reading the 
> timestamp frequency (read_timestamp_frequency in
> intel_device_info.c).
> I'm pretty sure someone wrote a patch for it. Do you any idea?
> 
> If not, I can send something.

Yes, we have them. I'll see if I missed them while upstreaming and
resend in that case.

> 
> Thanks,
> 
> -
> Lionel
> 
> On 16/03/18 12:14, Mika Kuoppala wrote:
> > From: Oscar Mateo <oscar.mateo@intel.com>
> > 
> > In Gen11, the Video Decode engines (aka VDBOX, aka VCS, aka BSD)
> > and the
> > Video Enhancement engines (aka VEBOX, aka VECS) could be fused off.
> > Also,
> > each VDBOX and VEBOX has its own power well, which only exist if
> > the related
> > engine exists in the HW.
> > 
> > Unfortunately, we have a Catch-22 situation going on: we need the
> > blitter
> > forcewake to read the register with the fuse info, but we cannot
> > initialize
> > the forcewake domains without knowin about the engines present in
> > the HW.
> > We workaround this problem by allowing the initialization of all
> > forcewake
> > domains and then pruning the fused off ones, as per the fuse
> > information.
> > 
> > Bspec: 20680
> > 
> > v2: We were shifting incorrectly for vebox disable (Vinay)
> > 
> > v3: Assert mmio is ready and warn if we have attempted to
> > initialize
> >      forcewake for fused-off engines (Paulo)
> > 
> > v4:
> >    - Use INTEL_GEN in new code (Tvrtko)
> >    - Shorter local variable (Tvrtko, Michal)
> >    - Keep "if (!...) continue" style (Tvrtko)
> >    - No unnecessary BUG_ON (Tvrtko)
> >    - WARN_ON and cleanup if wrong mask (Tvrtko, Michal)
> >    - Use I915_READ_FW (Michal)
> >    - Use I915_MAX_VCS/VECS macros (Michal)
> > 
> > v5: Rebased by Rodrigo fixing conflicts on top of:
> >      commit 33def1ff7b0 ("drm/i915: Simplify intel_engines_init")
> > 
> > v6: Fix v5. Remove info->num_rings. (by Oscar)
> > 
> > v7: Rebase (Rodrigo).
> > 
> > v8:
> >    -
> > s/intel_device_info_fused_off_engines/intel_device_info_init_mmio
> > (Chris)
> >    - Make vdbox_disable & vebox_disable local variables (Chris)
> > 
> > v9:
> >    - Move function declaration to intel_device_info.h (Michal)
> >    - Missing indent in bit fields definitions (Michal)
> >    - When RC6 is enabled by BIOS, the fuse register cannot be read
> > until
> >      the blitter powerwell is awake. Shuffle where the fuse is
> > read, prune
> >      the forcewake domains after the fact and change the commit
> > message
> >      accordingly (Vinay, Sagar, Chris).
> > 
> > v10:
> >    - Improved commit message (Sagar)
> >    - New line in header file (Sagar)
> >    - Specify the message in fw_domain_reset applies to ICL+ (Sagar)
> > 
> > Cc: Paulo Zanoni <paulo.r.zanoni@intel.com>
> > Cc: Vinay Belgaumkar <vinay.belgaumkar@intel.com>
> > Cc: Tvrtko Ursulin <tvrtko.ursulin@intel.com>
> > Cc: Michal Wajdeczko <michal.wajdeczko@intel.com>
> > Cc: Chris Wilson <chris@chris-wilson.co.uk>
> > Cc: Daniele Ceraolo Spurio <daniele.ceraolospurio@intel.com>
> > Cc: Sagar Arun Kamble <sagar.a.kamble@intel.com>
> > Signed-off-by: Rodrigo Vivi <rodrigo.vivi@intel.com>
> > Signed-off-by: Oscar Mateo <oscar.mateo@intel.com>
> > ---
> >   drivers/gpu/drm/i915/i915_drv.c          |  4 +++
> >   drivers/gpu/drm/i915/i915_reg.h          |  5 +++
> >   drivers/gpu/drm/i915/intel_device_info.c | 47
> > +++++++++++++++++++++++++++
> >   drivers/gpu/drm/i915/intel_device_info.h |  2 ++
> >   drivers/gpu/drm/i915/intel_uncore.c      | 56
> > ++++++++++++++++++++++++++++++++
> >   drivers/gpu/drm/i915/intel_uncore.h      |  1 +
> >   6 files changed, 115 insertions(+)
> > 
> > diff --git a/drivers/gpu/drm/i915/i915_drv.c
> > b/drivers/gpu/drm/i915/i915_drv.c
> > index 3df5193487f3..83df8e21cec0 100644
> > --- a/drivers/gpu/drm/i915/i915_drv.c
> > +++ b/drivers/gpu/drm/i915/i915_drv.c
> > @@ -1033,6 +1033,10 @@ static int i915_driver_init_mmio(struct
> > drm_i915_private *dev_priv)
> >   
> >   	intel_uncore_init(dev_priv);
> >   
> > +	intel_device_info_init_mmio(dev_priv);
> > +
> > +	intel_uncore_prune(dev_priv);
> > +
> >   	intel_uc_init_mmio(dev_priv);
> >   
> >   	ret = intel_engines_init_mmio(dev_priv);
> > diff --git a/drivers/gpu/drm/i915/i915_reg.h
> > b/drivers/gpu/drm/i915/i915_reg.h
> > index cf7c837d6a09..982e72e73e99 100644
> > --- a/drivers/gpu/drm/i915/i915_reg.h
> > +++ b/drivers/gpu/drm/i915/i915_reg.h
> > @@ -2545,6 +2545,11 @@ enum i915_power_well_id {
> >   #define GEN10_EU_DISABLE3		_MMIO(0x9140)
> >   #define   GEN10_EU_DIS_SS_MASK		0xff
> >   
> > +#define GEN11_GT_VEBOX_VDBOX_DISABLE	_MMIO(0x9140)
> > +#define   GEN11_GT_VDBOX_DISABLE_MASK	0xff
> > +#define   GEN11_GT_VEBOX_DISABLE_SHIFT	16
> > +#define   GEN11_GT_VEBOX_DISABLE_MASK	(0xff <<
> > GEN11_GT_VEBOX_DISABLE_SHIFT)
> > +
> >   #define GEN6_BSD_SLEEP_PSMI_CONTROL	_MMIO(0x12050)
> >   #define   GEN6_BSD_SLEEP_MSG_DISABLE	(1 << 0)
> >   #define   GEN6_BSD_SLEEP_FLUSH_DISABLE	(1 << 2)
> > diff --git a/drivers/gpu/drm/i915/intel_device_info.c
> > b/drivers/gpu/drm/i915/intel_device_info.c
> > index 3dd350f7b8e6..4babfc6ee45b 100644
> > --- a/drivers/gpu/drm/i915/intel_device_info.c
> > +++ b/drivers/gpu/drm/i915/intel_device_info.c
> > @@ -780,3 +780,50 @@ void intel_driver_caps_print(const struct
> > intel_driver_caps *caps,
> >   {
> >   	drm_printf(p, "scheduler: %x\n", caps->scheduler);
> >   }
> > +
> > +/*
> > + * Determine which engines are fused off in our particular
> > hardware. Since the
> > + * fuse register is in the blitter powerwell, we need forcewake to
> > be ready at
> > + * this point (but later we need to prune the forcewake domains
> > for engines that
> > + * are indeed fused off).
> > + */
> > +void intel_device_info_init_mmio(struct drm_i915_private
> > *dev_priv)
> > +{
> > +	struct intel_device_info *info =
> > mkwrite_device_info(dev_priv);
> > +	u8 vdbox_disable, vebox_disable;
> > +	u32 media_fuse;
> > +	int i;
> > +
> > +	if (INTEL_GEN(dev_priv) < 11)
> > +		return;
> > +
> > +	media_fuse = I915_READ(GEN11_GT_VEBOX_VDBOX_DISABLE);
> > +
> > +	vdbox_disable = media_fuse & GEN11_GT_VDBOX_DISABLE_MASK;
> > +	vebox_disable = (media_fuse & GEN11_GT_VEBOX_DISABLE_MASK)
> > >>
> > +			GEN11_GT_VEBOX_DISABLE_SHIFT;
> > +
> > +	DRM_DEBUG_DRIVER("vdbox disable: %04x\n", vdbox_disable);
> > +	for (i = 0; i < I915_MAX_VCS; i++) {
> > +		if (!HAS_ENGINE(dev_priv, _VCS(i)))
> > +			continue;
> > +
> > +		if (!(BIT(i) & vdbox_disable))
> > +			continue;
> > +
> > +		info->ring_mask &= ~ENGINE_MASK(_VCS(i));
> > +		DRM_DEBUG_DRIVER("vcs%u fused off\n", i);
> > +	}
> > +
> > +	DRM_DEBUG_DRIVER("vebox disable: %04x\n", vebox_disable);
> > +	for (i = 0; i < I915_MAX_VECS; i++) {
> > +		if (!HAS_ENGINE(dev_priv, _VECS(i)))
> > +			continue;
> > +
> > +		if (!(BIT(i) & vebox_disable))
> > +			continue;
> > +
> > +		info->ring_mask &= ~ENGINE_MASK(_VECS(i));
> > +		DRM_DEBUG_DRIVER("vecs%u fused off\n", i);
> > +	}
> > +}
> > diff --git a/drivers/gpu/drm/i915/intel_device_info.h
> > b/drivers/gpu/drm/i915/intel_device_info.h
> > index 0835752c8b22..0cbb92223013 100644
> > --- a/drivers/gpu/drm/i915/intel_device_info.h
> > +++ b/drivers/gpu/drm/i915/intel_device_info.h
> > @@ -247,6 +247,8 @@ void intel_device_info_dump_runtime(const
> > struct intel_device_info *info,
> >   void intel_device_info_dump_topology(const struct sseu_dev_info
> > *sseu,
> >   				     struct drm_printer *p);
> >   
> > +void intel_device_info_init_mmio(struct drm_i915_private
> > *dev_priv);
> > +
> >   void intel_driver_caps_print(const struct intel_driver_caps
> > *caps,
> >   			     struct drm_printer *p);
> >   
> > diff --git a/drivers/gpu/drm/i915/intel_uncore.c
> > b/drivers/gpu/drm/i915/intel_uncore.c
> > index 4df7c2ef8576..4c616d074a97 100644
> > --- a/drivers/gpu/drm/i915/intel_uncore.c
> > +++ b/drivers/gpu/drm/i915/intel_uncore.c
> > @@ -62,6 +62,11 @@ static inline void
> >   fw_domain_reset(struct drm_i915_private *i915,
> >   		const struct intel_uncore_forcewake_domain *d)
> >   {
> > +	/*
> > +	 * We don't really know if the powerwell for the forcewake
> > domain we are
> > +	 * trying to reset here does exist at this point (engines
> > could be fused
> > +	 * off in ICL+), so no waiting for acks
> > +	 */
> >   	__raw_i915_write32(i915, d->reg_set, i915-
> > >uncore.fw_reset);
> >   }
> >   
> > @@ -1353,6 +1358,23 @@ static void fw_domain_init(struct
> > drm_i915_private *dev_priv,
> >   	fw_domain_reset(dev_priv, d);
> >   }
> >   
> > +static void fw_domain_fini(struct drm_i915_private *dev_priv,
> > +			   enum forcewake_domain_id domain_id)
> > +{
> > +	struct intel_uncore_forcewake_domain *d;
> > +
> > +	if (WARN_ON(domain_id >= FW_DOMAIN_ID_COUNT))
> > +		return;
> > +
> > +	d = &dev_priv->uncore.fw_domain[domain_id];
> > +
> > +	WARN_ON(d->wake_count);
> > +	WARN_ON(hrtimer_cancel(&d->timer));
> > +	memset(d, 0, sizeof(*d));
> > +
> > +	dev_priv->uncore.fw_domains &= ~BIT(domain_id);
> > +}
> > +
> >   static void intel_uncore_fw_domains_init(struct drm_i915_private
> > *dev_priv)
> >   {
> >   	if (INTEL_GEN(dev_priv) <= 5 ||
> > intel_vgpu_active(dev_priv))
> > @@ -1565,6 +1587,40 @@ void intel_uncore_init(struct
> > drm_i915_private *dev_priv)
> >   		&dev_priv->uncore.pmic_bus_access_nb);
> >   }
> >   
> > +/*
> > + * We might have detected that some engines are fused off after we
> > initialized
> > + * the forcewake domains. Prune them, to make sure they only
> > reference existing
> > + * engines.
> > + */
> > +void intel_uncore_prune(struct drm_i915_private *dev_priv)
> > +{
> > +	if (INTEL_GEN(dev_priv) >= 11) {
> > +		enum forcewake_domains fw_domains = dev_priv-
> > >uncore.fw_domains;
> > +		enum forcewake_domain_id domain_id;
> > +		int i;
> > +
> > +		for (i = 0; i < I915_MAX_VCS; i++) {
> > +			domain_id = FW_DOMAIN_ID_MEDIA_VDBOX0 + i;
> > +
> > +			if (HAS_ENGINE(dev_priv, _VCS(i)))
> > +				continue;
> > +
> > +			if (fw_domains & BIT(domain_id))
> > +				fw_domain_fini(dev_priv,
> > domain_id);
> > +		}
> > +
> > +		for (i = 0; i < I915_MAX_VECS; i++) {
> > +			domain_id = FW_DOMAIN_ID_MEDIA_VEBOX0 + i;
> > +
> > +			if (HAS_ENGINE(dev_priv, _VECS(i)))
> > +				continue;
> > +
> > +			if (fw_domains & BIT(domain_id))
> > +				fw_domain_fini(dev_priv,
> > domain_id);
> > +		}
> > +	}
> > +}
> > +
> >   void intel_uncore_fini(struct drm_i915_private *dev_priv)
> >   {
> >   	/* Paranoia: make sure we have disabled everything before
> > we exit. */
> > diff --git a/drivers/gpu/drm/i915/intel_uncore.h
> > b/drivers/gpu/drm/i915/intel_uncore.h
> > index dfdf444e4bcc..47478d609630 100644
> > --- a/drivers/gpu/drm/i915/intel_uncore.h
> > +++ b/drivers/gpu/drm/i915/intel_uncore.h
> > @@ -140,6 +140,7 @@ struct intel_uncore {
> >   
> >   void intel_uncore_sanitize(struct drm_i915_private *dev_priv);
> >   void intel_uncore_init(struct drm_i915_private *dev_priv);
> > +void intel_uncore_prune(struct drm_i915_private *dev_priv);
> >   bool intel_uncore_unclaimed_mmio(struct drm_i915_private
> > *dev_priv);
> >   bool intel_uncore_arm_unclaimed_mmio_detection(struct
> > drm_i915_private *dev_priv);
> >   void intel_uncore_fini(struct drm_i915_private *dev_priv);
> 
> 
_______________________________________________
Intel-gfx mailing list
Intel-gfx@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/intel-gfx

^ permalink raw reply	[flat|nested] 27+ messages in thread

* Re: [PATCH 1/8] drm/i915/icl: Check for fused-off VDBOX and VEBOX instances
  2018-03-27 22:42   ` Paulo Zanoni
@ 2018-03-27 23:39     ` Paulo Zanoni
  2018-03-28 11:36       ` Lionel Landwerlin
  0 siblings, 1 reply; 27+ messages in thread
From: Paulo Zanoni @ 2018-03-27 23:39 UTC (permalink / raw)
  To: Lionel Landwerlin, Mika Kuoppala, intel-gfx; +Cc: Rodrigo Vivi

Em Ter, 2018-03-27 às 15:42 -0700, Paulo Zanoni escreveu:
> Em Sex, 2018-03-23 às 16:28 +0000, Lionel Landwerlin escreveu:
> > Hi Mika,
> > 
> > Even after this series, we're still missing support for reading
> > the 
> > timestamp frequency (read_timestamp_frequency in
> > intel_device_info.c).
> > I'm pretty sure someone wrote a patch for it. Do you any idea?
> > 
> > If not, I can send something.
> 
> Yes, we have them. I'll see if I missed them while upstreaming and
> resend in that case.

https://patchwork.freedesktop.org/patch/196710/

Hey Lionel, the Reviewed-by stamp you gave on the patch was before we
upstreamed it, so we need you (or someone else) to re-check the patch
and re-issue the reviewed-by tag. We do this because of the rebasing
that happened between the R-B tag and the upstreaming, since issues can
be introduced in between. If you can check the patch again and validate
the r-b tag (or point the issues) then we can move forward and
hopefully merge it.

Thanks,
Paulo

> 
> > 
> > Thanks,
> > 
> > -
> > Lionel
> > 
> > On 16/03/18 12:14, Mika Kuoppala wrote:
> > > From: Oscar Mateo <oscar.mateo@intel.com>
> > > 
> > > In Gen11, the Video Decode engines (aka VDBOX, aka VCS, aka BSD)
> > > and the
> > > Video Enhancement engines (aka VEBOX, aka VECS) could be fused
> > > off.
> > > Also,
> > > each VDBOX and VEBOX has its own power well, which only exist if
> > > the related
> > > engine exists in the HW.
> > > 
> > > Unfortunately, we have a Catch-22 situation going on: we need the
> > > blitter
> > > forcewake to read the register with the fuse info, but we cannot
> > > initialize
> > > the forcewake domains without knowin about the engines present in
> > > the HW.
> > > We workaround this problem by allowing the initialization of all
> > > forcewake
> > > domains and then pruning the fused off ones, as per the fuse
> > > information.
> > > 
> > > Bspec: 20680
> > > 
> > > v2: We were shifting incorrectly for vebox disable (Vinay)
> > > 
> > > v3: Assert mmio is ready and warn if we have attempted to
> > > initialize
> > >      forcewake for fused-off engines (Paulo)
> > > 
> > > v4:
> > >    - Use INTEL_GEN in new code (Tvrtko)
> > >    - Shorter local variable (Tvrtko, Michal)
> > >    - Keep "if (!...) continue" style (Tvrtko)
> > >    - No unnecessary BUG_ON (Tvrtko)
> > >    - WARN_ON and cleanup if wrong mask (Tvrtko, Michal)
> > >    - Use I915_READ_FW (Michal)
> > >    - Use I915_MAX_VCS/VECS macros (Michal)
> > > 
> > > v5: Rebased by Rodrigo fixing conflicts on top of:
> > >      commit 33def1ff7b0 ("drm/i915: Simplify intel_engines_init")
> > > 
> > > v6: Fix v5. Remove info->num_rings. (by Oscar)
> > > 
> > > v7: Rebase (Rodrigo).
> > > 
> > > v8:
> > >    -
> > > s/intel_device_info_fused_off_engines/intel_device_info_init_mmio
> > > (Chris)
> > >    - Make vdbox_disable & vebox_disable local variables (Chris)
> > > 
> > > v9:
> > >    - Move function declaration to intel_device_info.h (Michal)
> > >    - Missing indent in bit fields definitions (Michal)
> > >    - When RC6 is enabled by BIOS, the fuse register cannot be
> > > read
> > > until
> > >      the blitter powerwell is awake. Shuffle where the fuse is
> > > read, prune
> > >      the forcewake domains after the fact and change the commit
> > > message
> > >      accordingly (Vinay, Sagar, Chris).
> > > 
> > > v10:
> > >    - Improved commit message (Sagar)
> > >    - New line in header file (Sagar)
> > >    - Specify the message in fw_domain_reset applies to ICL+
> > > (Sagar)
> > > 
> > > Cc: Paulo Zanoni <paulo.r.zanoni@intel.com>
> > > Cc: Vinay Belgaumkar <vinay.belgaumkar@intel.com>
> > > Cc: Tvrtko Ursulin <tvrtko.ursulin@intel.com>
> > > Cc: Michal Wajdeczko <michal.wajdeczko@intel.com>
> > > Cc: Chris Wilson <chris@chris-wilson.co.uk>
> > > Cc: Daniele Ceraolo Spurio <daniele.ceraolospurio@intel.com>
> > > Cc: Sagar Arun Kamble <sagar.a.kamble@intel.com>
> > > Signed-off-by: Rodrigo Vivi <rodrigo.vivi@intel.com>
> > > Signed-off-by: Oscar Mateo <oscar.mateo@intel.com>
> > > ---
> > >   drivers/gpu/drm/i915/i915_drv.c          |  4 +++
> > >   drivers/gpu/drm/i915/i915_reg.h          |  5 +++
> > >   drivers/gpu/drm/i915/intel_device_info.c | 47
> > > +++++++++++++++++++++++++++
> > >   drivers/gpu/drm/i915/intel_device_info.h |  2 ++
> > >   drivers/gpu/drm/i915/intel_uncore.c      | 56
> > > ++++++++++++++++++++++++++++++++
> > >   drivers/gpu/drm/i915/intel_uncore.h      |  1 +
> > >   6 files changed, 115 insertions(+)
> > > 
> > > diff --git a/drivers/gpu/drm/i915/i915_drv.c
> > > b/drivers/gpu/drm/i915/i915_drv.c
> > > index 3df5193487f3..83df8e21cec0 100644
> > > --- a/drivers/gpu/drm/i915/i915_drv.c
> > > +++ b/drivers/gpu/drm/i915/i915_drv.c
> > > @@ -1033,6 +1033,10 @@ static int i915_driver_init_mmio(struct
> > > drm_i915_private *dev_priv)
> > >   
> > >   	intel_uncore_init(dev_priv);
> > >   
> > > +	intel_device_info_init_mmio(dev_priv);
> > > +
> > > +	intel_uncore_prune(dev_priv);
> > > +
> > >   	intel_uc_init_mmio(dev_priv);
> > >   
> > >   	ret = intel_engines_init_mmio(dev_priv);
> > > diff --git a/drivers/gpu/drm/i915/i915_reg.h
> > > b/drivers/gpu/drm/i915/i915_reg.h
> > > index cf7c837d6a09..982e72e73e99 100644
> > > --- a/drivers/gpu/drm/i915/i915_reg.h
> > > +++ b/drivers/gpu/drm/i915/i915_reg.h
> > > @@ -2545,6 +2545,11 @@ enum i915_power_well_id {
> > >   #define GEN10_EU_DISABLE3		_MMIO(0x9140)
> > >   #define   GEN10_EU_DIS_SS_MASK		0xff
> > >   
> > > +#define GEN11_GT_VEBOX_VDBOX_DISABLE	_MMIO(0x9140)
> > > +#define   GEN11_GT_VDBOX_DISABLE_MASK	0xff
> > > +#define   GEN11_GT_VEBOX_DISABLE_SHIFT	16
> > > +#define   GEN11_GT_VEBOX_DISABLE_MASK	(0xff <<
> > > GEN11_GT_VEBOX_DISABLE_SHIFT)
> > > +
> > >   #define GEN6_BSD_SLEEP_PSMI_CONTROL	_MMIO(0x12050)
> > >   #define   GEN6_BSD_SLEEP_MSG_DISABLE	(1 << 0)
> > >   #define   GEN6_BSD_SLEEP_FLUSH_DISABLE	(1 << 2)
> > > diff --git a/drivers/gpu/drm/i915/intel_device_info.c
> > > b/drivers/gpu/drm/i915/intel_device_info.c
> > > index 3dd350f7b8e6..4babfc6ee45b 100644
> > > --- a/drivers/gpu/drm/i915/intel_device_info.c
> > > +++ b/drivers/gpu/drm/i915/intel_device_info.c
> > > @@ -780,3 +780,50 @@ void intel_driver_caps_print(const struct
> > > intel_driver_caps *caps,
> > >   {
> > >   	drm_printf(p, "scheduler: %x\n", caps->scheduler);
> > >   }
> > > +
> > > +/*
> > > + * Determine which engines are fused off in our particular
> > > hardware. Since the
> > > + * fuse register is in the blitter powerwell, we need forcewake
> > > to
> > > be ready at
> > > + * this point (but later we need to prune the forcewake domains
> > > for engines that
> > > + * are indeed fused off).
> > > + */
> > > +void intel_device_info_init_mmio(struct drm_i915_private
> > > *dev_priv)
> > > +{
> > > +	struct intel_device_info *info =
> > > mkwrite_device_info(dev_priv);
> > > +	u8 vdbox_disable, vebox_disable;
> > > +	u32 media_fuse;
> > > +	int i;
> > > +
> > > +	if (INTEL_GEN(dev_priv) < 11)
> > > +		return;
> > > +
> > > +	media_fuse = I915_READ(GEN11_GT_VEBOX_VDBOX_DISABLE);
> > > +
> > > +	vdbox_disable = media_fuse &
> > > GEN11_GT_VDBOX_DISABLE_MASK;
> > > +	vebox_disable = (media_fuse &
> > > GEN11_GT_VEBOX_DISABLE_MASK)
> > > > > 
> > > 
> > > +			GEN11_GT_VEBOX_DISABLE_SHIFT;
> > > +
> > > +	DRM_DEBUG_DRIVER("vdbox disable: %04x\n",
> > > vdbox_disable);
> > > +	for (i = 0; i < I915_MAX_VCS; i++) {
> > > +		if (!HAS_ENGINE(dev_priv, _VCS(i)))
> > > +			continue;
> > > +
> > > +		if (!(BIT(i) & vdbox_disable))
> > > +			continue;
> > > +
> > > +		info->ring_mask &= ~ENGINE_MASK(_VCS(i));
> > > +		DRM_DEBUG_DRIVER("vcs%u fused off\n", i);
> > > +	}
> > > +
> > > +	DRM_DEBUG_DRIVER("vebox disable: %04x\n",
> > > vebox_disable);
> > > +	for (i = 0; i < I915_MAX_VECS; i++) {
> > > +		if (!HAS_ENGINE(dev_priv, _VECS(i)))
> > > +			continue;
> > > +
> > > +		if (!(BIT(i) & vebox_disable))
> > > +			continue;
> > > +
> > > +		info->ring_mask &= ~ENGINE_MASK(_VECS(i));
> > > +		DRM_DEBUG_DRIVER("vecs%u fused off\n", i);
> > > +	}
> > > +}
> > > diff --git a/drivers/gpu/drm/i915/intel_device_info.h
> > > b/drivers/gpu/drm/i915/intel_device_info.h
> > > index 0835752c8b22..0cbb92223013 100644
> > > --- a/drivers/gpu/drm/i915/intel_device_info.h
> > > +++ b/drivers/gpu/drm/i915/intel_device_info.h
> > > @@ -247,6 +247,8 @@ void intel_device_info_dump_runtime(const
> > > struct intel_device_info *info,
> > >   void intel_device_info_dump_topology(const struct sseu_dev_info
> > > *sseu,
> > >   				     struct drm_printer *p);
> > >   
> > > +void intel_device_info_init_mmio(struct drm_i915_private
> > > *dev_priv);
> > > +
> > >   void intel_driver_caps_print(const struct intel_driver_caps
> > > *caps,
> > >   			     struct drm_printer *p);
> > >   
> > > diff --git a/drivers/gpu/drm/i915/intel_uncore.c
> > > b/drivers/gpu/drm/i915/intel_uncore.c
> > > index 4df7c2ef8576..4c616d074a97 100644
> > > --- a/drivers/gpu/drm/i915/intel_uncore.c
> > > +++ b/drivers/gpu/drm/i915/intel_uncore.c
> > > @@ -62,6 +62,11 @@ static inline void
> > >   fw_domain_reset(struct drm_i915_private *i915,
> > >   		const struct intel_uncore_forcewake_domain *d)
> > >   {
> > > +	/*
> > > +	 * We don't really know if the powerwell for the
> > > forcewake
> > > domain we are
> > > +	 * trying to reset here does exist at this point
> > > (engines
> > > could be fused
> > > +	 * off in ICL+), so no waiting for acks
> > > +	 */
> > >   	__raw_i915_write32(i915, d->reg_set, i915-
> > > > uncore.fw_reset);
> > > 
> > >   }
> > >   
> > > @@ -1353,6 +1358,23 @@ static void fw_domain_init(struct
> > > drm_i915_private *dev_priv,
> > >   	fw_domain_reset(dev_priv, d);
> > >   }
> > >   
> > > +static void fw_domain_fini(struct drm_i915_private *dev_priv,
> > > +			   enum forcewake_domain_id domain_id)
> > > +{
> > > +	struct intel_uncore_forcewake_domain *d;
> > > +
> > > +	if (WARN_ON(domain_id >= FW_DOMAIN_ID_COUNT))
> > > +		return;
> > > +
> > > +	d = &dev_priv->uncore.fw_domain[domain_id];
> > > +
> > > +	WARN_ON(d->wake_count);
> > > +	WARN_ON(hrtimer_cancel(&d->timer));
> > > +	memset(d, 0, sizeof(*d));
> > > +
> > > +	dev_priv->uncore.fw_domains &= ~BIT(domain_id);
> > > +}
> > > +
> > >   static void intel_uncore_fw_domains_init(struct
> > > drm_i915_private
> > > *dev_priv)
> > >   {
> > >   	if (INTEL_GEN(dev_priv) <= 5 ||
> > > intel_vgpu_active(dev_priv))
> > > @@ -1565,6 +1587,40 @@ void intel_uncore_init(struct
> > > drm_i915_private *dev_priv)
> > >   		&dev_priv->uncore.pmic_bus_access_nb);
> > >   }
> > >   
> > > +/*
> > > + * We might have detected that some engines are fused off after
> > > we
> > > initialized
> > > + * the forcewake domains. Prune them, to make sure they only
> > > reference existing
> > > + * engines.
> > > + */
> > > +void intel_uncore_prune(struct drm_i915_private *dev_priv)
> > > +{
> > > +	if (INTEL_GEN(dev_priv) >= 11) {
> > > +		enum forcewake_domains fw_domains = dev_priv-
> > > > uncore.fw_domains;
> > > 
> > > +		enum forcewake_domain_id domain_id;
> > > +		int i;
> > > +
> > > +		for (i = 0; i < I915_MAX_VCS; i++) {
> > > +			domain_id = FW_DOMAIN_ID_MEDIA_VDBOX0 +
> > > i;
> > > +
> > > +			if (HAS_ENGINE(dev_priv, _VCS(i)))
> > > +				continue;
> > > +
> > > +			if (fw_domains & BIT(domain_id))
> > > +				fw_domain_fini(dev_priv,
> > > domain_id);
> > > +		}
> > > +
> > > +		for (i = 0; i < I915_MAX_VECS; i++) {
> > > +			domain_id = FW_DOMAIN_ID_MEDIA_VEBOX0 +
> > > i;
> > > +
> > > +			if (HAS_ENGINE(dev_priv, _VECS(i)))
> > > +				continue;
> > > +
> > > +			if (fw_domains & BIT(domain_id))
> > > +				fw_domain_fini(dev_priv,
> > > domain_id);
> > > +		}
> > > +	}
> > > +}
> > > +
> > >   void intel_uncore_fini(struct drm_i915_private *dev_priv)
> > >   {
> > >   	/* Paranoia: make sure we have disabled everything
> > > before
> > > we exit. */
> > > diff --git a/drivers/gpu/drm/i915/intel_uncore.h
> > > b/drivers/gpu/drm/i915/intel_uncore.h
> > > index dfdf444e4bcc..47478d609630 100644
> > > --- a/drivers/gpu/drm/i915/intel_uncore.h
> > > +++ b/drivers/gpu/drm/i915/intel_uncore.h
> > > @@ -140,6 +140,7 @@ struct intel_uncore {
> > >   
> > >   void intel_uncore_sanitize(struct drm_i915_private *dev_priv);
> > >   void intel_uncore_init(struct drm_i915_private *dev_priv);
> > > +void intel_uncore_prune(struct drm_i915_private *dev_priv);
> > >   bool intel_uncore_unclaimed_mmio(struct drm_i915_private
> > > *dev_priv);
> > >   bool intel_uncore_arm_unclaimed_mmio_detection(struct
> > > drm_i915_private *dev_priv);
> > >   void intel_uncore_fini(struct drm_i915_private *dev_priv);
> > 
> > 
> 
> _______________________________________________
> Intel-gfx mailing list
> Intel-gfx@lists.freedesktop.org
> https://lists.freedesktop.org/mailman/listinfo/intel-gfx
_______________________________________________
Intel-gfx mailing list
Intel-gfx@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/intel-gfx

^ permalink raw reply	[flat|nested] 27+ messages in thread

* Re: [PATCH 1/8] drm/i915/icl: Check for fused-off VDBOX and VEBOX instances
  2018-03-27 23:39     ` Paulo Zanoni
@ 2018-03-28 11:36       ` Lionel Landwerlin
  0 siblings, 0 replies; 27+ messages in thread
From: Lionel Landwerlin @ 2018-03-28 11:36 UTC (permalink / raw)
  To: Paulo Zanoni, Mika Kuoppala, intel-gfx; +Cc: Rodrigo Vivi

On 28/03/18 00:39, Paulo Zanoni wrote:
> Em Ter, 2018-03-27 às 15:42 -0700, Paulo Zanoni escreveu:
>> Em Sex, 2018-03-23 às 16:28 +0000, Lionel Landwerlin escreveu:
>>> Hi Mika,
>>>
>>> Even after this series, we're still missing support for reading
>>> the
>>> timestamp frequency (read_timestamp_frequency in
>>> intel_device_info.c).
>>> I'm pretty sure someone wrote a patch for it. Do you any idea?
>>>
>>> If not, I can send something.
>> Yes, we have them. I'll see if I missed them while upstreaming and
>> resend in that case.
> https://patchwork.freedesktop.org/patch/196710/
>
> Hey Lionel, the Reviewed-by stamp you gave on the patch was before we
> upstreamed it, so we need you (or someone else) to re-check the patch
> and re-issue the reviewed-by tag. We do this because of the rebasing
> that happened between the R-B tag and the upstreaming, since issues can
> be introduced in between. If you can check the patch again and validate
> the r-b tag (or point the issues) then we can move forward and
> hopefully merge it.
>
> Thanks,
> Paulo

Thanks, just sent another Rb, please push it :)

>
>>> Thanks,
>>>
>>> -
>>> Lionel
>>>
>>> On 16/03/18 12:14, Mika Kuoppala wrote:
>>>> From: Oscar Mateo <oscar.mateo@intel.com>
>>>>
>>>> In Gen11, the Video Decode engines (aka VDBOX, aka VCS, aka BSD)
>>>> and the
>>>> Video Enhancement engines (aka VEBOX, aka VECS) could be fused
>>>> off.
>>>> Also,
>>>> each VDBOX and VEBOX has its own power well, which only exist if
>>>> the related
>>>> engine exists in the HW.
>>>>
>>>> Unfortunately, we have a Catch-22 situation going on: we need the
>>>> blitter
>>>> forcewake to read the register with the fuse info, but we cannot
>>>> initialize
>>>> the forcewake domains without knowin about the engines present in
>>>> the HW.
>>>> We workaround this problem by allowing the initialization of all
>>>> forcewake
>>>> domains and then pruning the fused off ones, as per the fuse
>>>> information.
>>>>
>>>> Bspec: 20680
>>>>
>>>> v2: We were shifting incorrectly for vebox disable (Vinay)
>>>>
>>>> v3: Assert mmio is ready and warn if we have attempted to
>>>> initialize
>>>>       forcewake for fused-off engines (Paulo)
>>>>
>>>> v4:
>>>>     - Use INTEL_GEN in new code (Tvrtko)
>>>>     - Shorter local variable (Tvrtko, Michal)
>>>>     - Keep "if (!...) continue" style (Tvrtko)
>>>>     - No unnecessary BUG_ON (Tvrtko)
>>>>     - WARN_ON and cleanup if wrong mask (Tvrtko, Michal)
>>>>     - Use I915_READ_FW (Michal)
>>>>     - Use I915_MAX_VCS/VECS macros (Michal)
>>>>
>>>> v5: Rebased by Rodrigo fixing conflicts on top of:
>>>>       commit 33def1ff7b0 ("drm/i915: Simplify intel_engines_init")
>>>>
>>>> v6: Fix v5. Remove info->num_rings. (by Oscar)
>>>>
>>>> v7: Rebase (Rodrigo).
>>>>
>>>> v8:
>>>>     -
>>>> s/intel_device_info_fused_off_engines/intel_device_info_init_mmio
>>>> (Chris)
>>>>     - Make vdbox_disable & vebox_disable local variables (Chris)
>>>>
>>>> v9:
>>>>     - Move function declaration to intel_device_info.h (Michal)
>>>>     - Missing indent in bit fields definitions (Michal)
>>>>     - When RC6 is enabled by BIOS, the fuse register cannot be
>>>> read
>>>> until
>>>>       the blitter powerwell is awake. Shuffle where the fuse is
>>>> read, prune
>>>>       the forcewake domains after the fact and change the commit
>>>> message
>>>>       accordingly (Vinay, Sagar, Chris).
>>>>
>>>> v10:
>>>>     - Improved commit message (Sagar)
>>>>     - New line in header file (Sagar)
>>>>     - Specify the message in fw_domain_reset applies to ICL+
>>>> (Sagar)
>>>>
>>>> Cc: Paulo Zanoni <paulo.r.zanoni@intel.com>
>>>> Cc: Vinay Belgaumkar <vinay.belgaumkar@intel.com>
>>>> Cc: Tvrtko Ursulin <tvrtko.ursulin@intel.com>
>>>> Cc: Michal Wajdeczko <michal.wajdeczko@intel.com>
>>>> Cc: Chris Wilson <chris@chris-wilson.co.uk>
>>>> Cc: Daniele Ceraolo Spurio <daniele.ceraolospurio@intel.com>
>>>> Cc: Sagar Arun Kamble <sagar.a.kamble@intel.com>
>>>> Signed-off-by: Rodrigo Vivi <rodrigo.vivi@intel.com>
>>>> Signed-off-by: Oscar Mateo <oscar.mateo@intel.com>
>>>> ---
>>>>    drivers/gpu/drm/i915/i915_drv.c          |  4 +++
>>>>    drivers/gpu/drm/i915/i915_reg.h          |  5 +++
>>>>    drivers/gpu/drm/i915/intel_device_info.c | 47
>>>> +++++++++++++++++++++++++++
>>>>    drivers/gpu/drm/i915/intel_device_info.h |  2 ++
>>>>    drivers/gpu/drm/i915/intel_uncore.c      | 56
>>>> ++++++++++++++++++++++++++++++++
>>>>    drivers/gpu/drm/i915/intel_uncore.h      |  1 +
>>>>    6 files changed, 115 insertions(+)
>>>>
>>>> diff --git a/drivers/gpu/drm/i915/i915_drv.c
>>>> b/drivers/gpu/drm/i915/i915_drv.c
>>>> index 3df5193487f3..83df8e21cec0 100644
>>>> --- a/drivers/gpu/drm/i915/i915_drv.c
>>>> +++ b/drivers/gpu/drm/i915/i915_drv.c
>>>> @@ -1033,6 +1033,10 @@ static int i915_driver_init_mmio(struct
>>>> drm_i915_private *dev_priv)
>>>>    
>>>>    	intel_uncore_init(dev_priv);
>>>>    
>>>> +	intel_device_info_init_mmio(dev_priv);
>>>> +
>>>> +	intel_uncore_prune(dev_priv);
>>>> +
>>>>    	intel_uc_init_mmio(dev_priv);
>>>>    
>>>>    	ret = intel_engines_init_mmio(dev_priv);
>>>> diff --git a/drivers/gpu/drm/i915/i915_reg.h
>>>> b/drivers/gpu/drm/i915/i915_reg.h
>>>> index cf7c837d6a09..982e72e73e99 100644
>>>> --- a/drivers/gpu/drm/i915/i915_reg.h
>>>> +++ b/drivers/gpu/drm/i915/i915_reg.h
>>>> @@ -2545,6 +2545,11 @@ enum i915_power_well_id {
>>>>    #define GEN10_EU_DISABLE3		_MMIO(0x9140)
>>>>    #define   GEN10_EU_DIS_SS_MASK		0xff
>>>>    
>>>> +#define GEN11_GT_VEBOX_VDBOX_DISABLE	_MMIO(0x9140)
>>>> +#define   GEN11_GT_VDBOX_DISABLE_MASK	0xff
>>>> +#define   GEN11_GT_VEBOX_DISABLE_SHIFT	16
>>>> +#define   GEN11_GT_VEBOX_DISABLE_MASK	(0xff <<
>>>> GEN11_GT_VEBOX_DISABLE_SHIFT)
>>>> +
>>>>    #define GEN6_BSD_SLEEP_PSMI_CONTROL	_MMIO(0x12050)
>>>>    #define   GEN6_BSD_SLEEP_MSG_DISABLE	(1 << 0)
>>>>    #define   GEN6_BSD_SLEEP_FLUSH_DISABLE	(1 << 2)
>>>> diff --git a/drivers/gpu/drm/i915/intel_device_info.c
>>>> b/drivers/gpu/drm/i915/intel_device_info.c
>>>> index 3dd350f7b8e6..4babfc6ee45b 100644
>>>> --- a/drivers/gpu/drm/i915/intel_device_info.c
>>>> +++ b/drivers/gpu/drm/i915/intel_device_info.c
>>>> @@ -780,3 +780,50 @@ void intel_driver_caps_print(const struct
>>>> intel_driver_caps *caps,
>>>>    {
>>>>    	drm_printf(p, "scheduler: %x\n", caps->scheduler);
>>>>    }
>>>> +
>>>> +/*
>>>> + * Determine which engines are fused off in our particular
>>>> hardware. Since the
>>>> + * fuse register is in the blitter powerwell, we need forcewake
>>>> to
>>>> be ready at
>>>> + * this point (but later we need to prune the forcewake domains
>>>> for engines that
>>>> + * are indeed fused off).
>>>> + */
>>>> +void intel_device_info_init_mmio(struct drm_i915_private
>>>> *dev_priv)
>>>> +{
>>>> +	struct intel_device_info *info =
>>>> mkwrite_device_info(dev_priv);
>>>> +	u8 vdbox_disable, vebox_disable;
>>>> +	u32 media_fuse;
>>>> +	int i;
>>>> +
>>>> +	if (INTEL_GEN(dev_priv) < 11)
>>>> +		return;
>>>> +
>>>> +	media_fuse = I915_READ(GEN11_GT_VEBOX_VDBOX_DISABLE);
>>>> +
>>>> +	vdbox_disable = media_fuse &
>>>> GEN11_GT_VDBOX_DISABLE_MASK;
>>>> +	vebox_disable = (media_fuse &
>>>> GEN11_GT_VEBOX_DISABLE_MASK)
>>>> +			GEN11_GT_VEBOX_DISABLE_SHIFT;
>>>> +
>>>> +	DRM_DEBUG_DRIVER("vdbox disable: %04x\n",
>>>> vdbox_disable);
>>>> +	for (i = 0; i < I915_MAX_VCS; i++) {
>>>> +		if (!HAS_ENGINE(dev_priv, _VCS(i)))
>>>> +			continue;
>>>> +
>>>> +		if (!(BIT(i) & vdbox_disable))
>>>> +			continue;
>>>> +
>>>> +		info->ring_mask &= ~ENGINE_MASK(_VCS(i));
>>>> +		DRM_DEBUG_DRIVER("vcs%u fused off\n", i);
>>>> +	}
>>>> +
>>>> +	DRM_DEBUG_DRIVER("vebox disable: %04x\n",
>>>> vebox_disable);
>>>> +	for (i = 0; i < I915_MAX_VECS; i++) {
>>>> +		if (!HAS_ENGINE(dev_priv, _VECS(i)))
>>>> +			continue;
>>>> +
>>>> +		if (!(BIT(i) & vebox_disable))
>>>> +			continue;
>>>> +
>>>> +		info->ring_mask &= ~ENGINE_MASK(_VECS(i));
>>>> +		DRM_DEBUG_DRIVER("vecs%u fused off\n", i);
>>>> +	}
>>>> +}
>>>> diff --git a/drivers/gpu/drm/i915/intel_device_info.h
>>>> b/drivers/gpu/drm/i915/intel_device_info.h
>>>> index 0835752c8b22..0cbb92223013 100644
>>>> --- a/drivers/gpu/drm/i915/intel_device_info.h
>>>> +++ b/drivers/gpu/drm/i915/intel_device_info.h
>>>> @@ -247,6 +247,8 @@ void intel_device_info_dump_runtime(const
>>>> struct intel_device_info *info,
>>>>    void intel_device_info_dump_topology(const struct sseu_dev_info
>>>> *sseu,
>>>>    				     struct drm_printer *p);
>>>>    
>>>> +void intel_device_info_init_mmio(struct drm_i915_private
>>>> *dev_priv);
>>>> +
>>>>    void intel_driver_caps_print(const struct intel_driver_caps
>>>> *caps,
>>>>    			     struct drm_printer *p);
>>>>    
>>>> diff --git a/drivers/gpu/drm/i915/intel_uncore.c
>>>> b/drivers/gpu/drm/i915/intel_uncore.c
>>>> index 4df7c2ef8576..4c616d074a97 100644
>>>> --- a/drivers/gpu/drm/i915/intel_uncore.c
>>>> +++ b/drivers/gpu/drm/i915/intel_uncore.c
>>>> @@ -62,6 +62,11 @@ static inline void
>>>>    fw_domain_reset(struct drm_i915_private *i915,
>>>>    		const struct intel_uncore_forcewake_domain *d)
>>>>    {
>>>> +	/*
>>>> +	 * We don't really know if the powerwell for the
>>>> forcewake
>>>> domain we are
>>>> +	 * trying to reset here does exist at this point
>>>> (engines
>>>> could be fused
>>>> +	 * off in ICL+), so no waiting for acks
>>>> +	 */
>>>>    	__raw_i915_write32(i915, d->reg_set, i915-
>>>>> uncore.fw_reset);
>>>>    }
>>>>    
>>>> @@ -1353,6 +1358,23 @@ static void fw_domain_init(struct
>>>> drm_i915_private *dev_priv,
>>>>    	fw_domain_reset(dev_priv, d);
>>>>    }
>>>>    
>>>> +static void fw_domain_fini(struct drm_i915_private *dev_priv,
>>>> +			   enum forcewake_domain_id domain_id)
>>>> +{
>>>> +	struct intel_uncore_forcewake_domain *d;
>>>> +
>>>> +	if (WARN_ON(domain_id >= FW_DOMAIN_ID_COUNT))
>>>> +		return;
>>>> +
>>>> +	d = &dev_priv->uncore.fw_domain[domain_id];
>>>> +
>>>> +	WARN_ON(d->wake_count);
>>>> +	WARN_ON(hrtimer_cancel(&d->timer));
>>>> +	memset(d, 0, sizeof(*d));
>>>> +
>>>> +	dev_priv->uncore.fw_domains &= ~BIT(domain_id);
>>>> +}
>>>> +
>>>>    static void intel_uncore_fw_domains_init(struct
>>>> drm_i915_private
>>>> *dev_priv)
>>>>    {
>>>>    	if (INTEL_GEN(dev_priv) <= 5 ||
>>>> intel_vgpu_active(dev_priv))
>>>> @@ -1565,6 +1587,40 @@ void intel_uncore_init(struct
>>>> drm_i915_private *dev_priv)
>>>>    		&dev_priv->uncore.pmic_bus_access_nb);
>>>>    }
>>>>    
>>>> +/*
>>>> + * We might have detected that some engines are fused off after
>>>> we
>>>> initialized
>>>> + * the forcewake domains. Prune them, to make sure they only
>>>> reference existing
>>>> + * engines.
>>>> + */
>>>> +void intel_uncore_prune(struct drm_i915_private *dev_priv)
>>>> +{
>>>> +	if (INTEL_GEN(dev_priv) >= 11) {
>>>> +		enum forcewake_domains fw_domains = dev_priv-
>>>>> uncore.fw_domains;
>>>> +		enum forcewake_domain_id domain_id;
>>>> +		int i;
>>>> +
>>>> +		for (i = 0; i < I915_MAX_VCS; i++) {
>>>> +			domain_id = FW_DOMAIN_ID_MEDIA_VDBOX0 +
>>>> i;
>>>> +
>>>> +			if (HAS_ENGINE(dev_priv, _VCS(i)))
>>>> +				continue;
>>>> +
>>>> +			if (fw_domains & BIT(domain_id))
>>>> +				fw_domain_fini(dev_priv,
>>>> domain_id);
>>>> +		}
>>>> +
>>>> +		for (i = 0; i < I915_MAX_VECS; i++) {
>>>> +			domain_id = FW_DOMAIN_ID_MEDIA_VEBOX0 +
>>>> i;
>>>> +
>>>> +			if (HAS_ENGINE(dev_priv, _VECS(i)))
>>>> +				continue;
>>>> +
>>>> +			if (fw_domains & BIT(domain_id))
>>>> +				fw_domain_fini(dev_priv,
>>>> domain_id);
>>>> +		}
>>>> +	}
>>>> +}
>>>> +
>>>>    void intel_uncore_fini(struct drm_i915_private *dev_priv)
>>>>    {
>>>>    	/* Paranoia: make sure we have disabled everything
>>>> before
>>>> we exit. */
>>>> diff --git a/drivers/gpu/drm/i915/intel_uncore.h
>>>> b/drivers/gpu/drm/i915/intel_uncore.h
>>>> index dfdf444e4bcc..47478d609630 100644
>>>> --- a/drivers/gpu/drm/i915/intel_uncore.h
>>>> +++ b/drivers/gpu/drm/i915/intel_uncore.h
>>>> @@ -140,6 +140,7 @@ struct intel_uncore {
>>>>    
>>>>    void intel_uncore_sanitize(struct drm_i915_private *dev_priv);
>>>>    void intel_uncore_init(struct drm_i915_private *dev_priv);
>>>> +void intel_uncore_prune(struct drm_i915_private *dev_priv);
>>>>    bool intel_uncore_unclaimed_mmio(struct drm_i915_private
>>>> *dev_priv);
>>>>    bool intel_uncore_arm_unclaimed_mmio_detection(struct
>>>> drm_i915_private *dev_priv);
>>>>    void intel_uncore_fini(struct drm_i915_private *dev_priv);
>>>
>> _______________________________________________
>> Intel-gfx mailing list
>> Intel-gfx@lists.freedesktop.org
>> https://lists.freedesktop.org/mailman/listinfo/intel-gfx


_______________________________________________
Intel-gfx mailing list
Intel-gfx@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/intel-gfx

^ permalink raw reply	[flat|nested] 27+ messages in thread

* Re: [PATCH 1/8] drm/i915/icl: Check for fused-off VDBOX and VEBOX instances
  2018-03-19 15:26 ` [PATCH 1/8] drm/i915/icl: Check for fused-off VDBOX and VEBOX instances Sagar Arun Kamble
@ 2018-10-18  9:47   ` Tvrtko Ursulin
  0 siblings, 0 replies; 27+ messages in thread
From: Tvrtko Ursulin @ 2018-10-18  9:47 UTC (permalink / raw)
  To: Mika Kuoppala, intel-gfx; +Cc: Paulo Zanoni, Rodrigo Vivi


This patch seems to have fallen through the cracks..

On 19/03/2018 15:26, Sagar Arun Kamble wrote:
> 
> 
> On 3/16/2018 5:44 PM, Mika Kuoppala wrote:
>> From: Oscar Mateo <oscar.mateo@intel.com>
>>
>> In Gen11, the Video Decode engines (aka VDBOX, aka VCS, aka BSD) and the
>> Video Enhancement engines (aka VEBOX, aka VECS) could be fused off. Also,
>> each VDBOX and VEBOX has its own power well, which only exist if the 
>> related
>> engine exists in the HW.
>>
>> Unfortunately, we have a Catch-22 situation going on: we need the blitter
>> forcewake to read the register with the fuse info, but we cannot 
>> initialize
>> the forcewake domains without knowin about the engines present in the HW.
>> We workaround this problem by allowing the initialization of all 
>> forcewake
>> domains and then pruning the fused off ones, as per the fuse information.
>>
>> Bspec: 20680
>>
>> v2: We were shifting incorrectly for vebox disable (Vinay)
>>
>> v3: Assert mmio is ready and warn if we have attempted to initialize
>>      forcewake for fused-off engines (Paulo)
>>
>> v4:
>>    - Use INTEL_GEN in new code (Tvrtko)
>>    - Shorter local variable (Tvrtko, Michal)
>>    - Keep "if (!...) continue" style (Tvrtko)
>>    - No unnecessary BUG_ON (Tvrtko)
>>    - WARN_ON and cleanup if wrong mask (Tvrtko, Michal)
>>    - Use I915_READ_FW (Michal)
>>    - Use I915_MAX_VCS/VECS macros (Michal)
>>
>> v5: Rebased by Rodrigo fixing conflicts on top of:
>>      commit 33def1ff7b0 ("drm/i915: Simplify intel_engines_init")
>>
>> v6: Fix v5. Remove info->num_rings. (by Oscar)
>>
>> v7: Rebase (Rodrigo).
>>
>> v8:
>>    - s/intel_device_info_fused_off_engines/intel_device_info_init_mmio 
>> (Chris)
>>    - Make vdbox_disable & vebox_disable local variables (Chris)
>>
>> v9:
>>    - Move function declaration to intel_device_info.h (Michal)
>>    - Missing indent in bit fields definitions (Michal)
>>    - When RC6 is enabled by BIOS, the fuse register cannot be read until
>>      the blitter powerwell is awake. Shuffle where the fuse is read, 
>> prune
>>      the forcewake domains after the fact and change the commit message
>>      accordingly (Vinay, Sagar, Chris).
>>
>> v10:
>>    - Improved commit message (Sagar)
>>    - New line in header file (Sagar)
>>    - Specify the message in fw_domain_reset applies to ICL+ (Sagar)
>>
>> Cc: Paulo Zanoni <paulo.r.zanoni@intel.com>
>> Cc: Vinay Belgaumkar <vinay.belgaumkar@intel.com>
>> Cc: Tvrtko Ursulin <tvrtko.ursulin@intel.com>
>> Cc: Michal Wajdeczko <michal.wajdeczko@intel.com>
>> Cc: Chris Wilson <chris@chris-wilson.co.uk>
>> Cc: Daniele Ceraolo Spurio <daniele.ceraolospurio@intel.com>
>> Cc: Sagar Arun Kamble <sagar.a.kamble@intel.com>
>> Signed-off-by: Rodrigo Vivi <rodrigo.vivi@intel.com>
>> Signed-off-by: Oscar Mateo <oscar.mateo@intel.com>
> Reviewed-by: Sagar Arun Kamble <sagar.a.kamble@intel.com>
>> ---
>>   drivers/gpu/drm/i915/i915_drv.c          |  4 +++
>>   drivers/gpu/drm/i915/i915_reg.h          |  5 +++
>>   drivers/gpu/drm/i915/intel_device_info.c | 47 
>> +++++++++++++++++++++++++++
>>   drivers/gpu/drm/i915/intel_device_info.h |  2 ++
>>   drivers/gpu/drm/i915/intel_uncore.c      | 56 
>> ++++++++++++++++++++++++++++++++
>>   drivers/gpu/drm/i915/intel_uncore.h      |  1 +
>>   6 files changed, 115 insertions(+)
>>
>> diff --git a/drivers/gpu/drm/i915/i915_drv.c 
>> b/drivers/gpu/drm/i915/i915_drv.c
>> index 3df5193487f3..83df8e21cec0 100644
>> --- a/drivers/gpu/drm/i915/i915_drv.c
>> +++ b/drivers/gpu/drm/i915/i915_drv.c
>> @@ -1033,6 +1033,10 @@ static int i915_driver_init_mmio(struct 
>> drm_i915_private *dev_priv)
>>       intel_uncore_init(dev_priv);
>> +    intel_device_info_init_mmio(dev_priv);
>> +
>> +    intel_uncore_prune(dev_priv);
>> +
>>       intel_uc_init_mmio(dev_priv);
>>       ret = intel_engines_init_mmio(dev_priv);
>> diff --git a/drivers/gpu/drm/i915/i915_reg.h 
>> b/drivers/gpu/drm/i915/i915_reg.h
>> index cf7c837d6a09..982e72e73e99 100644
>> --- a/drivers/gpu/drm/i915/i915_reg.h
>> +++ b/drivers/gpu/drm/i915/i915_reg.h
>> @@ -2545,6 +2545,11 @@ enum i915_power_well_id {
>>   #define GEN10_EU_DISABLE3        _MMIO(0x9140)
>>   #define   GEN10_EU_DIS_SS_MASK        0xff
>> +#define GEN11_GT_VEBOX_VDBOX_DISABLE    _MMIO(0x9140)
>> +#define   GEN11_GT_VDBOX_DISABLE_MASK    0xff
>> +#define   GEN11_GT_VEBOX_DISABLE_SHIFT    16
>> +#define   GEN11_GT_VEBOX_DISABLE_MASK    (0xff << 
>> GEN11_GT_VEBOX_DISABLE_SHIFT)
>> +
>>   #define GEN6_BSD_SLEEP_PSMI_CONTROL    _MMIO(0x12050)
>>   #define   GEN6_BSD_SLEEP_MSG_DISABLE    (1 << 0)
>>   #define   GEN6_BSD_SLEEP_FLUSH_DISABLE    (1 << 2)
>> diff --git a/drivers/gpu/drm/i915/intel_device_info.c 
>> b/drivers/gpu/drm/i915/intel_device_info.c
>> index 3dd350f7b8e6..4babfc6ee45b 100644
>> --- a/drivers/gpu/drm/i915/intel_device_info.c
>> +++ b/drivers/gpu/drm/i915/intel_device_info.c
>> @@ -780,3 +780,50 @@ void intel_driver_caps_print(const struct 
>> intel_driver_caps *caps,
>>   {
>>       drm_printf(p, "scheduler: %x\n", caps->scheduler);
>>   }
>> +
>> +/*
>> + * Determine which engines are fused off in our particular hardware. 
>> Since the
>> + * fuse register is in the blitter powerwell, we need forcewake to be 
>> ready at
>> + * this point (but later we need to prune the forcewake domains for 
>> engines that
>> + * are indeed fused off).
>> + */
>> +void intel_device_info_init_mmio(struct drm_i915_private *dev_priv)
>> +{
>> +    struct intel_device_info *info = mkwrite_device_info(dev_priv);
>> +    u8 vdbox_disable, vebox_disable;
>> +    u32 media_fuse;
>> +    int i;
>> +
>> +    if (INTEL_GEN(dev_priv) < 11)
>> +        return;
>> +
>> +    media_fuse = I915_READ(GEN11_GT_VEBOX_VDBOX_DISABLE);
>> +
>> +    vdbox_disable = media_fuse & GEN11_GT_VDBOX_DISABLE_MASK;
>> +    vebox_disable = (media_fuse & GEN11_GT_VEBOX_DISABLE_MASK) >>
>> +            GEN11_GT_VEBOX_DISABLE_SHIFT;
>> +
>> +    DRM_DEBUG_DRIVER("vdbox disable: %04x\n", vdbox_disable);
>> +    for (i = 0; i < I915_MAX_VCS; i++) {
>> +        if (!HAS_ENGINE(dev_priv, _VCS(i)))
>> +            continue;
>> +
>> +        if (!(BIT(i) & vdbox_disable))
>> +            continue;
>> +
>> +        info->ring_mask &= ~ENGINE_MASK(_VCS(i));
>> +        DRM_DEBUG_DRIVER("vcs%u fused off\n", i);
>> +    }
>> +
>> +    DRM_DEBUG_DRIVER("vebox disable: %04x\n", vebox_disable);
>> +    for (i = 0; i < I915_MAX_VECS; i++) {
>> +        if (!HAS_ENGINE(dev_priv, _VECS(i)))
>> +            continue;
>> +
>> +        if (!(BIT(i) & vebox_disable))
>> +            continue;
>> +
>> +        info->ring_mask &= ~ENGINE_MASK(_VECS(i));
>> +        DRM_DEBUG_DRIVER("vecs%u fused off\n", i);
>> +    }
>> +}
>> diff --git a/drivers/gpu/drm/i915/intel_device_info.h 
>> b/drivers/gpu/drm/i915/intel_device_info.h
>> index 0835752c8b22..0cbb92223013 100644
>> --- a/drivers/gpu/drm/i915/intel_device_info.h
>> +++ b/drivers/gpu/drm/i915/intel_device_info.h
>> @@ -247,6 +247,8 @@ void intel_device_info_dump_runtime(const struct 
>> intel_device_info *info,
>>   void intel_device_info_dump_topology(const struct sseu_dev_info *sseu,
>>                        struct drm_printer *p);
>> +void intel_device_info_init_mmio(struct drm_i915_private *dev_priv);
>> +
>>   void intel_driver_caps_print(const struct intel_driver_caps *caps,
>>                    struct drm_printer *p);
>> diff --git a/drivers/gpu/drm/i915/intel_uncore.c 
>> b/drivers/gpu/drm/i915/intel_uncore.c
>> index 4df7c2ef8576..4c616d074a97 100644
>> --- a/drivers/gpu/drm/i915/intel_uncore.c
>> +++ b/drivers/gpu/drm/i915/intel_uncore.c
>> @@ -62,6 +62,11 @@ static inline void
>>   fw_domain_reset(struct drm_i915_private *i915,
>>           const struct intel_uncore_forcewake_domain *d)
>>   {
>> +    /*
>> +     * We don't really know if the powerwell for the forcewake domain 
>> we are
>> +     * trying to reset here does exist at this point (engines could 
>> be fused
>> +     * off in ICL+), so no waiting for acks
>> +     */
>>       __raw_i915_write32(i915, d->reg_set, i915->uncore.fw_reset);
>>   }
>> @@ -1353,6 +1358,23 @@ static void fw_domain_init(struct 
>> drm_i915_private *dev_priv,
>>       fw_domain_reset(dev_priv, d);
>>   }
>> +static void fw_domain_fini(struct drm_i915_private *dev_priv,
>> +               enum forcewake_domain_id domain_id)
>> +{
>> +    struct intel_uncore_forcewake_domain *d;
>> +
>> +    if (WARN_ON(domain_id >= FW_DOMAIN_ID_COUNT))
>> +        return;
>> +
>> +    d = &dev_priv->uncore.fw_domain[domain_id];
>> +
>> +    WARN_ON(d->wake_count);
>> +    WARN_ON(hrtimer_cancel(&d->timer));
>> +    memset(d, 0, sizeof(*d));
>> +
>> +    dev_priv->uncore.fw_domains &= ~BIT(domain_id);
>> +}
>> +
>>   static void intel_uncore_fw_domains_init(struct drm_i915_private 
>> *dev_priv)
>>   {
>>       if (INTEL_GEN(dev_priv) <= 5 || intel_vgpu_active(dev_priv))
>> @@ -1565,6 +1587,40 @@ void intel_uncore_init(struct drm_i915_private 
>> *dev_priv)
>>           &dev_priv->uncore.pmic_bus_access_nb);
>>   }
>> +/*
>> + * We might have detected that some engines are fused off after we 
>> initialized
>> + * the forcewake domains. Prune them, to make sure they only 
>> reference existing
>> + * engines.
>> + */
>> +void intel_uncore_prune(struct drm_i915_private *dev_priv)
>> +{
>> +    if (INTEL_GEN(dev_priv) >= 11) {
>> +        enum forcewake_domains fw_domains = dev_priv->uncore.fw_domains;
>> +        enum forcewake_domain_id domain_id;
>> +        int i;
>> +
>> +        for (i = 0; i < I915_MAX_VCS; i++) {
>> +            domain_id = FW_DOMAIN_ID_MEDIA_VDBOX0 + i;
>> +
>> +            if (HAS_ENGINE(dev_priv, _VCS(i)))
>> +                continue;
>> +
>> +            if (fw_domains & BIT(domain_id))
>> +                fw_domain_fini(dev_priv, domain_id);
>> +        }
>> +
>> +        for (i = 0; i < I915_MAX_VECS; i++) {
>> +            domain_id = FW_DOMAIN_ID_MEDIA_VEBOX0 + i;
>> +
>> +            if (HAS_ENGINE(dev_priv, _VECS(i)))
>> +                continue;
>> +
>> +            if (fw_domains & BIT(domain_id))
>> +                fw_domain_fini(dev_priv, domain_id);
>> +        }
>> +    }
>> +}
>> +
>>   void intel_uncore_fini(struct drm_i915_private *dev_priv)
>>   {
>>       /* Paranoia: make sure we have disabled everything before we 
>> exit. */
>> diff --git a/drivers/gpu/drm/i915/intel_uncore.h 
>> b/drivers/gpu/drm/i915/intel_uncore.h
>> index dfdf444e4bcc..47478d609630 100644
>> --- a/drivers/gpu/drm/i915/intel_uncore.h
>> +++ b/drivers/gpu/drm/i915/intel_uncore.h
>> @@ -140,6 +140,7 @@ struct intel_uncore {
>>   void intel_uncore_sanitize(struct drm_i915_private *dev_priv);
>>   void intel_uncore_init(struct drm_i915_private *dev_priv);
>> +void intel_uncore_prune(struct drm_i915_private *dev_priv);
>>   bool intel_uncore_unclaimed_mmio(struct drm_i915_private *dev_priv);
>>   bool intel_uncore_arm_unclaimed_mmio_detection(struct 
>> drm_i915_private *dev_priv);
>>   void intel_uncore_fini(struct drm_i915_private *dev_priv);
> 
_______________________________________________
Intel-gfx mailing list
Intel-gfx@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/intel-gfx

^ permalink raw reply	[flat|nested] 27+ messages in thread

end of thread, other threads:[~2018-10-18  9:47 UTC | newest]

Thread overview: 27+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2018-03-16 12:14 [PATCH 1/8] drm/i915/icl: Check for fused-off VDBOX and VEBOX instances Mika Kuoppala
2018-03-16 12:14 ` [PATCH 2/8] drm/i915/icl: Enable the extra video decode and enhancement boxes for Icelake 11 Mika Kuoppala
2018-03-16 12:14 ` [PATCH 3/8] drm/i915/icl: Update subslice define for ICL 11 Mika Kuoppala
2018-03-20 14:34   ` Mika Kuoppala
2018-03-16 12:14 ` [PATCH 4/8] drm/i915/icl: Added ICL 11 slice, subslice and EU fuse detection Mika Kuoppala
2018-03-16 12:18   ` Lionel Landwerlin
2018-03-16 13:06   ` [PATCH v2 " Lionel Landwerlin
2018-03-16 12:14 ` [PATCH 5/8] drm/i915/icl: Add reset control register changes Mika Kuoppala
2018-03-16 12:22   ` Mika Kuoppala
2018-03-16 12:45   ` Chris Wilson
2018-03-16 20:28   ` Daniele Ceraolo Spurio
2018-03-16 21:55     ` Chris Wilson
2018-03-27 16:26     ` Michel Thierry
2018-03-16 12:14 ` [PATCH 6/8] drm/i915/icl: Handle RPS interrupts correctly for Gen11 Mika Kuoppala
2018-03-16 12:14 ` [PATCH 7/8] drm/i915/icl: Enable RC6 and RPS in Gen11 Mika Kuoppala
2018-03-16 12:14 ` [PATCH 8/8] drm/i915/icl: Use hw engine class, instance to find irq handler Mika Kuoppala
2018-03-16 18:28   ` Michel Thierry
2018-03-16 19:37     ` Daniele Ceraolo Spurio
2018-03-19 15:14       ` Daniele Ceraolo Spurio
2018-03-16 13:53 ` ✓ Fi.CI.BAT: success for series starting with [1/8] drm/i915/icl: Check for fused-off VDBOX and VEBOX instances (rev2) Patchwork
2018-03-16 17:01 ` ✓ Fi.CI.IGT: " Patchwork
2018-03-19 15:26 ` [PATCH 1/8] drm/i915/icl: Check for fused-off VDBOX and VEBOX instances Sagar Arun Kamble
2018-10-18  9:47   ` Tvrtko Ursulin
2018-03-23 16:28 ` Lionel Landwerlin
2018-03-27 22:42   ` Paulo Zanoni
2018-03-27 23:39     ` Paulo Zanoni
2018-03-28 11:36       ` Lionel Landwerlin

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.