Commit
7da55c27e76749b9 ("drm/amd/display: Remove incorrect FP context
start") removes the FP context protection of dml2_create(), and it said
"All the DC_FP_START/END should be used before call anything from DML2".
However, dml21_copy() are not protected from their callers, causing such
errors:
do_fpu invoked from kernel context![#1]:
CPU: 0 UID: 0 PID: 240 Comm: kworker/0:5 Not tainted 6.14.0-rc6+ #1
Workqueue: events work_for_cpu_fn
pc
ffff80000318bd2c ra
ffff80000315750c tp
9000000105910000 sp
9000000105913810
a0
0000000000000000 a1
0000000000000002 a2
900000013140d728 a3
900000013140d720
a4
0000000000000000 a5
9000000131592d98 a6
0000000000017ae8 a7
00000000001312d0
t0
9000000130751ff0 t1
ffff800003790000 t2
ffff800003790000 t3
9000000131592e28
t4
000000000004c6a8 t5
00000000001b7740 t6
0000000000023e38 t7
0000000000249f00
t8
0000000000000002 u0
0000000000000000 s9
900000012b010000 s0
9000000131400000
s1
9000000130751fd8 s2
ffff800003408000 s3
9000000130752c78 s4
9000000131592da8
s5
9000000131592120 s6
9000000130751ff0 s7
9000000131592e28 s8
9000000131400008
ra:
ffff80000315750c dml2_top_soc15_initialize_instance+0x20c/0x300 [amdgpu]
ERA:
ffff80000318bd2c mcg_dcn4_build_min_clock_table+0x14c/0x600 [amdgpu]
CRMD:
000000b0 (PLV0 -IE -DA +PG DACF=CC DACM=CC -WE)
PRMD:
00000004 (PPLV0 +PIE -PWE)
EUEN:
00000000 (-FPE -SXE -ASXE -BTE)
ECFG:
00071c1d (LIE=0,2-4,10-12 VS=7)
ESTAT:
000f0000 [FPD] (IS= ECode=15 EsubCode=0)
PRID:
0014d010 (Loongson-64bit, Loongson-3C6000/S)
Process kworker/0:5 (pid: 240, threadinfo=
00000000f1700428, task=
0000000020d2e962)
Stack :
0000000000000000 0000000000000000 0000000000000000 9000000130751fd8
9000000131400000 ffff8000031574e0 9000000130751ff0 0000000000000000
9000000131592e28 0000000000000000 0000000000000000 0000000000000000
0000000000000000 0000000000000000 0000000000000000 0000000000000000
0000000000000000 0000000000000000 0000000000000000 0000000000000000
0000000000000000 0000000000000000 0000000000000000 f9175936df5d7fd2
900000012b00ff08 900000012b000000 ffff800003409000 ffff8000034a1780
90000001019634c0 900000012b000010 90000001307beeb8 90000001306b0000
0000000000000001 ffff8000031942b4 9000000130780000 90000001306c0000
9000000130780000 ffff8000031c276c 900000012b044bd0 ffff800003408000
...
Call Trace:
[<
ffff80000318bd2c>] mcg_dcn4_build_min_clock_table+0x14c/0x600 [amdgpu]
[<
ffff800003157508>] dml2_top_soc15_initialize_instance+0x208/0x300 [amdgpu]
[<
ffff8000031942b0>] dml21_create_copy+0x30/0x60 [amdgpu]
[<
ffff8000031c2768>] dc_state_create_copy+0x68/0xe0 [amdgpu]
[<
ffff800002e98ea0>] amdgpu_dm_init+0x8c0/0x2060 [amdgpu]
[<
ffff800002e9a658>] dm_hw_init+0x18/0x60 [amdgpu]
[<
ffff800002b0a738>] amdgpu_device_init+0x1938/0x27e0 [amdgpu]
[<
ffff800002b0ce80>] amdgpu_driver_load_kms+0x20/0xa0 [amdgpu]
[<
ffff800002b008f0>] amdgpu_pci_probe+0x1b0/0x580 [amdgpu]
[<
9000000003c7eae4>] local_pci_probe+0x44/0xc0
[<
90000000032f2b18>] work_for_cpu_fn+0x18/0x40
[<
90000000032f5da0>] process_one_work+0x160/0x300
[<
90000000032f6718>] worker_thread+0x318/0x440
[<
9000000003301b8c>] kthread+0x12c/0x220
[<
90000000032b1484>] ret_from_kernel_thread+0x8/0xa4
Unfortunately, protecting dml21_copy() out of DML2 causes "sleeping
function called from invalid context", so protect them with DC_FP_START()
and DC_FP_END() inside.
Fixes: 7da55c27e767 ("drm/amd/display: Remove incorrect FP context start")
Cc: stable@vger.kernel.org
Signed-off-by: Huacai Chen <chenhuacai@loongson.cn>
Reviewed-by: Aurabindo Pillai <aurabindo.pillai@amd.com>
Tested-by: Daniel Wheeler <daniel.wheeler@amd.com>
Signed-off-by: Alex Deucher <alexander.deucher@amd.com>