[MIPI SEQ PARSING v3 05/13] drm/i915: Add debug entry to get the opregion VBT blob

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



Currently there is a entry to get the complete opregion
dump, this patch adds entry to get the VBT alone from
the opregion.

Adding this entry helps developer to get the VBT easily,
instead of following the old way where we get the complete
opregion dump and pick the VBT from the dump wrt to
the VBT offset.

Cc: Jani Nikula <jani.nikula@xxxxxxxxx>
Signed-off-by: Deepak M <m.deepak@xxxxxxxxx>
---
 drivers/gpu/drm/i915/i915_debugfs.c   | 29 +++++++++++++++++++++++++++++
 drivers/gpu/drm/i915/i915_drv.h       |  1 +
 drivers/gpu/drm/i915/intel_bios.c     |  1 +
 drivers/gpu/drm/i915/intel_opregion.c |  3 +++
 4 files changed, 34 insertions(+)

diff --git a/drivers/gpu/drm/i915/i915_debugfs.c b/drivers/gpu/drm/i915/i915_debugfs.c
index d6d69f4..9b7fb00 100644
--- a/drivers/gpu/drm/i915/i915_debugfs.c
+++ b/drivers/gpu/drm/i915/i915_debugfs.c
@@ -1865,6 +1865,34 @@ out:
 	return 0;
 }
 
+static int i915_opregion_vbt(struct seq_file *m, void *unused)
+{
+	struct drm_info_node *node = m->private;
+	struct drm_device *dev = node->minor->dev;
+	struct drm_i915_private *dev_priv = dev->dev_private;
+	struct intel_opregion *opregion = &dev_priv->opregion;
+	void *data = kmalloc(opregion->vbt_size, GFP_KERNEL);
+	int ret;
+
+	if (data == NULL)
+		return -ENOMEM;
+
+	ret = mutex_lock_interruptible(&dev->struct_mutex);
+	if (ret)
+		goto out;
+
+	if (opregion->vbt) {
+		memcpy(data, opregion->vbt, opregion->vbt_size);
+		seq_write(m, data, opregion->vbt_size);
+	}
+
+	mutex_unlock(&dev->struct_mutex);
+
+out:
+	kfree(data);
+	return 0;
+}
+
 static int i915_gem_framebuffer_info(struct seq_file *m, void *data)
 {
 	struct drm_info_node *node = m->private;
@@ -5383,6 +5411,7 @@ static const struct drm_info_list i915_debugfs_list[] = {
 	{"i915_ips_status", i915_ips_status, 0},
 	{"i915_sr_status", i915_sr_status, 0},
 	{"i915_opregion", i915_opregion, 0},
+	{"i915_opregion_vbt", i915_opregion_vbt, 0},
 	{"i915_gem_framebuffer", i915_gem_framebuffer_info, 0},
 	{"i915_context_status", i915_context_status, 0},
 	{"i915_dump_lrc", i915_dump_lrc, 0},
diff --git a/drivers/gpu/drm/i915/i915_drv.h b/drivers/gpu/drm/i915/i915_drv.h
index 8cf8375..59a39d1 100644
--- a/drivers/gpu/drm/i915/i915_drv.h
+++ b/drivers/gpu/drm/i915/i915_drv.h
@@ -457,6 +457,7 @@ struct intel_opregion {
 	u32 swsci_sbcb_sub_functions;
 	struct opregion_asle *asle;
 	void *vbt;
+	u32 vbt_size;
 	struct opregion_asle_ext *asle_ext;
 	u32 *lid_state;
 	struct work_struct asle_work;
diff --git a/drivers/gpu/drm/i915/intel_bios.c b/drivers/gpu/drm/i915/intel_bios.c
index 57a77aa..98b0e2a 100644
--- a/drivers/gpu/drm/i915/intel_bios.c
+++ b/drivers/gpu/drm/i915/intel_bios.c
@@ -1338,6 +1338,7 @@ intel_parse_bios(struct drm_device *dev)
 			return -1;
 		}
 
+		dev_priv->opregion.vbt_size = vbt->vbt_size;
 		bdb = (const void *)vbt + vbt->bdb_offset;
 	}
 
diff --git a/drivers/gpu/drm/i915/intel_opregion.c b/drivers/gpu/drm/i915/intel_opregion.c
index 4a78282..7908a1d 100644
--- a/drivers/gpu/drm/i915/intel_opregion.c
+++ b/drivers/gpu/drm/i915/intel_opregion.c
@@ -971,6 +971,9 @@ int intel_opregion_setup(struct drm_device *dev)
 		goto err_out;
 	}
 
+	vbt = (const struct vbt_header *)(base + OPREGION_VBT_OFFSET);
+	dev_priv->opregion.vbt_size = vbt->vbt_size;
+
 	opregion->header = base;
 	opregion->vbt = base + OPREGION_VBT_OFFSET;
 
-- 
1.9.1

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




[Index of Archives]     [Linux USB Devel]     [Linux Audio Users]     [Yosemite News]     [Linux Kernel]     [Linux SCSI]
  Powered by Linux