All of lore.kernel.org
 help / color / mirror / Atom feed
* [PATCH RESEND 1/4] drm/i915/opregion: bail out early for systems with no opregion VBT
@ 2017-03-29 10:32 Jani Nikula
  2017-03-29 10:32 ` [PATCH RESEND 2/4] drm/i915/opregion: try to validate RVDA VBT only if it's there Jani Nikula
                   ` (4 more replies)
  0 siblings, 5 replies; 11+ messages in thread
From: Jani Nikula @ 2017-03-29 10:32 UTC (permalink / raw)
  To: intel-gfx; +Cc: jani.nikula

Reduce indent. No functional changes.

Signed-off-by: Jani Nikula <jani.nikula@intel.com>
---
 drivers/gpu/drm/i915/intel_opregion.c | 64 +++++++++++++++++------------------
 1 file changed, 32 insertions(+), 32 deletions(-)

diff --git a/drivers/gpu/drm/i915/intel_opregion.c b/drivers/gpu/drm/i915/intel_opregion.c
index 441c01466384..76a39ee6d005 100644
--- a/drivers/gpu/drm/i915/intel_opregion.c
+++ b/drivers/gpu/drm/i915/intel_opregion.c
@@ -920,6 +920,8 @@ int intel_opregion_setup(struct drm_i915_private *dev_priv)
 	char buf[sizeof(OPREGION_SIGNATURE)];
 	int err = 0;
 	void *base;
+	const void *vbt = NULL;
+	u32 vbt_size = 0;
 
 	BUILD_BUG_ON(sizeof(struct opregion_header) != 0x100);
 	BUILD_BUG_ON(sizeof(struct opregion_acpi) != 0x100);
@@ -972,45 +974,43 @@ int intel_opregion_setup(struct drm_i915_private *dev_priv)
 	if (mboxes & MBOX_ASLE_EXT)
 		DRM_DEBUG_DRIVER("ASLE extension supported\n");
 
-	if (!dmi_check_system(intel_no_opregion_vbt)) {
-		const void *vbt = NULL;
-		u32 vbt_size = 0;
-
-		if (opregion->header->opregion_ver >= 2 && opregion->asle &&
-		    opregion->asle->rvda && opregion->asle->rvds) {
-			opregion->rvda = memremap(opregion->asle->rvda,
-						  opregion->asle->rvds,
-						  MEMREMAP_WB);
-			vbt = opregion->rvda;
-			vbt_size = opregion->asle->rvds;
-		}
+	if (dmi_check_system(intel_no_opregion_vbt))
+		goto out;
+
+	if (opregion->header->opregion_ver >= 2 && opregion->asle &&
+	    opregion->asle->rvda && opregion->asle->rvds) {
+		opregion->rvda = memremap(opregion->asle->rvda,
+					  opregion->asle->rvds,
+					  MEMREMAP_WB);
+		vbt = opregion->rvda;
+		vbt_size = opregion->asle->rvds;
+	}
 
+	if (intel_bios_is_valid_vbt(vbt, vbt_size)) {
+		DRM_DEBUG_KMS("Found valid VBT in ACPI OpRegion (RVDA)\n");
+		opregion->vbt = vbt;
+		opregion->vbt_size = vbt_size;
+	} else {
+		vbt = base + OPREGION_VBT_OFFSET;
+		/*
+		 * The VBT specification says that if the ASLE ext mailbox is
+		 * not used its area is reserved, but on some CHT boards the VBT
+		 * extends into the ASLE ext area. Allow this even though it is
+		 * against the spec, so we do not end up rejecting the VBT on
+		 * those boards (and end up not finding the LCD panel because of
+		 * this).
+		 */
+		vbt_size = (mboxes & MBOX_ASLE_EXT) ?
+			OPREGION_ASLE_EXT_OFFSET : OPREGION_SIZE;
+		vbt_size -= OPREGION_VBT_OFFSET;
 		if (intel_bios_is_valid_vbt(vbt, vbt_size)) {
-			DRM_DEBUG_KMS("Found valid VBT in ACPI OpRegion (RVDA)\n");
+			DRM_DEBUG_KMS("Found valid VBT in ACPI OpRegion (Mailbox #4)\n");
 			opregion->vbt = vbt;
 			opregion->vbt_size = vbt_size;
-		} else {
-			vbt = base + OPREGION_VBT_OFFSET;
-			/*
-			 * The VBT specification says that if the ASLE ext
-			 * mailbox is not used its area is reserved, but
-			 * on some CHT boards the VBT extends into the
-			 * ASLE ext area. Allow this even though it is
-			 * against the spec, so we do not end up rejecting
-			 * the VBT on those boards (and end up not finding the
-			 * LCD panel because of this).
-			 */
-			vbt_size = (mboxes & MBOX_ASLE_EXT) ?
-				OPREGION_ASLE_EXT_OFFSET : OPREGION_SIZE;
-			vbt_size -= OPREGION_VBT_OFFSET;
-			if (intel_bios_is_valid_vbt(vbt, vbt_size)) {
-				DRM_DEBUG_KMS("Found valid VBT in ACPI OpRegion (Mailbox #4)\n");
-				opregion->vbt = vbt;
-				opregion->vbt_size = vbt_size;
-			}
 		}
 	}
 
+out:
 	return 0;
 
 err_out:
-- 
2.1.4

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

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

* [PATCH RESEND 2/4] drm/i915/opregion: try to validate RVDA VBT only if it's there
  2017-03-29 10:32 [PATCH RESEND 1/4] drm/i915/opregion: bail out early for systems with no opregion VBT Jani Nikula
@ 2017-03-29 10:32 ` Jani Nikula
  2017-03-29 17:53   ` Bob Paauwe
  2017-03-29 10:32 ` [PATCH RESEND 3/4] drm/i915/opregion: debug log about invalid ACPI OpRegion VBT Jani Nikula
                   ` (3 subsequent siblings)
  4 siblings, 1 reply; 11+ messages in thread
From: Jani Nikula @ 2017-03-29 10:32 UTC (permalink / raw)
  To: intel-gfx; +Cc: jani.nikula

Seems more sensible this way, and reduces indent for the more common
case.

Signed-off-by: Jani Nikula <jani.nikula@intel.com>
---
 drivers/gpu/drm/i915/intel_opregion.c | 41 +++++++++++++++++------------------
 1 file changed, 20 insertions(+), 21 deletions(-)

diff --git a/drivers/gpu/drm/i915/intel_opregion.c b/drivers/gpu/drm/i915/intel_opregion.c
index 76a39ee6d005..2b64cb6691eb 100644
--- a/drivers/gpu/drm/i915/intel_opregion.c
+++ b/drivers/gpu/drm/i915/intel_opregion.c
@@ -920,8 +920,8 @@ int intel_opregion_setup(struct drm_i915_private *dev_priv)
 	char buf[sizeof(OPREGION_SIGNATURE)];
 	int err = 0;
 	void *base;
-	const void *vbt = NULL;
-	u32 vbt_size = 0;
+	const void *vbt;
+	u32 vbt_size;
 
 	BUILD_BUG_ON(sizeof(struct opregion_header) != 0x100);
 	BUILD_BUG_ON(sizeof(struct opregion_acpi) != 0x100);
@@ -984,30 +984,29 @@ int intel_opregion_setup(struct drm_i915_private *dev_priv)
 					  MEMREMAP_WB);
 		vbt = opregion->rvda;
 		vbt_size = opregion->asle->rvds;
