mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/netdev/net.git/
synced 2026-04-18 06:33:43 -04:00
Merge tag 'amd-drm-next-6.19-2025-10-24' of https://gitlab.freedesktop.org/agd5f/linux into drm-next
amd-drm-next-6.19-2025-10-24: amdgpu: - HMM cleanup - Add new RAS framework - DML2.1 updates - YCbCr420 fixes - DC FP fixes - DMUB fixes - LTTPR fixes - DTBCLK fixes - DMU cursor offload handling - Userq validation improvements - Misc code cleanups - Unify shutdown callback handling - Suspend improvements - Power limit code cleanup - Fence cleanup - IP Discovery cleanup - SR-IOV fixes - AUX backlight fixes - DCN 3.5 fixes - HDMI compliance fixes - DCN 4.0.1 cursor updates - DCN interrupt fix - DC KMS full update improvements - Add additional HDCP traces - DCN 3.2 fixes - DP MST fixes - Add support for new SR-IOV mailbox interface Signed-off-by: Simona Vetter <simona.vetter@ffwll.ch> From: Alex Deucher <alexander.deucher@amd.com> Link: https://lore.kernel.org/r/20251024175249.58099-1-alexander.deucher@amd.com
This commit is contained in:
@@ -551,13 +551,13 @@ static void schedule_dc_vmin_vmax(struct amdgpu_device *adev,
|
||||
struct dc_stream_state *stream,
|
||||
struct dc_crtc_timing_adjust *adjust)
|
||||
{
|
||||
struct vupdate_offload_work *offload_work = kzalloc(sizeof(*offload_work), GFP_KERNEL);
|
||||
struct vupdate_offload_work *offload_work = kzalloc(sizeof(*offload_work), GFP_NOWAIT);
|
||||
if (!offload_work) {
|
||||
drm_dbg_driver(adev_to_drm(adev), "Failed to allocate vupdate_offload_work\n");
|
||||
return;
|
||||
}
|
||||
|
||||
struct dc_crtc_timing_adjust *adjust_copy = kzalloc(sizeof(*adjust_copy), GFP_KERNEL);
|
||||
struct dc_crtc_timing_adjust *adjust_copy = kzalloc(sizeof(*adjust_copy), GFP_NOWAIT);
|
||||
if (!adjust_copy) {
|
||||
drm_dbg_driver(adev_to_drm(adev), "Failed to allocate adjust_copy\n");
|
||||
kfree(offload_work);
|
||||
@@ -3392,6 +3392,67 @@ static void apply_delay_after_dpcd_poweroff(struct amdgpu_device *adev,
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* amdgpu_dm_dump_links_and_sinks - Debug dump of all DC links and their sinks
|
||||
* @adev: amdgpu device pointer
|
||||
*
|
||||
* Iterates through all DC links and dumps information about local and remote
|
||||
* (MST) sinks. Should be called after connector detection is complete to see
|
||||
* the final state of all links.
|
||||
*/
|
||||
static void amdgpu_dm_dump_links_and_sinks(struct amdgpu_device *adev)
|
||||
{
|
||||
struct dc *dc = adev->dm.dc;
|
||||
struct drm_device *dev = adev_to_drm(adev);
|
||||
int li;
|
||||
|
||||
if (!dc)
|
||||
return;
|
||||
|
||||
for (li = 0; li < dc->link_count; li++) {
|
||||
struct dc_link *l = dc->links[li];
|
||||
const char *name = NULL;
|
||||
int rs;
|
||||
|
||||
if (!l)
|
||||
continue;
|
||||
if (l->local_sink && l->local_sink->edid_caps.display_name[0])
|
||||
name = l->local_sink->edid_caps.display_name;
|
||||
else
|
||||
name = "n/a";
|
||||
|
||||
drm_dbg_kms(dev,
|
||||
"LINK_DUMP[%d]: local_sink=%p type=%d sink_signal=%d sink_count=%u edid_name=%s mst_capable=%d mst_alloc_streams=%d\n",
|
||||
li,
|
||||
l->local_sink,
|
||||
l->type,
|
||||
l->local_sink ? l->local_sink->sink_signal : SIGNAL_TYPE_NONE,
|
||||
l->sink_count,
|
||||
name,
|
||||
l->dpcd_caps.is_mst_capable,
|
||||
l->mst_stream_alloc_table.stream_count);
|
||||
|
||||
/* Dump remote (MST) sinks if any */
|
||||
for (rs = 0; rs < l->sink_count; rs++) {
|
||||
struct dc_sink *rsink = l->remote_sinks[rs];
|
||||
const char *rname = NULL;
|
||||
|
||||
if (!rsink)
|
||||
continue;
|
||||
if (rsink->edid_caps.display_name[0])
|
||||
rname = rsink->edid_caps.display_name;
|
||||
else
|
||||
rname = "n/a";
|
||||
drm_dbg_kms(dev,
|
||||
" REMOTE_SINK[%d:%d]: sink=%p signal=%d edid_name=%s\n",
|
||||
li, rs,
|
||||
rsink,
|
||||
rsink->sink_signal,
|
||||
rname);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
static int dm_resume(struct amdgpu_ip_block *ip_block)
|
||||
{
|
||||
struct amdgpu_device *adev = ip_block->adev;
|
||||
@@ -3576,6 +3637,12 @@ static int dm_resume(struct amdgpu_ip_block *ip_block)
|
||||
}
|
||||
drm_connector_list_iter_end(&iter);
|
||||
|
||||
/* Debug dump: list all DC links and their associated sinks after detection
|
||||
* is complete for all connectors. This provides a comprehensive view of the
|
||||
* final state without repeating the dump for each connector.
|
||||
*/
|
||||
amdgpu_dm_dump_links_and_sinks(adev);
|
||||
|
||||
amdgpu_dm_irq_resume_late(adev);
|
||||
|
||||
amdgpu_dm_smu_write_watermarks_table(adev);
|
||||
@@ -5407,6 +5474,12 @@ static int amdgpu_dm_initialize_drm_device(struct amdgpu_device *adev)
|
||||
amdgpu_set_panel_orientation(&aconnector->base);
|
||||
}
|
||||
|
||||
/* Debug dump: list all DC links and their associated sinks after detection
|
||||
* is complete for all connectors. This provides a comprehensive view of the
|
||||
* final state without repeating the dump for each connector.
|
||||
*/
|
||||
amdgpu_dm_dump_links_and_sinks(adev);
|
||||
|
||||
/* Software is initialized. Now we can register interrupt handlers. */
|
||||
switch (adev->asic_type) {
|
||||
#if defined(CONFIG_DRM_AMD_DC_SI)
|
||||
@@ -10519,7 +10592,7 @@ static void amdgpu_dm_atomic_commit_tail(struct drm_atomic_state *state)
|
||||
* Here we create an empty update on each plane.
|
||||
* To fix this, DC should permit updating only stream properties.
|
||||
*/
|
||||
dummy_updates = kzalloc(sizeof(struct dc_surface_update) * MAX_SURFACES, GFP_ATOMIC);
|
||||
dummy_updates = kzalloc(sizeof(struct dc_surface_update) * MAX_SURFACES, GFP_KERNEL);
|
||||
if (!dummy_updates) {
|
||||
drm_err(adev_to_drm(adev), "Failed to allocate memory for dummy_updates.\n");
|
||||
continue;
|
||||
|
||||
Reference in New Issue
Block a user