From nobody Mon Feb 9 21:37:21 2026 Received: from mail-ed1-f45.google.com (mail-ed1-f45.google.com [209.85.208.45]) (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 BF0203793D3 for ; Tue, 3 Feb 2026 18:56:54 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.208.45 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1770145016; cv=none; b=TrBR3ybFVHJRTQ3aARfI6i6cRE7pA4OHY0xJdRK3WFY1k7fHtfJ3W01vwLSmRuLBHlEK9pRgdnT+zJB5uAlvf/M5+V1Q9p5GqTfX2Sl+S4g8MYENTFsKmGyjBJ1E+JXjbtpUDOcGkPv7tFk4/OazOvzL6hME10EEIG+HYLyEEuk= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1770145016; c=relaxed/simple; bh=7kuP5ufKrRtq57K/6jl4/fZ844YdTgYXKAyTVdnqVng=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version:Content-Type; b=QEZqHAFRrsMXL1ZiidAeJleH5p9W6ALNzg6qXjVznw8voL4GSRon+BVCRm/36c5aEHRi69L0vFLlpixJTzOtLhUAMjOBAbQ+LES0LFm4HwY6FENmiMqzhNpQTLZiHS9iEK72B/41dWsCEqSQhMzClQ/fEhLnp1h8oIKnbKfEmgM= 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=J9y4pVzR; arc=none smtp.client-ip=209.85.208.45 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="J9y4pVzR" Received: by mail-ed1-f45.google.com with SMTP id 4fb4d7f45d1cf-64b686e7d04so655092a12.3 for ; Tue, 03 Feb 2026 10:56:54 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1770145013; x=1770749813; 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=r2h2wnsXtZ4g2BRwKy8/RzhvGTG6VzYgHk4FML1+grU=; b=J9y4pVzRRCpoI4IYzRGev5jWuvX6e+n80SaTL8oYJUT95Xszsvgi2dBjq1DgCBEOau UlEz0DfYz77W3V0WtUah6H1b9MKcvsbcpNIoPxTZrr141Hf8nuWgh9Fk4KcK9aHtgMMQ JLrSYhTHPZmKc27VVd++nrd7xSZUW8rbleQxWILtPx6aurlAICt3C4j1GAABI/n8XbeS PpwF+OVorwL7yS1D0ix2jUT7J0kpnRWmhJtmxwaNbLJ8qZEZyi+eKkUOtlC7PGnKLHS5 8DQSqjg5TPWqWwEhtknv3y3orH82hbgkr15cCx9uQoTqz5ohPPZ23Yul9PzRM2CXzYt/ YyWw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1770145013; x=1770749813; 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=r2h2wnsXtZ4g2BRwKy8/RzhvGTG6VzYgHk4FML1+grU=; b=GSEOUPzWSGWnzyucFsTEZTazMObLBJARc/LrA7f7ZL/lUBqkR5bLd3oZlggwUJeJCo 8OR7IIK3X9anH4ZkLakbcy2g+QSQjZsGAggrfLFq6Z6vdj38zew2UIG3xQ5xB3dmwK18 6ugc0y3d/1Bbspj3Wawg81j+5jtykyZdS5bltKra4+VaHNtLeAYmqdNtw4NRFpZw0uxJ zYFq5xOFCvISWRfpjg5iTluht6M9GWaQyje/Nlq45BY+AuIUWeIKp9KPrDxjbmDu0FCP Wj/j+bmjnz+GBybfRb/8scGpFPuKLZV2gYfjQYHniKPu5ia5VOXmKljL+9wMJaR0B16f pqdQ== X-Forwarded-Encrypted: i=1; AJvYcCVUOVtJsN8nU6dc/677kVHWJ113hG/qUNJd1SuSaFPi3WBFtvpU5ypQ6bAC7Fz4WgxF/VoTiWjVdEsDEKA=@vger.kernel.org X-Gm-Message-State: AOJu0Yw04Ew4ni5v0beCMZvctxFps7K1a7En3fOkUJqR1PgX8ML8tNjJ 4QHjNvTcoOx1/uu8jAVW9xt9SlWUbCQrNOWiUOSN82m1q+jNv35pMSjO X-Gm-Gg: AZuq6aLYt154rsBBbo9T35v0qLloBm4Kf6Nrcdjcs1xoD/pLgjjbofUfDTOm1BtSyx9 SJHOKVaVBNhZFMbx2ZbHmF6hjb6WXJH+07bMadfMxtHqoD+uZmBJOlt8FVd4Ui6ZIpRjtfxYCsp r73w2w68C6OdFb49RciQsFnW4gyfdUAF9hJxurESJFyS1s6ec/TTXPdVTgar3pkKoVSeOqJmpsd 6QRh8qhjy+rC0cPHVfhIDxPOa8HXC2i3rGi45IOO+vjAQXUeBRxmytFLb/k6rsCuXlTwdX26M/0 ARSBFo5CEovEJdKfDOsbq29OsH7xoDkCk/CfVMF2/Z7KDfSh2dBm9KVznLSirnCz460gi3Ry3dQ xIqqJ3PDvEtzGASjDbDD5dxYrtQh4vasX2AS+VmCLWA89/wjl7+KkfDw7Hi0jDUiUcM68UtBetY S9VojZ5++4ZiZr3jm0yC/pF8ELYq23UH2ANAPynszaE8WDjS/NqoAQQpHgIfiUWWC+ X-Received: by 2002:a17:907:3e0a:b0:b87:2780:1b2b with SMTP id a640c23a62f3a-b8e9f2f270bmr21095366b.4.1770145012928; Tue, 03 Feb 2026 10:56:52 -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-b8e9fad97a7sm16715766b.0.2026.02.03.10.56.51 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 03 Feb 2026 10:56:52 -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, admin@ptr1337.dev Subject: [PATCH v3 16/19] drm/amd/display: Add parameter to control ALLM behavior Date: Tue, 3 Feb 2026 19:56:23 +0100 Message-ID: <20260203185626.55428-17-tomasz.pakula.oficjalny@gmail.com> X-Mailer: git-send-email 2.52.0 In-Reply-To: <20260203185626.55428-1-tomasz.pakula.oficjalny@gmail.com> References: <20260203185626.55428-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] Some users prefer to always manually control ALLM/Gaming mode while others might want it permanently forced on. [How] Since there isn't yet an API to control this, expose module parameter Changes in v3: - Include a fix for possible NULL pointer dereference by Peter Closes: https://github.com/CachyOS/linux-cachyos/issues/680 Co-developed-by: Peter Jung Signed-off-by: Peter Jung Signed-off-by: Tomasz Paku=C5=82a --- drivers/gpu/drm/amd/amdgpu/amdgpu.h | 1 + drivers/gpu/drm/amd/amdgpu/amdgpu_drv.c | 14 +++++- .../gpu/drm/amd/display/dc/core/dc_resource.c | 7 +-- .../amd/display/modules/inc/mod_info_packet.h | 1 + .../display/modules/info_packet/info_packet.c | 46 ++++++++++++++++--- 5 files changed, 56 insertions(+), 13 deletions(-) diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu.h b/drivers/gpu/drm/amd/amdg= pu/amdgpu.h index 447e734c362b..312aa32064d5 100644 --- a/drivers/gpu/drm/amd/amdgpu/amdgpu.h +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu.h @@ -268,6 +268,7 @@ extern int amdgpu_rebar; =20 extern int amdgpu_wbrf; extern int amdgpu_user_queue; +extern uint amdgpu_allm_mode; =20 extern uint amdgpu_hdmi_hpd_debounce_delay_ms; =20 diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_drv.c b/drivers/gpu/drm/amd/= amdgpu/amdgpu_drv.c index d6d0a6e34c6b..4b038c8bbf9f 100644 --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_drv.c +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_drv.c @@ -248,6 +248,7 @@ int amdgpu_umsch_mm_fwlog; int amdgpu_rebar =3D -1; /* auto */ int amdgpu_user_queue =3D -1; uint amdgpu_hdmi_hpd_debounce_delay_ms; +uint amdgpu_allm_mode =3D 1; =20 DECLARE_DYNDBG_CLASSMAP(drm_debug_classes, DD_CLASS_TYPE_DISJOINT_BITS, 0, "DRM_UT_CORE", @@ -1124,7 +1125,7 @@ module_param_named(rebar, amdgpu_rebar, int, 0444); MODULE_PARM_DESC(user_queue, "Enable user queues (-1 =3D auto (default), 0= =3D disable, 1 =3D enable, 2 =3D enable UQs and disable KQs)"); module_param_named(user_queue, amdgpu_user_queue, int, 0444); =20 -/* +/** * DOC: hdmi_hpd_debounce_delay_ms (uint) * HDMI HPD disconnect debounce delay in milliseconds. * @@ -1134,6 +1135,17 @@ module_param_named(user_queue, amdgpu_user_queue, in= t, 0444); MODULE_PARM_DESC(hdmi_hpd_debounce_delay_ms, "HDMI HPD disconnect debounce= delay in milliseconds (0 to disable (by default), 1500 is common)"); module_param_named(hdmi_hpd_debounce_delay_ms, amdgpu_hdmi_hpd_debounce_de= lay_ms, uint, 0644); =20 +/** + * DOC: allm_mode (int) + * Changes ALLM triggering mode (if sink supports ALLM). Possible values: + * + * - 0 =3D ALLM disabled + * - 1 =3D ALLM dynamically triggered based on VRR state / Game Content Ty= pe Hint + * - 2 =3D ALLM forced always on + */ +MODULE_PARM_DESC(allm_mode, "Changes ALLM trigger mode (0 =3D disable, 1 = =3D enable (default), 2 =3D force enable)"); +module_param_named(allm_mode, amdgpu_allm_mode, uint, 0644); + /* These devices are not supported by amdgpu. * They are supported by the mach64, r128, radeon drivers */ 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 4a7c9f810e35..b779aac28dfa 100644 --- a/drivers/gpu/drm/amd/display/dc/core/dc_resource.c +++ b/drivers/gpu/drm/amd/display/dc/core/dc_resource.c @@ -44,6 +44,7 @@ #include "clk_mgr.h" #include "dc_state_priv.h" #include "dc_stream_priv.h" +#include "modules/inc/mod_info_packet.h" =20 #include "virtual/virtual_link_hwss.h" #include "link/hwss/link_hwss_dio.h" @@ -4503,8 +4504,6 @@ static void set_avi_info_frame( unsigned int vic =3D pipe_ctx->stream->timing.vic; unsigned int rid =3D pipe_ctx->stream->timing.rid; unsigned int fr_ind =3D pipe_ctx->stream->timing.fr_index; - enum dc_timing_3d_format format; - bool allm; =20 if (stream->avi_infopacket.valid) { *info_packet =3D stream->avi_infopacket; @@ -4658,10 +4657,8 @@ static void set_avi_info_frame( ///VIC if (pipe_ctx->stream->timing.hdmi_vic !=3D 0) vic =3D 0; - format =3D stream->timing.timing_3d_format; - allm =3D stream->link->local_sink->edid_caps.allm; /*todo, add 3DStereo support*/ - if ((format !=3D TIMING_3D_FORMAT_NONE) || allm) { + if (!is_hdmi_vic_mode(pipe_ctx->stream)) { // 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/modules/inc/mod_info_packet.h b/dr= ivers/gpu/drm/amd/display/modules/inc/mod_info_packet.h index 306eb7355c25..9ec123ecc7c4 100644 --- a/drivers/gpu/drm/amd/display/modules/inc/mod_info_packet.h +++ b/drivers/gpu/drm/amd/display/modules/inc/mod_info_packet.h @@ -41,6 +41,7 @@ void set_vsc_packet_colorimetry_data( enum dc_color_space cs, enum color_transfer_func tf); =20 +bool is_hdmi_vic_mode(const struct dc_stream_state *stream); void mod_build_vsc_infopacket(const struct dc_stream_state *stream, struct dc_info_packet *info_packet, enum dc_color_space cs, 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 53e488fdb4ea..829cce9455db 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 @@ -23,12 +23,13 @@ * */ =20 -#include "mod_info_packet.h" +#include "amdgpu.h" #include "core_types.h" -#include "dc_types.h" -#include "mod_shared.h" -#include "mod_freesync.h" #include "dc.h" +#include "dc_types.h" +#include "mod_freesync.h" +#include "mod_info_packet.h" +#include "mod_shared.h" =20 enum vsc_packet_revision { vsc_packet_undefined =3D 0, @@ -54,6 +55,12 @@ enum vsc_packet_revision { #define HF_VSIF_3D_BIT 0 #define HF_VSIF_ALLM_BIT 1 =20 +enum allm_trigger_mode { + ALLM_MODE_DISABLED =3D 0, + ALLM_MODE_ENABLED_DYNAMIC =3D 1, + ALLM_MODE_ENABLED_FORCED =3D 2, +}; + // VTEM Byte Offset #define VTEM_PB0 0 #define VTEM_PB1 1 @@ -499,7 +506,32 @@ void mod_build_vsc_infopacket(const struct dc_stream_s= tate *stream, } } =20 -static bool is_hdmi_vic_mode(const struct dc_stream_state *stream) +static bool is_hdmi_allm_mode(const struct dc_stream_state *stream) +{ + /* No local sink */ + if (!stream->link->local_sink) + return false; + + /* Sink doesn't expose ALLM support in edid */ + if (!stream->link->local_sink->edid_caps.allm) + return false; + + switch (amdgpu_allm_mode) { + case ALLM_MODE_DISABLED: + return false; + + case ALLM_MODE_ENABLED_DYNAMIC: + break; + + case ALLM_MODE_ENABLED_FORCED: + return true; + } + + return stream->content_type =3D=3D DISPLAY_CONTENT_TYPE_GAME || + stream->vrr_active_variable; +} + +bool is_hdmi_vic_mode(const struct dc_stream_state *stream) { if (stream->timing.hdmi_vic =3D=3D 0) return false; @@ -512,7 +544,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 (is_hdmi_allm_mode(stream)) return false; =20 return true; @@ -541,7 +573,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 is_hdmi_allm_mode(stream); format =3D stream->view_format =3D=3D VIEW_3D_FORMAT_NONE ? TIMING_3D_FORMAT_NONE : stream->timing.timing_3d_format; --=20 2.52.0