+		if (intel_bios_is_valid_vbt(vbt, vbt_size)) {
+			DRM_DEBUG_KMS("Found valid VBT in ACPI OpRegion (RVDA)\n");
+			opregion->vbt = vbt;
+			opregion->vbt_size = vbt_size;
+			goto out;
+		}
 	}
 
+	vbt = base + OPREGION_VBT_OFFSET;
+	/*
+	 * The VBT specification says that if the ASLE ext mailbox is not used
+	 * its area is reserved, but on some CHT boards the VBT extends into the
+	 * ASLE ext area. Allow this even though it is against the spec, so we
+	 * do not end up rejecting the VBT on those boards (and end up not
+	 * finding the LCD panel because of this).
+	 */
+	vbt_size = (mboxes & MBOX_ASLE_EXT) ?
+		OPREGION_ASLE_EXT_OFFSET : OPREGION_SIZE;
+	vbt_size -= OPREGION_VBT_OFFSET;
 	if (intel_bios_is_valid_vbt(vbt, vbt_size)) {
-		DRM_DEBUG_KMS("Found valid VBT in ACPI OpRegion (RVDA)\n");
+		DRM_DEBUG_KMS("Found valid VBT in ACPI OpRegion (Mailbox #4)\n");
 		opregion->vbt = vbt;
 		opregion->vbt_size = vbt_size;
-	} else {
-		vbt = base + OPREGION_VBT_OFFSET;
-		/*
-		 * The VBT specification says that if the ASLE ext mailbox is
-		 * not used its area is reserved, but on some CHT boards the VBT
-		 * extends into the ASLE ext area. Allow this even though it is
-		 * against the spec, so we do not end up rejecting the VBT on
-		 * those boards (and end up not finding the LCD panel because of
-		 * this).
-		 */
-		vbt_size = (mboxes & MBOX_ASLE_EXT) ?
-			OPREGION_ASLE_EXT_OFFSET : OPREGION_SIZE;
-		vbt_size -= OPREGION_VBT_OFFSET;
-		if (intel_bios_is_valid_vbt(vbt, vbt_size)) {
-			DRM_DEBUG_KMS("Found valid VBT in ACPI OpRegion (Mailbox #4)\n");
-			opregion->vbt = vbt;
-			opregion->vbt_size = vbt_size;
-		}
 	}
 
 out:
-- 
2.1.4

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

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

