- Add new DG2 PCI IDs (Shekhar)
- Remove watchdog timers for PSR on Lunar Lake (Mika Kahola) - DSB changes for proper handling of LUT programming (Ville) - Store DSC DPCD capabilities in the connector (Imre) - Clean up zero initializers (Ville) - Remove Meteor Lake force_probe protection (RK) -----BEGIN PGP SIGNATURE----- iQEzBAABCAAdFiEEbSBwaO7dZQkcLOKj+mJfZA7rE8oFAmUxVawACgkQ+mJfZA7r E8pKKAf9H6aS95fUeIqrxzkzGVrZ/faOulxzvAG/a0BsNI7SlwAGkQt/z4XWevxY iZmmJnIxggrP9pWObAZ2LWs6pDtWqzMt5NmuacHLWWdeOFYUaZosfRbQHPKt1WGN fQFsHk+YKQX2ssi3yuHjGDsdN58pA44AI9d1pb6scmu61TPujmF8Mb9wc3CUCMEW OrXGYhU18jvUoxyPeXAA29iYxn7BYOmw3Zj98ua5V9vopw/dY9UeVgiblz/ag43d 3fSelNPhTB6AYra0zlV4HQfbxSmWTiFbNsbEa8nC0aKqDlVD6LpDOM+ix5KLRwbP OC08dzMNL7Oen6LRMyyPRymy6Fp1OQ== =qQGI -----END PGP SIGNATURE----- Merge tag 'drm-intel-next-2023-10-19' of git://anongit.freedesktop.org/drm/drm-intel into drm-next - Add new DG2 PCI IDs (Shekhar) - Remove watchdog timers for PSR on Lunar Lake (Mika Kahola) - DSB changes for proper handling of LUT programming (Ville) - Store DSC DPCD capabilities in the connector (Imre) - Clean up zero initializers (Ville) - Remove Meteor Lake force_probe protection (RK) Signed-off-by: Dave Airlie <airlied@redhat.com> From: Rodrigo Vivi <rodrigo.vivi@intel.com> Link: https://patchwork.freedesktop.org/patch/msgid/ZTFW4g6duLtp+Wy0@intel.com
This commit is contained in:
commit
3ac5fa3fb7
@ -153,7 +153,7 @@ static acpi_handle intel_dsm_pci_probe(struct pci_dev *pdev)
|
||||
static bool intel_dsm_detect(void)
|
||||
{
|
||||
acpi_handle dhandle = NULL;
|
||||
char acpi_method_name[255] = { 0 };
|
||||
char acpi_method_name[255] = {};
|
||||
struct acpi_buffer buffer = {sizeof(acpi_method_name), acpi_method_name};
|
||||
struct pci_dev *pdev = NULL;
|
||||
int vga_count = 0;
|
||||
|
@ -1895,9 +1895,6 @@ void intel_color_prepare_commit(struct intel_crtc_state *crtc_state)
|
||||
struct intel_crtc *crtc = to_intel_crtc(crtc_state->uapi.crtc);
|
||||
struct drm_i915_private *i915 = to_i915(crtc->base.dev);
|
||||
|
||||
/* FIXME DSB has issues loading LUTs, disable it for now */
|
||||
return;
|
||||
|
||||
if (!crtc_state->hw.active ||
|
||||
intel_crtc_needs_modeset(crtc_state))
|
||||
return;
|
||||
|
@ -3009,7 +3009,7 @@ void intel_c10pll_state_verify(struct intel_atomic_state *state,
|
||||
struct drm_i915_private *i915 = to_i915(state->base.dev);
|
||||
const struct intel_crtc_state *new_crtc_state =
|
||||
intel_atomic_get_new_crtc_state(state, crtc);
|
||||
struct intel_c10pll_state mpllb_hw_state = { 0 };
|
||||
struct intel_c10pll_state mpllb_hw_state = {};
|
||||
const struct intel_c10pll_state *mpllb_sw_state = &new_crtc_state->cx0pll_state.c10;
|
||||
struct intel_encoder *encoder;
|
||||
enum phy phy;
|
||||
|
@ -1191,8 +1191,8 @@ DEFINE_SHOW_ATTRIBUTE(i915_lpsp_capability);
|
||||
|
||||
static int i915_dsc_fec_support_show(struct seq_file *m, void *data)
|
||||
{
|
||||
struct drm_connector *connector = m->private;
|
||||
struct drm_device *dev = connector->dev;
|
||||
struct intel_connector *connector = to_intel_connector(m->private);
|
||||
struct drm_i915_private *i915 = to_i915(connector->base.dev);
|
||||
struct drm_crtc *crtc;
|
||||
struct intel_dp *intel_dp;
|
||||
struct drm_modeset_acquire_ctx ctx;
|
||||
@ -1204,7 +1204,7 @@ static int i915_dsc_fec_support_show(struct seq_file *m, void *data)
|
||||
|
||||
do {
|
||||
try_again = false;
|
||||
ret = drm_modeset_lock(&dev->mode_config.connection_mutex,
|
||||
ret = drm_modeset_lock(&i915->drm.mode_config.connection_mutex,
|
||||
&ctx);
|
||||
if (ret) {
|
||||
if (ret == -EDEADLK && !drm_modeset_backoff(&ctx)) {
|
||||
@ -1213,8 +1213,8 @@ static int i915_dsc_fec_support_show(struct seq_file *m, void *data)
|
||||
}
|
||||
break;
|
||||
}
|
||||
crtc = connector->state->crtc;
|
||||
if (connector->status != connector_status_connected || !crtc) {
|
||||
crtc = connector->base.state->crtc;
|
||||
if (connector->base.status != connector_status_connected || !crtc) {
|
||||
ret = -ENODEV;
|
||||
break;
|
||||
}
|
||||
@ -1229,24 +1229,24 @@ static int i915_dsc_fec_support_show(struct seq_file *m, void *data)
|
||||
} else if (ret) {
|
||||
break;
|
||||
}
|
||||
intel_dp = intel_attached_dp(to_intel_connector(connector));
|
||||
intel_dp = intel_attached_dp(connector);
|
||||
crtc_state = to_intel_crtc_state(crtc->state);
|
||||
seq_printf(m, "DSC_Enabled: %s\n",
|
||||
str_yes_no(crtc_state->dsc.compression_enable));
|
||||
seq_printf(m, "DSC_Sink_Support: %s\n",
|
||||
str_yes_no(drm_dp_sink_supports_dsc(intel_dp->dsc_dpcd)));
|
||||
str_yes_no(drm_dp_sink_supports_dsc(connector->dp.dsc_dpcd)));
|
||||
seq_printf(m, "DSC_Output_Format_Sink_Support: RGB: %s YCBCR420: %s YCBCR444: %s\n",
|
||||
str_yes_no(drm_dp_dsc_sink_supports_format(intel_dp->dsc_dpcd,
|
||||
str_yes_no(drm_dp_dsc_sink_supports_format(connector->dp.dsc_dpcd,
|
||||
DP_DSC_RGB)),
|
||||
str_yes_no(drm_dp_dsc_sink_supports_format(intel_dp->dsc_dpcd,
|
||||
str_yes_no(drm_dp_dsc_sink_supports_format(connector->dp.dsc_dpcd,
|
||||
DP_DSC_YCbCr420_Native)),
|
||||
str_yes_no(drm_dp_dsc_sink_supports_format(intel_dp->dsc_dpcd,
|
||||
str_yes_no(drm_dp_dsc_sink_supports_format(connector->dp.dsc_dpcd,
|
||||
DP_DSC_YCbCr444)));
|
||||
seq_printf(m, "Force_DSC_Enable: %s\n",
|
||||
str_yes_no(intel_dp->force_dsc_en));
|
||||
if (!intel_dp_is_edp(intel_dp))
|
||||
seq_printf(m, "FEC_Sink_Support: %s\n",
|
||||
str_yes_no(drm_dp_sink_supports_fec(intel_dp->fec_capable)));
|
||||
str_yes_no(drm_dp_sink_supports_fec(connector->dp.fec_capability)));
|
||||
} while (try_again);
|
||||
|
||||
drm_modeset_drop_locks(&ctx);
|
||||
|
@ -620,6 +620,12 @@ struct intel_connector {
|
||||
|
||||
struct intel_dp *mst_port;
|
||||
|
||||
struct {
|
||||
struct drm_dp_aux *dsc_decompression_aux;
|
||||
u8 dsc_dpcd[DP_DSC_RECEIVER_CAP_SIZE];
|
||||
u8 fec_capability;
|
||||
} dp;
|
||||
|
||||
/* Work struct to schedule a uevent on link train failure */
|
||||
struct work_struct modeset_retry_work;
|
||||
|
||||
@ -1719,10 +1725,8 @@ struct intel_dp {
|
||||
u8 psr_dpcd[EDP_PSR_RECEIVER_CAP_SIZE];
|
||||
u8 downstream_ports[DP_MAX_DOWNSTREAM_PORTS];
|
||||
u8 edp_dpcd[EDP_DISPLAY_CTL_CAP_SIZE];
|
||||
u8 dsc_dpcd[DP_DSC_RECEIVER_CAP_SIZE];
|
||||
u8 lttpr_common_caps[DP_LTTPR_COMMON_CAP_SIZE];
|
||||
u8 lttpr_phy_caps[DP_MAX_LTTPR_COUNT][DP_LTTPR_PHY_CAP_SIZE];
|
||||
u8 fec_capable;
|
||||
u8 pcon_dsc_dpcd[DP_PCON_DSC_ENCODER_CAP_SIZE];
|
||||
/* source rates */
|
||||
int num_source_rates;
|
||||
|
@ -823,11 +823,11 @@ u16 intel_dp_dsc_get_max_compressed_bpp(struct drm_i915_private *i915,
|
||||
return bits_per_pixel;
|
||||
}
|
||||
|
||||
u8 intel_dp_dsc_get_slice_count(struct intel_dp *intel_dp,
|
||||
u8 intel_dp_dsc_get_slice_count(const struct intel_connector *connector,
|
||||
int mode_clock, int mode_hdisplay,
|
||||
bool bigjoiner)
|
||||
{
|
||||
struct drm_i915_private *i915 = dp_to_i915(intel_dp);
|
||||
struct drm_i915_private *i915 = to_i915(connector->base.dev);
|
||||
u8 min_slice_count, i;
|
||||
int max_slice_width;
|
||||
|
||||
@ -845,7 +845,7 @@ u8 intel_dp_dsc_get_slice_count(struct intel_dp *intel_dp,
|
||||
if (mode_clock >= ((i915->display.cdclk.max_cdclk_freq * 85) / 100))
|
||||
min_slice_count = max_t(u8, min_slice_count, 2);
|
||||
|
||||
max_slice_width = drm_dp_dsc_sink_max_slice_width(intel_dp->dsc_dpcd);
|
||||
max_slice_width = drm_dp_dsc_sink_max_slice_width(connector->dp.dsc_dpcd);
|
||||
if (max_slice_width < DP_DSC_MIN_SLICE_WIDTH_VALUE) {
|
||||
drm_dbg_kms(&i915->drm,
|
||||
"Unsupported slice width %d by DP DSC Sink device\n",
|
||||
@ -862,7 +862,7 @@ u8 intel_dp_dsc_get_slice_count(struct intel_dp *intel_dp,
|
||||
u8 test_slice_count = valid_dsc_slicecount[i] << bigjoiner;
|
||||
|
||||
if (test_slice_count >
|
||||
drm_dp_dsc_sink_max_slice_count(intel_dp->dsc_dpcd, false))
|
||||
drm_dp_dsc_sink_max_slice_count(connector->dp.dsc_dpcd, false))
|
||||
break;
|
||||
|
||||
/* big joiner needs small joiner to be enabled */
|
||||
@ -1205,7 +1205,7 @@ intel_dp_mode_valid(struct drm_connector *_connector,
|
||||
intel_dp_mode_min_output_bpp(connector, mode));
|
||||
|
||||
if (HAS_DSC(dev_priv) &&
|
||||
drm_dp_sink_supports_dsc(intel_dp->dsc_dpcd)) {
|
||||
drm_dp_sink_supports_dsc(connector->dp.dsc_dpcd)) {
|
||||
enum intel_output_format sink_format, output_format;
|
||||
int pipe_bpp;
|
||||
|
||||
@ -1215,7 +1215,7 @@ intel_dp_mode_valid(struct drm_connector *_connector,
|
||||
* TBD pass the connector BPC,
|
||||
* for now U8_MAX so that max BPC on that platform would be picked
|
||||
*/
|
||||
pipe_bpp = intel_dp_dsc_compute_max_bpp(intel_dp, U8_MAX);
|
||||
pipe_bpp = intel_dp_dsc_compute_max_bpp(connector, U8_MAX);
|
||||
|
||||
/*
|
||||
* Output bpp is stored in 6.4 format so right shift by 4 to get the
|
||||
@ -1223,11 +1223,11 @@ intel_dp_mode_valid(struct drm_connector *_connector,
|
||||
*/
|
||||
if (intel_dp_is_edp(intel_dp)) {
|
||||
dsc_max_compressed_bpp =
|
||||
drm_edp_dsc_sink_output_bpp(intel_dp->dsc_dpcd) >> 4;
|
||||
drm_edp_dsc_sink_output_bpp(connector->dp.dsc_dpcd) >> 4;
|
||||
dsc_slice_count =
|
||||
drm_dp_dsc_sink_max_slice_count(intel_dp->dsc_dpcd,
|
||||
drm_dp_dsc_sink_max_slice_count(connector->dp.dsc_dpcd,
|
||||
true);
|
||||
} else if (drm_dp_sink_supports_fec(intel_dp->fec_capable)) {
|
||||
} else if (drm_dp_sink_supports_fec(connector->dp.fec_capability)) {
|
||||
dsc_max_compressed_bpp =
|
||||
intel_dp_dsc_get_max_compressed_bpp(dev_priv,
|
||||
max_link_clock,
|
||||
@ -1238,7 +1238,7 @@ intel_dp_mode_valid(struct drm_connector *_connector,
|
||||
output_format,
|
||||
pipe_bpp, 64);
|
||||
dsc_slice_count =
|
||||
intel_dp_dsc_get_slice_count(intel_dp,
|
||||
intel_dp_dsc_get_slice_count(connector,
|
||||
target_clock,
|
||||
mode->hdisplay,
|
||||
bigjoiner);
|
||||
@ -1370,20 +1370,21 @@ static bool intel_dp_source_supports_fec(struct intel_dp *intel_dp,
|
||||
}
|
||||
|
||||
static bool intel_dp_supports_fec(struct intel_dp *intel_dp,
|
||||
const struct intel_connector *connector,
|
||||
const struct intel_crtc_state *pipe_config)
|
||||
{
|
||||
return intel_dp_source_supports_fec(intel_dp, pipe_config) &&
|
||||
drm_dp_sink_supports_fec(intel_dp->fec_capable);
|
||||
drm_dp_sink_supports_fec(connector->dp.fec_capability);
|
||||
}
|
||||
|
||||
static bool intel_dp_supports_dsc(struct intel_dp *intel_dp,
|
||||
static bool intel_dp_supports_dsc(const struct intel_connector *connector,
|
||||
const struct intel_crtc_state *crtc_state)
|
||||
{
|
||||
if (intel_crtc_has_type(crtc_state, INTEL_OUTPUT_DP) && !crtc_state->fec_enable)
|
||||
return false;
|
||||
|
||||
return intel_dsc_source_support(crtc_state) &&
|
||||
drm_dp_sink_supports_dsc(intel_dp->dsc_dpcd);
|
||||
drm_dp_sink_supports_dsc(connector->dp.dsc_dpcd);
|
||||
}
|
||||
|
||||
static int intel_dp_hdmi_compute_bpc(struct intel_dp *intel_dp,
|
||||
@ -1577,11 +1578,12 @@ u8 intel_dp_dsc_max_src_input_bpc(struct drm_i915_private *i915)
|
||||
return 0;
|
||||
}
|
||||
|
||||
int intel_dp_dsc_compute_max_bpp(struct intel_dp *intel_dp, u8 max_req_bpc)
|
||||
int intel_dp_dsc_compute_max_bpp(const struct intel_connector *connector,
|
||||
u8 max_req_bpc)
|
||||
{
|
||||
struct drm_i915_private *i915 = dp_to_i915(intel_dp);
|
||||
struct drm_i915_private *i915 = to_i915(connector->base.dev);
|
||||
int i, num_bpc;
|
||||
u8 dsc_bpc[3] = {0};
|
||||
u8 dsc_bpc[3] = {};
|
||||
u8 dsc_max_bpc;
|
||||
|
||||
dsc_max_bpc = intel_dp_dsc_max_src_input_bpc(i915);
|
||||
@ -1591,7 +1593,7 @@ int intel_dp_dsc_compute_max_bpp(struct intel_dp *intel_dp, u8 max_req_bpc)
|
||||
|
||||
dsc_max_bpc = min_t(u8, dsc_max_bpc, max_req_bpc);
|
||||
|
||||
num_bpc = drm_dp_dsc_sink_supported_input_bpcs(intel_dp->dsc_dpcd,
|
||||
num_bpc = drm_dp_dsc_sink_supported_input_bpcs(connector->dp.dsc_dpcd,
|
||||
dsc_bpc);
|
||||
for (i = 0; i < num_bpc; i++) {
|
||||
if (dsc_max_bpc >= dsc_bpc[i])
|
||||
@ -1601,16 +1603,14 @@ int intel_dp_dsc_compute_max_bpp(struct intel_dp *intel_dp, u8 max_req_bpc)
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int intel_dp_source_dsc_version_minor(struct intel_dp *intel_dp)
|
||||
static int intel_dp_source_dsc_version_minor(struct drm_i915_private *i915)
|
||||
{
|
||||
struct drm_i915_private *i915 = dp_to_i915(intel_dp);
|
||||
|
||||
return DISPLAY_VER(i915) >= 14 ? 2 : 1;
|
||||
}
|
||||
|
||||
static int intel_dp_sink_dsc_version_minor(struct intel_dp *intel_dp)
|
||||
static int intel_dp_sink_dsc_version_minor(const u8 dsc_dpcd[DP_DSC_RECEIVER_CAP_SIZE])
|
||||
{
|
||||
return (intel_dp->dsc_dpcd[DP_DSC_REV - DP_DSC_SUPPORT] & DP_DSC_MINOR_MASK) >>
|
||||
return (dsc_dpcd[DP_DSC_REV - DP_DSC_SUPPORT] & DP_DSC_MINOR_MASK) >>
|
||||
DP_DSC_MINOR_SHIFT;
|
||||
}
|
||||
|
||||
@ -1636,11 +1636,10 @@ static int intel_dp_get_slice_height(int vactive)
|
||||
return 2;
|
||||
}
|
||||
|
||||
static int intel_dp_dsc_compute_params(struct intel_encoder *encoder,
|
||||
static int intel_dp_dsc_compute_params(const struct intel_connector *connector,
|
||||
struct intel_crtc_state *crtc_state)
|
||||
{
|
||||
struct drm_i915_private *i915 = to_i915(encoder->base.dev);
|
||||
struct intel_dp *intel_dp = enc_to_intel_dp(encoder);
|
||||
struct drm_i915_private *i915 = to_i915(connector->base.dev);
|
||||
struct drm_dsc_config *vdsc_cfg = &crtc_state->dsc.config;
|
||||
u8 line_buf_depth;
|
||||
int ret;
|
||||
@ -1661,17 +1660,17 @@ static int intel_dp_dsc_compute_params(struct intel_encoder *encoder,
|
||||
return ret;
|
||||
|
||||
vdsc_cfg->dsc_version_major =
|
||||
(intel_dp->dsc_dpcd[DP_DSC_REV - DP_DSC_SUPPORT] &
|
||||
(connector->dp.dsc_dpcd[DP_DSC_REV - DP_DSC_SUPPORT] &
|
||||
DP_DSC_MAJOR_MASK) >> DP_DSC_MAJOR_SHIFT;
|
||||
vdsc_cfg->dsc_version_minor =
|
||||
min(intel_dp_source_dsc_version_minor(intel_dp),
|
||||
intel_dp_sink_dsc_version_minor(intel_dp));
|
||||
min(intel_dp_source_dsc_version_minor(i915),
|
||||
intel_dp_sink_dsc_version_minor(connector->dp.dsc_dpcd));
|
||||
if (vdsc_cfg->convert_rgb)
|
||||
vdsc_cfg->convert_rgb =
|
||||
intel_dp->dsc_dpcd[DP_DSC_DEC_COLOR_FORMAT_CAP - DP_DSC_SUPPORT] &
|
||||
connector->dp.dsc_dpcd[DP_DSC_DEC_COLOR_FORMAT_CAP - DP_DSC_SUPPORT] &
|
||||
DP_DSC_RGB;
|
||||
|
||||
line_buf_depth = drm_dp_dsc_sink_line_buf_depth(intel_dp->dsc_dpcd);
|
||||
line_buf_depth = drm_dp_dsc_sink_line_buf_depth(connector->dp.dsc_dpcd);
|
||||
if (!line_buf_depth) {
|
||||
drm_dbg_kms(&i915->drm,
|
||||
"DSC Sink Line Buffer Depth invalid\n");
|
||||
@ -1686,15 +1685,16 @@ static int intel_dp_dsc_compute_params(struct intel_encoder *encoder,
|
||||
DSC_1_1_MAX_LINEBUF_DEPTH_BITS : line_buf_depth;
|
||||
|
||||
vdsc_cfg->block_pred_enable =
|
||||
intel_dp->dsc_dpcd[DP_DSC_BLK_PREDICTION_SUPPORT - DP_DSC_SUPPORT] &
|
||||
connector->dp.dsc_dpcd[DP_DSC_BLK_PREDICTION_SUPPORT - DP_DSC_SUPPORT] &
|
||||
DP_DSC_BLK_PREDICTION_IS_SUPPORTED;
|
||||
|
||||
return drm_dsc_compute_rc_parameters(vdsc_cfg);
|
||||
}
|
||||
|
||||
static bool intel_dp_dsc_supports_format(struct intel_dp *intel_dp,
|
||||
static bool intel_dp_dsc_supports_format(const struct intel_connector *connector,
|
||||
enum intel_output_format output_format)
|
||||
{
|
||||
struct drm_i915_private *i915 = to_i915(connector->base.dev);
|
||||
u8 sink_dsc_format;
|
||||
|
||||
switch (output_format) {
|
||||
@ -1705,8 +1705,8 @@ static bool intel_dp_dsc_supports_format(struct intel_dp *intel_dp,
|
||||
sink_dsc_format = DP_DSC_YCbCr444;
|
||||
break;
|
||||
case INTEL_OUTPUT_FORMAT_YCBCR420:
|
||||
if (min(intel_dp_source_dsc_version_minor(intel_dp),
|
||||
intel_dp_sink_dsc_version_minor(intel_dp)) < 2)
|
||||
if (min(intel_dp_source_dsc_version_minor(i915),
|
||||
intel_dp_sink_dsc_version_minor(connector->dp.dsc_dpcd)) < 2)
|
||||
return false;
|
||||
sink_dsc_format = DP_DSC_YCbCr420_Native;
|
||||
break;
|
||||
@ -1714,7 +1714,7 @@ static bool intel_dp_dsc_supports_format(struct intel_dp *intel_dp,
|
||||
return false;
|
||||
}
|
||||
|
||||
return drm_dp_dsc_sink_supports_format(intel_dp->dsc_dpcd, sink_dsc_format);
|
||||
return drm_dp_dsc_sink_supports_format(connector->dp.dsc_dpcd, sink_dsc_format);
|
||||
}
|
||||
|
||||
static bool is_bw_sufficient_for_dsc_config(u16 compressed_bpp, u32 link_clock,
|
||||
@ -1765,11 +1765,11 @@ static int dsc_compute_link_config(struct intel_dp *intel_dp,
|
||||
}
|
||||
|
||||
static
|
||||
u16 intel_dp_dsc_max_sink_compressed_bppx16(struct intel_dp *intel_dp,
|
||||
u16 intel_dp_dsc_max_sink_compressed_bppx16(const struct intel_connector *connector,
|
||||
struct intel_crtc_state *pipe_config,
|
||||
int bpc)
|
||||
{
|
||||
u16 max_bppx16 = drm_edp_dsc_sink_output_bpp(intel_dp->dsc_dpcd);
|
||||
u16 max_bppx16 = drm_edp_dsc_sink_output_bpp(connector->dp.dsc_dpcd);
|
||||
|
||||
if (max_bppx16)
|
||||
return max_bppx16;
|
||||
@ -1808,11 +1808,11 @@ static int dsc_sink_min_compressed_bpp(struct intel_crtc_state *pipe_config)
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int dsc_sink_max_compressed_bpp(struct intel_dp *intel_dp,
|
||||
static int dsc_sink_max_compressed_bpp(const struct intel_connector *connector,
|
||||
struct intel_crtc_state *pipe_config,
|
||||
int bpc)
|
||||
{
|
||||
return intel_dp_dsc_max_sink_compressed_bppx16(intel_dp,
|
||||
return intel_dp_dsc_max_sink_compressed_bppx16(connector,
|
||||
pipe_config, bpc) >> 4;
|
||||
}
|
||||
|
||||
@ -1911,6 +1911,7 @@ xelpd_dsc_compute_link_config(struct intel_dp *intel_dp,
|
||||
}
|
||||
|
||||
static int dsc_compute_compressed_bpp(struct intel_dp *intel_dp,
|
||||
const struct intel_connector *connector,
|
||||
struct intel_crtc_state *pipe_config,
|
||||
struct link_config_limits *limits,
|
||||
int pipe_bpp,
|
||||
@ -1928,7 +1929,7 @@ static int dsc_compute_compressed_bpp(struct intel_dp *intel_dp,
|
||||
dsc_min_bpp = max(dsc_min_bpp, to_bpp_int_roundup(limits->link.min_bpp_x16));
|
||||
|
||||
dsc_src_max_bpp = dsc_src_max_compressed_bpp(intel_dp);
|
||||
dsc_sink_max_bpp = dsc_sink_max_compressed_bpp(intel_dp, pipe_config, pipe_bpp / 3);
|
||||
dsc_sink_max_bpp = dsc_sink_max_compressed_bpp(connector, pipe_config, pipe_bpp / 3);
|
||||
dsc_max_bpp = dsc_sink_max_bpp ? min(dsc_sink_max_bpp, dsc_src_max_bpp) : dsc_src_max_bpp;
|
||||
|
||||
dsc_joiner_max_bpp = get_max_compressed_bpp_with_joiner(i915, adjusted_mode->clock,
|
||||
@ -2000,17 +2001,19 @@ static int intel_dp_dsc_compute_pipe_bpp(struct intel_dp *intel_dp,
|
||||
int timeslots)
|
||||
{
|
||||
struct drm_i915_private *i915 = dp_to_i915(intel_dp);
|
||||
const struct intel_connector *connector =
|
||||
to_intel_connector(conn_state->connector);
|
||||
u8 max_req_bpc = conn_state->max_requested_bpc;
|
||||
u8 dsc_max_bpc, dsc_max_bpp;
|
||||
u8 dsc_min_bpc, dsc_min_bpp;
|
||||
u8 dsc_bpc[3] = {0};
|
||||
u8 dsc_bpc[3] = {};
|
||||
int forced_bpp, pipe_bpp;
|
||||
int num_bpc, i, ret;
|
||||
|
||||
forced_bpp = intel_dp_force_dsc_pipe_bpp(intel_dp, conn_state, limits);
|
||||
|
||||
if (forced_bpp) {
|
||||
ret = dsc_compute_compressed_bpp(intel_dp, pipe_config,
|
||||
ret = dsc_compute_compressed_bpp(intel_dp, connector, pipe_config,
|
||||
limits, forced_bpp, timeslots);
|
||||
if (ret == 0) {
|
||||
pipe_config->pipe_bpp = forced_bpp;
|
||||
@ -2032,14 +2035,14 @@ static int intel_dp_dsc_compute_pipe_bpp(struct intel_dp *intel_dp,
|
||||
* Get the maximum DSC bpc that will be supported by any valid
|
||||
* link configuration and compressed bpp.
|
||||
*/
|
||||
num_bpc = drm_dp_dsc_sink_supported_input_bpcs(intel_dp->dsc_dpcd, dsc_bpc);
|
||||
num_bpc = drm_dp_dsc_sink_supported_input_bpcs(connector->dp.dsc_dpcd, dsc_bpc);
|
||||
for (i = 0; i < num_bpc; i++) {
|
||||
pipe_bpp = dsc_bpc[i] * 3;
|
||||
if (pipe_bpp < dsc_min_bpp)
|
||||
break;
|
||||
if (pipe_bpp > dsc_max_bpp)
|
||||
continue;
|
||||
ret = dsc_compute_compressed_bpp(intel_dp, pipe_config,
|
||||
ret = dsc_compute_compressed_bpp(intel_dp, connector, pipe_config,
|
||||
limits, pipe_bpp, timeslots);
|
||||
if (ret == 0) {
|
||||
pipe_config->pipe_bpp = pipe_bpp;
|
||||
@ -2056,6 +2059,8 @@ static int intel_edp_dsc_compute_pipe_bpp(struct intel_dp *intel_dp,
|
||||
struct link_config_limits *limits)
|
||||
{
|
||||
struct drm_i915_private *i915 = dp_to_i915(intel_dp);
|
||||
struct intel_connector *connector =
|
||||
to_intel_connector(conn_state->connector);
|
||||
int pipe_bpp, forced_bpp;
|
||||
int dsc_src_min_bpp, dsc_sink_min_bpp, dsc_min_bpp;
|
||||
int dsc_src_max_bpp, dsc_sink_max_bpp, dsc_max_bpp;
|
||||
@ -2068,7 +2073,7 @@ static int intel_edp_dsc_compute_pipe_bpp(struct intel_dp *intel_dp,
|
||||
int max_bpc = min(limits->pipe.max_bpp / 3, (int)conn_state->max_requested_bpc);
|
||||
|
||||
/* For eDP use max bpp that can be supported with DSC. */
|
||||
pipe_bpp = intel_dp_dsc_compute_max_bpp(intel_dp, max_bpc);
|
||||
pipe_bpp = intel_dp_dsc_compute_max_bpp(connector, max_bpc);
|
||||
if (!is_dsc_pipe_bpp_sufficient(i915, conn_state, limits, pipe_bpp)) {
|
||||
drm_dbg_kms(&i915->drm,
|
||||
"Computed BPC is not in DSC BPC limits\n");
|
||||
@ -2084,7 +2089,7 @@ static int intel_edp_dsc_compute_pipe_bpp(struct intel_dp *intel_dp,
|
||||
dsc_min_bpp = max(dsc_min_bpp, to_bpp_int_roundup(limits->link.min_bpp_x16));
|
||||
|
||||
dsc_src_max_bpp = dsc_src_max_compressed_bpp(intel_dp);
|
||||
dsc_sink_max_bpp = dsc_sink_max_compressed_bpp(intel_dp, pipe_config, pipe_bpp / 3);
|
||||
dsc_sink_max_bpp = dsc_sink_max_compressed_bpp(connector, pipe_config, pipe_bpp / 3);
|
||||
dsc_max_bpp = dsc_sink_max_bpp ? min(dsc_sink_max_bpp, dsc_src_max_bpp) : dsc_src_max_bpp;
|
||||
dsc_max_bpp = min(dsc_max_bpp, to_bpp_int(limits->link.max_bpp_x16));
|
||||
|
||||
@ -2107,17 +2112,19 @@ int intel_dp_dsc_compute_config(struct intel_dp *intel_dp,
|
||||
{
|
||||
struct intel_digital_port *dig_port = dp_to_dig_port(intel_dp);
|
||||
struct drm_i915_private *dev_priv = to_i915(dig_port->base.base.dev);
|
||||
const struct intel_connector *connector =
|
||||
to_intel_connector(conn_state->connector);
|
||||
const struct drm_display_mode *adjusted_mode =
|
||||
&pipe_config->hw.adjusted_mode;
|
||||
int ret;
|
||||
|
||||
pipe_config->fec_enable = !intel_dp_is_edp(intel_dp) &&
|
||||
intel_dp_supports_fec(intel_dp, pipe_config);
|
||||
intel_dp_supports_fec(intel_dp, connector, pipe_config);
|
||||
|
||||
if (!intel_dp_supports_dsc(intel_dp, pipe_config))
|
||||
if (!intel_dp_supports_dsc(connector, pipe_config))
|
||||
return -EINVAL;
|
||||
|
||||
if (!intel_dp_dsc_supports_format(intel_dp, pipe_config->output_format))
|
||||
if (!intel_dp_dsc_supports_format(connector, pipe_config->output_format))
|
||||
return -EINVAL;
|
||||
|
||||
/*
|
||||
@ -2143,7 +2150,7 @@ int intel_dp_dsc_compute_config(struct intel_dp *intel_dp,
|
||||
/* Calculate Slice count */
|
||||
if (intel_dp_is_edp(intel_dp)) {
|
||||
pipe_config->dsc.slice_count =
|
||||
drm_dp_dsc_sink_max_slice_count(intel_dp->dsc_dpcd,
|
||||
drm_dp_dsc_sink_max_slice_count(connector->dp.dsc_dpcd,
|
||||
true);
|
||||
if (!pipe_config->dsc.slice_count) {
|
||||
drm_dbg_kms(&dev_priv->drm, "Unsupported Slice Count %d\n",
|
||||
@ -2154,7 +2161,7 @@ int intel_dp_dsc_compute_config(struct intel_dp *intel_dp,
|
||||
u8 dsc_dp_slice_count;
|
||||
|
||||
dsc_dp_slice_count =
|
||||
intel_dp_dsc_get_slice_count(intel_dp,
|
||||
intel_dp_dsc_get_slice_count(connector,
|
||||
adjusted_mode->crtc_clock,
|
||||
adjusted_mode->crtc_hdisplay,
|
||||
pipe_config->bigjoiner_pipes);
|
||||
@ -2174,7 +2181,7 @@ int intel_dp_dsc_compute_config(struct intel_dp *intel_dp,
|
||||
if (pipe_config->bigjoiner_pipes || pipe_config->dsc.slice_count > 1)
|
||||
pipe_config->dsc.dsc_split = true;
|
||||
|
||||
ret = intel_dp_dsc_compute_params(&dig_port->base, pipe_config);
|
||||
ret = intel_dp_dsc_compute_params(connector, pipe_config);
|
||||
if (ret < 0) {
|
||||
drm_dbg_kms(&dev_priv->drm,
|
||||
"Cannot compute valid DSC parameters for Input Bpp = %d "
|
||||
@ -2933,7 +2940,7 @@ intel_edp_init_source_oui(struct intel_dp *intel_dp, bool careful)
|
||||
{
|
||||
struct drm_i915_private *i915 = dp_to_i915(intel_dp);
|
||||
u8 oui[] = { 0x00, 0xaa, 0x01 };
|
||||
u8 buf[3] = { 0 };
|
||||
u8 buf[3] = {};
|
||||
|
||||
/*
|
||||
* During driver init, we want to be careful and avoid changing the source OUI if it's
|
||||
@ -3467,43 +3474,57 @@ bool intel_dp_get_colorimetry_status(struct intel_dp *intel_dp)
|
||||
return dprx & DP_VSC_SDP_EXT_FOR_COLORIMETRY_SUPPORTED;
|
||||
}
|
||||
|
||||
static void intel_dp_get_dsc_sink_cap(struct intel_dp *intel_dp)
|
||||
static void intel_dp_read_dsc_dpcd(struct drm_dp_aux *aux,
|
||||
u8 dsc_dpcd[DP_DSC_RECEIVER_CAP_SIZE])
|
||||
{
|
||||
struct drm_i915_private *i915 = dp_to_i915(intel_dp);
|
||||
if (drm_dp_dpcd_read(aux, DP_DSC_SUPPORT, dsc_dpcd,
|
||||
DP_DSC_RECEIVER_CAP_SIZE) < 0) {
|
||||
drm_err(aux->drm_dev,
|
||||
"Failed to read DPCD register 0x%x\n",
|
||||
DP_DSC_SUPPORT);
|
||||
return;
|
||||
}
|
||||
|
||||
drm_dbg_kms(aux->drm_dev, "DSC DPCD: %*ph\n",
|
||||
DP_DSC_RECEIVER_CAP_SIZE,
|
||||
dsc_dpcd);
|
||||
}
|
||||
|
||||
void intel_dp_get_dsc_sink_cap(u8 dpcd_rev, struct intel_connector *connector)
|
||||
{
|
||||
struct drm_i915_private *i915 = to_i915(connector->base.dev);
|
||||
|
||||
/*
|
||||
* Clear the cached register set to avoid using stale values
|
||||
* for the sinks that do not support DSC.
|
||||
*/
|
||||
memset(intel_dp->dsc_dpcd, 0, sizeof(intel_dp->dsc_dpcd));
|
||||
memset(connector->dp.dsc_dpcd, 0, sizeof(connector->dp.dsc_dpcd));
|
||||
|
||||
/* Clear fec_capable to avoid using stale values */
|
||||
intel_dp->fec_capable = 0;
|
||||
connector->dp.fec_capability = 0;
|
||||
|
||||
/* Cache the DSC DPCD if eDP or DP rev >= 1.4 */
|
||||
if (intel_dp->dpcd[DP_DPCD_REV] >= 0x14 ||
|
||||
intel_dp->edp_dpcd[0] >= DP_EDP_14) {
|
||||
if (drm_dp_dpcd_read(&intel_dp->aux, DP_DSC_SUPPORT,
|
||||
intel_dp->dsc_dpcd,
|
||||
sizeof(intel_dp->dsc_dpcd)) < 0)
|
||||
drm_err(&i915->drm,
|
||||
"Failed to read DPCD register 0x%x\n",
|
||||
DP_DSC_SUPPORT);
|
||||
if (dpcd_rev < DP_DPCD_REV_14)
|
||||
return;
|
||||
|
||||
drm_dbg_kms(&i915->drm, "DSC DPCD: %*ph\n",
|
||||
(int)sizeof(intel_dp->dsc_dpcd),
|
||||
intel_dp->dsc_dpcd);
|
||||
intel_dp_read_dsc_dpcd(connector->dp.dsc_decompression_aux,
|
||||
connector->dp.dsc_dpcd);
|
||||
|
||||
/* FEC is supported only on DP 1.4 */
|
||||
if (!intel_dp_is_edp(intel_dp) &&
|
||||
drm_dp_dpcd_readb(&intel_dp->aux, DP_FEC_CAPABILITY,
|
||||
&intel_dp->fec_capable) < 0)
|
||||
drm_err(&i915->drm,
|
||||
"Failed to read FEC DPCD register\n");
|
||||
|
||||
drm_dbg_kms(&i915->drm, "FEC CAPABILITY: %x\n",
|
||||
intel_dp->fec_capable);
|
||||
if (drm_dp_dpcd_readb(connector->dp.dsc_decompression_aux, DP_FEC_CAPABILITY,
|
||||
&connector->dp.fec_capability) < 0) {
|
||||
drm_err(&i915->drm, "Failed to read FEC DPCD register\n");
|
||||
return;
|
||||
}
|
||||
|
||||
drm_dbg_kms(&i915->drm, "FEC CAPABILITY: %x\n",
|
||||
connector->dp.fec_capability);
|
||||
}
|
||||
|
||||
static void intel_edp_get_dsc_sink_cap(u8 edp_dpcd_rev, struct intel_connector *connector)
|
||||
{
|
||||
if (edp_dpcd_rev < DP_EDP_14)
|
||||
return;
|
||||
|
||||
intel_dp_read_dsc_dpcd(connector->dp.dsc_decompression_aux, connector->dp.dsc_dpcd);
|
||||
}
|
||||
|
||||
static void intel_edp_mso_mode_fixup(struct intel_connector *connector,
|
||||
@ -3595,7 +3616,7 @@ static void intel_edp_mso_init(struct intel_dp *intel_dp)
|
||||
}
|
||||
|
||||
static bool
|
||||
intel_edp_init_dpcd(struct intel_dp *intel_dp)
|
||||
intel_edp_init_dpcd(struct intel_dp *intel_dp, struct intel_connector *connector)
|
||||
{
|
||||
struct drm_i915_private *dev_priv =
|
||||
to_i915(dp_to_dig_port(intel_dp)->base.base.dev);
|
||||
@ -3674,7 +3695,8 @@ intel_edp_init_dpcd(struct intel_dp *intel_dp)
|
||||
|
||||
/* Read the eDP DSC DPCD registers */
|
||||
if (HAS_DSC(dev_priv))
|
||||
intel_dp_get_dsc_sink_cap(intel_dp);
|
||||
intel_edp_get_dsc_sink_cap(intel_dp->edp_dpcd[0],
|
||||
connector);
|
||||
|
||||
/*
|
||||
* If needed, program our source OUI so we can make various Intel-specific AUX services
|
||||
@ -5338,13 +5360,32 @@ intel_dp_unset_edid(struct intel_dp *intel_dp)
|
||||
false);
|
||||
}
|
||||
|
||||
static void
|
||||
intel_dp_detect_dsc_caps(struct intel_dp *intel_dp, struct intel_connector *connector)
|
||||
{
|
||||
struct drm_i915_private *i915 = dp_to_i915(intel_dp);
|
||||
|
||||
/* Read DP Sink DSC Cap DPCD regs for DP v1.4 */
|
||||
if (!HAS_DSC(i915))
|
||||
return;
|
||||
|
||||
if (intel_dp_is_edp(intel_dp))
|
||||
intel_edp_get_dsc_sink_cap(intel_dp->edp_dpcd[0],
|
||||
connector);
|
||||
else
|
||||
intel_dp_get_dsc_sink_cap(intel_dp->dpcd[DP_DPCD_REV],
|
||||
connector);
|
||||
}
|
||||
|
||||
static int
|
||||
intel_dp_detect(struct drm_connector *connector,
|
||||
struct drm_modeset_acquire_ctx *ctx,
|
||||
bool force)
|
||||
{
|
||||
struct drm_i915_private *dev_priv = to_i915(connector->dev);
|
||||
struct intel_dp *intel_dp = intel_attached_dp(to_intel_connector(connector));
|
||||
struct intel_connector *intel_connector =
|
||||
to_intel_connector(connector);
|
||||
struct intel_dp *intel_dp = intel_attached_dp(intel_connector);
|
||||
struct intel_digital_port *dig_port = dp_to_dig_port(intel_dp);
|
||||
struct intel_encoder *encoder = &dig_port->base;
|
||||
enum drm_connector_status status;
|
||||
@ -5367,7 +5408,7 @@ intel_dp_detect(struct drm_connector *connector,
|
||||
|
||||
if (status == connector_status_disconnected) {
|
||||
memset(&intel_dp->compliance, 0, sizeof(intel_dp->compliance));
|
||||
memset(intel_dp->dsc_dpcd, 0, sizeof(intel_dp->dsc_dpcd));
|
||||
memset(intel_connector->dp.dsc_dpcd, 0, sizeof(intel_connector->dp.dsc_dpcd));
|
||||
|
||||
if (intel_dp->is_mst) {
|
||||
drm_dbg_kms(&dev_priv->drm,
|
||||
@ -5382,9 +5423,7 @@ intel_dp_detect(struct drm_connector *connector,
|
||||
goto out;
|
||||
}
|
||||
|
||||
/* Read DP Sink DSC Cap DPCD regs for DP v1.4 */
|
||||
if (HAS_DSC(dev_priv))
|
||||
intel_dp_get_dsc_sink_cap(intel_dp);
|
||||
intel_dp_detect_dsc_caps(intel_dp, intel_connector);
|
||||
|
||||
intel_dp_configure_mst(intel_dp);
|
||||
|
||||
@ -5980,7 +6019,7 @@ static bool intel_edp_init_connector(struct intel_dp *intel_dp,
|
||||
intel_hpd_enable_detection(encoder);
|
||||
|
||||
/* Cache DPCD and EDID for edp. */
|
||||
has_dpcd = intel_edp_init_dpcd(intel_dp);
|
||||
has_dpcd = intel_edp_init_dpcd(intel_dp, intel_connector);
|
||||
|
||||
if (!has_dpcd) {
|
||||
/* if this fails, presume the device is a ghost */
|
||||
@ -6154,6 +6193,7 @@ intel_dp_init_connector(struct intel_digital_port *dig_port,
|
||||
intel_dp->pps.active_pipe = vlv_active_pipe(intel_dp);
|
||||
|
||||
intel_dp_aux_init(intel_dp);
|
||||
intel_connector->dp.dsc_decompression_aux = &intel_dp->aux;
|
||||
|
||||
drm_dbg_kms(&dev_priv->drm,
|
||||
"Adding %s connector on [ENCODER:%d:%s]\n",
|
||||
|
@ -116,7 +116,8 @@ void intel_read_dp_sdp(struct intel_encoder *encoder,
|
||||
struct intel_crtc_state *crtc_state,
|
||||
unsigned int type);
|
||||
bool intel_digital_port_connected(struct intel_encoder *encoder);
|
||||
int intel_dp_dsc_compute_max_bpp(struct intel_dp *intel_dp, u8 dsc_max_bpc);
|
||||
int intel_dp_dsc_compute_max_bpp(const struct intel_connector *connector,
|
||||
u8 dsc_max_bpc);
|
||||
u16 intel_dp_dsc_get_max_compressed_bpp(struct drm_i915_private *i915,
|
||||
u32 link_clock, u32 lane_count,
|
||||
u32 mode_clock, u32 mode_hdisplay,
|
||||
@ -124,7 +125,7 @@ u16 intel_dp_dsc_get_max_compressed_bpp(struct drm_i915_private *i915,
|
||||
enum intel_output_format output_format,
|
||||
u32 pipe_bpp,
|
||||
u32 timeslots);
|
||||
u8 intel_dp_dsc_get_slice_count(struct intel_dp *intel_dp,
|
||||
u8 intel_dp_dsc_get_slice_count(const struct intel_connector *connector,
|
||||
int mode_clock, int mode_hdisplay,
|
||||
bool bigjoiner);
|
||||
bool intel_dp_need_bigjoiner(struct intel_dp *intel_dp,
|
||||
@ -162,4 +163,6 @@ intel_dp_compute_config_link_bpp_limits(struct intel_dp *intel_dp,
|
||||
bool dsc,
|
||||
struct link_config_limits *limits);
|
||||
|
||||
void intel_dp_get_dsc_sink_cap(u8 dpcd_rev, struct intel_connector *connector);
|
||||
|
||||
#endif /* __INTEL_DP_H__ */
|
||||
|
@ -169,7 +169,7 @@ intel_dp_aux_hdr_get_backlight(struct intel_connector *connector, enum pipe pipe
|
||||
struct intel_panel *panel = &connector->panel;
|
||||
struct intel_dp *intel_dp = enc_to_intel_dp(connector->encoder);
|
||||
u8 tmp;
|
||||
u8 buf[2] = { 0 };
|
||||
u8 buf[2] = {};
|
||||
|
||||
if (drm_dp_dpcd_readb(&intel_dp->aux, INTEL_EDP_HDR_GETSET_CTRL_PARAMS, &tmp) != 1) {
|
||||
drm_err(&i915->drm, "[CONNECTOR:%d:%s] Failed to read current backlight mode from DPCD\n",
|
||||
@ -204,7 +204,7 @@ intel_dp_aux_hdr_set_aux_backlight(const struct drm_connector_state *conn_state,
|
||||
struct intel_connector *connector = to_intel_connector(conn_state->connector);
|
||||
struct drm_device *dev = connector->base.dev;
|
||||
struct intel_dp *intel_dp = enc_to_intel_dp(connector->encoder);
|
||||
u8 buf[4] = { 0 };
|
||||
u8 buf[4] = {};
|
||||
|
||||
buf[0] = level & 0xFF;
|
||||
buf[1] = (level & 0xFF00) >> 8;
|
||||
|
@ -185,8 +185,6 @@ static int intel_dp_dsc_mst_compute_link_config(struct intel_encoder *encoder,
|
||||
struct drm_connector_state *conn_state,
|
||||
struct link_config_limits *limits)
|
||||
{
|
||||
struct intel_dp_mst_encoder *intel_mst = enc_to_mst(encoder);
|
||||
struct intel_dp *intel_dp = &intel_mst->primary->dp;
|
||||
struct intel_connector *connector =
|
||||
to_intel_connector(conn_state->connector);
|
||||
struct drm_i915_private *i915 = to_i915(connector->base.dev);
|
||||
@ -194,7 +192,7 @@ static int intel_dp_dsc_mst_compute_link_config(struct intel_encoder *encoder,
|
||||
&crtc_state->hw.adjusted_mode;
|
||||
int slots = -EINVAL;
|
||||
int i, num_bpc;
|
||||
u8 dsc_bpc[3] = {0};
|
||||
u8 dsc_bpc[3] = {};
|
||||
int min_bpp, max_bpp, sink_min_bpp, sink_max_bpp;
|
||||
u8 dsc_max_bpc;
|
||||
bool need_timeslot_recalc = false;
|
||||
@ -209,7 +207,7 @@ static int intel_dp_dsc_mst_compute_link_config(struct intel_encoder *encoder,
|
||||
max_bpp = min_t(u8, dsc_max_bpc * 3, limits->pipe.max_bpp);
|
||||
min_bpp = limits->pipe.min_bpp;
|
||||
|
||||
num_bpc = drm_dp_dsc_sink_supported_input_bpcs(intel_dp->dsc_dpcd,
|
||||
num_bpc = drm_dp_dsc_sink_supported_input_bpcs(connector->dp.dsc_dpcd,
|
||||
dsc_bpc);
|
||||
|
||||
drm_dbg_kms(&i915->drm, "DSC Source supported min bpp %d max bpp %d\n",
|
||||
@ -998,14 +996,14 @@ intel_dp_mst_mode_valid_ctx(struct drm_connector *connector,
|
||||
}
|
||||
|
||||
if (DISPLAY_VER(dev_priv) >= 10 &&
|
||||
drm_dp_sink_supports_dsc(intel_dp->dsc_dpcd)) {
|
||||
drm_dp_sink_supports_dsc(intel_connector->dp.dsc_dpcd)) {
|
||||
/*
|
||||
* TBD pass the connector BPC,
|
||||
* for now U8_MAX so that max BPC on that platform would be picked
|
||||
*/
|
||||
int pipe_bpp = intel_dp_dsc_compute_max_bpp(intel_dp, U8_MAX);
|
||||
int pipe_bpp = intel_dp_dsc_compute_max_bpp(intel_connector, U8_MAX);
|
||||
|
||||
if (drm_dp_sink_supports_fec(intel_dp->fec_capable)) {
|
||||
if (drm_dp_sink_supports_fec(intel_connector->dp.fec_capability)) {
|
||||
dsc_max_compressed_bpp =
|
||||
intel_dp_dsc_get_max_compressed_bpp(dev_priv,
|
||||
max_link_clock,
|
||||
@ -1016,7 +1014,7 @@ intel_dp_mst_mode_valid_ctx(struct drm_connector *connector,
|
||||
INTEL_OUTPUT_FORMAT_RGB,
|
||||
pipe_bpp, 64);
|
||||
dsc_slice_count =
|
||||
intel_dp_dsc_get_slice_count(intel_dp,
|
||||
intel_dp_dsc_get_slice_count(intel_connector,
|
||||
target_clock,
|
||||
mode->hdisplay,
|
||||
bigjoiner);
|
||||
@ -1126,6 +1124,21 @@ static int intel_dp_mst_add_properties(struct intel_dp *intel_dp,
|
||||
return drm_connector_set_path_property(connector, pathprop);
|
||||
}
|
||||
|
||||
static void
|
||||
intel_dp_mst_read_decompression_port_dsc_caps(struct intel_dp *intel_dp,
|
||||
struct intel_connector *connector)
|
||||
{
|
||||
u8 dpcd_caps[DP_RECEIVER_CAP_SIZE];
|
||||
|
||||
if (!connector->dp.dsc_decompression_aux)
|
||||
return;
|
||||
|
||||
if (drm_dp_read_dpcd_caps(connector->dp.dsc_decompression_aux, dpcd_caps) < 0)
|
||||
return;
|
||||
|
||||
intel_dp_get_dsc_sink_cap(dpcd_caps[DP_DPCD_REV], connector);
|
||||
}
|
||||
|
||||
static struct drm_connector *intel_dp_add_mst_connector(struct drm_dp_mst_topology_mgr *mgr,
|
||||
struct drm_dp_mst_port *port,
|
||||
const char *pathprop)
|
||||
@ -1159,6 +1172,14 @@ static struct drm_connector *intel_dp_add_mst_connector(struct drm_dp_mst_topolo
|
||||
|
||||
drm_connector_helper_add(connector, &intel_dp_mst_connector_helper_funcs);
|
||||
|
||||
/*
|
||||
* TODO: set the AUX for the actual MST port decompressing the stream.
|
||||
* At the moment the driver only supports enabling this globally in the
|
||||
* first downstream MST branch, via intel_dp's (root port) AUX.
|
||||
*/
|
||||
intel_connector->dp.dsc_decompression_aux = &intel_dp->aux;
|
||||
intel_dp_mst_read_decompression_port_dsc_caps(intel_dp, intel_connector);
|
||||
|
||||
for_each_pipe(dev_priv, pipe) {
|
||||
struct drm_encoder *enc =
|
||||
&intel_dp->mst_encoders[pipe]->base.base;
|
||||
|
@ -5,6 +5,7 @@
|
||||
*/
|
||||
|
||||
#include "gem/i915_gem_internal.h"
|
||||
#include "gem/i915_gem_lmem.h"
|
||||
|
||||
#include "i915_drv.h"
|
||||
#include "i915_irq.h"
|
||||
@ -315,6 +316,8 @@ void intel_dsb_finish(struct intel_dsb *dsb)
|
||||
DSB_FORCE_DEWAKE, 0);
|
||||
|
||||
intel_dsb_align_tail(dsb);
|
||||
|
||||
i915_gem_object_flush_map(dsb->vma->obj);
|
||||
}
|
||||
|
||||
static int intel_dsb_dewake_scanline(const struct intel_crtc_state *crtc_state)
|
||||
@ -461,9 +464,18 @@ struct intel_dsb *intel_dsb_prepare(const struct intel_crtc_state *crtc_state,
|
||||
/* ~1 qword per instruction, full cachelines */
|
||||
size = ALIGN(max_cmds * 8, CACHELINE_BYTES);
|
||||
|
||||
obj = i915_gem_object_create_internal(i915, PAGE_ALIGN(size));
|
||||
if (IS_ERR(obj))
|
||||
goto out_put_rpm;
|
||||
if (HAS_LMEM(i915)) {
|
||||
obj = i915_gem_object_create_lmem(i915, PAGE_ALIGN(size),
|
||||
I915_BO_ALLOC_CONTIGUOUS);
|
||||
if (IS_ERR(obj))
|
||||
goto out_put_rpm;
|
||||
} else {
|
||||
obj = i915_gem_object_create_internal(i915, PAGE_ALIGN(size));
|
||||
if (IS_ERR(obj))
|
||||
goto out_put_rpm;
|
||||
|
||||
i915_gem_object_set_cache_coherency(obj, I915_CACHE_NONE);
|
||||
}
|
||||
|
||||
vma = i915_gem_object_ggtt_pin(obj, NULL, 0, 0, 0);
|
||||
if (IS_ERR(vma)) {
|
||||
|
@ -781,7 +781,7 @@ int intel_gmbus_output_aksv(struct i2c_adapter *adapter)
|
||||
struct intel_gmbus *bus = to_intel_gmbus(adapter);
|
||||
struct drm_i915_private *i915 = bus->i915;
|
||||
u8 cmd = DRM_HDCP_DDC_AKSV;
|
||||
u8 buf[DRM_HDCP_KSV_LEN] = { 0 };
|
||||
u8 buf[DRM_HDCP_KSV_LEN] = {};
|
||||
struct i2c_msg msgs[] = {
|
||||
{
|
||||
.addr = DRM_HDCP_DDC_ADDR,
|
||||
|
@ -13,9 +13,8 @@ int
|
||||
intel_hdcp_gsc_initiate_session(struct device *dev, struct hdcp_port_data *data,
|
||||
struct hdcp2_ake_init *ake_data)
|
||||
{
|
||||
struct wired_cmd_initiate_hdcp2_session_in session_init_in = { { 0 } };
|
||||
struct wired_cmd_initiate_hdcp2_session_out
|
||||
session_init_out = { { 0 } };
|
||||
struct wired_cmd_initiate_hdcp2_session_in session_init_in = {};
|
||||
struct wired_cmd_initiate_hdcp2_session_out session_init_out = {};
|
||||
struct drm_i915_private *i915;
|
||||
ssize_t byte;
|
||||
|
||||
@ -71,8 +70,8 @@ intel_hdcp_gsc_verify_receiver_cert_prepare_km(struct device *dev,
|
||||
*ek_pub_km,
|
||||
size_t *msg_sz)
|
||||
{
|
||||
struct wired_cmd_verify_receiver_cert_in verify_rxcert_in = { { 0 } };
|
||||
struct wired_cmd_verify_receiver_cert_out verify_rxcert_out = { { 0 } };
|
||||
struct wired_cmd_verify_receiver_cert_in verify_rxcert_in = {};
|
||||
struct wired_cmd_verify_receiver_cert_out verify_rxcert_out = {};
|
||||
struct drm_i915_private *i915;
|
||||
ssize_t byte;
|
||||
|
||||
@ -134,8 +133,8 @@ int
|
||||
intel_hdcp_gsc_verify_hprime(struct device *dev, struct hdcp_port_data *data,
|
||||
struct hdcp2_ake_send_hprime *rx_hprime)
|
||||
{
|
||||
struct wired_cmd_ake_send_hprime_in send_hprime_in = { { 0 } };
|
||||
struct wired_cmd_ake_send_hprime_out send_hprime_out = { { 0 } };
|
||||
struct wired_cmd_ake_send_hprime_in send_hprime_in = {};
|
||||
struct wired_cmd_ake_send_hprime_out send_hprime_out = {};
|
||||
struct drm_i915_private *i915;
|
||||
ssize_t byte;
|
||||
|
||||
@ -182,8 +181,8 @@ int
|
||||
intel_hdcp_gsc_store_pairing_info(struct device *dev, struct hdcp_port_data *data,
|
||||
struct hdcp2_ake_send_pairing_info *pairing_info)
|
||||
{
|
||||
struct wired_cmd_ake_send_pairing_info_in pairing_info_in = { { 0 } };
|
||||
struct wired_cmd_ake_send_pairing_info_out pairing_info_out = { { 0 } };
|
||||
struct wired_cmd_ake_send_pairing_info_in pairing_info_in = {};
|
||||
struct wired_cmd_ake_send_pairing_info_out pairing_info_out = {};
|
||||
struct drm_i915_private *i915;
|
||||
ssize_t byte;
|
||||
|
||||
@ -233,8 +232,8 @@ intel_hdcp_gsc_initiate_locality_check(struct device *dev,
|
||||
struct hdcp_port_data *data,
|
||||
struct hdcp2_lc_init *lc_init_data)
|
||||
{
|
||||
struct wired_cmd_init_locality_check_in lc_init_in = { { 0 } };
|
||||
struct wired_cmd_init_locality_check_out lc_init_out = { { 0 } };
|
||||
struct wired_cmd_init_locality_check_in lc_init_in = {};
|
||||
struct wired_cmd_init_locality_check_out lc_init_out = {};
|
||||
struct drm_i915_private *i915;
|
||||
ssize_t byte;
|
||||
|
||||
@ -279,8 +278,8 @@ int
|
||||
intel_hdcp_gsc_verify_lprime(struct device *dev, struct hdcp_port_data *data,
|
||||
struct hdcp2_lc_send_lprime *rx_lprime)
|
||||
{
|
||||
struct wired_cmd_validate_locality_in verify_lprime_in = { { 0 } };
|
||||
struct wired_cmd_validate_locality_out verify_lprime_out = { { 0 } };
|
||||
struct wired_cmd_validate_locality_in verify_lprime_in = {};
|
||||
struct wired_cmd_validate_locality_out verify_lprime_out = {};
|
||||
struct drm_i915_private *i915;
|
||||
ssize_t byte;
|
||||
|
||||
@ -329,8 +328,8 @@ int intel_hdcp_gsc_get_session_key(struct device *dev,
|
||||
struct hdcp_port_data *data,
|
||||
struct hdcp2_ske_send_eks *ske_data)
|
||||
{
|
||||
struct wired_cmd_get_session_key_in get_skey_in = { { 0 } };
|
||||
struct wired_cmd_get_session_key_out get_skey_out = { { 0 } };
|
||||
struct wired_cmd_get_session_key_in get_skey_in = {};
|
||||
struct wired_cmd_get_session_key_out get_skey_out = {};
|
||||
struct drm_i915_private *i915;
|
||||
ssize_t byte;
|
||||
|
||||
@ -381,8 +380,8 @@ intel_hdcp_gsc_repeater_check_flow_prepare_ack(struct device *dev,
|
||||
struct hdcp2_rep_send_ack
|
||||
*rep_send_ack)
|
||||
{
|
||||
struct wired_cmd_verify_repeater_in verify_repeater_in = { { 0 } };
|
||||
struct wired_cmd_verify_repeater_out verify_repeater_out = { { 0 } };
|
||||
struct wired_cmd_verify_repeater_in verify_repeater_in = {};
|
||||
struct wired_cmd_verify_repeater_out verify_repeater_out = {};
|
||||
struct drm_i915_private *i915;
|
||||
ssize_t byte;
|
||||
|
||||
@ -442,8 +441,7 @@ int intel_hdcp_gsc_verify_mprime(struct device *dev,
|
||||
struct hdcp2_rep_stream_ready *stream_ready)
|
||||
{
|
||||
struct wired_cmd_repeater_auth_stream_req_in *verify_mprime_in;
|
||||
struct wired_cmd_repeater_auth_stream_req_out
|
||||
verify_mprime_out = { { 0 } };
|
||||
struct wired_cmd_repeater_auth_stream_req_out verify_mprime_out = {};
|
||||
struct drm_i915_private *i915;
|
||||
ssize_t byte;
|
||||
size_t cmd_size;
|
||||
@ -504,8 +502,8 @@ int intel_hdcp_gsc_verify_mprime(struct device *dev,
|
||||
int intel_hdcp_gsc_enable_authentication(struct device *dev,
|
||||
struct hdcp_port_data *data)
|
||||
{
|
||||
struct wired_cmd_enable_auth_in enable_auth_in = { { 0 } };
|
||||
struct wired_cmd_enable_auth_out enable_auth_out = { { 0 } };
|
||||
struct wired_cmd_enable_auth_in enable_auth_in = {};
|
||||
struct wired_cmd_enable_auth_out enable_auth_out = {};
|
||||
struct drm_i915_private *i915;
|
||||
ssize_t byte;
|
||||
|
||||
@ -549,8 +547,8 @@ int intel_hdcp_gsc_enable_authentication(struct device *dev,
|
||||
int
|
||||
intel_hdcp_gsc_close_session(struct device *dev, struct hdcp_port_data *data)
|
||||
{
|
||||
struct wired_cmd_close_session_in session_close_in = { { 0 } };
|
||||
struct wired_cmd_close_session_out session_close_out = { { 0 } };
|
||||
struct wired_cmd_close_session_in session_close_in = {};
|
||||
struct wired_cmd_close_session_out session_close_out = {};
|
||||
struct drm_i915_private *i915;
|
||||
ssize_t byte;
|
||||
|
||||
|
@ -166,7 +166,7 @@ intel_alloc_initial_plane_obj(struct intel_crtc *crtc,
|
||||
{
|
||||
struct drm_device *dev = crtc->base.dev;
|
||||
struct drm_i915_private *dev_priv = to_i915(dev);
|
||||
struct drm_mode_fb_cmd2 mode_cmd = { 0 };
|
||||
struct drm_mode_fb_cmd2 mode_cmd = {};
|
||||
struct drm_framebuffer *fb = &plane_config->fb->base;
|
||||
struct i915_vma *vma;
|
||||
|
||||
|
@ -676,7 +676,9 @@ static void hsw_activate_psr1(struct intel_dp *intel_dp)
|
||||
|
||||
val |= EDP_PSR_IDLE_FRAMES(psr_compute_idle_frames(intel_dp));
|
||||
|
||||
val |= EDP_PSR_MAX_SLEEP_TIME(max_sleep_time);
|
||||
if (DISPLAY_VER(dev_priv) < 20)
|
||||
val |= EDP_PSR_MAX_SLEEP_TIME(max_sleep_time);
|
||||
|
||||
if (IS_HASWELL(dev_priv))
|
||||
val |= EDP_PSR_MIN_LINK_ENTRY_TIME_8_LINES;
|
||||
|
||||
@ -1400,8 +1402,10 @@ static void intel_psr_enable_source(struct intel_dp *intel_dp,
|
||||
*/
|
||||
mask = EDP_PSR_DEBUG_MASK_MEMUP |
|
||||
EDP_PSR_DEBUG_MASK_HPD |
|
||||
EDP_PSR_DEBUG_MASK_LPSP |
|
||||
EDP_PSR_DEBUG_MASK_MAX_SLEEP;
|
||||
EDP_PSR_DEBUG_MASK_LPSP;
|
||||
|
||||
if (DISPLAY_VER(dev_priv) < 20)
|
||||
mask |= EDP_PSR_DEBUG_MASK_MAX_SLEEP;
|
||||
|
||||
/*
|
||||
* No separate pipe reg write mask on hsw/bdw, so have to unmask all
|
||||
|
@ -649,7 +649,7 @@ intel_sdvo_get_value(struct intel_sdvo *intel_sdvo, u8 cmd, void *value, int len
|
||||
|
||||
static bool intel_sdvo_set_target_input(struct intel_sdvo *intel_sdvo)
|
||||
{
|
||||
struct intel_sdvo_set_target_input_args targets = {0};
|
||||
struct intel_sdvo_set_target_input_args targets = {};
|
||||
return intel_sdvo_set_value(intel_sdvo,
|
||||
SDVO_CMD_SET_TARGET_INPUT,
|
||||
&targets, sizeof(targets));
|
||||
|
@ -1998,7 +1998,7 @@ void intel_mpllb_state_verify(struct intel_atomic_state *state,
|
||||
struct drm_i915_private *i915 = to_i915(state->base.dev);
|
||||
const struct intel_crtc_state *new_crtc_state =
|
||||
intel_atomic_get_new_crtc_state(state, crtc);
|
||||
struct intel_mpllb_state mpllb_hw_state = { 0 };
|
||||
struct intel_mpllb_state mpllb_hw_state = {};
|
||||
const struct intel_mpllb_state *mpllb_sw_state = &new_crtc_state->mpllb_state;
|
||||
struct intel_encoder *encoder;
|
||||
|
||||
|
@ -290,7 +290,7 @@ static ssize_t wm_latency_write(struct file *file, const char __user *ubuf,
|
||||
{
|
||||
struct seq_file *m = file->private_data;
|
||||
struct drm_i915_private *dev_priv = m->private;
|
||||
u16 new[8] = { 0 };
|
||||
u16 new[8] = {};
|
||||
int level;
|
||||
int ret;
|
||||
char tmp[32];
|
||||
|
@ -836,7 +836,6 @@ static const struct intel_device_info mtl_info = {
|
||||
.has_pxp = 1,
|
||||
.memory_regions = REGION_SMEM | REGION_STOLEN_LMEM,
|
||||
.platform_engine_mask = BIT(RCS0) | BIT(BCS0) | BIT(CCS0),
|
||||
.require_force_probe = 1,
|
||||
MTL_CACHELEVEL,
|
||||
};
|
||||
|
||||
@ -923,7 +922,7 @@ static const struct pci_device_id pciidlist[] = {
|
||||
INTEL_DG2_IDS(&dg2_info),
|
||||
INTEL_ATS_M_IDS(&ats_m_info),
|
||||
INTEL_MTL_IDS(&mtl_info),
|
||||
{0, 0, 0}
|
||||
{}
|
||||
};
|
||||
MODULE_DEVICE_TABLE(pci, pciidlist);
|
||||
|
||||
|
@ -718,7 +718,11 @@
|
||||
INTEL_VGA_DEVICE(0x56A5, info), \
|
||||
INTEL_VGA_DEVICE(0x56A6, info), \
|
||||
INTEL_VGA_DEVICE(0x56B0, info), \
|
||||
INTEL_VGA_DEVICE(0x56B1, info)
|
||||
INTEL_VGA_DEVICE(0x56B1, info), \
|
||||
INTEL_VGA_DEVICE(0x56BA, info), \
|
||||
INTEL_VGA_DEVICE(0x56BB, info), \
|
||||
INTEL_VGA_DEVICE(0x56BC, info), \
|
||||
INTEL_VGA_DEVICE(0x56BD, info)
|
||||
|
||||
#define INTEL_DG2_G12_IDS(info) \
|
||||
INTEL_VGA_DEVICE(0x5696, info), \
|
||||
|
Loading…
Reference in New Issue
Block a user