Skip to content

Commit 04ebaad

Browse files
committed
drm/i915/opregion: handle VBT sizes bigger than 6 KB
The RVDA and RVDS (raw VBT data address and size) fields of the ASLE mailbox may specify an alternate location for VBT instead of mailbox #4. Use the alternate location if available and valid, falling back to mailbox #4 otherwise. v2: Update debug logging (Ville) Reviewed-by: Ville Syrjälä <ville.syrjala@linux.intel.com> Tested-by: Mika Kahola <mika.kahola@intel.com> Signed-off-by: Jani Nikula <jani.nikula@intel.com> Link: http://patchwork.freedesktop.org/patch/msgid/1450178280-28020-1-git-send-email-jani.nikula@intel.com
1 parent ffc85da commit 04ebaad

File tree

2 files changed

+25
-3
lines changed

2 files changed

+25
-3
lines changed

drivers/gpu/drm/i915/i915_drv.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -458,6 +458,7 @@ struct intel_opregion {
458458
u32 swsci_gbda_sub_functions;
459459
u32 swsci_sbcb_sub_functions;
460460
struct opregion_asle *asle;
461+
void *rvda;
461462
const void *vbt;
462463
u32 vbt_size;
463464
u32 *lid_state;

drivers/gpu/drm/i915/intel_opregion.c

Lines changed: 24 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -837,6 +837,10 @@ void intel_opregion_fini(struct drm_device *dev)
837837

838838
/* just clear all opregion memory pointers now */
839839
memunmap(opregion->header);
840+
if (opregion->rvda) {
841+
memunmap(opregion->rvda);
842+
opregion->rvda = NULL;
843+
}
840844
opregion->header = NULL;
841845
opregion->acpi = NULL;
842846
opregion->swsci = NULL;
@@ -987,13 +991,30 @@ int intel_opregion_setup(struct drm_device *dev)
987991
DRM_DEBUG_DRIVER("ASLE extension supported\n");
988992

989993
if (!dmi_check_system(intel_no_opregion_vbt)) {
990-
const void *vbt = base + OPREGION_VBT_OFFSET;
991-
u32 vbt_size = OPREGION_ASLE_EXT_OFFSET - OPREGION_VBT_OFFSET;
994+
const void *vbt = NULL;
995+
u32 vbt_size = 0;
996+
997+
if (opregion->header->opregion_ver >= 2 && opregion->asle &&
998+
opregion->asle->rvda && opregion->asle->rvds) {
999+
opregion->rvda = memremap(opregion->asle->rvda,
1000+
opregion->asle->rvds,
1001+
MEMREMAP_WB);
1002+
vbt = opregion->rvda;
1003+
vbt_size = opregion->asle->rvds;
1004+
}
9921005

9931006
if (intel_bios_is_valid_vbt(vbt, vbt_size)) {
994-
DRM_DEBUG_KMS("Found valid VBT in ACPI OpRegion\n");
1007+
DRM_DEBUG_KMS("Found valid VBT in ACPI OpRegion (RVDA)\n");
9951008
opregion->vbt = vbt;
9961009
opregion->vbt_size = vbt_size;
1010+
} else {
1011+
vbt = base + OPREGION_VBT_OFFSET;
1012+
vbt_size = OPREGION_ASLE_EXT_OFFSET - OPREGION_VBT_OFFSET;
1013+
if (intel_bios_is_valid_vbt(vbt, vbt_size)) {
1014+
DRM_DEBUG_KMS("Found valid VBT in ACPI OpRegion (Mailbox #4)\n");
1015+
opregion->vbt = vbt;
1016+
opregion->vbt_size = vbt_size;
1017+
}
9971018
}
9981019
}
9991020

0 commit comments

Comments
 (0)