* [PATCH RESEND 3/4] drm/i915/opregion: debug log about invalid ACPI OpRegion VBT
  2017-03-29 10:32 [PATCH RESEND 1/4] drm/i915/opregion: bail out early for systems with no opregion VBT Jani Nikula
  2017-03-29 10:32 ` [PATCH RESEND 2/4] drm/i915/opregion: try to validate RVDA VBT only if it's there Jani Nikula
@ 2017-03-29 10:32 ` Jani Nikula
  2017-03-29 17:54   ` Bob Paauwe
  2017-03-29 10:32 ` [PATCH RESEND 4/4] drm/i915/opregion: let user specify override VBT via firmware load Jani Nikula
                   ` (2 subsequent siblings)
  4 siblings, 1 reply; 11+ messages in thread
From: Jani Nikula @ 2017-03-29 10:32 UTC (permalink / raw)
  To: intel-gfx; +Cc: jani.nikula

Leave more breadcrumbs for debuggers.

Signed-off-by: Jani Nikula <jani.nikula@intel.com>
---
 drivers/gpu/drm/i915/intel_opregion.c | 4 ++++
 1 file changed, 4 insertions(+)

diff --git a/drivers/gpu/drm/i915/intel_opregion.c b/drivers/gpu/drm/i915/intel_opregion.c
index 2b64cb6691eb..d44465190dc1 100644
--- a/drivers/gpu/drm/i915/intel_opregion.c
+++ b/drivers/gpu/drm/i915/intel_opregion.c
@@ -989,6 +989,8 @@ int intel_opregion_setup(struct drm_i915_private *dev_priv)
 			opregion->vbt = vbt;
 			opregion->vbt_size = vbt_size;
 			goto out;
+		} else {
+			DRM_DEBUG_KMS("Invalid VBT in ACPI OpRegion (RVDA)\n");
 		}
 	}
 
@@ -1007,6 +1009,8 @@ int intel_opregion_setup(struct drm_i915_private *dev_priv)
 		DRM_DEBUG_KMS("Found valid VBT in ACPI OpRegion (Mailbox #4)\n");
 		opregion->vbt = vbt;
 		opregion->vbt_size = vbt_size;
+	} else {
+		DRM_DEBUG_KMS("Invalid VBT in ACPI OpRegion (Mailbox #4)\n");
 	}
 
 out:
-- 
2.1.4

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

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

* [PATCH RESEND 4/4] drm/i915/opregion: let user specify override VBT via firmware load
  2017-03-29 10:32 [PATCH RESEND 1/4] drm/i915/opregion: bail out early for systems with no opregion VBT Jani Nikula
  2017-03-29 10:32 ` [PATCH RESEND 2/4] drm/i915/opregion: try to validate RVDA VBT only if it's there Jani Nikula
  2017-03-29 10:32 ` [PATCH RESEND 3/4] drm/i915/opregion: debug log about invalid ACPI OpRegion VBT Jani Nikula
@ 2017-03-29 10:32 ` Jani Nikula
  2017-03-29 17:57   ` Bob Paauwe
  2017-03-29 11:10 ` ✓ Fi.CI.BAT: success for series starting with [RESEND,1/4] drm/i915/opregion: bail out early for systems with no opregion VBT Patchwork
  2017-03-29 17:51 ` [PATCH RESEND 1/4] " Bob Paauwe
  4 siblings, 1 reply; 11+ messages in thread
From: Jani Nikula @ 2017-03-29 10:32 UTC (permalink / raw)
  To: intel-gfx; +Cc: jani.nikula

Sometimes it would be most enlightening to debug systems by replacing
the VBT to be used. For example, in the referenced bug the BIOS provides
different VBT depending on the boot mode (UEFI vs. legacy). It would be
interesting to try the failing boot mode with the VBT from the working
boot, and see if that makes a difference.

Add a module parameter to load the VBT using the firmware loader, not
unlike the EDID firmware mechanism.

As a starting point for experimenting, one can pick up the BIOS provided
VBT from /sys/kernel/debug/dri/0/i915_opregion/i915_vbt.

References: https://bugs.freedesktop.org/show_bug.cgi?id=97822#c83
Signed-off-by: Jani Nikula <jani.nikula@intel.com>
---
 drivers/gpu/drm/i915/i915_params.c    |  4 ++++
 drivers/gpu/drm/i915/i915_params.h    |  1 +
 drivers/gpu/drm/i915/intel_opregion.c | 40 +++++++++++++++++++++++++++++++++++
 3 files changed, 45 insertions(+)

diff --git a/drivers/gpu/drm/i915/i915_params.c b/drivers/gpu/drm/i915/i915_params.c
index b6a7e363d076..6d5d334f50b1 100644
--- a/drivers/gpu/drm/i915/i915_params.c
+++ b/drivers/gpu/drm/i915/i915_params.c
@@ -115,6 +115,10 @@ MODULE_PARM_DESC(vbt_sdvo_panel_type,
 	"Override/Ignore selection of SDVO panel mode in the VBT "
 	"(-2=ignore, -1=auto [default], index in VBT BIOS table)");
 
+module_param_named_unsafe(vbt_firmware, i915.vbt_firmware, charp, 0400);
+MODULE_PARM_DESC(vbt_firmware,
+		 "Load VBT from specified file under /lib/firmware");
+
 module_param_named_unsafe(reset, i915.reset, bool, 0600);
 MODULE_PARM_DESC(reset, "Attempt GPU resets (default: true)");
 
diff --git a/drivers/gpu/drm/i915/i915_params.h b/drivers/gpu/drm/i915/i915_params.h
index 34148cc8637c..0aeb106e06af 100644
--- a/drivers/gpu/drm/i915/i915_params.h
+++ b/drivers/gpu/drm/i915/i915_params.h
@@ -28,6 +28,7 @@
 #include <linux/cache.h> /* for __read_mostly */
 
 #define I915_PARAMS_FOR_EACH(func) \
+	func(char *, vbt_firmware); \
 	func(int, modeset); \
 	func(int, panel_ignore_lid); \
 	func(int, semaphores); \
diff --git a/drivers/gpu/drm/i915/intel_opregion.c b/drivers/gpu/drm/i915/intel_opregion.c
index d44465190dc1..7cbd801516ab 100644
--- a/drivers/gpu/drm/i915/intel_opregion.c
+++ b/drivers/gpu/drm/i915/intel_opregion.c
@@ -27,6 +27,7 @@
 
 #include <linux/acpi.h>
 #include <linux/dmi.h>
+#include <linux/firmware.h>
 #include <acpi/video.h>
 
 #include <drm/drmP.h>
@@ -912,6 +913,42 @@ static const struct dmi_system_id intel_no_opregion_vbt[] = {
 	{ }
 };
 
+static int intel_load_vbt_firmware(struct drm_i915_private *dev_priv)
+{
+	struct intel_opregion *opregion = &dev_priv->opregion;
+	const struct firmware *fw = NULL;
+	const char *name = i915.vbt_firmware;
+	int ret;
+
+	if (!name || !*name)
+		return -ENOENT;
+
+	ret = request_firmware(&fw, name, &dev_priv->drm.pdev->dev);
+	if (ret) {
+		DRM_ERROR("Requesting VBT firmware \"%s\" failed (%d)\n",
+			  name, ret);
+		return ret;
+	}
+
+	if (intel_bios_is_valid_vbt(fw->data, fw->size)) {
+		opregion->vbt = kmemdup(fw->data, fw->size, GFP_KERNEL);
+		if (opregion->vbt) {
+			DRM_DEBUG_KMS("Found valid VBT firmware \"%s\"\n", name);
+			opregion->vbt_size = fw->size;
+			ret = 0;
+		} else {
+			ret = -ENOMEM;
+		}
+	} else {
+		DRM_DEBUG_KMS("Invalid VBT firmware \"%s\"\n", name);
+		ret = -EINVAL;
+	}
+
+	release_firmware(fw);
+
+	return ret;
+}
+
 int intel_opregion_setup(struct drm_i915_private *dev_priv)
 {
 	struct intel_opregion *opregion = &dev_priv->opregion;
@@ -974,6 +1011,9 @@ int intel_opregion_setup(struct drm_i915_private *dev_priv)
 	if (mboxes & MBOX_ASLE_EXT)
 		DRM_DEBUG_DRIVER("ASLE extension supported\n");
 
+	if (!intel_load_vbt_firmware(dev_priv))
+		goto out;
+
 	if (dmi_check_system(intel_no_opregion_vbt))
 		goto out;
 
-- 
2.1.4

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

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

* ✓ Fi.CI.BAT: success for series starting with [RESEND,1/4] drm/i915/opregion: bail out early for systems with no opregion VBT
  2017-03-29 10:32 [PATCH RESEND 1/4] drm/i915/opregion: bail out early for systems with no opregion VBT Jani Nikula
                   ` (2 preceding siblings ...)
  2017-03-29 10:32 ` [PATCH RESEND 4/4] drm/i915/opregion: let user specify override VBT via firmware load Jani Nikula
@ 2017-03-29 11:10 ` Patchwork
  2017-03-29 17:51 ` [PATCH RESEND 1/4] " Bob Paauwe
  4 siblings, 0 replies; 11+ messages in thread
From: Patchwork @ 2017-03-29 11:10 UTC (permalink / raw)
  To: Jani Nikula; +Cc: intel-gfx

== Series Details ==

Series: series starting with [RESEND,1/4] drm/i915/opregion: bail out early for systems with no opregion VBT
URL   : https://patchwork.freedesktop.org/series/22075/
State : success

== Summary ==

Series 22075v1 Series without cover letter
https://patchwork.freedesktop.org/api/1.0/series/22075/revisions/1/mbox/

Test gem_exec_suspend:
        Subgroup basic-s4-devices:
                dmesg-warn -> PASS       (fi-snb-2600)
                dmesg-warn -> PASS       (fi-kbl-7560u) fdo#100428

fdo#100428 https://bugs.freedesktop.org/show_bug.cgi?id=100428

fi-bdw-5557u     total:278  pass:267  dwarn:0   dfail:0   fail:0   skip:11  time: 459s
fi-bdw-gvtdvm    total:278  pass:256  dwarn:8   dfail:0   fail:0   skip:14  time: 452s
fi-bsw-n3050     total:278  pass:239  dwarn:0   dfail:0   fail:0   skip:39  time: 598s
fi-bxt-j4205     total:278  pass:259  dwarn:0   dfail:0   fail:0   skip:19  time: 536s
fi-bxt-t5700     total:278  pass:258  dwarn:0   dfail:0   fail:0   skip:20  time: 579s
fi-byt-j1900     total:278  pass:251  dwarn:0   dfail:0   fail:0   skip:27  time: 504s
fi-byt-n2820     total:278  pass:247  dwarn:0   dfail:0   fail:0   skip:31  time: 498s
fi-hsw-4770      total:278  pass:262  dwarn:0   dfail:0   fail:0   skip:16  time: 434s
fi-hsw-4770r     total:278  pass:262  dwarn:0   dfail:0   fail:0   skip:16  time: 436s
fi-ilk-650       total:278  pass:228  dwarn:0   dfail:0   fail:0   skip:50  time: 440s
fi-ivb-3520m     total:278  pass:260  dwarn:0   dfail:0   fail:0   skip:18  time: 512s
fi-ivb-3770      total:278  pass:260  dwarn:0   dfail:0   fail:0   skip:18  time: 502s
fi-kbl-7500u     total:278  pass:260  dwarn:0   dfail:0   fail:0   skip:18  time: 477s
fi-kbl-7560u     total:278  pass:268  dwarn:0   dfail:0   fail:0   skip:10  time: 594s
fi-skl-6260u     total:278  pass:268  dwarn:0   dfail:0   fail:0   skip:10  time: 486s
fi-skl-6700hq    total:278  pass:261  dwarn:0   dfail:0   fail:0   skip:17  time: 604s
fi-skl-6700k     total:278  pass:256  dwarn:4   dfail:0   fail:0   skip:18  time: 488s
fi-skl-6770hq    total:278  pass:268  dwarn:0   dfail:0   fail:0   skip:10  time: 516s
fi-skl-gvtdvm    total:278  pass:265  dwarn:0   dfail:0   fail:0   skip:13  time: 470s
fi-snb-2520m     total:278  pass:250  dwarn:0   dfail:0   fail:0   skip:28  time: 549s
fi-snb-2600      total:278  pass:249  dwarn:0   dfail:0   fail:0   skip:29  time: 422s

1610e07cbf696204259f584fcc74fde1c16a4d29 drm-tip: 2017y-03m-29d-10h-12m-03s UTC integration manifest
748b27b drm/i915/opregion: let user specify override VBT via firmware load
4399a24 drm/i915/opregion: debug log about invalid ACPI OpRegion VBT
22aa1b0 drm/i915/opregion: try to validate RVDA VBT only if it's there
aae9dac drm/i915/opregion: bail out early for systems with no opregion VBT

== Logs ==

For more details see: https://intel-gfx-ci.01.org/CI/Patchwork_4338/
_______________________________________________
Intel-gfx mailing list
Intel-gfx@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/intel-gfx

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

* Re: [PATCH RESEND 1/4] drm/i915/opregion: bail out early for systems with no opregion VBT
  2017-03-29 10:32 [PATCH RESEND 1/4] drm/i915/opregion: bail out early for systems with no opregion VBT Jani Nikula
                   ` (3 preceding siblings ...)
  2017-03-29 11:10 ` ✓ Fi.CI.BAT: success for series starting with [RESEND,1/4] drm/i915/opregion: bail out early for systems with no opregion VBT Patchwork
@ 2017-03-29 17:51 ` Bob Paauwe
  4 siblings, 0 replies; 11+ messages in thread
