summaryrefslogtreecommitdiff
path: root/drivers/gpu
AgeCommit message (Collapse)Author
2026-08-25drm/amd/display: Cover hdmi_frl_status_polling_workBhawanpreet Lakha
Add KUnit tests for hdmi_frl_status_polling_work() covering the no-links, no-local-sink, non-HDMI and zero-FRL-rate skip cases, plus the poll paths that leave the link unchanged or trigger a retrain. Assisted-by: Copilot:Claude-Opus-4.8 Reviewed-by: Alex Hung <alex.hung@amd.com> Signed-off-by: Bhawanpreet Lakha <bhawanpreet.lakha@amd.com> Signed-off-by: Ivan Lipski <ivan.lipski@amd.com> Tested-by: Dan Wheeler <daniel.wheeler@amd.com> Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
2026-08-25drm/amd/display: Refactor hdmi_frl_status_polling_work for Kunit testingIvan Lipski
[Why&How] The KUnit connector test references hdmi_frl_status_polling_work(), but the function was static with no visible prototype, causing a build failure (undeclared / implicit declaration). Make the function non-static and add a prototype to amdgpu_dm_connector.h so the test can reference it. The INIT_DELAYED_WORK setup remains in amdgpu_dm_connector_init_helper(); no runtime behavior change. Assisted-by: Copilot:Claude-Opus-4.8 Reviewed-by: Alex Hung <alex.hung@amd.com> Signed-off-by: Ivan Lipski <ivan.lipski@amd.com> Tested-by: Dan Wheeler <daniel.wheeler@amd.com> Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
2026-08-25drm/amd/display: Cover add_fs_modes illegal timing skipBhawanpreet Lakha
Add a KUnit test for add_fs_modes() confirming that a generated mode with illegal timing is skipped rather than added. Assisted-by: Copilot:Claude-Opus-4.8 Reviewed-by: Alex Hung <alex.hung@amd.com> Signed-off-by: Bhawanpreet Lakha <bhawanpreet.lakha@amd.com> Signed-off-by: Ivan Lipski <ivan.lipski@amd.com> Tested-by: Dan Wheeler <daniel.wheeler@amd.com> Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
2026-08-25drm/amd/display: Cover add_fs_modes mode generationBhawanpreet Lakha
Add KUnit tests for add_fs_modes() covering successful freesync-video mode generation and refresh rates that fall outside the supported range. Assisted-by: Copilot:Claude-Opus-4.8 Reviewed-by: Alex Hung <alex.hung@amd.com> Signed-off-by: Bhawanpreet Lakha <bhawanpreet.lakha@amd.com> Signed-off-by: Ivan Lipski <ivan.lipski@amd.com> Tested-by: Dan Wheeler <daniel.wheeler@amd.com> Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
2026-08-25drm/amd/display: Cover amdgpu_dm_prune_primary_tile_modesBhawanpreet Lakha
Add KUnit tests for amdgpu_dm_prune_primary_tile_modes() covering the no-sink, no panel-patch and non-tiled early returns, a secondary tile, and the primary-tile path that prunes per-tile modes. Assisted-by: Copilot:Claude-Opus-4.8 Reviewed-by: Alex Hung <alex.hung@amd.com> Signed-off-by: Bhawanpreet Lakha <bhawanpreet.lakha@amd.com> Signed-off-by: Ivan Lipski <ivan.lipski@amd.com> Tested-by: Dan Wheeler <daniel.wheeler@amd.com> Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
2026-08-25drm/amd/display: Fix mismatch number of OPP/DPP accountingDillon Varone
[WHY&HOW] For cases where number of OPP/DPP mismatch, like 4 planes, 1 stream on a 3 OPP ASIC, mode support would previously fail citing lack of OPP's. This is incorrect, as the configuration only needs 1 OPP but 4 DPP's. Reviewed-by: Austin Zheng <austin.zheng@amd.com> Signed-off-by: Dillon Varone <Dillon.Varone@amd.com> Signed-off-by: Ivan Lipski <ivan.lipski@amd.com> Tested-by: Dan Wheeler <daniel.wheeler@amd.com> Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
2026-08-25drm/amd/display: Test amdgpu_dm_dcn10_register_irq_handlersAlex Hung
[WHAT] Add KUnit tests for amdgpu_dm_dcn10_register_irq_handlers() covering the add_id() rejections for the VUPDATE and HPD sources and the invalid-source guard in the VUPDATE_NO_LOCK loop, and for amdgpu_dm_register_outbox_irq_handlers() rejecting a source with no funcs table. [HOW] Reuse the shared registration fixture and the fake IRQ service that maps no source IDs. Assisted-by: Copilot:Claude-Opus-5 Reviewed-by: Bhawanpreet Lakha <bhawanpreet.lakha@amd.com> Signed-off-by: Alex Hung <alex.hung@amd.com> Signed-off-by: Ivan Lipski <ivan.lipski@amd.com> Tested-by: Dan Wheeler <daniel.wheeler@amd.com> Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
2026-08-25drm/amd/display: Test amdgpu_dm_dce110_register_irq_handlersAlex Hung
[WHAT] Add KUnit tests for amdgpu_dm_dce110_register_irq_handlers() covering the SOC15 DCE client used from Vega on, the amdgpu_irq_add_id() rejections for the CRTC, VUPDATE and HPD sources, and the invalid-source guards in the VBLANK, VUPDATE and PFLIP loops. [HOW] Add three fake IRQ services that map only a prefix of the source IDs so each loop reaches its guard in turn. Clearing a single amdgpu_irq_src's funcs makes only that source's add_id() fail. Assisted-by: Copilot:Claude-Opus-5 Reviewed-by: Bhawanpreet Lakha <bhawanpreet.lakha@amd.com> Signed-off-by: Alex Hung <alex.hung@amd.com> Signed-off-by: Ivan Lipski <ivan.lipski@amd.com> Tested-by: Dan Wheeler <daniel.wheeler@amd.com> Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
2026-08-25drm/amd/display: Test dm_dmub_outbox1_low_irq drain and work guardsAlex Hung
[WHAT] Add KUnit tests for dm_dmub_outbox1_low_irq() draining a trace ring up to the DMUB_TRACE_MAX_READ cap, dm_handle_hpd_work() rejecting a work item with no notification, and amdgpu_dm_irq_schedule_work() not queueing once the IRQ workqueue is gone. [HOW] Back dmub->outbox0_rb with a fake ring whose write pointer sits one entry past the cap, and keep the ring larger so the read pointer does not wrap. dm_handle_hpd_work() returns before its own kfree() on the NULL-notify path, so the test frees the work item. Assisted-by: Copilot:Claude-Opus-5 Reviewed-by: Bhawanpreet Lakha <bhawanpreet.lakha@amd.com> Signed-off-by: Alex Hung <alex.hung@amd.com> Signed-off-by: Ivan Lipski <ivan.lipski@amd.com> Tested-by: Dan Wheeler <daniel.wheeler@amd.com> Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
2026-08-25drm/amd/display: Test HPD RX, HPD init and DMUB callback branchesAlex Hung
[WHAT] Add KUnit tests for handle_hpd_rx_irq() re-detecting a downstream port change on a non-MST-root connector, amdgpu_dm_hpd_init() skipping a connector with no dc_link, and dmub_hpd_callback() deferring HPD while suspended. Also add a writeback connector to the HPD registration test. [HOW] The downstream-change test reuses dm_test_setup_hpd_rx_irq() and clears the MST root state, with dc_link_detect() stubbed to fail. The suspend test leaves adev->dm.ddev NULL, so reaching the connector walk would crash. Assisted-by: Copilot:Claude-Opus-5 Reviewed-by: Bhawanpreet Lakha <bhawanpreet.lakha@amd.com> Signed-off-by: Alex Hung <alex.hung@amd.com> Signed-off-by: Ivan Lipski <ivan.lipski@amd.com> Tested-by: Dan Wheeler <daniel.wheeler@amd.com> Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
2026-08-25drm/amd/display: Test handle_hpd_irq_helper detect and debounce exitsAlex Hung
[WHAT] Add KUnit tests for handle_hpd_irq_helper() covering a failing dc_link_detect_connection_type() and the early return taken when a debounce re-detect is already scheduled. Also arm the debounce work in the stale-prev-sink test so mod_delayed_work() re-schedules. [HOW] Both build on dm_test_setup_hpd_irq_helper() and override only the link_srv stubs they need. The pending-debounce test arms the work ten seconds out and spies on dc_link_detect() to prove it was skipped. Assisted-by: Copilot:Claude-Opus-5 Reviewed-by: Bhawanpreet Lakha <bhawanpreet.lakha@amd.com> Signed-off-by: Alex Hung <alex.hung@amd.com> Signed-off-by: Ivan Lipski <ivan.lipski@amd.com> Tested-by: Dan Wheeler <daniel.wheeler@amd.com> Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
2026-08-25drm/amd/display: Test schedule_dc_vmin_vmaxAlex Hung
[WHAT] Add KUnit tests for schedule_dc_vmin_vmax(), which had no coverage. Both callers are exercised: dm_crtc_high_irq() on an AI+ family and the DCE path of dm_vupdate_high_irq() on a pre-DCE12 family. [HOW] Add a dm_test_setup_vmin_vmax_crtc() fixture building a CRTC with an active VRR stream and a vmin/vmax work queue. Each test flushes the queue and checks the worker applied the adjust and dropped its stream reference. Assisted-by: Copilot:Claude-Opus-5 Reviewed-by: Bhawanpreet Lakha <bhawanpreet.lakha@amd.com> Signed-off-by: Alex Hung <alex.hung@amd.com> Signed-off-by: Ivan Lipski <ivan.lipski@amd.com> Tested-by: Dan Wheeler <daniel.wheeler@amd.com> Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
2026-08-25drm/amd/display: Test writeback handling in dm_crtc_high_irqAlex Hung
[WHAT] Add KUnit tests for the two writeback vblanks in dm_crtc_high_irq(): the first disables frame capture and marks wb_frame_done, the second signals the out fence and clears the pending state. [HOW] dc_stream_fc_disable_writeback() dereferences dc->res_pool before its NULL-stream check, so supply a dc with a fake IRQ service. The completion test queues a bare drm_writeback_job and holds a vblank reference for the completion's drm_crtc_vblank_put(). Assisted-by: Copilot:Claude-Opus-5 Reviewed-by: Bhawanpreet Lakha <bhawanpreet.lakha@amd.com> Signed-off-by: Alex Hung <alex.hung@amd.com> Signed-off-by: Ivan Lipski <ivan.lipski@amd.com> Tested-by: Dan Wheeler <daniel.wheeler@amd.com> Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
2026-08-25drm/amd/display: Test pageflip completion in the high IRQ handlersAlex Hung
[WHAT] Add KUnit tests for pageflip completion: the non-VRR path in dm_pflip_high_irq(), and the DCN VUPDATE_NO_LOCK paths in dm_vupdate_high_irq() that deliver the event once the OTG reports no flip pending, or retire the flip when there are no active planes. [HOW] Initialise DRM vblank and hold a reference to balance the handler's drm_crtc_vblank_put(). A non-zero DCE IP version selects the DCN path, and a NULL adev->dm.dc makes dc_get_flip_pending_on_otg() report no pending flip. Assisted-by: Copilot:Claude-Opus-5 Reviewed-by: Bhawanpreet Lakha <bhawanpreet.lakha@amd.com> Signed-off-by: Alex Hung <alex.hung@amd.com> Signed-off-by: Ivan Lipski <ivan.lipski@amd.com> Tested-by: Dan Wheeler <daniel.wheeler@amd.com> Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
2026-08-25drm/amd/display: Refactor amdgpu_dm_irq_testAlex Hung
[WHAT] Several amdgpu_dm_irq tests were each open-coding the same setup. Share it through three functions: dm_test_add_crtc(), dm_test_setup_hpd_irq_helper() and dm_test_setup_irq_regs(). Assisted-by: Copilot:Claude-Opus-5 Reviewed-by: Bhawanpreet Lakha <bhawanpreet.lakha@amd.com> Signed-off-by: Alex Hung <alex.hung@amd.com> Signed-off-by: Ivan Lipski <ivan.lipski@amd.com> Tested-by: Dan Wheeler <daniel.wheeler@amd.com> Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
2026-08-25drm/amd/display: Cover amdgpu_set_panel_orientationBhawanpreet Lakha
Add KUnit tests for amdgpu_set_panel_orientation() covering the non-eDP early return, the missing native mode case, and a panel that applies the orientation quirk. Assisted-by: Copilot:Claude-Opus-4.8 Reviewed-by: Alex Hung <alex.hung@amd.com> Signed-off-by: Bhawanpreet Lakha <bhawanpreet.lakha@amd.com> Signed-off-by: Ivan Lipski <ivan.lipski@amd.com> Tested-by: Dan Wheeler <daniel.wheeler@amd.com> Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
2026-08-25drm/amd/display: Cover create_eml_sink valid EDID pathBhawanpreet Lakha
Add KUnit tests driving create_eml_sink() through the valid-EDID branch: reading the EDID over DDC, and the forced-on paths using an emulated sink and a cached local sink. Assisted-by: Copilot:Claude-Opus-4.8 Reviewed-by: Alex Hung <alex.hung@amd.com> Signed-off-by: Bhawanpreet Lakha <bhawanpreet.lakha@amd.com> Signed-off-by: Ivan Lipski <ivan.lipski@amd.com> Tested-by: Dan Wheeler <daniel.wheeler@amd.com> Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
2026-08-25drm/amd/display: Cover amdgpu_dm_connector_get_modesBhawanpreet Lakha
Add KUnit tests for amdgpu_dm_connector_get_modes() covering the no-EDID default modes, the extra modes added for 128b/132b and analog links, and the path that adds modes from a valid EDID. Assisted-by: Copilot:Claude-Opus-4.8 Reviewed-by: Alex Hung <alex.hung@amd.com> Signed-off-by: Bhawanpreet Lakha <bhawanpreet.lakha@amd.com> Signed-off-by: Ivan Lipski <ivan.lipski@amd.com> Tested-by: Dan Wheeler <daniel.wheeler@amd.com> Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
2026-08-25drm/amd/display: Cover funcs_force valid EDID pathBhawanpreet Lakha
Add a KUnit test that drives amdgpu_dm_connector_funcs_force() through the valid-EDID branch: a fake i2c adapter serves a valid EDID over the DDC read protocol so the connector caches drm_edid and, with an emulated sink and dc_link present, copies the raw EDID into the sink and parses its caps. Assisted-by: Copilot:Claude-Opus-4.8 Reviewed-by: Alex Hung <alex.hung@amd.com> Signed-off-by: Bhawanpreet Lakha <bhawanpreet.lakha@amd.com> Signed-off-by: Ivan Lipski <ivan.lipski@amd.com> Tested-by: Dan Wheeler <daniel.wheeler@amd.com> Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
2026-08-25drm/amd/display: Cover atomic_check modeset triggersBhawanpreet Lakha
Add KUnit tests for the amdgpu_dm_connector_atomic_check() properties that force a modeset: privacy-screen, colorspace and content-type changes, plus the HDR-metadata exit and fill-error branches. Assisted-by: Copilot:Claude-Opus-4.8 Reviewed-by: Alex Hung <alex.hung@amd.com> Signed-off-by: Bhawanpreet Lakha <bhawanpreet.lakha@amd.com> Signed-off-by: Ivan Lipski <ivan.lipski@amd.com> Tested-by: Dan Wheeler <daniel.wheeler@amd.com> Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
2026-08-25drm/amd/display: Cover amdgpu_dm_connector_atomic_checkBhawanpreet Lakha
Add KUnit tests for amdgpu_dm_connector_atomic_check() covering the no-CRTC early return, the DP-MST connector path, and an unchanged state that skips revalidation. Assisted-by: Copilot:Claude-Opus-4.8 Reviewed-by: Alex Hung <alex.hung@amd.com> Signed-off-by: Bhawanpreet Lakha <bhawanpreet.lakha@amd.com> Signed-off-by: Ivan Lipski <ivan.lipski@amd.com> Tested-by: Dan Wheeler <daniel.wheeler@amd.com> Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
2026-08-25drm/amd/display: Cover amdgpu_dm_fill_hdr_info_packetBhawanpreet Lakha
Add KUnit tests for amdgpu_dm_fill_hdr_info_packet() covering the HDMI and DisplayPort HDR paths, an unsupported connector signal, and invalid HDR metadata. Assisted-by: Copilot:Claude-Opus-4.8 Reviewed-by: Alex Hung <alex.hung@amd.com> Signed-off-by: Bhawanpreet Lakha <bhawanpreet.lakha@amd.com> Signed-off-by: Ivan Lipski <ivan.lipski@amd.com> Tested-by: Dan Wheeler <daniel.wheeler@amd.com> Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
2026-08-25drm/amd/display: Cover mode_valid EDID mgmt pathBhawanpreet Lakha
Add a KUnit test driving amdgpu_dm_connector_mode_valid() through the EDID-management branch for a forced-on connector. Assisted-by: Copilot:Claude-Opus-4.8 Reviewed-by: Alex Hung <alex.hung@amd.com> Signed-off-by: Bhawanpreet Lakha <bhawanpreet.lakha@amd.com> Signed-off-by: Ivan Lipski <ivan.lipski@amd.com> Tested-by: Dan Wheeler <daniel.wheeler@amd.com> Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
2026-08-25drm/amd/display: Remove RMCM tetrahedral cube from dc_plane_stateRafal Ostrowski
[Why&How] MCM and RMCM both took their cube from struct tetrahedral_params, which is embedded by value in dc_3dlut and therefore in dc_plane_state and dc.scratch. RMCM needs a 33x33x33 cube, but that cube is ~421KB, so enabling it in the shared union - where tetrahedral_33 was left commented out - would push sizeof(struct dc) past the kmalloc MAX_PAGE_ORDER limit and break kunit and other allocations. Drop the unused struct tetrahedral_33x33x33 definition and lut_dim. Reviewed-by: Dillon Varone <dillon.varone@amd.com> Reviewed-by: Sridevi Arvindekar <sridevi.arvindekar@amd.com> Signed-off-by: Rafal Ostrowski <rafal.ostrowski@amd.com> Signed-off-by: Ivan Lipski <ivan.lipski@amd.com> Tested-by: Dan Wheeler <daniel.wheeler@amd.com> Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
2026-08-25drm/amd/display: Test cursor update and async plane updateAlex Hung
[WHAT] Add KUnit tests for amdgpu_dm_plane_handle_cursor_update() and amdgpu_dm_plane_atomic_async_update() covering the return taken when the cursor plane has no framebuffer, and the copy of the new position and size into the plane state ahead of the cursor update. Assisted-by: Copilot:Claude-Opus-5 Reviewed-by: Bhawanpreet Lakha <bhawanpreet.lakha@amd.com> Signed-off-by: Alex Hung <alex.hung@amd.com> Signed-off-by: Ivan Lipski <ivan.lipski@amd.com> Tested-by: Dan Wheeler <daniel.wheeler@amd.com> Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
2026-08-25drm/amd/display: Test framebuffer prepare and cleanupAlex Hung
[WHAT] Add KUnit tests for amdgpu_dm_plane_helper_prepare_fb() and amdgpu_dm_plane_helper_cleanup_fb() covering the early return taken when the plane state carries no framebuffer, so no buffer object is pinned or unpinned. Assisted-by: Copilot:Claude-Opus-5 Reviewed-by: Bhawanpreet Lakha <bhawanpreet.lakha@amd.com> Signed-off-by: Alex Hung <alex.hung@amd.com> Signed-off-by: Ivan Lipski <ivan.lipski@amd.com> Tested-by: Dan Wheeler <daniel.wheeler@amd.com> Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
2026-08-25drm/amd/display: Test GFX6-8 modifier list generationAlex Hung
[WHAT] Add KUnit tests for amdgpu_dm_plane_get_plane_modifiers() and amdgpu_dm_plane_format_mod_supported() on a GFX6-8 device. The exposed list holds one macro tiled modifier per distinct bits per pixel plus a micro tiled and a linear one, and a listed modifier is validated through the GFX6-8 specific check. Add dm_test_mods_count() for the list length and use it in the existing sentinel scans. Assisted-by: Copilot:Claude-Opus-5 Reviewed-by: Bhawanpreet Lakha <bhawanpreet.lakha@amd.com> Signed-off-by: Alex Hung <alex.hung@amd.com> Signed-off-by: Ivan Lipski <ivan.lipski@amd.com> Tested-by: Dan Wheeler <daniel.wheeler@amd.com> Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
2026-08-25drm/amd/display: Test GFX6-8 modifier calculationAlex Hung
[WHAT] Add KUnit tests for amdgpu_dm_plane_calc_gfx6_mod() and amdgpu_dm_plane_gfx6_format_mod_supported() covering the micro tiled early return, the GFX7-8 macro tile mode table lookup, the GFX6 tile mode register fields, and the rejection of foreign, DCC, newer tile version, GFX9+ and non-displayable modifiers. Assisted-by: Copilot:Claude-Opus-5 Reviewed-by: Bhawanpreet Lakha <bhawanpreet.lakha@amd.com> Signed-off-by: Alex Hung <alex.hung@amd.com> Signed-off-by: Ivan Lipski <ivan.lipski@amd.com> Tested-by: Dan Wheeler <daniel.wheeler@amd.com> Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
2026-08-25drm/amd/display: Test GFX6-8 tile mode and tile split lookupsAlex Hung
[WHAT] Add KUnit tests for amdgpu_dm_plane_get_gfx6_tile_idx(), amdgpu_dm_plane_calc_gfx7_tile_split() and amdgpu_dm_plane_get_gfx7_macro_tile_idx() covering the per-family tile mode index selection, the tile split derived from the sample split factor with its 256 byte and memory row size clamps, and the macro tile index capped by the tile split. Assisted-by: Copilot:Claude-Opus-5 Reviewed-by: Bhawanpreet Lakha <bhawanpreet.lakha@amd.com> Signed-off-by: Alex Hung <alex.hung@amd.com> Signed-off-by: Ivan Lipski <ivan.lipski@amd.com> Tested-by: Dan Wheeler <daniel.wheeler@amd.com> Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
2026-08-25drm/amd/display: Test GFX6-8 tiling info from modifiersAlex Hung
[WHAT] Add KUnit tests for amdgpu_dm_plane_fill_gfx6_tiling_info_from_modifier() covering the linear, micro tiled and macro tiled modifiers, and the rejection of a modifier that is not of the GFX6 tile version. Assisted-by: Copilot:Claude-Opus-5 Reviewed-by: Bhawanpreet Lakha <bhawanpreet.lakha@amd.com> Signed-off-by: Alex Hung <alex.hung@amd.com> Signed-off-by: Ivan Lipski <ivan.lipski@amd.com> Tested-by: Dan Wheeler <daniel.wheeler@amd.com> Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
2026-08-25drm/amd/display: Test modifier list de-duplicationAlex Hung
[WHAT] Add KUnit tests for amdgpu_dm_plane_add_modifier_dedup() covering a modifier already present in the list, which is not appended a second time, a new modifier, which is appended, and a NULL list left over from an earlier allocation failure, which is a no-op. Assisted-by: Copilot:Claude-Opus-5 Reviewed-by: Bhawanpreet Lakha <bhawanpreet.lakha@amd.com> Signed-off-by: Alex Hung <alex.hung@amd.com> Signed-off-by: Ivan Lipski <ivan.lipski@amd.com> Tested-by: Dan Wheeler <daniel.wheeler@amd.com> Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
2026-08-25drm/amd/display: Test plane state duplicate and destroyAlex Hung
[WHAT] Add KUnit tests for amdgpu_dm_plane_drm_plane_duplicate_state() and amdgpu_dm_plane_drm_plane_destroy_state() covering the resource paths. Duplicating a state shares every color blob and takes an extra reference on the DC plane state, and destroying one drops a reference on each. Assisted-by: Copilot:Claude-Opus-5 Reviewed-by: Bhawanpreet Lakha <bhawanpreet.lakha@amd.com> Signed-off-by: Alex Hung <alex.hung@amd.com> Signed-off-by: Ivan Lipski <ivan.lipski@amd.com> Tested-by: Dan Wheeler <daniel.wheeler@amd.com> Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
2026-08-25drm/amd/display: Test dm_dp_mst_connector_destroyAlex Hung
[WHAT] Add KUnit tests for dm_dp_mst_connector_destroy() covering the teardown of a connector that never had a remote sink, and the teardown that first removes the remote sink from the DC link. [HOW] The function frees both the connector and the MST port, so the test allocates them outside the KUnit managed allocator. The parent branch device takes an extra malloc reference so it survives the port teardown. Assisted-by: Copilot:Claude-Opus-5 Reviewed-by: Bhawanpreet Lakha <bhawanpreet.lakha@amd.com> Signed-off-by: Alex Hung <alex.hung@amd.com> Signed-off-by: Ivan Lipski <ivan.lipski@amd.com> Tested-by: Dan Wheeler <daniel.wheeler@amd.com> Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
2026-08-25drm/amd/display: Test MST connector register and unregisterAlex Hung
[WHAT] Add KUnit tests for amdgpu_dm_mst_connector_late_register() and amdgpu_dm_mst_connector_early_unregister(), covering the remote AUX bus registration, the unregister that only resets the MST status when no remote sink is attached, and the unregister that removes the sink from the DC link and clears the MST connector state. [HOW] The tests reuse the MST downstream connector fixture, which already provides the kernel device the DRM MST helpers log through and the modeset lock the unregister path takes. Assisted-by: Copilot:Claude-Opus-5 Reviewed-by: Bhawanpreet Lakha <bhawanpreet.lakha@amd.com> Signed-off-by: Alex Hung <alex.hung@amd.com> Signed-off-by: Ivan Lipski <ivan.lipski@amd.com> Tested-by: Dan Wheeler <daniel.wheeler@amd.com> Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
2026-08-25drm/amd/display: Test dm_dp_mst_detect DPCD probe and unplugAlex Hung
[WHAT] Add KUnit tests for dm_dp_mst_detect() covering the DPCD revision probe of a peer device, the fallback when both revision registers read back as zero, the NAKed remote read that must leave the cached revision alone, and the unplugged port whose disconnected status releases the remote sink and resets the MST connector state. [HOW] The tests reuse the MST downstream connector fixture. Its empty topology manager makes drm_dp_mst_detect_port() report a disconnected port, which is what the unplug path needs, and the port AUX is served by the fake DPCD store. Assisted-by: Copilot:Claude-Opus-5 Reviewed-by: Bhawanpreet Lakha <bhawanpreet.lakha@amd.com> Signed-off-by: Alex Hung <alex.hung@amd.com> Signed-off-by: Ivan Lipski <ivan.lipski@amd.com> Tested-by: Dan Wheeler <daniel.wheeler@amd.com> Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
2026-08-25drm/amd/display: Test dm_dp_mst_get_modes with a remote EDIDAlex Hung
[WHAT] Add KUnit tests for dm_dp_mst_get_modes() covering the paths taken once an EDID is available: a placeholder virtual sink is released and replaced by a real remote sink, DC refusing that sink returns zero modes, the content protection state is restored from the HDCP workqueue, and an EDID read from a port still in the topology is cached with MST_REMOTE_EDID flagged. [HOW] The tests reuse the MST downstream connector fixture and feed it a minimal EDID base block. For the remote read the fixture topology gains a branch device holding the port so drm_dp_mst_edid_read() can validate it and return the cached EDID. Assisted-by: Copilot:Claude-Opus-5 Reviewed-by: Bhawanpreet Lakha <bhawanpreet.lakha@amd.com> Signed-off-by: Alex Hung <alex.hung@amd.com> Signed-off-by: Ivan Lipski <ivan.lipski@amd.com> Tested-by: Dan Wheeler <daniel.wheeler@amd.com> Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
2026-08-25drm/amd/display: Test dm_dp_mst_get_modes without a remote EDIDAlex Hung
[WHAT] Add KUnit tests for dm_dp_mst_get_modes() covering the path taken when the remote EDID cannot be read: the default remote sink is registered and MST_REMOTE_EDID is cleared, DC refusing the sink leaves the connector without one, and an already attached sink is kept instead of asking DC for a second one. [HOW] A shared fixture builds an MST downstream connector on a real DRM device with an empty topology manager, so drm_dp_mst_edid_read() takes its "port is gone" path without needing a branch device. dc_link_add_remote_sink() and dc_link_remove_remote_sink() are thin wrappers over link_service callbacks, so fakes for those two are enough to run the connector paths without a DC core. Assisted-by: Copilot:Claude-Opus-5 Reviewed-by: Bhawanpreet Lakha <bhawanpreet.lakha@amd.com> Signed-off-by: Alex Hung <alex.hung@amd.com> Signed-off-by: Ivan Lipski <ivan.lipski@amd.com> Tested-by: Dan Wheeler <daniel.wheeler@amd.com> Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
2026-08-25drm/amd/display: Test MST sideband message ack pathAlex Hung
[WHAT] Add KUnit tests for dm_handle_mst_sideband_msg_ready_event() covering the DOWN_REP ready bit that is acknowledged at DPCD and re-polled until the iteration limit, and the case where the acknowledge write keeps failing and the handler gives up after the third retry. [HOW] A live topology manager is needed for the handler to reach its ack path, so the tests initialise one on a DRM device and arm the DOWN_REP ready bit in the fake DPCD. The fake AUX channel gains a separate write result so the ESI read still succeeds while the acknowledge write fails. Assisted-by: Copilot:Claude-Opus-5 Reviewed-by: Bhawanpreet Lakha <bhawanpreet.lakha@amd.com> Signed-off-by: Alex Hung <alex.hung@amd.com> Signed-off-by: Ivan Lipski <ivan.lipski@amd.com> Tested-by: Dan Wheeler <daniel.wheeler@amd.com> Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
2026-08-25drm/amd/display: Cover amdgpu_dm_connector_mode_validBhawanpreet Lakha
Add KUnit tests for amdgpu_dm_connector_mode_valid() covering the missing dc_sink path and a forced-on connector that fails to create a validation stream. Assisted-by: Copilot:Claude-Opus-4.8 Reviewed-by: Alex Hung <alex.hung@amd.com> Signed-off-by: Bhawanpreet Lakha <bhawanpreet.lakha@amd.com> Signed-off-by: Ivan Lipski <ivan.lipski@amd.com> Tested-by: Dan Wheeler <daniel.wheeler@amd.com> Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
2026-08-25drm/amd/display: Cover amdgpu_dm_create_validate_stream_for_sinkBhawanpreet Lakha
Add KUnit tests for amdgpu_dm_create_validate_stream_for_sink() covering the writeback connector path, the colour-depth downgrade when no valid bpc is found, the HDMI YCbCr and forced YCbCr420/422/444 output paths, and the timing/context prune-and-retry loops. Assisted-by: Copilot:Claude-Opus-4.8 Reviewed-by: Alex Hung <alex.hung@amd.com> Signed-off-by: Bhawanpreet Lakha <bhawanpreet.lakha@amd.com> Signed-off-by: Ivan Lipski <ivan.lipski@amd.com> Tested-by: Dan Wheeler <daniel.wheeler@amd.com> Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
2026-08-25drm/amd/display: Cover dm_validate_stream_and_contextBhawanpreet Lakha
Add dm_test_validate_stream_dc_ok_no_pipe which builds a minimal fake dc so stream and plane validation both pass, then lets dc_state_add_stream() bail out early via timing_generator_count == 0 to avoid deep pipe allocation, raising coverage from 24% to 90%. Assisted-by: Copilot:Claude-Opus-4.8 Reviewed-by: Alex Hung <alex.hung@amd.com> Signed-off-by: Bhawanpreet Lakha <bhawanpreet.lakha@amd.com> Signed-off-by: Ivan Lipski <ivan.lipski@amd.com> Tested-by: Dan Wheeler <daniel.wheeler@amd.com> Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
2026-08-25drm/amd/display: Cover hide_secondary_tile_from_userspaceBhawanpreet Lakha
Add a KUnit test that drives amdgpu_dm_connector_detect() through the amdgpu_dm_hide_secondary_tile_from_userspace() path using a sink that requests disable_second_tile and a synthesized DisplayID tiled EDID at a non-origin tile location, so the secondary Apple Studio Display tile is hidden and the connector reports disconnected. Raises the helper coverage from 44% to 100%. Assisted-by: Copilot:Claude-Opus-4.8 Reviewed-by: Alex Hung <alex.hung@amd.com> Signed-off-by: Bhawanpreet Lakha <bhawanpreet.lakha@amd.com> Signed-off-by: Ivan Lipski <ivan.lipski@amd.com> Tested-by: Dan Wheeler <daniel.wheeler@amd.com> Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
2026-08-25drm/amd/display: Add amdgpu_dm_connector_poll KUnit testsBhawanpreet Lakha
Add tests covering the non-shortcut poll paths: connected reusing a cached local_sink, connected via full dc_link_detect(), and the disconnect teardown that releases and clears a stale sink. Fakes wire link->dc->link_srv detect_connection_type/detect_link function pointers. Raises amdgpu_dm_connector_poll coverage from 35% to 100%. Assisted-by: Copilot:Claude-Opus-4.8 Reviewed-by: Alex Hung <alex.hung@amd.com> Signed-off-by: Bhawanpreet Lakha <bhawanpreet.lakha@amd.com> Signed-off-by: Ivan Lipski <ivan.lipski@amd.com> Tested-by: Dan Wheeler <daniel.wheeler@amd.com> Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
2026-08-25drm/amd/display: Enable min dispclk ODM on DCN42Gabe Teeger
[Why] Dynamic ODM lowers the required dispclk and saves power. DCN42 and the DCN42 variant should follow whatever the driver requests through the config flag rather than defaulting it off in resource construct. [How] Assign minimize_dispclk_using_odm directly from the config flag so an enable request from the driver is honoured. No functional change when the flag is not set. Reviewed-by: Dmytro Laktyushkin <dmytro.laktyushkin@amd.com> Signed-off-by: Gabe Teeger <gabe.teeger@amd.com> Signed-off-by: Ivan Lipski <ivan.lipski@amd.com> Tested-by: Dan Wheeler <daniel.wheeler@amd.com> Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
2026-08-25drm/amd/display: Update alt-ch size calculationsAlvin Lee
[Description] - Align calculation with addrlib (need to align to macro tiled widht/height) - Align the copy size / addr to 256KB for SW_256KB modes Reviewed-by: Dillon Varone <dillon.varone@amd.com> Signed-off-by: Alvin Lee <Alvin.Lee2@amd.com> Signed-off-by: Ivan Lipski <ivan.lipski@amd.com> Tested-by: Dan Wheeler <daniel.wheeler@amd.com> Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
2026-08-25drm/amd/display: Add hook to disable alt-ch in PMOAlvin Lee
[Why&How] DML should have a method of disabling alt-ch pstate method. Add a debug mask bit to disable the alt-ch pstate method in PMO. Reviewed-by: Dillon Varone <dillon.varone@amd.com> Signed-off-by: Alvin Lee <Alvin.Lee2@amd.com> Signed-off-by: Ivan Lipski <ivan.lipski@amd.com> Tested-by: Dan Wheeler <daniel.wheeler@amd.com> Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
2026-08-25drm/amd/display: Test dm_dmub_sw_initAlex Hung
[WHAT] Add KUnit tests for dm_dmub_sw_init(), covering the ASIC to DMUB service mapping for all 19 supported IP versions, the memory domain choice, a complete successful init, the BSS data region variant and the PSP firmware load registration. [HOW] The framebuffer allocation needs a live TTM device, so add amdgpu_bo_create_kernel() to the indirection table introduced for the firmware request. The ASIC mapping and memory domain tests force that allocation to fail, which walks every ASIC through DMUB service creation and region calculation without a fake framebuffer. Grow the fake firmware so its instruction constant region is larger than two PSP footers. The footer probing in dmub_srv_get_fw_meta_info_from_raw_fw() walks back from the end of that region twice, so a region smaller than the footers underflows the size and reads out of bounds. Assisted-by: Copilot:Claude-Opus-5 Reviewed-by: Bhawanpreet Lakha <bhawanpreet.lakha@amd.com> Signed-off-by: Alex Hung <alex.hung@amd.com> Signed-off-by: Ivan Lipski <ivan.lipski@amd.com> Tested-by: Dan Wheeler <daniel.wheeler@amd.com> Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
2026-08-25drm/amd/display: Test dm_init_microcodeAlex Hung
[WHAT] Add KUnit tests for dm_init_microcode(), covering the ASIC to firmware name mapping for all 21 supported IP versions and the firmware request failure path. [HOW] The real amdgpu_ucode_request() reaches the firmware loader, so add a KUnit-only indirection table for it. The default table entry points at the existing function, so no test-only wrapper is introduced, and the prototype is mirrored verbatim so an upstream change fails the build at the default initializer rather than diverging silently. Tests install a fake that records the formatted firmware name, letting a single table-driven case assert the name chosen for every ASIC, including the Green Sardine revision check and the Sienna Cichlid versus Navy Flounder split on the graphics IP version. Assisted-by: Copilot:Claude-Opus-5 Reviewed-by: Bhawanpreet Lakha <bhawanpreet.lakha@amd.com> Signed-off-by: Alex Hung <alex.hung@amd.com> Signed-off-by: Ivan Lipski <ivan.lipski@amd.com> Tested-by: Dan Wheeler <daniel.wheeler@amd.com> Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
2026-08-25drm/amd/display: Test VBIOS bounding boxAlex Hung
[WHAT] Add KUnit tests for dm_dmub_get_vbios_bounding_box(), covering the successful handshake on every ASIC that has a bounding box, the GPU memory allocation failure path, and both GPINT timeout paths. This also covers dm_dmub_send_vbios_gpint_command(). [HOW] Extend the fake CGS device with a fail_on_write hook so a chosen GPINT write is never acked, which drives the timeout paths without waiting on real firmware. Reuse the buffer object indirection added for dm_allocate_gpu_mem() with a fake allocator, since the real path needs a live TTM device. The success test walks every ASIC with a bounding box and confirms a non-zero GART buffer is allocated and that all four address words plus the copy request are sent. The timeout tests confirm the buffer is released and the allocation list left empty. Assisted-by: Copilot:Claude-Opus-5 Reviewed-by: Bhawanpreet Lakha <bhawanpreet.lakha@amd.com> Signed-off-by: Alex Hung <alex.hung@amd.com> Signed-off-by: Ivan Lipski <ivan.lipski@amd.com> Tested-by: Dan Wheeler <daniel.wheeler@amd.com> Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
2026-08-25drm/amd/ras: skip the RAS firmware reload when the block is downXiang Liu
A reset on init lowers the init level to the minimal XGMI set, which leaves out the RAS IP block, so its hw_init never runs and the PSP buffers stay unallocated. The resume that follows the reset tries to reload the RAS firmware into those buffers, fails with -ENOMEM and aborts the whole resume, taking every device of the hive down with it. There is nothing to reload in that case. Leave the block alone and let amdgpu_ras_resume_after_reset() bring it up, which is where it has to happen anyway: the RAS hardware init reads the EEPROM and so takes the reset domain lock for read, while the reset on init path still holds it for write, so doing it here deadlocks. Signed-off-by: Xiang Liu <xiang.liu@amd.com> Reviewed-by: Hawking Zhang <Hawking.Zhang@amd.com> Signed-off-by: Alex Deucher <alexander.deucher@amd.com>