[Intel-gfx] [MIPI SEQ PARSING v3 06/13] drm/i915: Parsing VBT if size of VBT exceeds 6KB
Mika Kahola
mika.kahola at intel.com
Fri Dec 11 00:51:07 PST 2015
When testing this patch on my BXT-M I received this error message
Hardware name: Intel Corp. Broxton M/RVP, BIOS
BXTM_IFWI_X64_R_2015_49_2_03 11/25/2015
[ 0.000000] ------------[ cut here ]------------
[ 0.000000] WARNING: CPU: 0 PID: 0 at drivers/iommu/dmar.c:829
warn_invalid_dmar+0x81/0xa0()
[ 0.000000] Your BIOS is broken; DMAR reported at address ff000000
returns all ones!
[ 0.000000] BIOS vendor: Intel Corp.; Ver:
BXTM_IFWI_X64_R_2015_49_2_03; Product Version: A1
[ 0.000000] Modules linked in:
[ 0.000000] CPU: 0 PID: 0 Comm: swapper Not tainted 4.4.0-rc3-bxt-p6
#1
[ 0.000000] Hardware name: Intel Corp. Broxton M/RVP, BIOS
BXTM_IFWI_X64_R_2015_49_2_03 11/25/2015
[ 0.000000] ffffffff81cfa5a7 ffffffff81e03da0 ffffffff813f8609
ffffffff81e03de8
[ 0.000000] ffffffff81e03dd8 ffffffff8107c17e ffffffff830a600c
ffffffff830a60ec
[ 0.000000] 00000000ff000000 ffffffffffffffff 000000000000017b
ffffffff81e03e38
[ 0.000000] Call Trace:
[ 0.000000] [<ffffffff813f8609>] dump_stack+0x4e/0x85
[ 0.000000] [<ffffffff8107c17e>] warn_slowpath_common+0x9e/0xc0
[ 0.000000] [<ffffffff8107c234>] warn_slowpath_fmt_taint+0x44/0x50
[ 0.000000] [<ffffffff81f94950>] ? __acpi_map_table+0x13/0x1a
[ 0.000000] [<ffffffff81892113>] ? acpi_os_map_iomem+0x26/0x167
[ 0.000000] [<ffffffff814fb471>] warn_invalid_dmar+0x81/0xa0
[ 0.000000] [<ffffffff818923fc>] dmar_validate_one_drhd+0xac/0xc0
[ 0.000000] [<ffffffff814fb5cd>] dmar_walk_remapping_entries
+0x13d/0x180
[ 0.000000] [<ffffffff81fc77bc>] detect_intel_iommu+0x52/0xd1
[ 0.000000] [<ffffffff81892350>] ? acpi_os_unmap_memory+0x17/0x17
[ 0.000000] [<ffffffff81f8cd51>] pci_iommu_alloc+0x43/0x6c
[ 0.000000] [<ffffffff81f9b337>] mem_init+0x9/0x3e
[ 0.000000] [<ffffffff81f86def>] start_kernel+0x231/0x474
[ 0.000000] [<ffffffff81f868ed>] ? set_init_arg+0x57/0x57
[ 0.000000] [<ffffffff81f865ad>] x86_64_start_reservations+0x2a/0x2c
[ 0.000000] [<ffffffff81f86699>] x86_64_start_kernel+0xea/0xed
[ 0.000000] ---[ end trace e354834df7810082 ]---
And later on
[ 15.615809] IP: [<ffffffffa01a7d9c>] intel_opregion_setup+0x15c/0x420
[i915]
[ 15.623687] PGD 0
[ 15.625909] Oops: 0000 [#1] PREEMPT SMP
[ 15.630246] Modules linked in: snd_seq_oss snd_seq_midi snd_rawmidi
snd_seq_midi_event i915(+)[ 15.638805] sdhci-pci 0000:00:1c.0: power
state changed by ACPI to D3cold
[ 15.647060] snd_seq i2c_algo_bit snd_seq_device drm_kms_helper
syscopyarea snd_timer sysfillrect sysimgblt fb_sys_fops drm intel_gtt
snd
tpm_tis agpgart tpm fuse
[ 15.663370] CPU: 3 PID: 341 Comm: systemd-udevd Tainted: G I
4.4.0-rc3-bxt-p6 #1
[ 15.672794] Hardware name: Intel Corp. Broxton M/RVP, BIOS
BXTM_IFWI_X64_R_2015_49_2_03 11/25/2015
[ 15.672797] task: ffff8800791b4c80 ti: ffff880179e5c000 task.ti:
ffff880179e5c000
[ 15.672875] RIP: 0010:[<ffffffffa01a7d9c>] [<ffffffffa01a7d9c>]
intel_opregion_setup+0x15c/0x420 [i915]
[ 15.672878] RSP: 0018:ffff880179e5f8f8 EFLAGS: 00010246
[ 15.672880] RAX: 0000000000000000 RBX: ffff880079370000 RCX:
000000000000000f
[ 15.672881] RDX: 000000000000000f RSI: ffffffffa0204a5c RDI:
ffff880179e5f917
[ 15.672883] RBP: ffff880179e5f950 R08: 000000000000006d R09:
0000000000000000
[ 15.672884] R10: ffff8800791b4c80 R11: ffff8800791b54d8 R12:
ffffc900000b8018
[ 15.672885] R13: ffff880178256000 R14: ffff880179e5facc R15:
0000000000000000
[ 15.672888] FS: 00007f6693826880(0000) GS:ffff88017fd80000(0000)
knlGS:0000000000000000
[ 15.672889] CS: 0010 DS: 0000 ES: 0000 CR0: 0000000080050033
[ 15.672891] CR2: 0000000000000014 CR3: 000000017812a000 CR4:
00000000003406e0
[ 15.672892] Stack:
[ 15.672897] 00000000000018b8 ffff8800793717c8 79d77018a01e5bb0
49ffffffa01e5c30
[ 15.672900] 706172476c65746e 086d654d73636968 ffff880079370000
ffff880178256000
[ 15.672904] 0000000000000048 ffff880179e5facc ffff880079370000
ffff880179e5fb00
[ 15.672905] Call Trace:
[ 15.672975] [<ffffffffa01d23ac>] i915_driver_load+0xa7c/0x15b0
[i915]
[ 15.673007] [<ffffffffa009928f>] drm_dev_register+0x6f/0xb0 [drm]
[ 15.673025] [<ffffffffa009b81a>] drm_get_pci_dev+0x10a/0x1d0 [drm]
[ 15.673034] [<ffffffff818988b1>] ? _raw_spin_unlock_irqrestore
+0x51/0x70
[ 15.673074] [<ffffffffa0118249>] i915_pci_probe+0x49/0x50 [i915]
[ 15.673082] [<ffffffff81437f50>] pci_device_probe+0x80/0xf0
[ 15.673088] [<ffffffff8150d3b8>] driver_probe_device+0x168/0x3d0
[ 15.673091] [<ffffffff8150d686>] __driver_attach+0x66/0x90
[ 15.673093] [<ffffffff8150d620>] ? driver_probe_device+0x3d0/0x3d0
[ 15.673099] [<ffffffff8150b15b>] bus_for_each_dev+0x5b/0xa0
[ 15.673102] [<ffffffff8150cd8e>] driver_attach+0x1e/0x20
[ 15.673105] [<ffffffff8150c771>] bus_add_driver+0x151/0x270
[ 15.673108] [<ffffffff8150e23c>] driver_register+0x8c/0xd0
[ 15.673113] [<ffffffff81436620>] __pci_register_driver+0x60/0x70
[ 15.673130] [<ffffffffa009b938>] drm_pci_init+0x58/0xf0 [drm]
[ 15.673136] [<ffffffff810cd27d>] ? trace_hardirqs_on+0xd/0x10
[ 15.673139] [<ffffffffa023f000>] ? 0xffffffffa023f000
[ 15.673179] [<ffffffffa023f094>] i915_init+0x94/0x9b [i915]
[ 15.673185] [<ffffffff81000436>] do_one_initcall+0x106/0x1d0
[ 15.673191] [<ffffffff810e93ee>] ? rcu_read_lock_sched_held
+0x6e/0xa0
[ 15.673196] [<ffffffff811d9a21>] ? kmem_cache_alloc_trace
+0x1c1/0x230
[ 15.673203] [<ffffffff8118bd6d>] do_init_module+0x60/0x1ea
[ 15.673209] [<ffffffff811107e0>] load_module+0x1df0/0x25a0
[ 15.673212] [<ffffffff8110c900>] ? store_uevent+0x40/0x40
[ 15.673217] [<ffffffff8110d0e5>] ? copy_module_from_fd.isra.38
+0xa5/0x140
[ 15.673221] [<ffffffff8111117f>] SyS_finit_module+0x8f/0xa0
[ 15.673226] [<ffffffff8189915b>] entry_SYSCALL_64_fastpath+0x16/0x73
[ 15.673275] Code: 5c f2 ff 02 0f 84 aa 02 00 00 48 c7 c6 6d 4a 20 a0
48 c7 c7 50 26 1e a0 31 c0 e8 30 11 ef ff e9 90 02 00 00 48 8b 83 30
96 00 00 <83> 78 14 01 76 33 48 8b 83 50 96 00 00 48 8b b8 ba 00 00 00
48
[ 15.673332] RIP [<ffffffffa01a7d9c>] intel_opregion_setup
+0x15c/0x420 [i915]
[ 15.673333] RSP <ffff880179e5f8f8>
[ 15.673334] CR2: 0000000000000014
[ 15.673339] ---[ end trace e354834df7810084 ]---
On Tue, 2015-12-01 at 04:17 +0530, Deepak M wrote:
> Currently the iomap for VBT works only if the size of the
> VBT is less than 6KB, but if the size of the VBT exceeds
> 6KB than the physical address and the size of the VBT to
> be iomapped is specified in the mailbox3 and is iomapped
> accordingly.
>
> v3: -Splitted the patch into small ones
> -Handeled memory unmap in intel_opregion_fini
> -removed the new file created for opregion macro`s
>
> Cc: Jani Nikula <jani.nikula at intel.com>
> Signed-off-by: Deepak M <m.deepak at intel.com>
> ---
> drivers/gpu/drm/i915/intel_opregion.c | 33 +++++++++++++++++++++++++++------
> 1 file changed, 27 insertions(+), 6 deletions(-)
>
> diff --git a/drivers/gpu/drm/i915/intel_opregion.c b/drivers/gpu/drm/i915/intel_opregion.c
> index 7908a1d..b3a5709 100644
> --- a/drivers/gpu/drm/i915/intel_opregion.c
> +++ b/drivers/gpu/drm/i915/intel_opregion.c
> @@ -856,6 +856,8 @@ void intel_opregion_fini(struct drm_device *dev)
> }
>
> /* just clear all opregion memory pointers now */
> + if (opregion->header->opregion_ver >= 2 && opregion->asle->rvda)
> + memunmap(opregion->vbt);
> memunmap(opregion->header);
> opregion->header = NULL;
> opregion->acpi = NULL;
> @@ -933,7 +935,8 @@ int intel_opregion_setup(struct drm_device *dev)
> char buf[sizeof(OPREGION_SIGNATURE)];
> const struct vbt_header *vbt = NULL;
> int err = 0;
> - void *base;
> + void *base, *vbt_base;
> + size_t size;
>
> BUILD_BUG_ON(sizeof(struct opregion_header) != 0x100);
> BUILD_BUG_ON(sizeof(struct opregion_acpi) != 0x100);
> @@ -963,19 +966,37 @@ int intel_opregion_setup(struct drm_device *dev)
> goto err_out;
> }
>
> - vbt = validate_vbt(base + OPREGION_VBT_OFFSET,
> - MAILBOX_4_SIZE, "OpRegion");
> + /*
> + * Non-zero value in rvda field is an indication to driver that a
> + * valid Raw VBT is stored in that address and driver should not refer
> + * to mailbox4 for getting VBT.
> + */
> + if (opregion->header->opregion_ver >= 2 && opregion->asle->rvda) {
> + size = opregion->asle->rvds;
> + vbt_base = memremap(opregion->asle->rvda,
> + size, MEMREMAP_WB);
> + } else {
> + size = MAILBOX_4_SIZE;
> + vbt_base = base + OPREGION_VBT_OFFSET;
> + }
> +
> + vbt = validate_vbt(vbt_base, size, "OpRegion");
>
> if (vbt == NULL) {
> err = -EINVAL;
> goto err_out;
> }
>
> - vbt = (const struct vbt_header *)(base + OPREGION_VBT_OFFSET);
> - dev_priv->opregion.vbt_size = vbt->vbt_size;
> + /* Assigning the vbt_size based on the VBT location */
> + if (opregion->header->opregion_ver >= 2 && opregion->asle->rvda)
> + dev_priv->opregion.vbt_size = opregion->asle->rvds;
> + else {
> + 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;
> + opregion->vbt = vbt_base;
>
> opregion->lid_state = base + ACPI_CLID;
> opregion->asle_ext = base + OPREGION_ASLE_EXT_OFFSET;
More information about the Intel-gfx
mailing list