From: Bob Paauwe @ 2017-03-29 17:51 UTC (permalink / raw)
  To: Jani Nikula; +Cc: intel-gfx

On Wed, 29 Mar 2017 13:32:55 +0300
Jani Nikula <jani.nikula@intel.com> wrote:

> Reduce indent. No functional changes.
> 
> Signed-off-by: Jani Nikula <jani.nikula@intel.com>

Reviewed-by: Bob Paauwe <bob.j.paauwe@intel.com>

> ---
>  drivers/gpu/drm/i915/intel_opregion.c | 64 +++++++++++++++++------------------
>  1 file changed, 32 insertions(+), 32 deletions(-)
> 
> diff --git a/drivers/gpu/drm/i915/intel_opregion.c b/drivers/gpu/drm/i915/intel_opregion.c
> index 441c01466384..76a39ee6d005 100644
> --- a/drivers/gpu/drm/i915/intel_opregion.c
> +++ b/drivers/gpu/drm/i915/intel_opregion.c
> @@ -920,6 +920,8 @@ int intel_opregion_setup(struct drm_i915_private *dev_priv)
>  	char buf[sizeof(OPREGION_SIGNATURE)];
>  	int err = 0;
>  	void *base;
> +	const void *vbt = NULL;
> +	u32 vbt_size = 0;
>  
>  	BUILD_BUG_ON(sizeof(struct opregion_header) != 0x100);
>  	BUILD_BUG_ON(sizeof(struct opregion_acpi) != 0x100);
> @@ -972,45 +974,43 @@ int intel_opregion_setup(struct drm_i915_private *dev_priv)
>  	if (mboxes & MBOX_ASLE_EXT)
>  		DRM_DEBUG_DRIVER("ASLE extension supported\n");
>  
> -	if (!dmi_check_system(intel_no_opregion_vbt)) {
> -		const void *vbt = NULL;
> -		u32 vbt_size = 0;
> -
> -		if (opregion->header->opregion_ver >= 2 && opregion->asle &&
> -		    opregion->asle->rvda && opregion->asle->rvds) {
> -			opregion->rvda = memremap(opregion->asle->rvda,
> -						  opregion->asle->rvds,
> -						  MEMREMAP_WB);
> -			vbt = opregion->rvda;
> -			vbt_size = opregion->asle->rvds;
> -		}
> +	if (dmi_check_system(intel_no_opregion_vbt))
> +		goto out;
> +
> +	if (opregion->header->opregion_ver >= 2 && opregion->asle &&
> +	    opregion->asle->rvda && opregion->asle->rvds) {
> +		opregion->rvda = memremap(opregion->asle->rvda,
> +					  opregion->asle->rvds,
> +					  MEMREMAP_WB);
> +		vbt = opregion->rvda;
> +		vbt_size = opregion->asle->rvds;
> +	}
>  
> +	if (intel_bios_is_valid_vbt(vbt, vbt_size)) {
> +		DRM_DEBUG_KMS("Found valid VBT in ACPI OpRegion (RVDA)\n");
> +		opregion->vbt = vbt;
> +		opregion->vbt_size = vbt_size;
> +	} else {
> +		vbt = base + OPREGION_VBT_OFFSET;
> +		/*
> +		 * The VBT specification says that if the ASLE ext mailbox is
> +		 * not used its area is reserved, but on some CHT boards the VBT
> +		 * extends into the ASLE ext area. Allow this even though it is
> +		 * against the spec, so we do not end up rejecting the VBT on
> +		 * those boards (and end up not finding the LCD panel because of
> +		 * this).
> +		 */
> +		vbt_size = (mboxes & MBOX_ASLE_EXT) ?
> +			OPREGION_ASLE_EXT_OFFSET : OPREGION_SIZE;
> +		vbt_size -= OPREGION_VBT_OFFSET;
>  		if (intel_bios_is_valid_vbt(vbt, vbt_size)) {
> -			DRM_DEBUG_KMS("Found valid VBT in ACPI OpRegion (RVDA)\n");
> +			DRM_DEBUG_KMS("Found valid VBT in ACPI OpRegion (Mailbox #4)\n");
>  			opregion->vbt = vbt;
>  			opregion->vbt_size = vbt_size;
> -		} else {
> -			vbt = base + OPREGION_VBT_OFFSET;
> -			/*
> -			 * The VBT specification says that if the ASLE ext
> -			 * mailbox is not used its area is reserved, but
> -			 * on some CHT boards the VBT extends into the
> -			 * ASLE ext area. Allow this even though it is
> -			 * against the spec, so we do not end up rejecting
> -			 * the VBT on those boards (and end up not finding the
> -			 * LCD panel because of this).
> -			 */
> -			vbt_size = (mboxes & MBOX_ASLE_EXT) ?
> -				OPREGION_ASLE_EXT_OFFSET : OPREGION_SIZE;
> -			vbt_size -= OPREGION_VBT_OFFSET;
> -			if (intel_bios_is_valid_vbt(vbt, vbt_size)) {
> -				DRM_DEBUG_KMS("Found valid VBT in ACPI OpRegion (Mailbox #4)\n");
> -				opregion->vbt = vbt;
> -				opregion->vbt_size = vbt_size;
> -			}
>  		}
>  	}
>  
> +out:
>  	return 0;
>  
>  err_out:



-- 
--
Bob Paauwe                  
Bob.J.Paauwe@intel.com
IOTG / PED Software Organization
Intel Corp.  Folsom, CA
(916) 356-6193    

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

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

* Re: [PATCH RESEND 2/4] drm/i915/opregion: try to validate RVDA VBT only if it's there
  2017-03-29 10:32 ` [PATCH RESEND 2/4] drm/i915/opregion: try to validate RVDA VBT only if it's there Jani Nikula
@ 2017-03-29 17:53   ` Bob Paauwe
  0 siblings, 0 replies; 11+ messages in thread
From: Bob Paauwe @ 2017-03-29 17:53 UTC (permalink / raw)
  To: Jani Nikula; +Cc: intel-gfx

On Wed, 29 Mar 2017 13:32:56 +0300
Jani Nikula <jani.nikula@intel.com> wrote:

> Seems more sensible this way, and reduces indent for the more common
> case.
> 
> Signed-off-by: Jani Nikula <jani.nikula@intel.com>

Reviewed-by: Bob Paauwe <bob.j.paauwe@intel.com>

> ---
>  drivers/gpu/drm/i915/intel_opregion.c | 41 +++++++++++++++++------------------
>  1 file changed, 20 insertions(+), 21 deletions(-)
> 
> diff --git a/drivers/gpu/drm/i915/intel_opregion.c b/drivers/gpu/drm/i915/intel_opregion.c
> index 76a39ee6d005..2b64cb6691eb 100644
> --- a/drivers/gpu/drm/i915/intel_opregion.c
> +++ b/drivers/gpu/drm/i915/intel_opregion.c
> @@ -920,8 +920,8 @@ int intel_opregion_setup(struct drm_i915_private *dev_priv)
>  	char buf[sizeof(OPREGION_SIGNATURE)];
>  	int err = 0;
>  	void *base;
> -	const void *vbt = NULL;
> -	u32 vbt_size = 0;
> +	const void *vbt;
> +	u32 vbt_size;
>  
>  	BUILD_BUG_ON(sizeof(struct opregion_header) != 0x100);
>  	BUILD_BUG_ON(sizeof(struct opregion_acpi) != 0x100);
> @@ -984,30 +984,29 @@ int intel_opregion_setup(struct drm_i915_private *dev_priv)
>  					  MEMREMAP_WB);
>  		vbt = opregion->rvda;
>  		vbt_size = opregion->asle->rvds;
> +		if (intel_bios_is_valid_vbt(vbt, vbt_size)) {
> +			DRM_DEBUG_KMS("Found valid VBT in ACPI OpRegion (RVDA)\n");
> +			opregion->vbt = vbt;
> +			opregion->vbt_size = vbt_size;
> +			goto out;
> +		}
>  	}
>  
> +	vbt = base + OPREGION_VBT_OFFSET;
> +	/*
> +	 * The VBT specification says that if the ASLE ext mailbox is not used
> +	 * its area is reserved, but on some CHT boards the VBT extends into the
> +	 * ASLE ext area. Allow this even though it is against the spec, so we
> +	 * do not end up rejecting the VBT on those boards (and end up not
> +	 * finding the LCD panel because of this).
> +	 */
> +	vbt_size = (mboxes & MBOX_ASLE_EXT) ?
> +		OPREGION_ASLE_EXT_OFFSET : OPREGION_SIZE;
> +	vbt_size -= OPREGION_VBT_OFFSET;
>  	if (intel_bios_is_valid_vbt(vbt, vbt_size)) {
> -		DRM_DEBUG_KMS("Found valid VBT in ACPI OpRegion (RVDA)\n");
> +		DRM_DEBUG_KMS("Found valid VBT in ACPI OpRegion (Mailbox #4)\n");
>  		opregion->vbt = vbt;
>  		opregion->vbt_size = vbt_size;
> -	} else {
> -		vbt = base + OPREGION_VBT_OFFSET;
> -		/*
> -		 * The VBT specification says that if the ASLE ext mailbox is
> -		 * not used its area is reserved, but on some CHT boards the VBT
> -		 * extends into the ASLE ext area. Allow this even though it is
> -		 * against the spec, so we do not end up rejecting the VBT on
> -		 * those boards (and end up not finding the LCD panel because of
> -		 * this).
> -		 */
> -		vbt_size = (mboxes & MBOX_ASLE_EXT) ?
> -			OPREGION_ASLE_EXT_OFFSET : OPREGION_SIZE;
> -		vbt_size -= OPREGION_VBT_OFFSET;
> -		if (intel_bios_is_valid_vbt(vbt, vbt_size)) {
> -			DRM_DEBUG_KMS("Found valid VBT in ACPI OpRegion (Mailbox #4)\n");
> -			opregion->vbt = vbt;
> -			opregion->vbt_size = vbt_size;
> -		}
>  	}
>  
>  out:



