projects
/
openwrt
/
staging
/
blogic.git
/ commitdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
| commitdiff |
tree
raw
|
patch
| inline |
side by side
(parent:
277ab5a
)
drm/i915/guc: Fix null pointer dereference when GuC FW is not available
author
Piotr Piórkowski
<
[email protected]
>
Fri, 23 Mar 2018 11:23:18 +0000
(12:23 +0100)
committer
Chris Wilson
<
[email protected]
>
Fri, 23 Mar 2018 17:03:24 +0000
(17:03 +0000)
If GuC firmware is not available on the system and we load i915 with enable
GuC, then we hit this null pointer dereference issue:
[ 71.098873] BUG: unable to handle kernel NULL pointer dereference at
0000000000000008
[ 71.098938] IP: intel_uc_fw_upload+0x1f/0x360 [i915]
[ 71.098947] PGD 0 P4D 0
[ 71.098956] Oops: 0000 [#1] PREEMPT SMP PTI
[ 71.098965] Modules linked in: i915(O+) netconsole x86_pkg_temp_thermal intel_powerclamp coretemp crct10dif_pclmul crc32_pclmul ghash_clmulni_intel mei_me i2c_i801 prime_numbers mei [last unloaded: i915]
[ 71.099005] CPU: 2 PID: 1167 Comm: insmod Tainted: G U W O 4.16.0-rc1+ #337
[ 71.099018] Hardware name: /NUC6i5SYB, BIOS SYSKLi35.86A.0065.2018.0103.1000 01/03/2018
[ 71.099077] RIP: 0010:intel_uc_fw_upload+0x1f/0x360 [i915]
[ 71.099087] RSP: 0018:
ffffc90000417aa0
EFLAGS:
00010282
[ 71.099097] RAX:
0000000000000000
RBX:
ffff88084cad12f8
RCX:
ffffffffa03e9357
[ 71.099108] RDX:
0000000000000002
RSI:
ffffffffa034dba0
RDI:
ffff88084cad12f8
[ 71.099118] RBP:
0000000000000002
R08:
ffff88085344ca90
R09:
0000000000000001
[ 71.099128] R10:
0000000000000000
R11:
0000000000000000
R12:
ffff88084cad0000
[ 71.099139] R13:
ffffffffa034dba0
R14:
00000000fffffff5
R15:
ffff88084cad12b0
[ 71.099151] FS:
00007f7f24ae2740
(0000) GS:
ffff88085e200000
(0000) knlGS:
0000000000000000
[ 71.099162] CS: 0010 DS: 0000 ES: 0000 CR0:
0000000080050033
[ 71.099171] CR2:
0000000000000008
CR3:
0000000855f48001
CR4:
00000000003606e0
[ 71.099182] Call Trace:
[ 71.099246] intel_uc_init_hw+0xc8/0x520 [i915]
[ 71.099303] i915_gem_init_hw+0x11f/0x2d0 [i915]
[ 71.099364] i915_gem_init+0x2b9/0x640 [i915]
[ 71.099413] i915_driver_load+0xb74/0x1110 [i915]
[ 71.099462] i915_pci_probe+0x2e/0x90 [i915]
[ 71.099476] pci_device_probe+0xa1/0x130
[ 71.099488] driver_probe_device+0x302/0x470
[ 71.099502] __driver_attach+0xb9/0xe0
[ 71.099513] ? driver_probe_device+0x470/0x470
[ 71.099525] ? driver_probe_device+0x470/0x470
[ 71.099538] bus_for_each_dev+0x64/0x90
[ 71.099550] bus_add_driver+0x164/0x260
[ 71.099561] ? 0xffffffffa04d6000
[ 71.099572] driver_register+0x57/0xc0
[ 71.099582] ? 0xffffffffa04d6000
[ 71.099593] do_one_initcall+0x3b/0x160
[ 71.099606] ? kmem_cache_alloc_trace+0x1c3/0x2a0
[ 71.099621] do_init_module+0x5b/0x1f9
[ 71.099635] load_module+0x2467/0x2a70
[ 71.099654] ? SyS_finit_module+0xbd/0xe0
[ 71.099668] SyS_finit_module+0xbd/0xe0
[ 71.099682] do_syscall_64+0x73/0x1c0
[ 71.099694] entry_SYSCALL_64_after_hwframe+0x26/0x9b
[ 71.099706] RIP: 0033:0x7f7f23fb40d9
[ 71.099717] RSP: 002b:
00007ffda7d67ed8
EFLAGS:
00000246
ORIG_RAX:
0000000000000139
[ 71.099734] RAX:
ffffffffffffffda
RBX:
000055f96e2a8870
RCX:
00007f7f23fb40d9
[ 71.099748] RDX:
0000000000000000
RSI:
000055f96e2a8260
RDI:
0000000000000003
[ 71.099763] RBP:
000055f96e2a8260
R08:
0000000000000000
R09:
00007ffda7d68088
[ 71.099777] R10:
0000000000000003
R11:
0000000000000246
R12:
0000000000000000
[ 71.099791] R13:
000055f96e2a8830
R14:
0000000000000000
R15:
000055f96e2a8260
[ 71.099810] Code: 00 00 66 2e 0f 1f 84 00 00 00 00 00 0f 1f 44 00 00 41 55 41 54 49 89 f5 55 53 48 c7 c1 57 93 3e a0 48 8b 47 10 48 89 fb 4c 8b 07 <48> 8b 68 08 8b 47 28 85 c0 74 15 83 f8 01 48 c7 c1 5b 93 3e a0
[ 71.100004] RIP: intel_uc_fw_upload+0x1f/0x360 [i915] RSP:
ffffc90000417aa0
[ 71.100020] CR2:
0000000000000008
[ 71.100031] ---[ end trace
d8ac93c30ceff5b2
]--
Fixes: 6b0478fb722a ("drm/i915: Implement dynamic GuC WOPCM offset and size calculation")
v2: don't assume it is always GuC FW (Michal)
v3: added a new variable to avoid exceeding the number of characters in the
line (Michal)
Signed-off-by: Piotr Piórkowski <
[email protected]
>
Reported-by: Radoslaw Szwichtenberg <
[email protected]
>
Cc: Michał Winiarski <
[email protected]
>
Cc: Michal Wajdeczko <
[email protected]
>
Cc: Sagar Arun Kamble <
[email protected]
>
Cc: Joonas Lahtinen <
[email protected]
>
Cc: Jackie Li <
[email protected]
>
Cc: Radoslaw Szwichtenberg <
[email protected]
>
Reviewed-by: Michal Wajdeczko <
[email protected]
>
Reviewed-by: Jackie Li <
[email protected]
>
Signed-off-by: Chris Wilson <
[email protected]
>
Link:
https://patchwork.freedesktop.org/patch/msgid/
[email protected]
drivers/gpu/drm/i915/intel_uc_fw.c
patch
|
blob
|
history
diff --git
a/drivers/gpu/drm/i915/intel_uc_fw.c
b/drivers/gpu/drm/i915/intel_uc_fw.c
index 30c73243f54d168bef75aaf84daa9dc2778db9d0..6e8e0b54674310d388e01476468c98d9c7b1173e 100644
(file)
--- a/
drivers/gpu/drm/i915/intel_uc_fw.c
+++ b/
drivers/gpu/drm/i915/intel_uc_fw.c
@@
-199,8
+199,8
@@
int intel_uc_fw_upload(struct intel_uc_fw *uc_fw,
int (*xfer)(struct intel_uc_fw *uc_fw,
struct i915_vma *vma))
{
- struct drm_i915_private *i915 = to_i915(uc_fw->obj->base.dev);
struct i915_vma *vma;
+ u32 ggtt_pin_bias;
int err;
DRM_DEBUG_DRIVER("%s fw load %s\n",
@@
-222,9
+222,9
@@
int intel_uc_fw_upload(struct intel_uc_fw *uc_fw,
goto fail;
}
+ ggtt_pin_bias = to_i915(uc_fw->obj->base.dev)->guc.ggtt_pin_bias;
vma = i915_gem_object_ggtt_pin(uc_fw->obj, NULL, 0, 0,
- PIN_OFFSET_BIAS |
- i915->guc.ggtt_pin_bias);
+ PIN_OFFSET_BIAS | ggtt_pin_bias);
if (IS_ERR(vma)) {
err = PTR_ERR(vma);
DRM_DEBUG_DRIVER("%s fw ggtt-pin err=%d\n",