drm/i915/opregion: abstract getting the opregion VBT
authorJani Nikula <jani.nikula@intel.com>
Thu, 11 Jan 2024 17:21:16 +0000 (19:21 +0200)
committerJani Nikula <jani.nikula@intel.com>
Tue, 16 Jan 2024 09:18:07 +0000 (11:18 +0200)
Add a function to get the opregion VBT instead of accessing the opregion
structures directly.

Cc: Radhakrishna Sripada <radhakrishna.sripada@intel.com>
Reviewed-by: Radhakrishna Sripada <radhakrishna.sripada@intel.com>
Signed-off-by: Jani Nikula <jani.nikula@intel.com>
Link: https://patchwork.freedesktop.org/patch/msgid/8205b8fa724f98bbf1f76c59e661909d874e843e.1704992868.git.jani.nikula@intel.com
drivers/gpu/drm/i915/display/intel_bios.c
drivers/gpu/drm/i915/display/intel_opregion.c
drivers/gpu/drm/i915/display/intel_opregion.h

index cf8e6f7bd490048c192ce3e1b923bae50f6091ce..5f04e495fd27563342808951dabd72089b37313e 100644 (file)
@@ -3073,7 +3073,7 @@ err_unmap_oprom:
  */
 void intel_bios_init(struct drm_i915_private *i915)
 {
-       const struct vbt_header *vbt = i915->display.opregion.vbt;
+       const struct vbt_header *vbt;
        struct vbt_header *oprom_vbt = NULL;
        const struct bdb_header *bdb;
 
@@ -3088,6 +3088,8 @@ void intel_bios_init(struct drm_i915_private *i915)
 
        init_vbt_defaults(i915);
 
+       vbt = intel_opregion_get_vbt(i915, NULL);
+
        /*
         * If the OpRegion does not have VBT, look in SPI flash through MMIO or
         * PCI mapping
@@ -3305,7 +3307,7 @@ bool intel_bios_is_lvds_present(struct drm_i915_private *i915, u8 *i2c_pin)
                 * additional data.  Trust that if the VBT was written into
                 * the OpRegion then they have validated the LVDS's existence.
                 */
-               if (i915->display.opregion.vbt)
+               if (intel_opregion_get_vbt(i915, NULL))
                        return true;
        }
 
@@ -3660,14 +3662,16 @@ void intel_bios_for_each_encoder(struct drm_i915_private *i915,
 static int intel_bios_vbt_show(struct seq_file *m, void *unused)
 {
        struct drm_i915_private *i915 = m->private;
-       struct intel_opregion *opregion = &i915->display.opregion;
+       const void *vbt;
+       size_t vbt_size;
 
        /*
         * FIXME: VBT might originate from other places than opregion, and then
         * this would be incorrect.
         */
-       if (opregion->vbt)
-               seq_write(m, opregion->vbt, opregion->vbt_size);
+       vbt = intel_opregion_get_vbt(i915, &vbt_size);
+       if (vbt)
+               seq_write(m, vbt, vbt_size);
 
        return 0;
 }
index 26c92ab4ee8afe0380b8c01ed08f9b3c3d750e8d..8b9e820971cb82520850297d7acd0acde9a292fa 100644 (file)
@@ -1132,6 +1132,19 @@ const struct drm_edid *intel_opregion_get_edid(struct intel_connector *intel_con
        return drm_edid;
 }
 
+const void *intel_opregion_get_vbt(struct drm_i915_private *i915, size_t *size)
+{
+       struct intel_opregion *opregion = &i915->display.opregion;
+
+       if (!opregion->vbt)
+               return NULL;
+
+       if (size)
+               *size = opregion->vbt_size;
+
+       return opregion->vbt;
+}
+
 bool intel_opregion_headless_sku(struct drm_i915_private *i915)
 {
        struct intel_opregion *opregion = &i915->display.opregion;
index 7177f50ab0d32bef0e6f9ebc9ae0d6161c6c7f36..9efadfb7258452ba4c28fdbb86db7a958bf85c74 100644 (file)
@@ -77,6 +77,8 @@ int intel_opregion_notify_adapter(struct drm_i915_private *dev_priv,
 int intel_opregion_get_panel_type(struct drm_i915_private *dev_priv);
 const struct drm_edid *intel_opregion_get_edid(struct intel_connector *connector);
 
+const void *intel_opregion_get_vbt(struct drm_i915_private *i915, size_t *size);
+
 bool intel_opregion_headless_sku(struct drm_i915_private *i915);
 
 void intel_opregion_debugfs_register(struct drm_i915_private *i915);
@@ -136,6 +138,12 @@ intel_opregion_get_edid(struct intel_connector *connector)
        return NULL;
 }
 
+static inline const void *
+intel_opregion_get_vbt(struct drm_i915_private *i915, size_t *size)
+{
+       return NULL;
+}
+
 static inline bool intel_opregion_headless_sku(struct drm_i915_private *i915)
 {
        return false;