* [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
* 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
* [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
* 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
* [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
* 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
* ✓ 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
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.