-- 
--
Bob Paauwe                  
Bob.J.Paauwe@intel.com
IOTG / PED Software Organization
Intel Corp.  Folsom, CA
(916) 356-6193    

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

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

* Re: [PATCH RESEND 3/4] drm/i915/opregion: debug log about invalid ACPI OpRegion VBT
  2017-03-29 10:32 ` [PATCH RESEND 3/4] drm/i915/opregion: debug log about invalid ACPI OpRegion VBT Jani Nikula
@ 2017-03-29 17:54   ` Bob Paauwe
  0 siblings, 0 replies; 11+ messages in thread
From: Bob Paauwe @ 2017-03-29 17:54 UTC (permalink / raw)
  To: Jani Nikula; +Cc: intel-gfx

On Wed, 29 Mar 2017 13:32:57 +0300
Jani Nikula <jani.nikula@intel.com> wrote:

> Leave more breadcrumbs for debuggers.
> 
> Signed-off-by: Jani Nikula <jani.nikula@intel.com>

Reviewed-by: Bob Paauwe <bob.j.paauwe@intel.com>

> ---
>  drivers/gpu/drm/i915/intel_opregion.c | 4 ++++
>  1 file changed, 4 insertions(+)
> 
> diff --git a/drivers/gpu/drm/i915/intel_opregion.c b/drivers/gpu/drm/i915/intel_opregion.c
> index 2b64cb6691eb..d44465190dc1 100644
> --- a/drivers/gpu/drm/i915/intel_opregion.c
> +++ b/drivers/gpu/drm/i915/intel_opregion.c
> @@ -989,6 +989,8 @@ int intel_opregion_setup(struct drm_i915_private *dev_priv)
>  			opregion->vbt = vbt;
>  			opregion->vbt_size = vbt_size;
>  			goto out;
> +		} else {
> +			DRM_DEBUG_KMS("Invalid VBT in ACPI OpRegion (RVDA)\n");
>  		}
>  	}
>  
> @@ -1007,6 +1009,8 @@ int intel_opregion_setup(struct drm_i915_private *dev_priv)
>  		DRM_DEBUG_KMS("Found valid VBT in ACPI OpRegion (Mailbox #4)\n");
>  		opregion->vbt = vbt;
>  		opregion->vbt_size = vbt_size;
> +	} else {
> +		DRM_DEBUG_KMS("Invalid VBT in ACPI OpRegion (Mailbox #4)\n");
>  	}
>  
>  out:



-- 
--
Bob Paauwe                  
Bob.J.Paauwe@intel.com
IOTG / PED Software Organization
Intel Corp.  Folsom, CA
(916) 356-6193    

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

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

