linux/drivers/gpu/drm
Huacai Chen 366e77cd49 drm/amd/display: Protect FPU in dml2_validate()/dml21_validate()
Commit 7da55c27e7 ("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, dml2_validate()/dml21_validate() are not protected from their
callers, causing such errors:

 do_fpu invoked from kernel context![#1]:
 CPU: 10 UID: 0 PID: 331 Comm: kworker/10:1H Not tainted 6.14.0-rc6+ #4
 Workqueue: events_highpri dm_irq_work_func [amdgpu]
 pc ffff800003191eb0 ra ffff800003191e60 tp 9000000107a94000 sp 9000000107a975b0
 a0 9000000140ce4910 a1 0000000000000000 a2 9000000140ce49b0 a3 9000000140ce49a8
 a4 9000000140ce49a8 a5 0000000100000000 a6 0000000000000001 a7 9000000107a97660
 t0 ffff800003790000 t1 9000000140ce5000 t2 0000000000000001 t3 0000000000000000
 t4 0000000000000004 t5 0000000000000000 t6 0000000000000000 t7 0000000000000000
 t8 0000000100000000 u0 ffff8000031a3b9c s9 9000000130bc0000 s0 9000000132400000
 s1 9000000140ec0000 s2 9000000132400000 s3 9000000140ce0000 s4 90000000057f8b88
 s5 9000000140ec0000 s6 9000000140ce4910 s7 0000000000000001 s8 9000000130d45010
 ra: ffff800003191e60 dml21_map_dc_state_into_dml_display_cfg+0x40/0x1140 [amdgpu]
   ERA: ffff800003191eb0 dml21_map_dc_state_into_dml_display_cfg+0x90/0x1140 [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/10:1H (pid: 331, threadinfo=000000007bf9ddb0, task=00000000cc4ab9f3)
 Stack : 0000000100000000 0000043800000780 0000000100000001 0000000100000001
         0000000000000000 0000078000000000 0000000000000438 0000078000000000
         0000000000000438 0000078000000000 0000000000000438 0000000100000000
         0000000100000000 0000000100000000 0000000100000000 0000000100000000
         0000000000000001 9000000140ec0000 9000000132400000 9000000132400000
         ffff800003408000 ffff800003408000 9000000132400000 9000000140ce0000
         9000000140ce0000 ffff800003193850 0000000000000001 9000000140ec0000
         9000000132400000 9000000140ec0860 9000000140ec0738 0000000000000001
         90000001405e8000 9000000130bc0000 9000000140ec02a8 ffff8000031b5db8
         0000000000000000 0000043800000780 0000000000000003 ffff8000031b79cc
         ...
 Call Trace:
 [<ffff800003191eb0>] dml21_map_dc_state_into_dml_display_cfg+0x90/0x1140 [amdgpu]
 [<ffff80000319384c>] dml21_validate+0xcc/0x520 [amdgpu]
 [<ffff8000031b8948>] dc_validate_global_state+0x2e8/0x460 [amdgpu]
 [<ffff800002e94034>] create_validate_stream_for_sink+0x3d4/0x420 [amdgpu]
 [<ffff800002e940e4>] amdgpu_dm_connector_mode_valid+0x64/0x240 [amdgpu]
 [<900000000441d6b8>] drm_connector_mode_valid+0x38/0x80
 [<900000000441d824>] __drm_helper_update_and_validate+0x124/0x3e0
 [<900000000441ddc0>] drm_helper_probe_single_connector_modes+0x2e0/0x620
 [<90000000044050dc>] drm_client_modeset_probe+0x23c/0x1780
 [<9000000004420384>] __drm_fb_helper_initial_config_and_unlock+0x44/0x5a0
 [<9000000004403acc>] drm_client_dev_hotplug+0xcc/0x140
 [<ffff800002e9ab50>] handle_hpd_irq_helper+0x1b0/0x1e0 [amdgpu]
 [<90000000038f5da0>] process_one_work+0x160/0x300
 [<90000000038f6718>] worker_thread+0x318/0x440
 [<9000000003901b8c>] kthread+0x12c/0x220
 [<90000000038b1484>] ret_from_kernel_thread+0x8/0xa4

Unfortunately, protecting dml2_validate()/dml21_validate() out of DML2
causes "sleeping function called from invalid context", so protect them
with DC_FP_START() and DC_FP_END() inside.

Fixes: 7da55c27e7 ("drm/amd/display: Remove incorrect FP context start")
Cc: stable@vger.kernel.org
Signed-off-by: Huacai Chen <chenhuacai@loongson.cn>
Tested-by: Dongyan Qian <qiandongyan@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>
2025-04-07 14:36:50 -04:00
..
adp drm: adp: Remove unnecessary print function dev_err() 2025-03-05 08:39:12 -05:00
amd drm/amd/display: Protect FPU in dml2_validate()/dml21_validate() 2025-04-07 14:36:50 -04:00
arm Merge drm/drm-next into drm-misc-next 2025-02-18 07:43:43 +01:00
armada drm-misc-next for 6.14: 2024-12-13 08:48:09 +10:00
aspeed drm/aspeed: move to devm_platform_ioremap_resource() usage 2025-02-26 15:27:06 +01:00
ast drm/ast: cursor: Move implementation to separate source file 2025-02-20 08:38:34 +01:00
atmel-hlcdc drm-misc-next for 6.14: 2024-12-13 08:48:09 +10:00
bridge drm/bridge: Fix spelling mistake "gettin" -> "getting" 2025-03-03 10:41:29 +01:00
ci drm/ci: update expectation files 2025-02-05 10:10:51 -03:00
clients drm/log: select CONFIG_FONT_SUPPORT 2024-12-12 18:26:32 +01:00
display drm-misc-next for v6.15: 2025-02-28 12:36:01 +10:00
etnaviv drm/sched: Use struct for drm_sched_init() params 2025-02-12 11:59:52 +01:00
exynos drm/connector: make mode_valid take a const struct drm_display_mode 2025-01-07 12:45:19 +02:00
fsl-dcu drm/connector: make mode_valid take a const struct drm_display_mode 2025-01-07 12:45:19 +02:00
gma500 drm/gma500: fix inconsistent indenting warning 2025-03-06 10:29:31 +01:00
gud drm: remove driver date from struct drm_driver and all drivers 2024-12-05 12:35:42 +02:00
hisilicon drm/hisilicon/hibmc: select CONFIG_DRM_DISPLAY_DP_HELPER 2025-02-09 03:56:34 +02:00
hyperv drm: remove driver date from struct drm_driver and all drivers 2024-12-05 12:35:42 +02:00
i915 Merge tag 'drm-intel-gt-next-2025-03-12' of https://gitlab.freedesktop.org/drm/i915/kernel into drm-next 2025-03-25 08:21:07 +10:00
imagination Linux 6.14-rc6 2025-03-12 09:43:12 +10:00
imx drm/connector: make mode_valid take a const struct drm_display_mode 2025-01-07 12:45:19 +02:00
ingenic drm/bridge: Pass full state to atomic_disable 2025-02-19 16:59:12 +01:00
kmb drm-misc-next for 6.14: 2024-12-13 08:48:09 +10:00
lib
lima drm/sched: Use struct for drm_sched_init() params 2025-02-12 11:59:52 +01:00
logicvc drm-misc-next for 6.14: 2024-12-13 08:48:09 +10:00
loongson drm/atomic: Let drivers decide which planes to async flip 2025-02-14 00:54:29 +02:00
mcde drm-misc-next for 6.14: 2024-12-13 08:48:09 +10:00
mediatek Mediatek DRM Next for Linux 6.15 2025-03-14 14:28:56 +10:00
meson drm/bridge: Pass full state to atomic_disable 2025-02-19 16:59:12 +01:00
mgag200 drm/mgag200: Added support for the new device G200eH5 2025-02-11 10:53:53 +01:00
msm drm/msm/dpu: drop wb2_formats_rgb 2025-03-08 02:16:49 +02:00
mxsfb drm-misc-next for 6.14: 2024-12-13 08:48:09 +10:00
nouveau Linux 6.14-rc6 2025-03-12 09:43:12 +10:00
omapdrm drm/bridge: Pass full state to atomic_disable 2025-02-19 16:59:12 +01:00
panel drm/panel: fix Visionox RM692E5 dependencies 2025-03-05 19:52:02 +01:00
panfrost drm/sched: Use struct for drm_sched_init() params 2025-02-12 11:59:52 +01:00
panthor drm/panthor: Clean up FW version information display 2025-03-05 14:15:04 +00:00
pl111 drm: remove driver date from struct drm_driver and all drivers 2024-12-05 12:35:42 +02:00
qxl drm/connector: make mode_valid take a const struct drm_display_mode 2025-01-07 12:45:19 +02:00
radeon drm/radeon/uvd: Replace nested max() with single max3() 2025-03-19 15:51:40 -04:00
renesas drm/bridge: Pass full state to atomic_disable 2025-02-19 16:59:12 +01:00
rockchip drm/rockchip: lvds: lower log severity for missing pinctrl settings 2025-03-04 16:59:58 +01:00
scheduler Linux 6.14-rc6 2025-03-12 09:43:12 +10:00
solomon drm/ssd130x: ensure ssd132x pitch is correct 2025-01-16 10:48:47 +01:00
sprd drm-misc-next for 6.14: 2024-12-13 08:48:09 +10:00
sti drm/connector: make mode_valid take a const struct drm_display_mode 2025-01-07 12:45:19 +02:00
stm drm/stm: move to devm_platform_ioremap_resource() usage 2025-02-26 15:27:07 +01:00
sun4i drm-misc-next for 6.14: 2024-12-13 08:48:09 +10:00
tegra drm/atomic: Let drivers decide which planes to async flip 2025-02-14 00:54:29 +02:00
tests drm/format-helper: Add conversion from XRGB8888 to BGR888 2025-03-03 16:13:33 +01:00
tidss drm/tidss: Fix typos 2025-01-24 09:41:01 +02:00
tilcdc drm-misc-next for 6.14: 2024-12-13 08:48:09 +10:00
tiny Short summary of fixes pull: 2025-03-24 17:52:28 +10:00
ttm drm/ttm: Add helpers for shrinking 2025-03-05 17:08:59 +01:00
tve200 drm-misc-next for 6.14: 2024-12-13 08:48:09 +10:00
udl drm: remove driver date from struct drm_driver and all drivers 2024-12-05 12:35:42 +02:00
v3d drm/v3d: Add clock handling 2025-02-12 09:55:50 -03:00
vboxvideo drm/vboxvideo: Remove unused hgsmi_cursor_position 2025-02-28 09:05:10 +01:00
vc4 drm/vc4: hdmi: Fix some NULL vs IS_ERR() bugs 2025-03-03 14:25:14 +01:00
vgem drm: remove driver date from struct drm_driver and all drivers 2024-12-05 12:35:42 +02:00
virtio drm/virtio: Add drm_panic support 2025-02-09 20:36:51 +03:00
vkms Linux 6.14-rc6 2025-03-12 09:43:12 +10:00
vmwgfx Merge drm/drm-next into drm-misc-next 2025-02-06 13:47:32 +01:00
xe drm/xe: Use correct type width for alignment in fb pinning code 2025-03-12 20:56:58 -07:00
xen drm: remove driver date from struct drm_driver and all drivers 2024-12-05 12:35:42 +02:00
xlnx drm/bridge: Pass full state to atomic_disable 2025-02-19 16:59:12 +01:00
drm_atomic_helper.c drm/atomic-helper: Add a note in drm_atomic_helper_reset_crtc() kernel-doc 2025-02-21 10:57:21 +01:00
drm_atomic_state_helper.c
drm_atomic_uapi.c drm/atomic: Let drivers decide which planes to async flip 2025-02-14 00:54:29 +02:00
drm_atomic.c drm/atomic: add interlaced and ycbcr_420 flags to connector's state dump 2024-10-24 22:42:25 +03:00
drm_auth.c
drm_blend.c
drm_bridge.c drm/bridge: Change parameter name of drm_atomic_bridge_chain_enable() 2025-02-19 16:59:20 +01:00
drm_buddy.c drm/buddy: Add a testcase to verify the multiroot fini 2025-01-14 20:43:19 +05:30
drm_cache.c
drm_client_event.c drm/client: Send pending hotplug events after resume 2025-03-05 21:48:49 +01:00
drm_client_modeset.c drm/client: Handle tiled displays better 2025-01-21 11:41:05 +01:00
drm_client.c drm/client: Move client event handlers to drm_client_event.c 2024-10-18 09:23:03 +02:00
drm_color_mgmt.c
drm_connector.c Linux 6.13 2025-01-23 14:42:21 +01:00
drm_crtc_helper_internal.h drm/connector: make mode_valid take a const struct drm_display_mode 2025-01-07 12:45:19 +02:00
drm_crtc_helper.c
drm_crtc_internal.h
drm_crtc.c drm: add clone mode check for CRTC 2025-01-08 01:39:58 +02:00
drm_damage_helper.c drm/damage-helper: add const qualifier in drm_atomic_helper_damage_merged() 2025-03-03 14:45:40 +02:00
drm_debugfs_crc.c
drm_debugfs.c drm/debugfs: fix printk format for bridge index 2025-02-17 14:17:53 +01:00
drm_displayid_internal.h
drm_displayid.c
drm_draw_internal.h drm/panic: Move drawing functions to drm_draw 2024-12-10 14:36:41 +01:00
drm_draw.c drm/panic: Move drawing functions to drm_draw 2024-12-10 14:36:41 +01:00
drm_drv.c drm: Introduce device wedged event 2025-02-13 12:15:43 -05:00
drm_dumb_buffers.c
drm_edid_load.c
drm_edid.c drm/connector: add mutex to protect ELD from concurrent access 2024-12-16 18:02:07 +02:00
drm_eld.c
drm_encoder.c
drm_exec.c
drm_fb_dma_helper.c drm/fb-dma-helper: Test for imported buffers with drm_gem_is_imported() 2025-03-06 08:59:17 +01:00
drm_fb_helper.c drm/fb-helper: Remove struct drm_fb_helper.fb_probe 2025-03-05 21:48:50 +01:00
drm_fbdev_dma.c drm/fbdev-dma: Add shadow buffering for deferred I/O 2025-02-27 09:37:55 +01:00
drm_fbdev_shmem.c
drm_fbdev_ttm.c
drm_file.c drm/file: Add fdinfo helper for printing regions with prefix 2025-02-07 15:23:36 +01:00
drm_flip_work.c
drm_format_helper.c drm/format-helper: Add conversion from XRGB8888 to BGR888 2025-03-03 16:13:33 +01:00
drm_fourcc.c
drm_framebuffer.c - The series "resource: A couple of cleanups" from Andy Shevchenko 2024-11-25 16:09:48 -08:00
drm_gem_atomic_helper.c
drm_gem_dma_helper.c drm/gem-dma: Use dma_buf from GEM object instance 2025-03-06 08:59:01 +01:00
drm_gem_framebuffer_helper.c drm/gem-framebuffer: Use dma_buf from GEM object instance 2025-03-06 08:59:14 +01:00
drm_gem_shmem_helper.c drm/gem-shmem: Use dma_buf from GEM object instance 2025-03-06 08:59:07 +01:00
drm_gem_ttm_helper.c
drm_gem_vram_helper.c
drm_gem.c drm/gem: Test for imported GEM buffers with helper 2025-03-06 08:58:27 +01:00
drm_gpusvm.c drm/gpusvm: Fix kernel-doc 2025-03-12 20:53:47 -07:00
drm_gpuvm.c
drm_internal.h drm/client: Make client support optional 2024-10-18 09:23:03 +02:00
drm_ioc32.c
drm_ioctl.c drm: add DRM_SET_CLIENT_NAME ioctl 2024-10-08 10:00:30 +02:00
drm_kms_helper_common.c
drm_lease.c
drm_managed.c drm/managed: Add DRM-managed alloc_ordered_workqueue 2025-01-21 10:32:31 +01:00
drm_mipi_dbi.c drm/mipi-dbi: Test for imported buffers with drm_gem_is_imported() 2025-03-06 08:59:20 +01:00
drm_mipi_dsi.c drm/mipi-dsi: stop passing non struct drm_device to drm_err() and friends 2025-03-04 17:00:24 +02:00
drm_mm.c
drm_mode_config.c drm/connector: Add FIXME for GETRESOURCES ioctl wrt. uninited connectors 2024-12-17 15:43:04 +02:00
drm_mode_object.c
drm_modes.c Linux 6.13-rc6 2025-01-10 14:24:17 +10:00
drm_modeset_helper.c drm/client: Move suspend/resume into DRM client callbacks 2024-10-18 09:23:03 +02:00
drm_modeset_lock.c
drm_of.c drm: of: drm_of_find_panel_or_bridge: move misplaced comment 2025-02-17 14:17:55 +01:00
drm_panel_backlight_quirks.c drm: panel-backlight-quirks: Add Framework 13 glossy and 2.8k panels 2024-11-21 09:28:15 -06:00
drm_panel_orientation_quirks.c drm: panel-orientation-quirks: Add quirk for OneXPlayer Mini (Intel) 2025-02-17 09:19:07 +01:00
drm_panel.c drm/bridge: panel: forbid initializing a panel with unknown connector type 2025-02-17 14:17:59 +01:00
drm_panic_qr.rs drm/panic: Better binary encoding in QR code 2025-02-07 17:52:09 +01:00
drm_panic.c drm/panic: Better binary encoding in QR code 2025-02-07 17:52:09 +01:00
drm_pci.c
drm_plane_helper.c
drm_plane.c
drm_prime.c drm/prime: Use dma_buf from GEM object instance 2025-03-06 08:59:36 +01:00
drm_print.c drm/print: add drm_print_hex_dump() 2024-12-10 14:08:40 +02:00
drm_privacy_screen_x86.c
drm_privacy_screen.c
drm_probe_helper.c drm/probe-helper: Call connector detect functions in single helper 2025-01-14 11:20:49 +01:00
drm_property.c
drm_rect.c
drm_self_refresh_helper.c
drm_simple_kms_helper.c
drm_suballoc.c
drm_syncobj.c fdget(), trivial conversions 2024-11-03 01:28:06 -05:00
drm_sysfs.c
drm_trace_points.c
drm_trace.h
drm_vblank_work.c treewide: Introduce kthread_run_worker[_on_cpu]() 2025-01-08 18:15:03 +01:00
drm_vblank.c
drm_vma_manager.c
drm_writeback.c drm: writeback: Fix kernel doc name 2025-02-20 15:02:09 +01:00
Kconfig UAPI Changes: 2025-03-11 10:26:17 +10:00
Makefile UAPI Changes: 2025-03-11 10:26:17 +10:00