VYPR
Medium severity5.5NVD Advisory· Published May 8, 2026· Updated May 15, 2026

CVE-2026-43305

CVE-2026-43305

Description

In the Linux kernel, the following vulnerability has been resolved:

drm/amd/display: Fix mismatched unlock for DMUB HW lock in HWSS fast path

[Why] The evaluation for whether we need to use the DMUB HW lock isn't the same as whether we need to unlock which results in a hang when the fast path is used for ASIC without FAMS support.

[How] Store a flag that indicates whether we should use the lock and use that same flag to specify whether unlocking is needed.

Affected products

1
  • cpe:2.3:o:linux:linux_kernel:*:*:*:*:*:*:*:*
    Range: >=6.19,<6.19.6

Patches

4
af3303970da5

drm/amd/display: Fix mismatched unlock for DMUB HW lock in HWSS fast path

https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.gitNicholas KazlauskasFixed in 7.0via kernel-cna
1 file changed · +6 5
  • drivers/gpu/drm/amd/display/dc/core/dc_hw_sequencer.c+6 5 modified
    diff --git a/drivers/gpu/drm/amd/display/dc/core/dc_hw_sequencer.c b/drivers/gpu/drm/amd/display/dc/core/dc_hw_sequencer.c
    index e2763b60482a0..052d573408c3e 100644
    --- a/drivers/gpu/drm/amd/display/dc/core/dc_hw_sequencer.c
    +++ b/drivers/gpu/drm/amd/display/dc/core/dc_hw_sequencer.c
    @@ -741,6 +741,7 @@ void hwss_build_fast_sequence(struct dc *dc,
     	struct dce_hwseq *hws = dc->hwseq;
     	struct pipe_ctx *current_pipe = NULL;
     	struct pipe_ctx *current_mpc_pipe = NULL;
    +	bool is_dmub_lock_required = false;
     	unsigned int i = 0;
     
     	*num_steps = 0; // Initialize to 0
    @@ -763,11 +764,12 @@ void hwss_build_fast_sequence(struct dc *dc,
     		(*num_steps)++;
     	}
     	if (dc->hwss.dmub_hw_control_lock_fast) {
    +		is_dmub_lock_required = dc_state_is_fams2_in_use(dc, context) ||
    +					dmub_hw_lock_mgr_does_link_require_lock(dc, stream->link);
    +
     		block_sequence[*num_steps].params.dmub_hw_control_lock_fast_params.dc = dc;
     		block_sequence[*num_steps].params.dmub_hw_control_lock_fast_params.lock = true;
    -		block_sequence[*num_steps].params.dmub_hw_control_lock_fast_params.is_required =
    -			dc_state_is_fams2_in_use(dc, context) ||
    -			dmub_hw_lock_mgr_does_link_require_lock(dc, stream->link);
    +		block_sequence[*num_steps].params.dmub_hw_control_lock_fast_params.is_required = is_dmub_lock_required;
     		block_sequence[*num_steps].func = DMUB_HW_CONTROL_LOCK_FAST;
     		(*num_steps)++;
     	}
    @@ -906,7 +908,7 @@ void hwss_build_fast_sequence(struct dc *dc,
     	if (dc->hwss.dmub_hw_control_lock_fast) {
     		block_sequence[*num_steps].params.dmub_hw_control_lock_fast_params.dc = dc;
     		block_sequence[*num_steps].params.dmub_hw_control_lock_fast_params.lock = false;
    -		block_sequence[*num_steps].params.dmub_hw_control_lock_fast_params.is_required = dc_state_is_fams2_in_use(dc, context);
    +		block_sequence[*num_steps].params.dmub_hw_control_lock_fast_params.is_required = is_dmub_lock_required;
     		block_sequence[*num_steps].func = DMUB_HW_CONTROL_LOCK_FAST;
     		(*num_steps)++;
     	}
    -- 
    cgit 1.3-korg
    
    
    
4e387ad67efb

drm/amd/display: Fix mismatched unlock for DMUB HW lock in HWSS fast path

https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.gitNicholas KazlauskasFixed in 6.19.6via kernel-cna
1 file changed · +6 5
  • drivers/gpu/drm/amd/display/dc/core/dc_hw_sequencer.c+6 5 modified
    diff --git a/drivers/gpu/drm/amd/display/dc/core/dc_hw_sequencer.c b/drivers/gpu/drm/amd/display/dc/core/dc_hw_sequencer.c
    index e2763b60482a0..052d573408c3e 100644
    --- a/drivers/gpu/drm/amd/display/dc/core/dc_hw_sequencer.c
    +++ b/drivers/gpu/drm/amd/display/dc/core/dc_hw_sequencer.c
    @@ -741,6 +741,7 @@ void hwss_build_fast_sequence(struct dc *dc,
     	struct dce_hwseq *hws = dc->hwseq;
     	struct pipe_ctx *current_pipe = NULL;
     	struct pipe_ctx *current_mpc_pipe = NULL;
    +	bool is_dmub_lock_required = false;
     	unsigned int i = 0;
     
     	*num_steps = 0; // Initialize to 0
    @@ -763,11 +764,12 @@ void hwss_build_fast_sequence(struct dc *dc,
     		(*num_steps)++;
     	}
     	if (dc->hwss.dmub_hw_control_lock_fast) {
    +		is_dmub_lock_required = dc_state_is_fams2_in_use(dc, context) ||
    +					dmub_hw_lock_mgr_does_link_require_lock(dc, stream->link);
    +
     		block_sequence[*num_steps].params.dmub_hw_control_lock_fast_params.dc = dc;
     		block_sequence[*num_steps].params.dmub_hw_control_lock_fast_params.lock = true;
    -		block_sequence[*num_steps].params.dmub_hw_control_lock_fast_params.is_required =
    -			dc_state_is_fams2_in_use(dc, context) ||
    -			dmub_hw_lock_mgr_does_link_require_lock(dc, stream->link);
    +		block_sequence[*num_steps].params.dmub_hw_control_lock_fast_params.is_required = is_dmub_lock_required;
     		block_sequence[*num_steps].func = DMUB_HW_CONTROL_LOCK_FAST;
     		(*num_steps)++;
     	}
    @@ -906,7 +908,7 @@ void hwss_build_fast_sequence(struct dc *dc,
     	if (dc->hwss.dmub_hw_control_lock_fast) {
     		block_sequence[*num_steps].params.dmub_hw_control_lock_fast_params.dc = dc;
     		block_sequence[*num_steps].params.dmub_hw_control_lock_fast_params.lock = false;
    -		block_sequence[*num_steps].params.dmub_hw_control_lock_fast_params.is_required = dc_state_is_fams2_in_use(dc, context);
    +		block_sequence[*num_steps].params.dmub_hw_control_lock_fast_params.is_required = is_dmub_lock_required;
     		block_sequence[*num_steps].func = DMUB_HW_CONTROL_LOCK_FAST;
     		(*num_steps)++;
     	}
    -- 
    cgit 1.3-korg
    
    
    
af3303970da5

drm/amd/display: Fix mismatched unlock for DMUB HW lock in HWSS fast path

1 file changed · +6 5
  • drivers/gpu/drm/amd/display/dc/core/dc_hw_sequencer.c+6 5 modified
    diff --git a/drivers/gpu/drm/amd/display/dc/core/dc_hw_sequencer.c b/drivers/gpu/drm/amd/display/dc/core/dc_hw_sequencer.c
    index e2763b60482a0..052d573408c3e 100644
    --- a/drivers/gpu/drm/amd/display/dc/core/dc_hw_sequencer.c
    +++ b/drivers/gpu/drm/amd/display/dc/core/dc_hw_sequencer.c
    @@ -741,6 +741,7 @@ void hwss_build_fast_sequence(struct dc *dc,
     	struct dce_hwseq *hws = dc->hwseq;
     	struct pipe_ctx *current_pipe = NULL;
     	struct pipe_ctx *current_mpc_pipe = NULL;
    +	bool is_dmub_lock_required = false;
     	unsigned int i = 0;
     
     	*num_steps = 0; // Initialize to 0
    @@ -763,11 +764,12 @@ void hwss_build_fast_sequence(struct dc *dc,
     		(*num_steps)++;
     	}
     	if (dc->hwss.dmub_hw_control_lock_fast) {
    +		is_dmub_lock_required = dc_state_is_fams2_in_use(dc, context) ||
    +					dmub_hw_lock_mgr_does_link_require_lock(dc, stream->link);
    +
     		block_sequence[*num_steps].params.dmub_hw_control_lock_fast_params.dc = dc;
     		block_sequence[*num_steps].params.dmub_hw_control_lock_fast_params.lock = true;
    -		block_sequence[*num_steps].params.dmub_hw_control_lock_fast_params.is_required =
    -			dc_state_is_fams2_in_use(dc, context) ||
    -			dmub_hw_lock_mgr_does_link_require_lock(dc, stream->link);
    +		block_sequence[*num_steps].params.dmub_hw_control_lock_fast_params.is_required = is_dmub_lock_required;
     		block_sequence[*num_steps].func = DMUB_HW_CONTROL_LOCK_FAST;
     		(*num_steps)++;
     	}
    @@ -906,7 +908,7 @@ void hwss_build_fast_sequence(struct dc *dc,
     	if (dc->hwss.dmub_hw_control_lock_fast) {
     		block_sequence[*num_steps].params.dmub_hw_control_lock_fast_params.dc = dc;
     		block_sequence[*num_steps].params.dmub_hw_control_lock_fast_params.lock = false;
    -		block_sequence[*num_steps].params.dmub_hw_control_lock_fast_params.is_required = dc_state_is_fams2_in_use(dc, context);
    +		block_sequence[*num_steps].params.dmub_hw_control_lock_fast_params.is_required = is_dmub_lock_required;
     		block_sequence[*num_steps].func = DMUB_HW_CONTROL_LOCK_FAST;
     		(*num_steps)++;
     	}
    -- 
    cgit 1.3-korg
    
    
    
4e387ad67efb

drm/amd/display: Fix mismatched unlock for DMUB HW lock in HWSS fast path

1 file changed · +6 5
  • drivers/gpu/drm/amd/display/dc/core/dc_hw_sequencer.c+6 5 modified
    diff --git a/drivers/gpu/drm/amd/display/dc/core/dc_hw_sequencer.c b/drivers/gpu/drm/amd/display/dc/core/dc_hw_sequencer.c
    index e2763b60482a0..052d573408c3e 100644
    --- a/drivers/gpu/drm/amd/display/dc/core/dc_hw_sequencer.c
    +++ b/drivers/gpu/drm/amd/display/dc/core/dc_hw_sequencer.c
    @@ -741,6 +741,7 @@ void hwss_build_fast_sequence(struct dc *dc,
     	struct dce_hwseq *hws = dc->hwseq;
     	struct pipe_ctx *current_pipe = NULL;
     	struct pipe_ctx *current_mpc_pipe = NULL;
    +	bool is_dmub_lock_required = false;
     	unsigned int i = 0;
     
     	*num_steps = 0; // Initialize to 0
    @@ -763,11 +764,12 @@ void hwss_build_fast_sequence(struct dc *dc,
     		(*num_steps)++;
     	}
     	if (dc->hwss.dmub_hw_control_lock_fast) {
    +		is_dmub_lock_required = dc_state_is_fams2_in_use(dc, context) ||
    +					dmub_hw_lock_mgr_does_link_require_lock(dc, stream->link);
    +
     		block_sequence[*num_steps].params.dmub_hw_control_lock_fast_params.dc = dc;
     		block_sequence[*num_steps].params.dmub_hw_control_lock_fast_params.lock = true;
    -		block_sequence[*num_steps].params.dmub_hw_control_lock_fast_params.is_required =
    -			dc_state_is_fams2_in_use(dc, context) ||
    -			dmub_hw_lock_mgr_does_link_require_lock(dc, stream->link);
    +		block_sequence[*num_steps].params.dmub_hw_control_lock_fast_params.is_required = is_dmub_lock_required;
     		block_sequence[*num_steps].func = DMUB_HW_CONTROL_LOCK_FAST;
     		(*num_steps)++;
     	}
    @@ -906,7 +908,7 @@ void hwss_build_fast_sequence(struct dc *dc,
     	if (dc->hwss.dmub_hw_control_lock_fast) {
     		block_sequence[*num_steps].params.dmub_hw_control_lock_fast_params.dc = dc;
     		block_sequence[*num_steps].params.dmub_hw_control_lock_fast_params.lock = false;
    -		block_sequence[*num_steps].params.dmub_hw_control_lock_fast_params.is_required = dc_state_is_fams2_in_use(dc, context);
    +		block_sequence[*num_steps].params.dmub_hw_control_lock_fast_params.is_required = is_dmub_lock_required;
     		block_sequence[*num_steps].func = DMUB_HW_CONTROL_LOCK_FAST;
     		(*num_steps)++;
     	}
    -- 
    cgit 1.3-korg
    
    
    

Vulnerability mechanics

Root cause

"The logic for acquiring and releasing a DMUB HW lock was mismatched in the fast path for ASICs without FAMS support."

Attack vector

An attacker with local privileges could trigger a hang condition by exploiting the fast path logic in the display core hardware sequencer. This occurs when the system uses an ASIC without FAMS support, leading to a denial-of-service.

Affected code

The vulnerability resides in the `hwss_build_fast_sequence` function within `drivers/gpu/drm/amd/display/dc/core/dc_hw_sequencer.c`. The logic for determining if a DMUB HW lock is required was inconsistent between the lock acquisition and release steps in the fast path.

What the fix does

The patch introduces a flag, `is_dmub_lock_required`, to consistently track whether the DMUB HW lock should be used. This flag is now used for both acquiring and releasing the lock, ensuring that the unlock operation only occurs if the lock was indeed required. This resolves the mismatched unlock condition that caused hangs in the fast path for specific hardware configurations [patch_id=4628458].

Preconditions

  • configThe affected system must be using an ASIC without FAMS support.
  • authThe attacker requires local privileges to trigger the vulnerability.

Generated on Jun 3, 2026. Inputs: CWE entries + fix-commit diffs from this CVE's patches. Citations validated against bundle.

References

2

News mentions

1