* Re: [PATCH RESEND 4/4] drm/i915/opregion: let user specify override VBT via firmware load
  2017-03-29 10:32 ` [PATCH RESEND 4/4] drm/i915/opregion: let user specify override VBT via firmware load Jani Nikula
@ 2017-03-29 17:57   ` Bob Paauwe
  2017-03-30  6:22     ` Jani Nikula
  0 siblings, 1 reply; 11+ messages in thread
From: Bob Paauwe @ 2017-03-29 17:57 UTC (permalink / raw)
  To: Jani Nikula; +Cc: intel-gfx

On Wed, 29 Mar 2017 13:32:58 +0300
Jani Nikula <jani.nikula@intel.com> wrote:

> Sometimes it would be most enlightening to debug systems by replacing
> the VBT to be used. For example, in the referenced bug the BIOS provides
> different VBT depending on the boot mode (UEFI vs. legacy). It would be
> interesting to try the failing boot mode with the VBT from the working
> boot, and see if that makes a difference.
> 
> Add a module parameter to load the VBT using the firmware loader, not
> unlike the EDID firmware mechanism.
> 
> As a starting point for experimenting, one can pick up the BIOS provided
> VBT from /sys/kernel/debug/dri/0/i915_opregion/i915_vbt.

Jani,

I really like this idea and believe that it will be useful.  Thanks for
doing this!

> 
> References: https://bugs.freedesktop.org/show_bug.cgi?id=97822#c83
> Signed-off-by: Jani Nikula <jani.nikula@intel.com>
> ---
>  drivers/gpu/drm/i915/i915_params.c    |  4 ++++
>  drivers/gpu/drm/i915/i915_params.h    |  1 +
>  drivers/gpu/drm/i915/intel_opregion.c | 40 +++++++++++++++++++++++++++++++++++
>  3 files changed, 45 insertions(+)
> 
> diff --git a/drivers/gpu/drm/i915/i915_params.c b/drivers/gpu/drm/i915/i915_params.c
> index b6a7e363d076..6d5d334f50b1 100644
> --- a/drivers/gpu/drm/i915/i915_params.c
> +++ b/drivers/gpu/drm/i915/i915_params.c
> @@ -115,6 +115,10 @@ MODULE_PARM_DESC(vbt_sdvo_panel_type,
>  	"Override/Ignore selection of SDVO panel mode in the VBT "
>  	"(-2=ignore, -1=auto [default], index in VBT BIOS table)");
>  
> +module_param_named_unsafe(vbt_firmware, i915.vbt_firmware, charp, 0400);
> +MODULE_PARM_DESC(vbt_firmware,
> +		 "Load VBT from specified file under /lib/firmware");
> +
>  module_param_named_unsafe(reset, i915.reset, bool, 0600);
>  MODULE_PARM_DESC(reset, "Attempt GPU resets (default: true)");
>  
> diff --git a/drivers/gpu/drm/i915/i915_params.h b/drivers/gpu/drm/i915/i915_params.h
> index 34148cc8637c..0aeb106e06af 100644
> --- a/drivers/gpu/drm/i915/i915_params.h
> +++ b/drivers/gpu/drm/i915/i915_params.h
> @@ -28,6 +28,7 @@
>  #include <linux/cache.h> /* for __read_mostly */
>  
>  #define I915_PARAMS_FOR_EACH(func) \
> +	func(char *, vbt_firmware); \
>  	func(int, modeset); \
>  	func(int, panel_ignore_lid); \
>  	func(int, semaphores); \
> diff --git a/drivers/gpu/drm/i915/intel_opregion.c b/drivers/gpu/drm/i915/intel_opregion.c
> index d44465190dc1..7cbd801516ab 100644
> --- a/drivers/gpu/drm/i915/intel_opregion.c
> +++ b/drivers/gpu/drm/i915/intel_opregion.c
> @@ -27,6 +27,7 @@
>  
>  #include <linux/acpi.h>
>  #include <linux/dmi.h>
> +#include <linux/firmware.h>
>  #include <acpi/video.h>
>  
>  #include <drm/drmP.h>
> @@ -912,6 +913,42 @@ static const struct dmi_system_id intel_no_opregion_vbt[] = {
>  	{ }
>  };
>  
> +static int intel_load_vbt_firmware(struct drm_i915_private *dev_priv)
> +{
> +	struct intel_opregion *opregion = &dev_priv->opregion;
> +	const struct firmware *fw = NULL;
> +	const char *name = i915.vbt_firmware;
> +	int ret;
> +
> +	if (!name || !*name)
> +		return -ENOENT;
> +
> +	ret = request_firmware(&fw, name, &dev_priv->drm.pdev->dev);
> +	if (ret) {
> +		DRM_ERROR("Requesting VBT firmware \"%s\" failed (%d)\n",
> +			  name, ret);
> +		return ret;
> +	}
> +
> +	if (intel_bios_is_valid_vbt(fw->data, fw->size)) {
> +		opregion->vbt = kmemdup(fw->data, fw->size, GFP_KERNEL);
> +		if (opregion->vbt) {
> +			DRM_DEBUG_KMS("Found valid VBT firmware \"%s\"\n", name);
> +			opregion->vbt_size = fw->size;
> +			ret = 0;
> +		} else {
> +			ret = -ENOMEM;

Since the errors propagated, it might be a good idea to add a debug
message here too.

> +		}
> +	} else {
> +		DRM_DEBUG_KMS("Invalid VBT firmware \"%s\"\n", name);
> +		ret = -EINVAL;
> +	}
> +
> +	release_firmware(fw);
> +
> +	return ret;
> +}
> +
>  int intel_opregion_setup(struct drm_i915_private *dev_priv)
>  {
>  	struct intel_opregion *opregion = &dev_priv->opregion;
> @@ -974,6 +1011,9 @@ int intel_opregion_setup(struct drm_i915_private *dev_priv)
>  	if (mboxes & MBOX_ASLE_EXT)
>  		DRM_DEBUG_DRIVER("ASLE extension supported\n");
>  
> +	if (!intel_load_vbt_firmware(dev_priv))
> +		goto out;

I find the condition a bit confusing. It reads to me as "if firmware
not loaded, goto out" which is backwards from what it's really doing.
Since you're ignoring the error return value anyway, making 
intel_load_vbt_firmware() a boolean it would make it read better.

However, if you have some future plan to propagate errors, then keep
I'm fine with it all as is.

> +
>  	if (dmi_check_system(intel_no_opregion_vbt))
>  		goto out;
>  



-- 
--
Bob Paauwe                  
Bob.J.Paauwe@intel.com
IOTG / PED Software Organization
Intel Corp.  Folsom, CA
(916) 356-6193    

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

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

* Re: [PATCH RESEND 4/4] drm/i915/opregion: let user specify override VBT via firmware load
  2017-03-29 17:57   ` Bob Paauwe
@ 2017-03-30  6:22     ` Jani Nikula
  2017-03-30 17:31       ` Bob Paauwe
  0 siblings, 1 reply; 11+ messages in thread
From: Jani Nikula @ 2017-03-30  6:22 UTC (permalink / raw)
  To: Bob Paauwe; +Cc: intel-gfx

On Wed, 29 Mar 2017, Bob Paauwe <bob.j.paauwe@intel.com> wrote:
> On Wed, 29 Mar 2017 13:32:58 +0300
> Jani Nikula <jani.nikula@intel.com> wrote:
>
>> Sometimes it would be most enlightening to debug systems by replacing
>> the VBT to be used. For example, in the referenced bug the BIOS provides
>> different VBT depending on the boot mode (UEFI vs. legacy). It would be
>> interesting to try the failing boot mode with the VBT from the working
>> boot, and see if that makes a difference.
>> 
>> Add a module parameter to load the VBT using the firmware loader, not
>> unlike the EDID firmware mechanism.
>> 
>> As a starting point for experimenting, one can pick up the BIOS provided
>> VBT from /sys/kernel/debug/dri/0/i915_opregion/i915_vbt.
>
> Jani,
>
> I really like this idea and believe that it will be useful.  Thanks for
> doing this!

Thanks for the review! I pushed patches 1-3 to drm-intel-next-queued.

