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.18-2025-09-19' of https://gitlab.freedesktop.org/agd5f/linux into drm-next
amd-drm-next-6.18-2025-09-19: amdgpu: - Fence drv clean up fix - DPC fixes - Misc display fixes - Support the MMIO remap page as a ttm pool - JPEG parser updates - UserQ updates - VCN ctx handling fixes - Documentation updates - Misc cleanups - SMU 13.0.x updates - SI DPM updates - GC 11.x cleaner shader updates - DMCUB updates - DML fixes - Improve fallback handling for pixel encoding - VCN reset improvements - DCE6 DC updates - DSC fixes - Use devm for i2c buses - GPUVM locking updates - GPUVM documentation improvements - Drop non-DC DCE11 code - S0ix fixes - Backlight fix - SR-IOV fixes amdkfd: - SVM updates Signed-off-by: Dave Airlie <airlied@redhat.com> From: Alex Deucher <alexander.deucher@amd.com> Link: https://lore.kernel.org/r/20250919193354.2989255-1-alexander.deucher@amd.com
This commit is contained in:
@@ -2081,6 +2081,8 @@ static int amdgpu_dm_init(struct amdgpu_device *adev)
|
||||
|
||||
dc_hardware_init(adev->dm.dc);
|
||||
|
||||
adev->dm.restore_backlight = true;
|
||||
|
||||
adev->dm.hpd_rx_offload_wq = hpd_rx_irq_create_workqueue(adev);
|
||||
if (!adev->dm.hpd_rx_offload_wq) {
|
||||
drm_err(adev_to_drm(adev), "failed to create hpd rx offload workqueue.\n");
|
||||
@@ -2945,7 +2947,7 @@ static int dm_oem_i2c_hw_init(struct amdgpu_device *adev)
|
||||
return -ENOMEM;
|
||||
}
|
||||
|
||||
r = i2c_add_adapter(&oem_i2c->base);
|
||||
r = devm_i2c_add_adapter(adev->dev, &oem_i2c->base);
|
||||
if (r) {
|
||||
drm_info(adev_to_drm(adev), "Failed to register oem i2c\n");
|
||||
kfree(oem_i2c);
|
||||
@@ -2957,17 +2959,6 @@ static int dm_oem_i2c_hw_init(struct amdgpu_device *adev)
|
||||
return 0;
|
||||
}
|
||||
|
||||
static void dm_oem_i2c_hw_fini(struct amdgpu_device *adev)
|
||||
{
|
||||
struct amdgpu_display_manager *dm = &adev->dm;
|
||||
|
||||
if (dm->oem_i2c) {
|
||||
i2c_del_adapter(&dm->oem_i2c->base);
|
||||
kfree(dm->oem_i2c);
|
||||
dm->oem_i2c = NULL;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* dm_hw_init() - Initialize DC device
|
||||
* @ip_block: Pointer to the amdgpu_ip_block for this hw instance.
|
||||
@@ -3018,8 +3009,6 @@ static int dm_hw_fini(struct amdgpu_ip_block *ip_block)
|
||||
{
|
||||
struct amdgpu_device *adev = ip_block->adev;
|
||||
|
||||
dm_oem_i2c_hw_fini(adev);
|
||||
|
||||
amdgpu_dm_hpd_fini(adev);
|
||||
|
||||
amdgpu_dm_irq_fini(adev);
|
||||
@@ -3047,14 +3036,20 @@ static void dm_gpureset_toggle_interrupts(struct amdgpu_device *adev,
|
||||
drm_warn(adev_to_drm(adev), "Failed to %s pflip interrupts\n",
|
||||
enable ? "enable" : "disable");
|
||||
|
||||
if (enable) {
|
||||
if (amdgpu_dm_crtc_vrr_active(to_dm_crtc_state(acrtc->base.state)))
|
||||
rc = amdgpu_dm_crtc_set_vupdate_irq(&acrtc->base, true);
|
||||
} else
|
||||
rc = amdgpu_dm_crtc_set_vupdate_irq(&acrtc->base, false);
|
||||
if (dc_supports_vrr(adev->dm.dc->ctx->dce_version)) {
|
||||
if (enable) {
|
||||
if (amdgpu_dm_crtc_vrr_active(
|
||||
to_dm_crtc_state(acrtc->base.state)))
|
||||
rc = amdgpu_dm_crtc_set_vupdate_irq(
|
||||
&acrtc->base, true);
|
||||
} else
|
||||
rc = amdgpu_dm_crtc_set_vupdate_irq(
|
||||
&acrtc->base, false);
|
||||
|
||||
if (rc)
|
||||
drm_warn(adev_to_drm(adev), "Failed to %sable vupdate interrupt\n", enable ? "en" : "dis");
|
||||
if (rc)
|
||||
drm_warn(adev_to_drm(adev), "Failed to %sable vupdate interrupt\n",
|
||||
enable ? "en" : "dis");
|
||||
}
|
||||
|
||||
irq_source = IRQ_TYPE_VBLANK + acrtc->otg_inst;
|
||||
/* During gpu-reset we disable and then enable vblank irq, so
|
||||
@@ -3443,6 +3438,7 @@ static int dm_resume(struct amdgpu_ip_block *ip_block)
|
||||
dc_set_power_state(dm->dc, DC_ACPI_CM_POWER_STATE_D0);
|
||||
|
||||
dc_resume(dm->dc);
|
||||
adev->dm.restore_backlight = true;
|
||||
|
||||
amdgpu_dm_irq_resume_early(adev);
|
||||
|
||||
@@ -6427,6 +6423,10 @@ static void fill_stream_properties_from_drm_display_mode(
|
||||
&& aconnector
|
||||
&& aconnector->force_yuv420_output)
|
||||
timing_out->pixel_encoding = PIXEL_ENCODING_YCBCR420;
|
||||
else if ((connector->display_info.color_formats & DRM_COLOR_FORMAT_YCBCR422)
|
||||
&& aconnector
|
||||
&& aconnector->force_yuv422_output)
|
||||
timing_out->pixel_encoding = PIXEL_ENCODING_YCBCR422;
|
||||
else if ((connector->display_info.color_formats & DRM_COLOR_FORMAT_YCBCR444)
|
||||
&& stream->signal == SIGNAL_TYPE_HDMI_TYPE_A)
|
||||
timing_out->pixel_encoding = PIXEL_ENCODING_YCBCR444;
|
||||
@@ -7384,10 +7384,6 @@ static void amdgpu_dm_connector_destroy(struct drm_connector *connector)
|
||||
drm_dp_cec_unregister_connector(&aconnector->dm_dp_aux.aux);
|
||||
drm_connector_unregister(connector);
|
||||
drm_connector_cleanup(connector);
|
||||
if (aconnector->i2c) {
|
||||
i2c_del_adapter(&aconnector->i2c->base);
|
||||
kfree(aconnector->i2c);
|
||||
}
|
||||
kfree(aconnector->dm_dp_aux.aux.name);
|
||||
|
||||
kfree(connector);
|
||||
@@ -7687,6 +7683,7 @@ create_validate_stream_for_sink(struct drm_connector *connector,
|
||||
bpc_limit = 8;
|
||||
|
||||
do {
|
||||
drm_dbg_kms(connector->dev, "Trying with %d bpc\n", requested_bpc);
|
||||
stream = create_stream_for_sink(connector, drm_mode,
|
||||
dm_state, old_stream,
|
||||
requested_bpc);
|
||||
@@ -7722,16 +7719,41 @@ create_validate_stream_for_sink(struct drm_connector *connector,
|
||||
|
||||
} while (stream == NULL && requested_bpc >= bpc_limit);
|
||||
|
||||
if ((dc_result == DC_FAIL_ENC_VALIDATE ||
|
||||
dc_result == DC_EXCEED_DONGLE_CAP) &&
|
||||
!aconnector->force_yuv420_output) {
|
||||
DRM_DEBUG_KMS("%s:%d Retry forcing yuv420 encoding\n",
|
||||
__func__, __LINE__);
|
||||
|
||||
aconnector->force_yuv420_output = true;
|
||||
switch (dc_result) {
|
||||
/*
|
||||
* If we failed to validate DP bandwidth stream with the requested RGB color depth,
|
||||
* we try to fallback and configure in order:
|
||||
* YUV422 (8bpc, 6bpc)
|
||||
* YUV420 (8bpc, 6bpc)
|
||||
*/
|
||||
case DC_FAIL_ENC_VALIDATE:
|
||||
case DC_EXCEED_DONGLE_CAP:
|
||||
case DC_NO_DP_LINK_BANDWIDTH:
|
||||
/* recursively entered twice and already tried both YUV422 and YUV420 */
|
||||
if (aconnector->force_yuv422_output && aconnector->force_yuv420_output)
|
||||
break;
|
||||
/* first failure; try YUV422 */
|
||||
if (!aconnector->force_yuv422_output) {
|
||||
drm_dbg_kms(connector->dev, "%s:%d Validation failed with %d, retrying w/ YUV422\n",
|
||||
__func__, __LINE__, dc_result);
|
||||
aconnector->force_yuv422_output = true;
|
||||
/* recursively entered and YUV422 failed, try YUV420 */
|
||||
} else if (!aconnector->force_yuv420_output) {
|
||||
drm_dbg_kms(connector->dev, "%s:%d Validation failed with %d, retrying w/ YUV420\n",
|
||||
__func__, __LINE__, dc_result);
|
||||
aconnector->force_yuv420_output = true;
|
||||
}
|
||||
stream = create_validate_stream_for_sink(connector, drm_mode,
|
||||
dm_state, old_stream);
|
||||
dm_state, old_stream);
|
||||
aconnector->force_yuv422_output = false;
|
||||
aconnector->force_yuv420_output = false;
|
||||
break;
|
||||
case DC_OK:
|
||||
break;
|
||||
default:
|
||||
drm_dbg_kms(connector->dev, "%s:%d Unhandled validation failure %d\n",
|
||||
__func__, __LINE__, dc_result);
|
||||
break;
|
||||
}
|
||||
|
||||
return stream;
|
||||
@@ -8719,7 +8741,7 @@ static int amdgpu_dm_connector_init(struct amdgpu_display_manager *dm,
|
||||
}
|
||||
|
||||
aconnector->i2c = i2c;
|
||||
res = i2c_add_adapter(&i2c->base);
|
||||
res = devm_i2c_add_adapter(dm->adev->dev, &i2c->base);
|
||||
|
||||
if (res) {
|
||||
drm_err(adev_to_drm(dm->adev), "Failed to register hw i2c %d\n", link->link_index);
|
||||
@@ -8817,7 +8839,16 @@ static int amdgpu_dm_encoder_init(struct drm_device *dev,
|
||||
static void manage_dm_interrupts(struct amdgpu_device *adev,
|
||||
struct amdgpu_crtc *acrtc,
|
||||
struct dm_crtc_state *acrtc_state)
|
||||
{
|
||||
{ /*
|
||||
* We cannot be sure that the frontend index maps to the same
|
||||
* backend index - some even map to more than one.
|
||||
* So we have to go through the CRTC to find the right IRQ.
|
||||
*/
|
||||
int irq_type = amdgpu_display_crtc_idx_to_irq_type(
|
||||
adev,
|
||||
acrtc->crtc_id);
|
||||
struct drm_device *dev = adev_to_drm(adev);
|
||||
|
||||
struct drm_vblank_crtc_config config = {0};
|
||||
struct dc_crtc_timing *timing;
|
||||
int offdelay;
|
||||
@@ -8870,7 +8901,35 @@ static void manage_dm_interrupts(struct amdgpu_device *adev,
|
||||
|
||||
drm_crtc_vblank_on_config(&acrtc->base,
|
||||
&config);
|
||||
/* Allow RX6xxx, RX7700, RX7800 GPUs to call amdgpu_irq_get.*/
|
||||
switch (amdgpu_ip_version(adev, DCE_HWIP, 0)) {
|
||||
case IP_VERSION(3, 0, 0):
|
||||
case IP_VERSION(3, 0, 2):
|
||||
case IP_VERSION(3, 0, 3):
|
||||
case IP_VERSION(3, 2, 0):
|
||||
if (amdgpu_irq_get(adev, &adev->pageflip_irq, irq_type))
|
||||
drm_err(dev, "DM_IRQ: Cannot get pageflip irq!\n");
|
||||
#if defined(CONFIG_DRM_AMD_SECURE_DISPLAY)
|
||||
if (amdgpu_irq_get(adev, &adev->vline0_irq, irq_type))
|
||||
drm_err(dev, "DM_IRQ: Cannot get vline0 irq!\n");
|
||||
#endif
|
||||
}
|
||||
|
||||
} else {
|
||||
/* Allow RX6xxx, RX7700, RX7800 GPUs to call amdgpu_irq_put.*/
|
||||
switch (amdgpu_ip_version(adev, DCE_HWIP, 0)) {
|
||||
case IP_VERSION(3, 0, 0):
|
||||
case IP_VERSION(3, 0, 2):
|
||||
case IP_VERSION(3, 0, 3):
|
||||
case IP_VERSION(3, 2, 0):
|
||||
#if defined(CONFIG_DRM_AMD_SECURE_DISPLAY)
|
||||
if (amdgpu_irq_put(adev, &adev->vline0_irq, irq_type))
|
||||
drm_err(dev, "DM_IRQ: Cannot put vline0 irq!\n");
|
||||
#endif
|
||||
if (amdgpu_irq_put(adev, &adev->pageflip_irq, irq_type))
|
||||
drm_err(dev, "DM_IRQ: Cannot put pageflip irq!\n");
|
||||
}
|
||||
|
||||
drm_crtc_vblank_off(&acrtc->base);
|
||||
}
|
||||
}
|
||||
@@ -9892,7 +9951,6 @@ static void amdgpu_dm_commit_streams(struct drm_atomic_state *state,
|
||||
bool mode_set_reset_required = false;
|
||||
u32 i;
|
||||
struct dc_commit_streams_params params = {dc_state->streams, dc_state->stream_count};
|
||||
bool set_backlight_level = false;
|
||||
|
||||
/* Disable writeback */
|
||||
for_each_old_connector_in_state(state, connector, old_con_state, i) {
|
||||
@@ -10012,7 +10070,6 @@ static void amdgpu_dm_commit_streams(struct drm_atomic_state *state,
|
||||
acrtc->hw_mode = new_crtc_state->mode;
|
||||
crtc->hwmode = new_crtc_state->mode;
|
||||
mode_set_reset_required = true;
|
||||
set_backlight_level = true;
|
||||
} else if (modereset_required(new_crtc_state)) {
|
||||
drm_dbg_atomic(dev,
|
||||
"Atomic commit: RESET. crtc id %d:[%p]\n",
|
||||
@@ -10069,13 +10126,16 @@ static void amdgpu_dm_commit_streams(struct drm_atomic_state *state,
|
||||
* to fix a flicker issue.
|
||||
* It will cause the dm->actual_brightness is not the current panel brightness
|
||||
* level. (the dm->brightness is the correct panel level)
|
||||
* So we set the backlight level with dm->brightness value after set mode
|
||||
* So we set the backlight level with dm->brightness value after initial
|
||||
* set mode. Use restore_backlight flag to avoid setting backlight level
|
||||
* for every subsequent mode set.
|
||||
*/
|
||||
if (set_backlight_level) {
|
||||
if (dm->restore_backlight) {
|
||||
for (i = 0; i < dm->num_of_edps; i++) {
|
||||
if (dm->backlight_dev[i])
|
||||
amdgpu_dm_backlight_set_level(dm, i, dm->brightness[i]);
|
||||
}
|
||||
dm->restore_backlight = false;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -10788,6 +10848,8 @@ static void get_freesync_config_for_crtc(
|
||||
} else {
|
||||
config.state = VRR_STATE_INACTIVE;
|
||||
}
|
||||
} else {
|
||||
config.state = VRR_STATE_UNSUPPORTED;
|
||||
}
|
||||
out:
|
||||
new_crtc_state->freesync_config = config;
|
||||
@@ -12689,7 +12751,7 @@ void amdgpu_dm_update_freesync_caps(struct drm_connector *connector,
|
||||
|
||||
dm_con_state = to_dm_connector_state(connector->state);
|
||||
|
||||
if (!adev->dm.freesync_module)
|
||||
if (!adev->dm.freesync_module || !dc_supports_vrr(sink->ctx->dce_version))
|
||||
goto update;
|
||||
|
||||
edid = drm_edid_raw(drm_edid); // FIXME: Get rid of drm_edid_raw()
|
||||
|
||||
Reference in New Issue
Block a user