list_for_each_entry(devdata, &i915->display.vbt.display_devices, node)
                func(i915, devdata);
 }
+
+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;
+
+       /*
+        * 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);
+
+       return 0;
+}
+
+DEFINE_SHOW_ATTRIBUTE(intel_bios_vbt);
+
+void intel_bios_debugfs_register(struct drm_i915_private *i915)
+{
+       struct drm_minor *minor = i915->drm.primary;
+
+       debugfs_create_file("i915_vbt", 0444, minor->debugfs_root,
+                           i915, &intel_bios_vbt_fops);
+}
 
        return 0;
 }
 
-static int i915_vbt(struct seq_file *m, void *unused)
-{
-       struct drm_i915_private *i915 = node_to_i915(m->private);
-       struct intel_opregion *opregion = &i915->display.opregion;
-
-       if (opregion->vbt)
-               seq_write(m, opregion->vbt, opregion->vbt_size);
-
-       return 0;
-}
-
 static int i915_gem_framebuffer_info(struct seq_file *m, void *data)
 {
        struct drm_i915_private *dev_priv = node_to_i915(m->private);
        {"i915_frontbuffer_tracking", i915_frontbuffer_tracking, 0},
        {"i915_sr_status", i915_sr_status, 0},
        {"i915_opregion", i915_opregion, 0},
-       {"i915_vbt", i915_vbt, 0},
        {"i915_gem_framebuffer", i915_gem_framebuffer_info, 0},
        {"i915_power_domain_info", i915_power_domain_info, 0},
        {"i915_display_info", i915_display_info, 0},
                                 ARRAY_SIZE(intel_display_debugfs_list),
                                 minor->debugfs_root, minor);
 
+       intel_bios_debugfs_register(i915);
        intel_cdclk_debugfs_register(i915);
        intel_dmc_debugfs_register(i915);
        intel_fbc_debugfs_register(i915);