From nobody Thu Mar 5 08:21:45 2026 Received: from mail-ej1-f54.google.com (mail-ej1-f54.google.com [209.85.218.54]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id EF8EF334C03 for ; Mon, 16 Feb 2026 16:45:56 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.218.54 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1771260358; cv=none; b=lCxwPnoKi7YkTlryxLWpa+1rLP8UONLJF4QWSnSmBsCOOQoyoTWAbd9z7x1hhN57gSBj+ydd8jMHRw16aWdmoDrhEujjdZxBJ+cjK4Q8yJDRGzLF2qFS/VYopX4fce6JWUxsGYBlW6BM/Ko7azKg8czwLGXSwuX63AljfbbRTo0= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1771260358; c=relaxed/simple; bh=3/hTJf8B/GZVVIGzNYpfySG4vAHHz53D+FyUAy3pv+A=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version:Content-Type; b=ILTgz8FEbZZqFAwAM3S3yGaO/Ua2kwi+XHDJ9bDZhvaGSm5pNbjD9TjChY+fZPAcAiN1RfoENPUslKs1UmRZcS7AuIz+DLJOsQaLiwEZTaPXOZWUbgvQxzR2HjresoQzrNoSkjbkXZtdzkYIIQKyFkXay+ArHpFESTc0bdP5WcU= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com; spf=pass smtp.mailfrom=gmail.com; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b=caSUqUwk; arc=none smtp.client-ip=209.85.218.54 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=gmail.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b="caSUqUwk" Received: by mail-ej1-f54.google.com with SMTP id a640c23a62f3a-b8f94bf6ef2so54440866b.2 for ; Mon, 16 Feb 2026 08:45:56 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1771260355; x=1771865155; darn=vger.kernel.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=0Q1lJwLmcWJWoDUb++cAchh6MvBOjQlKFX7ixOTz8S8=; b=caSUqUwkK+XIv3Zq7FuTHzH9cEYFtCU8kVlwMQ1hniB5QB9RH9VBeYFdx0p5eSSUEk KbrOOt1YMGu6EpgvQdI93Hdee2+QwcYfPWq3p2qOTAV6dWApriy056mzhYU8N0+LtDPz agredakLgRZiZVxsIMwPXKTzRfpb60Rv4nh9ryGBMOLvS6Hkzjj30w6A5dMw5s8qOq2O FLTCHljV4PKsxfdYyXaNWVMUgBWpQ8bQMcV6EHbQGyI3mHgQ5CPOxwDZg1apjfSeWQlW YaVAVxFM1tbGZ0EPQE7bgwVvY+VHRUT9Dd8lpr8cgL7lWjFAspXyvxNRUCo1O4LzFoJ1 ukhw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1771260355; x=1771865155; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-gg:x-gm-message-state:from :to:cc:subject:date:message-id:reply-to; bh=0Q1lJwLmcWJWoDUb++cAchh6MvBOjQlKFX7ixOTz8S8=; b=iGV6ojO5q3aFuEetyIwMqbgWhj2LAGVjK9yjI0dvfGndRhxDTKg4V8O3z60XfD4ymw nyoM7sSjeRn8TMl/2oTgPqkfNOvJgS925tQNNk/zTwMUOQCU/VeO/J/UHeSNKnZh397X 0JRRVUellf32FMtRhh8U5Fq+O9ai2v9WWk3tASv98hO1ZN/vujpXj1/bRaNP8/ZqSzWf yHvkRsbu6OUpiQMZev5ESrlwuuO2TSsoV5sxHa7bkL5V5kjUzJ3xHQCOXItmr/Ql5/nO V673XUbzmcmIq1tsNXo2LUWBkY50+bV03q8hvYgRqLJGsfTbpYj/pOXxcDMZewhjEKdQ 1CCw== X-Forwarded-Encrypted: i=1; AJvYcCVeyb1gWqVUmwM6w5m5cpdQLJI4BqumUw/2Rh17uWVWL8bxhMCGPzHQ+5gbNi8FULZBFcn0/AD6GbaJ3w4=@vger.kernel.org X-Gm-Message-State: AOJu0YzoBwtNhPod0Wzsb2vAheiyEHb3W5e/EUWZ+04prHMmH28S/NJA ifaeUdfH14ejkgbcX4IFBgmMfNjGzWjhACD6//IIsDqr+fVXmHfEZjVz X-Gm-Gg: AZuq6aKQxY2BaHFZXFlKyuCKUt3SkS9ZXkgcY1QxM2bXH3frgreiLL6Bs9vUuXYb3d4 mcUahzuCwFc9rCF8f7cjwnZCRS8GIVFx7l9PeVgjRSrketBFBR5fV4pmsQA3K1Z1eaB/fA3ZR8k BBEWCKQhpXCAOEd+F9SnpPJ1M9v+g3Kw8KLDzvX2P749GCUHXgyjw4KNxo7N/hzIAZR/4HMyk7P 00KOW/coVmeoNVUVwwZxcABO2QlZ/1fY8WmJ7iKPn3SHhSAnYHqREqh056zXm5HQ/+FLkcHb5Ci gd6Em1/UJDdDbT6iqPwr1MHo0YFh/7x8oLO71aOVSHC8qANKr9+hN/arrBm4Cy50utRridnrK1R fg0D+GCD8QhaKkOST2NqbsUzcEG/RECQ+QlW/uJb47qUdABHPQWHSgBs9Cx46PTEUvodfKStRIy 7RDtYJsktMTLacVl7ElS9t/DjNLK5TJ4BIYTcJAa2G81Ex6BW73oWLaW5CqsLCE2tvWLQMHUAkE Kdr X-Received: by 2002:a17:907:3da0:b0:b87:2780:1b2b with SMTP id a640c23a62f3a-b8facd9eeb2mr384160566b.4.1771260355157; Mon, 16 Feb 2026 08:45:55 -0800 (PST) Received: from laptok.lan (87-205-5-123.static.ip.netia.com.pl. [87.205.5.123]) by smtp.gmail.com with ESMTPSA id a640c23a62f3a-b8fc735d185sm264683866b.14.2026.02.16.08.45.53 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 16 Feb 2026 08:45:54 -0800 (PST) From: =?UTF-8?q?Tomasz=20Paku=C5=82a?= To: alexander.deucher@amd.com, harry.wentland@amd.com, sunpeng.li@amd.com Cc: maarten.lankhorst@linux.intel.com, mripard@kernel.org, tzimmermann@suse.de, airlied@gmail.com, simona@ffwll.ch, siqueira@igalia.com, dri-devel@lists.freedesktop.org, amd-gfx@lists.freedesktop.org, linux-kernel@vger.kernel.org, tomasz.pakula.oficjalny@gmail.com, bernhard.berger@gmail.com, michel.daenzer@mailbox.org, daniel@fooishbar.org Subject: [PATCH v4 27/27] drm/amd/display: Use ALLM properties in amdgpu Date: Mon, 16 Feb 2026 17:45:16 +0100 Message-ID: <20260216164516.36803-28-tomasz.pakula.oficjalny@gmail.com> X-Mailer: git-send-email 2.53.0 In-Reply-To: <20260216164516.36803-1-tomasz.pakula.oficjalny@gmail.com> References: <20260216164516.36803-1-tomasz.pakula.oficjalny@gmail.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable [Why] To enable ALLM when asked for by compositor [How] Attach properties to HDMI sinks, detect support and set allm_capable property, set allm_capable property for amdgpu_dm_connector Signed-off-by: Tomasz Paku=C5=82a --- .../gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c | 54 ++++++++++++++++++- .../gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.h | 3 ++ drivers/gpu/drm/amd/display/dc/core/dc.c | 3 ++ .../gpu/drm/amd/display/dc/core/dc_resource.c | 2 +- drivers/gpu/drm/amd/display/dc/dc_stream.h | 2 + .../display/modules/info_packet/info_packet.c | 4 +- 6 files changed, 64 insertions(+), 4 deletions(-) diff --git a/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c b/drivers/gp= u/drm/amd/display/amdgpu_dm/amdgpu_dm.c index 41677c50b3d2..695100c78314 100644 --- a/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c +++ b/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c @@ -8969,6 +8969,7 @@ void amdgpu_dm_connector_init_helper(struct amdgpu_di= splay_manager *dm, aconnector->audio_inst =3D -1; aconnector->pack_sdp_v1_3 =3D false; aconnector->as_type =3D ADAPTIVE_SYNC_TYPE_NONE; + aconnector->hdmi_allm_capable =3D false; memset(&aconnector->vsdb_info, 0, sizeof(aconnector->vsdb_info)); mutex_init(&aconnector->hpd_lock); mutex_init(&aconnector->handle_mst_msg_ready); @@ -9166,6 +9167,10 @@ int amdgpu_dm_initialize_hdmi_connector(struct amdgp= u_dm_connector *aconnector) struct drm_device *ddev =3D aconnector->base.dev; struct device *hdmi_dev =3D ddev->dev; =20 + /* ALLM */ + drm_connector_attach_allm_capable_property(&aconnector->base); + drm_connector_attach_allm_mode_property(&aconnector->base); + if (amdgpu_dc_debug_mask & DC_DISABLE_HDMI_CEC) { drm_info(ddev, "HDMI-CEC feature masked\n"); return -EINVAL; @@ -10856,6 +10861,31 @@ static int amdgpu_dm_atomic_setup_commit(struct dr= m_atomic_state *state) return 0; } =20 +static void update_allm_state_on_crtc_stream(struct dm_crtc_state *new_crt= c_state, + const struct drm_connector_state *new_conn) +{ + struct mod_freesync_config *config =3D &new_crtc_state->freesync_config; + struct dc_stream_state *new_stream =3D new_crtc_state->stream; + bool allm_active =3D false; + + switch (new_conn->allm_mode) { + case DRM_ALLM_MODE_ENABLED_DYNAMIC: + allm_active =3D config->state =3D=3D VRR_STATE_ACTIVE_VARIABLE || + new_stream->content_type =3D=3D DISPLAY_CONTENT_TYPE_GAME; + break; + + case DRM_ALLM_MODE_ENABLED_FORCED: + allm_active =3D true; + break; + + case DRM_ALLM_MODE_DISABLED: + default: + allm_active =3D false; + } + + new_stream->hdmi_allm_active =3D allm_active; +} + /** * amdgpu_dm_atomic_commit_tail() - AMDgpu DM's commit tail implementation. * @state: The atomic state to commit @@ -10898,12 +10928,14 @@ static void amdgpu_dm_atomic_commit_tail(struct d= rm_atomic_state *state) for_each_oldnew_connector_in_state(state, connector, old_con_state, new_c= on_state, i) { struct dm_connector_state *dm_new_con_state =3D to_dm_connector_state(ne= w_con_state); struct dm_connector_state *dm_old_con_state =3D to_dm_connector_state(ol= d_con_state); + struct amdgpu_dm_connector *dm_conn =3D to_amdgpu_dm_connector(connector= ); struct amdgpu_crtc *acrtc =3D to_amdgpu_crtc(dm_new_con_state->base.crtc= ); struct dc_surface_update *dummy_updates; struct dc_stream_update stream_update; struct dc_info_packet hdr_packet; struct dc_stream_status *status =3D NULL; bool abm_changed, hdr_changed, scaling_changed, output_color_space_chang= ed =3D false; + bool allm_changed =3D false; =20 memset(&stream_update, 0, sizeof(stream_update)); =20 @@ -10933,7 +10965,11 @@ static void amdgpu_dm_atomic_commit_tail(struct dr= m_atomic_state *state) hdr_changed =3D !drm_connector_atomic_hdr_metadata_equal(old_con_state, new_con_state); =20 - if (!scaling_changed && !abm_changed && !hdr_changed && !output_color_sp= ace_changed) + allm_changed =3D dm_conn->hdmi_allm_capable && + (new_con_state->allm_mode !=3D old_con_state->allm_mode); + + if (!scaling_changed && !abm_changed && !hdr_changed && + !output_color_space_changed && !allm_changed) continue; =20 stream_update.stream =3D dm_new_crtc_state->stream; @@ -10963,6 +10999,17 @@ static void amdgpu_dm_atomic_commit_tail(struct dr= m_atomic_state *state) stream_update.hdr_static_metadata =3D &hdr_packet; } =20 + if (allm_changed) { + update_allm_state_on_crtc_stream(dm_new_crtc_state, new_con_state); + mod_build_hf_vsif_infopacket(dm_new_crtc_state->stream, + &dm_new_crtc_state->stream->hfvsif_infopacket); + + stream_update.hdmi_allm_active =3D + &dm_new_crtc_state->stream->hdmi_allm_active; + stream_update.hfvsif_infopacket =3D + &dm_new_crtc_state->stream->hfvsif_infopacket; + } + status =3D dc_stream_get_status(dm_new_crtc_state->stream); =20 if (WARN_ON(!status)) @@ -13478,6 +13525,11 @@ void amdgpu_dm_update_freesync_caps(struct drm_con= nector *connector, =20 if (connector->passive_vrr_capable_property) drm_connector_set_passive_vrr_capable_property(connector, freesync_on_de= sktop); + + amdgpu_dm_connector->hdmi_allm_capable =3D connector->display_info.hdmi.a= llm; + if (connector->allm_capable_property) + drm_connector_set_allm_capable_property( + connector, connector->display_info.hdmi.allm); } =20 void amdgpu_dm_trigger_timing_sync(struct drm_device *dev) diff --git a/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.h b/drivers/gp= u/drm/amd/display/amdgpu_dm/amdgpu_dm.h index 88ec2b88dcaf..b9d27a483b1e 100644 --- a/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.h +++ b/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.h @@ -847,6 +847,9 @@ struct amdgpu_dm_connector { unsigned int hdmi_hpd_debounce_delay_ms; struct delayed_work hdmi_hpd_debounce_work; struct dc_sink *hdmi_prev_sink; + + /* HDMI ALLM */ + bool hdmi_allm_capable; }; =20 static inline void amdgpu_dm_set_mst_status(uint8_t *status, diff --git a/drivers/gpu/drm/amd/display/dc/core/dc.c b/drivers/gpu/drm/amd= /display/dc/core/dc.c index 17ba7af0ddcd..bfaa2fb0cba8 100644 --- a/drivers/gpu/drm/amd/display/dc/core/dc.c +++ b/drivers/gpu/drm/amd/display/dc/core/dc.c @@ -3295,6 +3295,9 @@ static void copy_stream_update_to_stream(struct dc *d= c, if (update->vrr_active_fixed) stream->vrr_active_fixed =3D *update->vrr_active_fixed; =20 + if (update->hdmi_allm_active) + stream->hdmi_allm_active =3D *update->hdmi_allm_active; + if (update->crtc_timing_adjust) { if (stream->adjust.v_total_min !=3D update->crtc_timing_adjust->v_total_= min || stream->adjust.v_total_max !=3D update->crtc_timing_adjust->v_total_max= || diff --git a/drivers/gpu/drm/amd/display/dc/core/dc_resource.c b/drivers/gp= u/drm/amd/display/dc/core/dc_resource.c index 639831295b21..078ca4a7258f 100644 --- a/drivers/gpu/drm/amd/display/dc/core/dc_resource.c +++ b/drivers/gpu/drm/amd/display/dc/core/dc_resource.c @@ -4660,7 +4660,7 @@ static void set_avi_info_frame( vic =3D 0; format =3D stream->timing.timing_3d_format; /*todo, add 3DStereo support*/ - if (format !=3D TIMING_3D_FORMAT_NONE) { + if (format !=3D TIMING_3D_FORMAT_NONE || stream->hdmi_allm_active) { // Based on HDMI specs hdmi vic needs to be converted to cea vic when 3D= is enabled switch (pipe_ctx->stream->timing.hdmi_vic) { case 1: diff --git a/drivers/gpu/drm/amd/display/dc/dc_stream.h b/drivers/gpu/drm/a= md/display/dc/dc_stream.h index 9960494007ff..17f891b03416 100644 --- a/drivers/gpu/drm/amd/display/dc/dc_stream.h +++ b/drivers/gpu/drm/amd/display/dc/dc_stream.h @@ -242,6 +242,7 @@ struct dc_stream_state { bool vrr_active_variable; bool freesync_on_desktop; bool vrr_active_fixed; + bool hdmi_allm_active; =20 bool converter_disable_audio; uint8_t qs_bit; @@ -345,6 +346,7 @@ struct dc_stream_update { bool *allow_freesync; bool *vrr_active_variable; bool *vrr_active_fixed; + bool *hdmi_allm_active; =20 struct colorspace_transform *gamut_remap; enum dc_color_space *output_color_space; diff --git a/drivers/gpu/drm/amd/display/modules/info_packet/info_packet.c = b/drivers/gpu/drm/amd/display/modules/info_packet/info_packet.c index 7e0adb90af39..fcfab7b9e0e2 100644 --- a/drivers/gpu/drm/amd/display/modules/info_packet/info_packet.c +++ b/drivers/gpu/drm/amd/display/modules/info_packet/info_packet.c @@ -500,7 +500,7 @@ static bool is_hdmi_vic_mode(const struct dc_stream_sta= te *stream) if (stream->view_format !=3D VIEW_3D_FORMAT_NONE) return false; =20 - if (stream->link->local_sink->edid_caps.allm) + if (stream->hdmi_allm_active) return false; =20 return true; @@ -529,7 +529,7 @@ void mod_build_hf_vsif_infopacket(const struct dc_strea= m_state *stream, =20 info_packet->valid =3D false; =20 - allm =3D stream->link->local_sink->edid_caps.allm; + allm =3D stream->hdmi_allm_active; format =3D stream->view_format =3D=3D VIEW_3D_FORMAT_NONE ? TIMING_3D_FORMAT_NONE : stream->timing.timing_3d_format; --=20 2.53.0