mirror of
https://github.com/torvalds/linux.git
synced 2026-04-19 23:34:00 -04:00
At the moment modesetting a stream CRTC will fail if the stream's BW along with the current BW of all the other streams on the same MST link is above the total BW of the MST link. Make the BW sharing more dynamic by trying to reduce the link bpp of one or more streams on the MST link in this case. When selecting a stream to reduce the BW for, take into account which link segment in the MST topology ran out of BW and which streams go through this link segment. For instance with A,B,C streams in the same MST topology A and B may share the BW of a link segment downstream of a branch device, stream C not downstream of the branch device, hence not affecting this BW. If this link segment's BW runs out one or both of stream A/B's BW will be reduced until their total BW is within limits. While reducing the link bpp for a given stream DSC may need to be enabled for it, which requires FEC on the whole MST link. Check for this condition and recompute the state for all streams taking the FEC overhead into account (on 8b/10b links). v2: - Rebase on s/min_bpp_pipes/min_bpp_reached_pipes/ change. Reviewed-by: Stanislav Lisovskiy <stanislav.lisovskiy@intel.com> Signed-off-by: Imre Deak <imre.deak@intel.com> Link: https://patchwork.freedesktop.org/patch/msgid/20231030155843.2251023-29-imre.deak@intel.com
39 lines
1018 B
C
39 lines
1018 B
C
/* SPDX-License-Identifier: MIT */
|
|
/*
|
|
* Copyright © 2023 Intel Corporation
|
|
*/
|
|
|
|
#ifndef __INTEL_LINK_BW_H__
|
|
#define __INTEL_LINK_BW_H__
|
|
|
|
#include <linux/types.h>
|
|
|
|
#include "intel_display_limits.h"
|
|
|
|
struct drm_i915_private;
|
|
|
|
struct intel_atomic_state;
|
|
struct intel_crtc_state;
|
|
|
|
struct intel_link_bw_limits {
|
|
u8 force_fec_pipes;
|
|
u8 bpp_limit_reached_pipes;
|
|
/* in 1/16 bpp units */
|
|
int max_bpp_x16[I915_MAX_PIPES];
|
|
};
|
|
|
|
void intel_link_bw_init_limits(struct drm_i915_private *i915,
|
|
struct intel_link_bw_limits *limits);
|
|
int intel_link_bw_reduce_bpp(struct intel_atomic_state *state,
|
|
struct intel_link_bw_limits *limits,
|
|
u8 pipe_mask,
|
|
const char *reason);
|
|
bool intel_link_bw_set_bpp_limit_for_pipe(struct intel_atomic_state *state,
|
|
const struct intel_link_bw_limits *old_limits,
|
|
struct intel_link_bw_limits *new_limits,
|
|
enum pipe pipe);
|
|
int intel_link_bw_atomic_check(struct intel_atomic_state *state,
|
|
struct intel_link_bw_limits *new_limits);
|
|
|
|
#endif
|