>> 
>> References: https://bugs.freedesktop.org/show_bug.cgi?id=97822#c83
>> Signed-off-by: Jani Nikula <jani.nikula@intel.com>
>> ---
>>  drivers/gpu/drm/i915/i915_params.c    |  4 ++++
>>  drivers/gpu/drm/i915/i915_params.h    |  1 +
>>  drivers/gpu/drm/i915/intel_opregion.c | 40 +++++++++++++++++++++++++++++++++++
>>  3 files changed, 45 insertions(+)
>> 
>> diff --git a/drivers/gpu/drm/i915/i915_params.c b/drivers/gpu/drm/i915/i915_params.c
>> index b6a7e363d076..6d5d334f50b1 100644
>> --- a/drivers/gpu/drm/i915/i915_params.c
>> +++ b/drivers/gpu/drm/i915/i915_params.c
>> @@ -115,6 +115,10 @@ MODULE_PARM_DESC(vbt_sdvo_panel_type,
>>  	"Override/Ignore selection of SDVO panel mode in the VBT "
>>  	"(-2=ignore, -1=auto [default], index in VBT BIOS table)");
>>  
>> +module_param_named_unsafe(vbt_firmware, i915.vbt_firmware, charp, 0400);
>> +MODULE_PARM_DESC(vbt_firmware,
>> +		 "Load VBT from specified file under /lib/firmware");
>> +
>>  module_param_named_unsafe(reset, i915.reset, bool, 0600);
>>  MODULE_PARM_DESC(reset, "Attempt GPU resets (default: true)");
>>  
>> diff --git a/drivers/gpu/drm/i915/i915_params.h b/drivers/gpu/drm/i915/i915_params.h
>> index 34148cc8637c..0aeb106e06af 100644
>> --- a/drivers/gpu/drm/i915/i915_params.h
>> +++ b/drivers/gpu/drm/i915/i915_params.h
>> @@ -28,6 +28,7 @@
>>  #include <linux/cache.h> /* for __read_mostly */
>>  
>>  #define I915_PARAMS_FOR_EACH(func) \
>> +	func(char *, vbt_firmware); \
>>  	func(int, modeset); \
>>  	func(int, panel_ignore_lid); \
>>  	func(int, semaphores); \
>> diff --git a/drivers/gpu/drm/i915/intel_opregion.c b/drivers/gpu/drm/i915/intel_opregion.c
>> index d44465190dc1..7cbd801516ab 100644
>> --- a/drivers/gpu/drm/i915/intel_opregion.c
>> +++ b/drivers/gpu/drm/i915/intel_opregion.c
>> @@ -27,6 +27,7 @@
>>  
>>  #include <linux/acpi.h>
>>  #include <linux/dmi.h>
>> +#include <linux/firmware.h>
>>  #include <acpi/video.h>
>>  
>>  #include <drm/drmP.h>
>> @@ -912,6 +913,42 @@ static const struct dmi_system_id intel_no_opregion_vbt[] = {
>>  	{ }
>>  };
>>  
>> +static int intel_load_vbt_firmware(struct drm_i915_private *dev_priv)
>> +{
>> +	struct intel_opregion *opregion = &dev_priv->opregion;
>> +	const struct firmware *fw = NULL;
>> +	const char *name = i915.vbt_firmware;
>> +	int ret;
>> +
>> +	if (!name || !*name)
>> +		return -ENOENT;
>> +
>> +	ret = request_firmware(&fw, name, &dev_priv->drm.pdev->dev);
>> +	if (ret) {
>> +		DRM_ERROR("Requesting VBT firmware \"%s\" failed (%d)\n",
>> +			  name, ret);
>> +		return ret;
>> +	}
>> +
>> +	if (intel_bios_is_valid_vbt(fw->data, fw->size)) {
>> +		opregion->vbt = kmemdup(fw->data, fw->size, GFP_KERNEL);
>> +		if (opregion->vbt) {
>> +			DRM_DEBUG_KMS("Found valid VBT firmware \"%s\"\n", name);
>> +			opregion->vbt_size = fw->size;
>> +			ret = 0;
>> +		} else {
>> +			ret = -ENOMEM;
>
> Since the errors propagated, it might be a good idea to add a debug
> message here too.

Will add.

>
>> +		}
>> +	} else {
>> +		DRM_DEBUG_KMS("Invalid VBT firmware \"%s\"\n", name);
>> +		ret = -EINVAL;
>> +	}
>> +
>> +	release_firmware(fw);
>> +
>> +	return ret;
>> +}
>> +
>>  int intel_opregion_setup(struct drm_i915_private *dev_priv)
>>  {
>>  	struct intel_opregion *opregion = &dev_priv->opregion;
>> @@ -974,6 +1011,9 @@ int intel_opregion_setup(struct drm_i915_private *dev_priv)
>>  	if (mboxes & MBOX_ASLE_EXT)
>>  		DRM_DEBUG_DRIVER("ASLE extension supported\n");
>>  
>> +	if (!intel_load_vbt_firmware(dev_priv))
>> +		goto out;
>
> I find the condition a bit confusing. It reads to me as "if firmware
> not loaded, goto out" which is backwards from what it's really doing.
> Since you're ignoring the error return value anyway, making 
> intel_load_vbt_firmware() a boolean it would make it read better.
>
> However, if you have some future plan to propagate errors, then keep
> I'm fine with it all as is.

Would this be clearer?

	if (intel_load_vbt_firmware(dev_priv) == 0)
		goto out;

BR,
Jani.

>
>> +
>>  	if (dmi_check_system(intel_no_opregion_vbt))
>>  		goto out;
>>  

-- 
Jani Nikula, Intel Open Source Technology Center
_______________________________________________
Intel-gfx mailing list
Intel-gfx@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/intel-gfx

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

* Re: [PATCH RESEND 4/4] drm/i915/opregion: let user specify override VBT via firmware load
  2017-03-30  6:22     ` Jani Nikula
@ 2017-03-30 17:31       ` Bob Paauwe
  0 siblings, 0 replies; 11+ messages in thread
From: Bob Paauwe @ 2017-03-30 17:31 UTC (permalink / raw)
  To: Jani Nikula; +Cc: intel-gfx

On Thu, 30 Mar 2017 09:22:19 +0300
Jani Nikula <jani.nikula@intel.com> wrote:

> On Wed, 29 Mar 2017, Bob Paauwe <bob.j.paauwe@intel.com> wrote:
> > On Wed, 29 Mar 2017 13:32:58 +0300
> > Jani Nikula <jani.nikula@intel.com> wrote:
> >  
> >> Sometimes it would be most enlightening to debug systems by replacing
> >> the VBT to be used. For example, in the referenced bug the BIOS provides
> >> different VBT depending on the boot mode (UEFI vs. legacy). It would be
> >> interesting to try the failing boot mode with the VBT from the working
> >> boot, and see if that makes a difference.
> >> 
> >> Add a module parameter to load the VBT using the firmware loader, not
> >> unlike the EDID firmware mechanism.
> >> 
> >> As a starting point for experimenting, one can pick up the BIOS provided
> >> VBT from /sys/kernel/debug/dri/0/i915_opregion/i915_vbt.  
> >
> > Jani,
> >
> > I really like this idea and believe that it will be useful.  Thanks for
> > doing this!  
> 
> Thanks for the review! I pushed patches 1-3 to drm-intel-next-queued.
> 
> >> 
> >> References: https://bugs.freedesktop.org/show_bug.cgi?id=97822#c83
> >> Signed-off-by: Jani Nikula <jani.nikula@intel.com>
> >> ---
> >>  drivers/gpu/drm/i915/i915_params.c    |  4 ++++
> >>  drivers/gpu/drm/i915/i915_params.h    |  1 +
> >>  drivers/gpu/drm/i915/intel_opregion.c | 40 +++++++++++++++++++++++++++++++++++
> >>  3 files changed, 45 insertions(+)
> >> 
> >> diff --git a/drivers/gpu/drm/i915/i915_params.c b/drivers/gpu/drm/i915/i915_params.c
> >> index b6a7e363d076..6d5d334f50b1 100644
> >> --- a/drivers/gpu/drm/i915/i915_params.c
> >> +++ b/drivers/gpu/drm/i915/i915_params.c
> >> @@ -115,6 +115,10 @@ MODULE_PARM_DESC(vbt_sdvo_panel_type,
> >>  	"Override/Ignore selection of SDVO panel mode in the VBT "
> >>  	"(-2=ignore, -1=auto [default], index in VBT BIOS table)");
> >>  
> >> +module_param_named_unsafe(vbt_firmware, i915.vbt_firmware, charp, 0400);
> >> +MODULE_PARM_DESC(vbt_firmware,
> >> +		 "Load VBT from specified file under /lib/firmware");
> >> +
> >>  module_param_named_unsafe(reset, i915.reset, bool, 0600);
> >>  MODULE_PARM_DESC(reset, "Attempt GPU resets (default: true)");
> >>  
> >> diff --git a/drivers/gpu/drm/i915/i915_params.h b/drivers/gpu/drm/i915/i915_params.h
> >> index 34148cc8637c..0aeb106e06af 100644
> >> --- a/drivers/gpu/drm/i915/i915_params.h
> >> +++ b/drivers/gpu/drm/i915/i915_params.h
> >> @@ -28,6 +28,7 @@
> >>  #include <linux/cache.h> /* for __read_mostly */
> >>  
> >>  #define I915_PARAMS_FOR_EACH(func) \
> >> +	func(char *, vbt_firmware); \
> >>  	func(int, modeset); \
> >>  	func(int, panel_ignore_lid); \
> >>  	func(int, semaphores); \
> >> diff --git a/drivers/gpu/drm/i915/intel_opregion.c b/drivers/gpu/drm/i915/intel_opregion.c
> >> index d44465190dc1..7cbd801516ab 100644
> >> --- a/drivers/gpu/drm/i915/intel_opregion.c
> >> +++ b/drivers/gpu/drm/i915/intel_opregion.c
> >> @@ -27,6 +27,7 @@
> >>  
> >>  #include <linux/acpi.h>
> >>  #include <linux/dmi.h>
> >> +#include <linux/firmware.h>
> >>  #include <acpi/video.h>
> >>  
> >>  #include <drm/drmP.h>
> >> @@ -912,6 +913,42 @@ static const struct dmi_system_id intel_no_opregion_vbt[] = {
> >>  	{ }
> >>  };
> >>  
> >> +static int intel_load_vbt_firmware(struct drm_i915_private *dev_priv)
> >> +{
> >> +	struct intel_opregion *opregion = &dev_priv->opregion;
> >> +	const struct firmware *fw = NULL;
> >> +	const char *name = i915.vbt_firmware;
> >> +	int ret;
> >> +
> >> +	if (!name || !*name)
> >> +		return -ENOENT;
> >> +
> >> +	ret = request_firmware(&fw, name, &dev_priv->drm.pdev->dev);
> >> +	if (ret) {
> >> +		DRM_ERROR("Requesting VBT firmware \"%s\" failed (%d)\n",
> >> +			  name, ret);
> >> +		return ret;
> >> +	}
> >> +
> >> +	if (intel_bios_is_valid_vbt(fw->data, fw->size)) {
> >> +		opregion->vbt = kmemdup(fw->data, fw->size, GFP_KERNEL);
> >> +		if (opregion->vbt) {
> >> +			DRM_DEBUG_KMS("Found valid VBT firmware \"%s\"\n", name);
> >> +			opregion->vbt_size = fw->size;
> >> +			ret = 0;
> >> +		} else {
> >> +			ret = -ENOMEM;  
> >
> > Since the errors propagated, it might be a good idea to add a debug
> > message here too.  
> 
> Will add.
> 
> >  
> >> +		}
> >> +	} else {
> >> +		DRM_DEBUG_KMS("Invalid VBT firmware \"%s\"\n", name);
> >> +		ret = -EINVAL;
> >> +	}
> >> +
> >> +	release_firmware(fw);
> >> +
> >> +	return ret;
> >> +}
> >> +
> >>  int intel_opregion_setup(struct drm_i915_private *dev_priv)
> >>  {
> >>  	struct intel_opregion *opregion = &dev_priv->opregion;
> >> @@ -974,6 +1011,9 @@ int intel_opregion_setup(struct drm_i915_private *dev_priv)
> >>  	if (mboxes & MBOX_ASLE_EXT)
> >>  		DRM_DEBUG_DRIVER("ASLE extension supported\n");
> >>  
> >> +	if (!intel_load_vbt_firmware(dev_priv))
> >> +		goto out;  
> >
> > I find the condition a bit confusing. It reads to me as "if firmware
> > not loaded, goto out" which is backwards from what it's really doing.
> > Since you're ignoring the error return value anyway, making 
> > intel_load_vbt_firmware() a boolean it would make it read better.
> >
> > However, if you have some future plan to propagate errors, then keep
> > I'm fine with it all as is.  
> 
> Would this be clearer?
> 
> 	if (intel_load_vbt_firmware(dev_priv) == 0)
> 		goto out;
> 

Yes, I think so.  zero as a successful return value is common so I
think this better says that if we successfully load the firmware, we're
done.

With this an the above change

Reviewed-by: Bob Paauwe <bob.j.paauwe@intel.com>

I know this capability would have been helpful to me in the past
where I instead was modifying the vbt parsing code to inject the
changes I needed.


> BR,
> Jani.
> 
> >  
> >> +
> >>  	if (dmi_check_system(intel_no_opregion_vbt))
> >>  		goto out;
> >>    
> 



-- 
--
Bob Paauwe                  
Bob.J.Paauwe@intel.com
IOTG / PED Software Organization
Intel Corp.  Folsom, CA
(916) 356-6193    

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

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

end of thread, other threads:[~2017-03-30 17:31 UTC | newest]

Thread overview: 11+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2017-03-29 10:32 [PATCH RESEND 1/4] drm/i915/opregion: bail out early for systems with no opregion VBT Jani Nikula
2017-03-29 10:32 ` [PATCH RESEND 2/4] drm/i915/opregion: try to validate RVDA VBT only if it's there Jani Nikula
2017-03-29 17:53   ` Bob Paauwe
2017-03-29 10:32 ` [PATCH RESEND 3/4] drm/i915/opregion: debug log about invalid ACPI OpRegion VBT Jani Nikula
2017-03-29 17:54   ` Bob Paauwe
2017-03-29 10:32 ` [PATCH RESEND 4/4] drm/i915/opregion: let user specify override VBT via firmware load Jani Nikula
2017-03-29 17:57   ` Bob Paauwe
2017-03-30  6:22     ` Jani Nikula
2017-03-30 17:31       ` Bob Paauwe
2017-03-29 11:10 ` ✓ Fi.CI.BAT: success for series starting with [RESEND,1/4] drm/i915/opregion: bail out early for systems with no opregion VBT Patchwork
2017-03-29 17:51 ` [PATCH RESEND 1/4] " Bob Paauwe

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.