[PATCH V2 1/3] drm/amd/display: Protect FPU in dml21_copy()

Aurabindo Pillai aurabindo.pillai at amd.com
Tue Apr 1 17:44:44 UTC 2025


On 2025-03-27 05:53, Huacai Chen wrote:
> 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.
> 
> Cc: stable at vger.kernel.org
> Signed-off-by: Huacai Chen <chenhuacai at loongson.cn>
> ---
>   drivers/gpu/drm/amd/display/dc/dml2/dml21/dml21_wrapper.c | 4 ++++
>   1 file changed, 4 insertions(+)
> 
> diff --git a/drivers/gpu/drm/amd/display/dc/dml2/dml21/dml21_wrapper.c b/drivers/gpu/drm/amd/display/dc/dml2/dml21/dml21_wrapper.c
> index fb80ba9287b6..a6b8df1d96e8 100644
> --- a/drivers/gpu/drm/amd/display/dc/dml2/dml21/dml21_wrapper.c
> +++ b/drivers/gpu/drm/amd/display/dc/dml2/dml21/dml21_wrapper.c
> @@ -412,8 +412,12 @@ void dml21_copy(struct dml2_context *dst_dml_ctx,
>   
>   	dst_dml_ctx->v21.mode_programming.programming = dst_dml2_programming;
>   
> +	DC_FP_START();
> +
>   	/* need to initialize copied instance for internal references to be correct */
>   	dml2_initialize_instance(&dst_dml_ctx->v21.dml_init);
> +
> +	DC_FP_END();
>   }
>   
>   bool dml21_create_copy(struct dml2_context **dst_dml_ctx,

Thanks, we're adding this series to our weekly testing, and will have it 
merged if there are no issues.


More information about the amd-gfx mailing list