Commit 3ac5fa3f authored by Dave Airlie's avatar Dave Airlie

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: default avatarDave Airlie <airlied@redhat.com>

From: Rodrigo Vivi <rodrigo.vivi@intel.com>
Link: https://patchwork.freedesktop.org/patch/msgid/ZTFW4g6duLtp+Wy0@intel.com
parents 27442758 213c4367
...@@ -153,7 +153,7 @@ static acpi_handle intel_dsm_pci_probe(struct pci_dev *pdev) ...@@ -153,7 +153,7 @@ static acpi_handle intel_dsm_pci_probe(struct pci_dev *pdev)
static bool intel_dsm_detect(void) static bool intel_dsm_detect(void)
{ {
acpi_handle dhandle = NULL; 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 acpi_buffer buffer = {sizeof(acpi_method_name), acpi_method_name};
struct pci_dev *pdev = NULL; struct pci_dev *pdev = NULL;
int vga_count = 0; int vga_count = 0;
......
...@@ -1895,9 +1895,6 @@ void intel_color_prepare_commit(struct intel_crtc_state *crtc_state) ...@@ -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 intel_crtc *crtc = to_intel_crtc(crtc_state->uapi.crtc);
struct drm_i915_private *i915 = to_i915(crtc->base.dev); 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 || if (!crtc_state->hw.active ||
intel_crtc_needs_modeset(crtc_state)) intel_crtc_needs_modeset(crtc_state))
return; return;
......
...@@ -3009,7 +3009,7 @@ void intel_c10pll_state_verify(struct intel_atomic_state *state, ...@@ -3009,7 +3009,7 @@ void intel_c10pll_state_verify(struct intel_atomic_state *state,
struct drm_i915_private *i915 = to_i915(state->base.dev); struct drm_i915_private *i915 = to_i915(state->base.dev);
const struct intel_crtc_state *new_crtc_state = const struct intel_crtc_state *new_crtc_state =
intel_atomic_get_new_crtc_state(state, crtc); 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; const struct intel_c10pll_state *mpllb_sw_state = &new_crtc_state->cx0pll_state.c10;
struct intel_encoder *encoder; struct intel_encoder *encoder;
enum phy phy; enum phy phy;
......
...@@ -1191,8 +1191,8 @@ DEFINE_SHOW_ATTRIBUTE(i915_lpsp_capability); ...@@ -1191,8 +1191,8 @@ DEFINE_SHOW_ATTRIBUTE(i915_lpsp_capability);
static int i915_dsc_fec_support_show(struct seq_file *m, void *data) static int i915_dsc_fec_support_show(struct seq_file *m, void *data)
{ {
struct drm_connector *connector = m->private; struct intel_connector *connector = to_intel_connector(m->private);
struct drm_device *dev = connector->dev; struct drm_i915_private *i915 = to_i915(connector->base.dev);
struct drm_crtc *crtc; struct drm_crtc *crtc;
struct intel_dp *intel_dp; struct intel_dp *intel_dp;
struct drm_modeset_acquire_ctx ctx; struct drm_modeset_acquire_ctx ctx;
...@@ -1204,7 +1204,7 @@ static int i915_dsc_fec_support_show(struct seq_file *m, void *data) ...@@ -1204,7 +1204,7 @@ static int i915_dsc_fec_support_show(struct seq_file *m, void *data)
do { do {
try_again = false; try_again = false;
ret = drm_modeset_lock(&dev->mode_config.connection_mutex, ret = drm_modeset_lock(&i915->drm.mode_config.connection_mutex,
&ctx); &ctx);
if (ret) { if (ret) {
if (ret == -EDEADLK && !drm_modeset_backoff(&ctx)) { if (ret == -EDEADLK && !drm_modeset_backoff(&ctx)) {
...@@ -1213,8 +1213,8 @@ static int i915_dsc_fec_support_show(struct seq_file *m, void *data) ...@@ -1213,8 +1213,8 @@ static int i915_dsc_fec_support_show(struct seq_file *m, void *data)
} }
break; break;
} }
crtc = connector->state->crtc; crtc = connector->base.state->crtc;
if (connector->status != connector_status_connected || !crtc) { if (connector->base.status != connector_status_connected || !crtc) {
ret = -ENODEV; ret = -ENODEV;
break; break;
} }
...@@ -1229,24 +1229,24 @@ static int i915_dsc_fec_support_show(struct seq_file *m, void *data) ...@@ -1229,24 +1229,24 @@ static int i915_dsc_fec_support_show(struct seq_file *m, void *data)
} else if (ret) { } else if (ret) {
break; break;
} }
intel_dp = intel_attached_dp(to_intel_connector(connector)); intel_dp = intel_attached_dp(connector);
crtc_state = to_intel_crtc_state(crtc->state); crtc_state = to_intel_crtc_state(crtc->state);
seq_printf(m, "DSC_Enabled: %s\n", seq_printf(m, "DSC_Enabled: %s\n",
str_yes_no(crtc_state->dsc.compression_enable)); str_yes_no(crtc_state->dsc.compression_enable));
seq_printf(m, "DSC_Sink_Support: %s\n", 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", 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)), 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)), 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))); DP_DSC_YCbCr444)));
seq_printf(m, "Force_DSC_Enable: %s\n", seq_printf(m, "Force_DSC_Enable: %s\n",
str_yes_no(intel_dp->force_dsc_en)); str_yes_no(intel_dp->force_dsc_en));
if (!intel_dp_is_edp(intel_dp)) if (!intel_dp_is_edp(intel_dp))
seq_printf(m, "FEC_Sink_Support: %s\n", 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); } while (try_again);
drm_modeset_drop_locks(&ctx); drm_modeset_drop_locks(&ctx);
......
...@@ -620,6 +620,12 @@ struct intel_connector { ...@@ -620,6 +620,12 @@ struct intel_connector {
struct intel_dp *mst_port; 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 */ /* Work struct to schedule a uevent on link train failure */
struct work_struct modeset_retry_work; struct work_struct modeset_retry_work;
...@@ -1719,10 +1725,8 @@ struct intel_dp { ...@@ -1719,10 +1725,8 @@ struct intel_dp {
u8 psr_dpcd[EDP_PSR_RECEIVER_CAP_SIZE]; u8 psr_dpcd[EDP_PSR_RECEIVER_CAP_SIZE];
u8 downstream_ports[DP_MAX_DOWNSTREAM_PORTS]; u8 downstream_ports[DP_MAX_DOWNSTREAM_PORTS];
u8 edp_dpcd[EDP_DISPLAY_CTL_CAP_SIZE]; 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_common_caps[DP_LTTPR_COMMON_CAP_SIZE];
u8 lttpr_phy_caps[DP_MAX_LTTPR_COUNT][DP_LTTPR_PHY_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]; u8 pcon_dsc_dpcd[DP_PCON_DSC_ENCODER_CAP_SIZE];
/* source rates */ /* source rates */
int num_source_rates; int num_source_rates;
......
...@@ -823,11 +823,11 @@ u16 intel_dp_dsc_get_max_compressed_bpp(struct drm_i915_private *i915, ...@@ -823,11 +823,11 @@ u16 intel_dp_dsc_get_max_compressed_bpp(struct drm_i915_private *i915,
return bits_per_pixel; 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, int mode_clock, int mode_hdisplay,
bool bigjoiner) 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; u8 min_slice_count, i;
int max_slice_width; int max_slice_width;
...@@ -845,7 +845,7 @@ u8 intel_dp_dsc_get_slice_count(struct intel_dp *intel_dp, ...@@ -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)) if (mode_clock >= ((i915->display.cdclk.max_cdclk_freq * 85) / 100))
min_slice_count = max_t(u8, min_slice_count, 2); 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) { if (max_slice_width < DP_DSC_MIN_SLICE_WIDTH_VALUE) {
drm_dbg_kms(&i915->drm, drm_dbg_kms(&i915->drm,
"Unsupported slice width %d by DP DSC Sink device\n", "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, ...@@ -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; u8 test_slice_count = valid_dsc_slicecount[i] << bigjoiner;
if (test_slice_count > 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; break;
/* big joiner needs small joiner to be enabled */ /* big joiner needs small joiner to be enabled */
...@@ -1205,7 +1205,7 @@ intel_dp_mode_valid(struct drm_connector *_connector, ...@@ -1205,7 +1205,7 @@ intel_dp_mode_valid(struct drm_connector *_connector,
intel_dp_mode_min_output_bpp(connector, mode)); intel_dp_mode_min_output_bpp(connector, mode));
if (HAS_DSC(dev_priv) && 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; enum intel_output_format sink_format, output_format;
int pipe_bpp; int pipe_bpp;
...@@ -1215,7 +1215,7 @@ intel_dp_mode_valid(struct drm_connector *_connector, ...@@ -1215,7 +1215,7 @@ intel_dp_mode_valid(struct drm_connector *_connector,
* TBD pass the connector BPC, * TBD pass the connector BPC,
* for now U8_MAX so that max BPC on that platform would be picked * 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 * 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, ...@@ -1223,11 +1223,11 @@ intel_dp_mode_valid(struct drm_connector *_connector,
*/ */
if (intel_dp_is_edp(intel_dp)) { if (intel_dp_is_edp(intel_dp)) {
dsc_max_compressed_bpp = 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 = 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); 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 = dsc_max_compressed_bpp =
intel_dp_dsc_get_max_compressed_bpp(dev_priv, intel_dp_dsc_get_max_compressed_bpp(dev_priv,
max_link_clock, max_link_clock,
...@@ -1238,7 +1238,7 @@ intel_dp_mode_valid(struct drm_connector *_connector, ...@@ -1238,7 +1238,7 @@ intel_dp_mode_valid(struct drm_connector *_connector,
output_format, output_format,
pipe_bpp, 64); pipe_bpp, 64);
dsc_slice_count = dsc_slice_count =
intel_dp_dsc_get_slice_count(intel_dp, intel_dp_dsc_get_slice_count(connector,
target_clock, target_clock,
mode->hdisplay, mode->hdisplay,
bigjoiner); bigjoiner);
...@@ -1370,20 +1370,21 @@ static bool intel_dp_source_supports_fec(struct intel_dp *intel_dp, ...@@ -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, static bool intel_dp_supports_fec(struct intel_dp *intel_dp,
const struct intel_connector *connector,
const struct intel_crtc_state *pipe_config) const struct intel_crtc_state *pipe_config)
{ {
return intel_dp_source_supports_fec(intel_dp, 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) const struct intel_crtc_state *crtc_state)
{ {
if (intel_crtc_has_type(crtc_state, INTEL_OUTPUT_DP) && !crtc_state->fec_enable) if (intel_crtc_has_type(crtc_state, INTEL_OUTPUT_DP) && !crtc_state->fec_enable)
return false; return false;
return intel_dsc_source_support(crtc_state) && 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, 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) ...@@ -1577,11 +1578,12 @@ u8 intel_dp_dsc_max_src_input_bpc(struct drm_i915_private *i915)
return 0; 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; int i, num_bpc;
u8 dsc_bpc[3] = {0}; u8 dsc_bpc[3] = {};
u8 dsc_max_bpc; u8 dsc_max_bpc;
dsc_max_bpc = intel_dp_dsc_max_src_input_bpc(i915); 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) ...@@ -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); 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); dsc_bpc);
for (i = 0; i < num_bpc; i++) { for (i = 0; i < num_bpc; i++) {
if (dsc_max_bpc >= dsc_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) ...@@ -1601,16 +1603,14 @@ int intel_dp_dsc_compute_max_bpp(struct intel_dp *intel_dp, u8 max_req_bpc)
return 0; 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; 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; DP_DSC_MINOR_SHIFT;
} }
...@@ -1636,11 +1636,10 @@ static int intel_dp_get_slice_height(int vactive) ...@@ -1636,11 +1636,10 @@ static int intel_dp_get_slice_height(int vactive)
return 2; 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 intel_crtc_state *crtc_state)
{ {
struct drm_i915_private *i915 = to_i915(encoder->base.dev); struct drm_i915_private *i915 = to_i915(connector->base.dev);
struct intel_dp *intel_dp = enc_to_intel_dp(encoder);
struct drm_dsc_config *vdsc_cfg = &crtc_state->dsc.config; struct drm_dsc_config *vdsc_cfg = &crtc_state->dsc.config;
u8 line_buf_depth; u8 line_buf_depth;
int ret; int ret;
...@@ -1661,17 +1660,17 @@ static int intel_dp_dsc_compute_params(struct intel_encoder *encoder, ...@@ -1661,17 +1660,17 @@ static int intel_dp_dsc_compute_params(struct intel_encoder *encoder,
return ret; return ret;
vdsc_cfg->dsc_version_major = 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; DP_DSC_MAJOR_MASK) >> DP_DSC_MAJOR_SHIFT;
vdsc_cfg->dsc_version_minor = vdsc_cfg->dsc_version_minor =
min(intel_dp_source_dsc_version_minor(intel_dp), min(intel_dp_source_dsc_version_minor(i915),
intel_dp_sink_dsc_version_minor(intel_dp)); intel_dp_sink_dsc_version_minor(connector->dp.dsc_dpcd));
if (vdsc_cfg->convert_rgb) if (vdsc_cfg->convert_rgb)
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; 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) { if (!line_buf_depth) {
drm_dbg_kms(&i915->drm, drm_dbg_kms(&i915->drm,
"DSC Sink Line Buffer Depth invalid\n"); "DSC Sink Line Buffer Depth invalid\n");
...@@ -1686,15 +1685,16 @@ static int intel_dp_dsc_compute_params(struct intel_encoder *encoder, ...@@ -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; DSC_1_1_MAX_LINEBUF_DEPTH_BITS : line_buf_depth;
vdsc_cfg->block_pred_enable = 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; DP_DSC_BLK_PREDICTION_IS_SUPPORTED;
return drm_dsc_compute_rc_parameters(vdsc_cfg); 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) enum intel_output_format output_format)
{ {
struct drm_i915_private *i915 = to_i915(connector->base.dev);
u8 sink_dsc_format; u8 sink_dsc_format;
switch (output_format) { switch (output_format) {
...@@ -1705,8 +1705,8 @@ static bool intel_dp_dsc_supports_format(struct intel_dp *intel_dp, ...@@ -1705,8 +1705,8 @@ static bool intel_dp_dsc_supports_format(struct intel_dp *intel_dp,
sink_dsc_format = DP_DSC_YCbCr444; sink_dsc_format = DP_DSC_YCbCr444;
break; break;
case INTEL_OUTPUT_FORMAT_YCBCR420: case INTEL_OUTPUT_FORMAT_YCBCR420:
if (min(intel_dp_source_dsc_version_minor(intel_dp), if (min(intel_dp_source_dsc_version_minor(i915),
intel_dp_sink_dsc_version_minor(intel_dp)) < 2) intel_dp_sink_dsc_version_minor(connector->dp.dsc_dpcd)) < 2)
return false; return false;
sink_dsc_format = DP_DSC_YCbCr420_Native; sink_dsc_format = DP_DSC_YCbCr420_Native;
break; break;
...@@ -1714,7 +1714,7 @@ static bool intel_dp_dsc_supports_format(struct intel_dp *intel_dp, ...@@ -1714,7 +1714,7 @@ static bool intel_dp_dsc_supports_format(struct intel_dp *intel_dp,
return false; 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, 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, ...@@ -1765,11 +1765,11 @@ static int dsc_compute_link_config(struct intel_dp *intel_dp,
} }
static 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, struct intel_crtc_state *pipe_config,
int bpc) 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) if (max_bppx16)
return max_bppx16; return max_bppx16;
...@@ -1808,11 +1808,11 @@ static int dsc_sink_min_compressed_bpp(struct intel_crtc_state *pipe_config) ...@@ -1808,11 +1808,11 @@ static int dsc_sink_min_compressed_bpp(struct intel_crtc_state *pipe_config)
return 0; 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, struct intel_crtc_state *pipe_config,
int bpc) 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; pipe_config, bpc) >> 4;
} }
...@@ -1911,6 +1911,7 @@ xelpd_dsc_compute_link_config(struct intel_dp *intel_dp, ...@@ -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, static int dsc_compute_compressed_bpp(struct intel_dp *intel_dp,
const struct intel_connector *connector,
struct intel_crtc_state *pipe_config, struct intel_crtc_state *pipe_config,
struct link_config_limits *limits, struct link_config_limits *limits,
int pipe_bpp, int pipe_bpp,
...@@ -1928,7 +1929,7 @@ static int dsc_compute_compressed_bpp(struct intel_dp *intel_dp, ...@@ -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_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_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 = 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, 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, ...@@ -2000,17 +2001,19 @@ static int intel_dp_dsc_compute_pipe_bpp(struct intel_dp *intel_dp,
int timeslots) int timeslots)
{ {
struct drm_i915_private *i915 = dp_to_i915(intel_dp); 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 max_req_bpc = conn_state->max_requested_bpc;
u8 dsc_max_bpc, dsc_max_bpp; u8 dsc_max_bpc, dsc_max_bpp;
u8 dsc_min_bpc, dsc_min_bpp; u8 dsc_min_bpc, dsc_min_bpp;
u8 dsc_bpc[3] = {0}; u8 dsc_bpc[3] = {};
int forced_bpp, pipe_bpp; int forced_bpp, pipe_bpp;
int num_bpc, i, ret; int num_bpc, i, ret;
forced_bpp = intel_dp_force_dsc_pipe_bpp(intel_dp, conn_state, limits); forced_bpp = intel_dp_force_dsc_pipe_bpp(intel_dp, conn_state, limits);
if (forced_bpp) { 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); limits, forced_bpp, timeslots);
if (ret == 0) { if (ret == 0) {
pipe_config->pipe_bpp = forced_bpp; pipe_config->pipe_bpp = forced_bpp;
...@@ -2032,14 +2035,14 @@ static int intel_dp_dsc_compute_pipe_bpp(struct intel_dp *intel_dp, ...@@ -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 * Get the maximum DSC bpc that will be supported by any valid
* link configuration and compressed bpp. * 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++) { for (i = 0; i < num_bpc; i++) {
pipe_bpp = dsc_bpc[i] * 3; pipe_bpp = dsc_bpc[i] * 3;
if (pipe_bpp < dsc_min_bpp) if (pipe_bpp < dsc_min_bpp)
break; break;
if (pipe_bpp > dsc_max_bpp) if (pipe_bpp > dsc_max_bpp)
continue; continue;
ret = dsc_compute_compressed_bpp(intel_dp, pipe_config, ret = dsc_compute_compressed_bpp(intel_dp, connector, pipe_config,
limits, pipe_bpp, timeslots); limits, pipe_bpp, timeslots);
if (ret == 0) { if (ret == 0) {
pipe_config->pipe_bpp = pipe_bpp; pipe_config->pipe_bpp = pipe_bpp;
...@@ -2056,6 +2059,8 @@ static int intel_edp_dsc_compute_pipe_bpp(struct intel_dp *intel_dp, ...@@ -2056,6 +2059,8 @@ static int intel_edp_dsc_compute_pipe_bpp(struct intel_dp *intel_dp,
struct link_config_limits *limits) struct link_config_limits *limits)
{ {
struct drm_i915_private *i915 = dp_to_i915(intel_dp); 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 pipe_bpp, forced_bpp;
int dsc_src_min_bpp, dsc_sink_min_bpp, dsc_min_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; 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, ...@@ -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); 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. */ /* 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)) { if (!is_dsc_pipe_bpp_sufficient(i915, conn_state, limits, pipe_bpp)) {
drm_dbg_kms(&i915->drm, drm_dbg_kms(&i915->drm,
"Computed BPC is not in DSC BPC limits\n"); "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, ...@@ -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_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_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 = 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)); 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, ...@@ -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 intel_digital_port *dig_port = dp_to_dig_port(intel_dp);
struct drm_i915_private *dev_priv = to_i915(dig_port->base.base.dev); 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 = const struct drm_display_mode *adjusted_mode =
&pipe_config->hw.adjusted_mode; &pipe_config->hw.adjusted_mode;
int ret; int ret;
pipe_config->fec_enable = !intel_dp_is_edp(intel_dp) && 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; 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; return -EINVAL;
/* /*
...@@ -2143,7 +2150,7 @@ int intel_dp_dsc_compute_config(struct intel_dp *intel_dp, ...@@ -2143,7 +2150,7 @@ int intel_dp_dsc_compute_config(struct intel_dp *intel_dp,
/* Calculate Slice count */ /* Calculate Slice count */
if (intel_dp_is_edp(intel_dp)) { if (intel_dp_is_edp(intel_dp)) {
pipe_config->dsc.slice_count = 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); true);
if (!pipe_config->dsc.slice_count) { if (!pipe_config->dsc.slice_count) {
drm_dbg_kms(&dev_priv->drm, "Unsupported Slice Count %d\n", 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, ...@@ -2154,7 +2161,7 @@ int intel_dp_dsc_compute_config(struct intel_dp *intel_dp,
u8 dsc_dp_slice_count; u8 dsc_dp_slice_count;
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_clock,
adjusted_mode->crtc_hdisplay, adjusted_mode->crtc_hdisplay,
pipe_config->bigjoiner_pipes); pipe_config->bigjoiner_pipes);
...@@ -2174,7 +2181,7 @@ int intel_dp_dsc_compute_config(struct intel_dp *intel_dp, ...@@ -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) if (pipe_config->bigjoiner_pipes || pipe_config->dsc.slice_count > 1)
pipe_config->dsc.dsc_split = true; 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) { if (ret < 0) {
drm_dbg_kms(&dev_priv->drm, drm_dbg_kms(&dev_priv->drm,
"Cannot compute valid DSC parameters for Input Bpp = %d " "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) ...@@ -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); struct drm_i915_private *i915 = dp_to_i915(intel_dp);
u8 oui[] = { 0x00, 0xaa, 0x01 }; 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 * 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) ...@@ -3467,43 +3474,57 @@ bool intel_dp_get_colorimetry_status(struct intel_dp *intel_dp)
return dprx & DP_VSC_SDP_EXT_FOR_COLORIMETRY_SUPPORTED; 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 * Clear the cached register set to avoid using stale values
* for the sinks that do not support DSC. * 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 */ /* 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);
drm_dbg_kms(&i915->drm, "DSC DPCD: %*ph\n", if (dpcd_rev < DP_DPCD_REV_14)
(int)sizeof(intel_dp->dsc_dpcd), return;
intel_dp->dsc_dpcd);
/* FEC is supported only on DP 1.4 */ intel_dp_read_dsc_dpcd(connector->dp.dsc_decompression_aux,
if (!intel_dp_is_edp(intel_dp) && connector->dp.dsc_dpcd);
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", if (drm_dp_dpcd_readb(connector->dp.dsc_decompression_aux, DP_FEC_CAPABILITY,
intel_dp->fec_capable); &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, 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) ...@@ -3595,7 +3616,7 @@ static void intel_edp_mso_init(struct intel_dp *intel_dp)
} }
static bool 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 = struct drm_i915_private *dev_priv =
to_i915(dp_to_dig_port(intel_dp)->base.base.dev); to_i915(dp_to_dig_port(intel_dp)->base.base.dev);
...@@ -3674,7 +3695,8 @@ intel_edp_init_dpcd(struct intel_dp *intel_dp) ...@@ -3674,7 +3695,8 @@ intel_edp_init_dpcd(struct intel_dp *intel_dp)
/* Read the eDP DSC DPCD registers */ /* Read the eDP DSC DPCD registers */
if (HAS_DSC(dev_priv)) 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 * 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) ...@@ -5338,13 +5360,32 @@ intel_dp_unset_edid(struct intel_dp *intel_dp)
false); 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 static int
intel_dp_detect(struct drm_connector *connector, intel_dp_detect(struct drm_connector *connector,
struct drm_modeset_acquire_ctx *ctx, struct drm_modeset_acquire_ctx *ctx,
bool force) bool force)
{ {
struct drm_i915_private *dev_priv = to_i915(connector->dev); 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_digital_port *dig_port = dp_to_dig_port(intel_dp);
struct intel_encoder *encoder = &dig_port->base; struct intel_encoder *encoder = &dig_port->base;
enum drm_connector_status status; enum drm_connector_status status;
...@@ -5367,7 +5408,7 @@ intel_dp_detect(struct drm_connector *connector, ...@@ -5367,7 +5408,7 @@ intel_dp_detect(struct drm_connector *connector,
if (status == connector_status_disconnected) { if (status == connector_status_disconnected) {
memset(&intel_dp->compliance, 0, sizeof(intel_dp->compliance)); 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) { if (intel_dp->is_mst) {
drm_dbg_kms(&dev_priv->drm, drm_dbg_kms(&dev_priv->drm,
...@@ -5382,9 +5423,7 @@ intel_dp_detect(struct drm_connector *connector, ...@@ -5382,9 +5423,7 @@ intel_dp_detect(struct drm_connector *connector,
goto out; goto out;
} }
/* Read DP Sink DSC Cap DPCD regs for DP v1.4 */ intel_dp_detect_dsc_caps(intel_dp, intel_connector);
if (HAS_DSC(dev_priv))
intel_dp_get_dsc_sink_cap(intel_dp);
intel_dp_configure_mst(intel_dp); intel_dp_configure_mst(intel_dp);
...@@ -5980,7 +6019,7 @@ static bool intel_edp_init_connector(struct intel_dp *intel_dp, ...@@ -5980,7 +6019,7 @@ static bool intel_edp_init_connector(struct intel_dp *intel_dp,
intel_hpd_enable_detection(encoder); intel_hpd_enable_detection(encoder);
/* Cache DPCD and EDID for edp. */ /* 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 (!has_dpcd) {
/* if this fails, presume the device is a ghost */ /* if this fails, presume the device is a ghost */
...@@ -6154,6 +6193,7 @@ intel_dp_init_connector(struct intel_digital_port *dig_port, ...@@ -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->pps.active_pipe = vlv_active_pipe(intel_dp);
intel_dp_aux_init(intel_dp); intel_dp_aux_init(intel_dp);
intel_connector->dp.dsc_decompression_aux = &intel_dp->aux;
drm_dbg_kms(&dev_priv->drm, drm_dbg_kms(&dev_priv->drm,
"Adding %s connector on [ENCODER:%d:%s]\n", "Adding %s connector on [ENCODER:%d:%s]\n",
......
...@@ -116,7 +116,8 @@ void intel_read_dp_sdp(struct intel_encoder *encoder, ...@@ -116,7 +116,8 @@ void intel_read_dp_sdp(struct intel_encoder *encoder,
struct intel_crtc_state *crtc_state, struct intel_crtc_state *crtc_state,
unsigned int type); unsigned int type);
bool intel_digital_port_connected(struct intel_encoder *encoder); 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, u16 intel_dp_dsc_get_max_compressed_bpp(struct drm_i915_private *i915,
u32 link_clock, u32 lane_count, u32 link_clock, u32 lane_count,
u32 mode_clock, u32 mode_hdisplay, u32 mode_clock, u32 mode_hdisplay,
...@@ -124,7 +125,7 @@ u16 intel_dp_dsc_get_max_compressed_bpp(struct drm_i915_private *i915, ...@@ -124,7 +125,7 @@ u16 intel_dp_dsc_get_max_compressed_bpp(struct drm_i915_private *i915,
enum intel_output_format output_format, enum intel_output_format output_format,
u32 pipe_bpp, u32 pipe_bpp,
u32 timeslots); 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, int mode_clock, int mode_hdisplay,
bool bigjoiner); bool bigjoiner);
bool intel_dp_need_bigjoiner(struct intel_dp *intel_dp, 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, ...@@ -162,4 +163,6 @@ intel_dp_compute_config_link_bpp_limits(struct intel_dp *intel_dp,
bool dsc, bool dsc,
struct link_config_limits *limits); struct link_config_limits *limits);
void intel_dp_get_dsc_sink_cap(u8 dpcd_rev, struct intel_connector *connector);
#endif /* __INTEL_DP_H__ */ #endif /* __INTEL_DP_H__ */
...@@ -169,7 +169,7 @@ intel_dp_aux_hdr_get_backlight(struct intel_connector *connector, enum pipe pipe ...@@ -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_panel *panel = &connector->panel;
struct intel_dp *intel_dp = enc_to_intel_dp(connector->encoder); struct intel_dp *intel_dp = enc_to_intel_dp(connector->encoder);
u8 tmp; 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) { 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", 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, ...@@ -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 intel_connector *connector = to_intel_connector(conn_state->connector);
struct drm_device *dev = connector->base.dev; struct drm_device *dev = connector->base.dev;
struct intel_dp *intel_dp = enc_to_intel_dp(connector->encoder); struct intel_dp *intel_dp = enc_to_intel_dp(connector->encoder);
u8 buf[4] = { 0 }; u8 buf[4] = {};
buf[0] = level & 0xFF; buf[0] = level & 0xFF;
buf[1] = (level & 0xFF00) >> 8; buf[1] = (level & 0xFF00) >> 8;
......
...@@ -185,8 +185,6 @@ static int intel_dp_dsc_mst_compute_link_config(struct intel_encoder *encoder, ...@@ -185,8 +185,6 @@ static int intel_dp_dsc_mst_compute_link_config(struct intel_encoder *encoder,
struct drm_connector_state *conn_state, struct drm_connector_state *conn_state,
struct link_config_limits *limits) 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 = struct intel_connector *connector =
to_intel_connector(conn_state->connector); to_intel_connector(conn_state->connector);
struct drm_i915_private *i915 = to_i915(connector->base.dev); 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, ...@@ -194,7 +192,7 @@ static int intel_dp_dsc_mst_compute_link_config(struct intel_encoder *encoder,
&crtc_state->hw.adjusted_mode; &crtc_state->hw.adjusted_mode;
int slots = -EINVAL; int slots = -EINVAL;
int i, num_bpc; int i, num_bpc;
u8 dsc_bpc[3] = {0}; u8 dsc_bpc[3] = {};
int min_bpp, max_bpp, sink_min_bpp, sink_max_bpp; int min_bpp, max_bpp, sink_min_bpp, sink_max_bpp;
u8 dsc_max_bpc; u8 dsc_max_bpc;
bool need_timeslot_recalc = false; bool need_timeslot_recalc = false;
...@@ -209,7 +207,7 @@ static int intel_dp_dsc_mst_compute_link_config(struct intel_encoder *encoder, ...@@ -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); max_bpp = min_t(u8, dsc_max_bpc * 3, limits->pipe.max_bpp);
min_bpp = limits->pipe.min_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); dsc_bpc);
drm_dbg_kms(&i915->drm, "DSC Source supported min bpp %d max bpp %d\n", 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, ...@@ -998,14 +996,14 @@ intel_dp_mst_mode_valid_ctx(struct drm_connector *connector,
} }
if (DISPLAY_VER(dev_priv) >= 10 && 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, * TBD pass the connector BPC,
* for now U8_MAX so that max BPC on that platform would be picked * 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 = dsc_max_compressed_bpp =
intel_dp_dsc_get_max_compressed_bpp(dev_priv, intel_dp_dsc_get_max_compressed_bpp(dev_priv,
max_link_clock, max_link_clock,
...@@ -1016,7 +1014,7 @@ intel_dp_mst_mode_valid_ctx(struct drm_connector *connector, ...@@ -1016,7 +1014,7 @@ intel_dp_mst_mode_valid_ctx(struct drm_connector *connector,
INTEL_OUTPUT_FORMAT_RGB, INTEL_OUTPUT_FORMAT_RGB,
pipe_bpp, 64); pipe_bpp, 64);
dsc_slice_count = dsc_slice_count =
intel_dp_dsc_get_slice_count(intel_dp, intel_dp_dsc_get_slice_count(intel_connector,
target_clock, target_clock,
mode->hdisplay, mode->hdisplay,
bigjoiner); bigjoiner);
...@@ -1126,6 +1124,21 @@ static int intel_dp_mst_add_properties(struct intel_dp *intel_dp, ...@@ -1126,6 +1124,21 @@ static int intel_dp_mst_add_properties(struct intel_dp *intel_dp,
return drm_connector_set_path_property(connector, pathprop); 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, static struct drm_connector *intel_dp_add_mst_connector(struct drm_dp_mst_topology_mgr *mgr,
struct drm_dp_mst_port *port, struct drm_dp_mst_port *port,
const char *pathprop) const char *pathprop)
...@@ -1159,6 +1172,14 @@ static struct drm_connector *intel_dp_add_mst_connector(struct drm_dp_mst_topolo ...@@ -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); 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) { for_each_pipe(dev_priv, pipe) {
struct drm_encoder *enc = struct drm_encoder *enc =
&intel_dp->mst_encoders[pipe]->base.base; &intel_dp->mst_encoders[pipe]->base.base;
......
...@@ -5,6 +5,7 @@ ...@@ -5,6 +5,7 @@
*/ */
#include "gem/i915_gem_internal.h" #include "gem/i915_gem_internal.h"
#include "gem/i915_gem_lmem.h"
#include "i915_drv.h" #include "i915_drv.h"
#include "i915_irq.h" #include "i915_irq.h"
...@@ -315,6 +316,8 @@ void intel_dsb_finish(struct intel_dsb *dsb) ...@@ -315,6 +316,8 @@ void intel_dsb_finish(struct intel_dsb *dsb)
DSB_FORCE_DEWAKE, 0); DSB_FORCE_DEWAKE, 0);
intel_dsb_align_tail(dsb); 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) 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, ...@@ -461,9 +464,18 @@ struct intel_dsb *intel_dsb_prepare(const struct intel_crtc_state *crtc_state,
/* ~1 qword per instruction, full cachelines */ /* ~1 qword per instruction, full cachelines */
size = ALIGN(max_cmds * 8, CACHELINE_BYTES); size = ALIGN(max_cmds * 8, CACHELINE_BYTES);
obj = i915_gem_object_create_internal(i915, PAGE_ALIGN(size)); if (HAS_LMEM(i915)) {
if (IS_ERR(obj)) obj = i915_gem_object_create_lmem(i915, PAGE_ALIGN(size),
goto out_put_rpm; 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); vma = i915_gem_object_ggtt_pin(obj, NULL, 0, 0, 0);
if (IS_ERR(vma)) { if (IS_ERR(vma)) {
......
...@@ -781,7 +781,7 @@ int intel_gmbus_output_aksv(struct i2c_adapter *adapter) ...@@ -781,7 +781,7 @@ int intel_gmbus_output_aksv(struct i2c_adapter *adapter)
struct intel_gmbus *bus = to_intel_gmbus(adapter); struct intel_gmbus *bus = to_intel_gmbus(adapter);
struct drm_i915_private *i915 = bus->i915; struct drm_i915_private *i915 = bus->i915;
u8 cmd = DRM_HDCP_DDC_AKSV; u8 cmd = DRM_HDCP_DDC_AKSV;
u8 buf[DRM_HDCP_KSV_LEN] = { 0 }; u8 buf[DRM_HDCP_KSV_LEN] = {};
struct i2c_msg msgs[] = { struct i2c_msg msgs[] = {
{ {
.addr = DRM_HDCP_DDC_ADDR, .addr = DRM_HDCP_DDC_ADDR,
......
...@@ -13,9 +13,8 @@ int ...@@ -13,9 +13,8 @@ int
intel_hdcp_gsc_initiate_session(struct device *dev, struct hdcp_port_data *data, intel_hdcp_gsc_initiate_session(struct device *dev, struct hdcp_port_data *data,
struct hdcp2_ake_init *ake_data) struct hdcp2_ake_init *ake_data)
{ {
struct wired_cmd_initiate_hdcp2_session_in session_init_in = { { 0 } }; struct wired_cmd_initiate_hdcp2_session_in session_init_in = {};
struct wired_cmd_initiate_hdcp2_session_out struct wired_cmd_initiate_hdcp2_session_out session_init_out = {};
session_init_out = { { 0 } };
struct drm_i915_private *i915; struct drm_i915_private *i915;
ssize_t byte; ssize_t byte;
...@@ -71,8 +70,8 @@ intel_hdcp_gsc_verify_receiver_cert_prepare_km(struct device *dev, ...@@ -71,8 +70,8 @@ intel_hdcp_gsc_verify_receiver_cert_prepare_km(struct device *dev,
*ek_pub_km, *ek_pub_km,
size_t *msg_sz) size_t *msg_sz)
{ {
struct wired_cmd_verify_receiver_cert_in verify_rxcert_in = { { 0 } }; struct wired_cmd_verify_receiver_cert_in verify_rxcert_in = {};
struct wired_cmd_verify_receiver_cert_out verify_rxcert_out = { { 0 } }; struct wired_cmd_verify_receiver_cert_out verify_rxcert_out = {};
struct drm_i915_private *i915; struct drm_i915_private *i915;
ssize_t byte; ssize_t byte;
...@@ -134,8 +133,8 @@ int ...@@ -134,8 +133,8 @@ int
intel_hdcp_gsc_verify_hprime(struct device *dev, struct hdcp_port_data *data, intel_hdcp_gsc_verify_hprime(struct device *dev, struct hdcp_port_data *data,
struct hdcp2_ake_send_hprime *rx_hprime) struct hdcp2_ake_send_hprime *rx_hprime)
{ {
struct wired_cmd_ake_send_hprime_in send_hprime_in = { { 0 } }; struct wired_cmd_ake_send_hprime_in send_hprime_in = {};
struct wired_cmd_ake_send_hprime_out send_hprime_out = { { 0 } }; struct wired_cmd_ake_send_hprime_out send_hprime_out = {};
struct drm_i915_private *i915; struct drm_i915_private *i915;
ssize_t byte; ssize_t byte;
...@@ -182,8 +181,8 @@ int ...@@ -182,8 +181,8 @@ int
intel_hdcp_gsc_store_pairing_info(struct device *dev, struct hdcp_port_data *data, intel_hdcp_gsc_store_pairing_info(struct device *dev, struct hdcp_port_data *data,
struct hdcp2_ake_send_pairing_info *pairing_info) 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_in pairing_info_in = {};
struct wired_cmd_ake_send_pairing_info_out pairing_info_out = { { 0 } }; struct wired_cmd_ake_send_pairing_info_out pairing_info_out = {};
struct drm_i915_private *i915; struct drm_i915_private *i915;
ssize_t byte; ssize_t byte;
...@@ -233,8 +232,8 @@ intel_hdcp_gsc_initiate_locality_check(struct device *dev, ...@@ -233,8 +232,8 @@ intel_hdcp_gsc_initiate_locality_check(struct device *dev,
struct hdcp_port_data *data, struct hdcp_port_data *data,
struct hdcp2_lc_init *lc_init_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_in lc_init_in = {};
struct wired_cmd_init_locality_check_out lc_init_out = { { 0 } }; struct wired_cmd_init_locality_check_out lc_init_out = {};
struct drm_i915_private *i915; struct drm_i915_private *i915;
ssize_t byte; ssize_t byte;
...@@ -279,8 +278,8 @@ int ...@@ -279,8 +278,8 @@ int
intel_hdcp_gsc_verify_lprime(struct device *dev, struct hdcp_port_data *data, intel_hdcp_gsc_verify_lprime(struct device *dev, struct hdcp_port_data *data,
struct hdcp2_lc_send_lprime *rx_lprime) struct hdcp2_lc_send_lprime *rx_lprime)
{ {
struct wired_cmd_validate_locality_in verify_lprime_in = { { 0 } }; struct wired_cmd_validate_locality_in verify_lprime_in = {};
struct wired_cmd_validate_locality_out verify_lprime_out = { { 0 } }; struct wired_cmd_validate_locality_out verify_lprime_out = {};
struct drm_i915_private *i915; struct drm_i915_private *i915;
ssize_t byte; ssize_t byte;
...@@ -329,8 +328,8 @@ int intel_hdcp_gsc_get_session_key(struct device *dev, ...@@ -329,8 +328,8 @@ int intel_hdcp_gsc_get_session_key(struct device *dev,
struct hdcp_port_data *data, struct hdcp_port_data *data,
struct hdcp2_ske_send_eks *ske_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_in get_skey_in = {};
struct wired_cmd_get_session_key_out get_skey_out = { { 0 } }; struct wired_cmd_get_session_key_out get_skey_out = {};
struct drm_i915_private *i915; struct drm_i915_private *i915;
ssize_t byte; ssize_t byte;
...@@ -381,8 +380,8 @@ intel_hdcp_gsc_repeater_check_flow_prepare_ack(struct device *dev, ...@@ -381,8 +380,8 @@ intel_hdcp_gsc_repeater_check_flow_prepare_ack(struct device *dev,
struct hdcp2_rep_send_ack struct hdcp2_rep_send_ack
*rep_send_ack) *rep_send_ack)
{ {
struct wired_cmd_verify_repeater_in verify_repeater_in = { { 0 } }; struct wired_cmd_verify_repeater_in verify_repeater_in = {};
struct wired_cmd_verify_repeater_out verify_repeater_out = { { 0 } }; struct wired_cmd_verify_repeater_out verify_repeater_out = {};
struct drm_i915_private *i915; struct drm_i915_private *i915;
ssize_t byte; ssize_t byte;
...@@ -442,8 +441,7 @@ int intel_hdcp_gsc_verify_mprime(struct device *dev, ...@@ -442,8 +441,7 @@ int intel_hdcp_gsc_verify_mprime(struct device *dev,
struct hdcp2_rep_stream_ready *stream_ready) 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_in *verify_mprime_in;
struct wired_cmd_repeater_auth_stream_req_out struct wired_cmd_repeater_auth_stream_req_out verify_mprime_out = {};
verify_mprime_out = { { 0 } };
struct drm_i915_private *i915; struct drm_i915_private *i915;
ssize_t byte; ssize_t byte;
size_t cmd_size; size_t cmd_size;
...@@ -504,8 +502,8 @@ int intel_hdcp_gsc_verify_mprime(struct device *dev, ...@@ -504,8 +502,8 @@ int intel_hdcp_gsc_verify_mprime(struct device *dev,
int intel_hdcp_gsc_enable_authentication(struct device *dev, int intel_hdcp_gsc_enable_authentication(struct device *dev,
struct hdcp_port_data *data) struct hdcp_port_data *data)
{ {
struct wired_cmd_enable_auth_in enable_auth_in = { { 0 } }; struct wired_cmd_enable_auth_in enable_auth_in = {};
struct wired_cmd_enable_auth_out enable_auth_out = { { 0 } }; struct wired_cmd_enable_auth_out enable_auth_out = {};
struct drm_i915_private *i915; struct drm_i915_private *i915;
ssize_t byte; ssize_t byte;
...@@ -549,8 +547,8 @@ int intel_hdcp_gsc_enable_authentication(struct device *dev, ...@@ -549,8 +547,8 @@ int intel_hdcp_gsc_enable_authentication(struct device *dev,
int int
intel_hdcp_gsc_close_session(struct device *dev, struct hdcp_port_data *data) 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_in session_close_in = {};
struct wired_cmd_close_session_out session_close_out = { { 0 } }; struct wired_cmd_close_session_out session_close_out = {};
struct drm_i915_private *i915; struct drm_i915_private *i915;
ssize_t byte; ssize_t byte;
......
...@@ -166,7 +166,7 @@ intel_alloc_initial_plane_obj(struct intel_crtc *crtc, ...@@ -166,7 +166,7 @@ intel_alloc_initial_plane_obj(struct intel_crtc *crtc,
{ {
struct drm_device *dev = crtc->base.dev; struct drm_device *dev = crtc->base.dev;
struct drm_i915_private *dev_priv = to_i915(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 drm_framebuffer *fb = &plane_config->fb->base;
struct i915_vma *vma; struct i915_vma *vma;
......
...@@ -676,7 +676,9 @@ static void hsw_activate_psr1(struct intel_dp *intel_dp) ...@@ -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_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)) if (IS_HASWELL(dev_priv))
val |= EDP_PSR_MIN_LINK_ENTRY_TIME_8_LINES; val |= EDP_PSR_MIN_LINK_ENTRY_TIME_8_LINES;
...@@ -1400,8 +1402,10 @@ static void intel_psr_enable_source(struct intel_dp *intel_dp, ...@@ -1400,8 +1402,10 @@ static void intel_psr_enable_source(struct intel_dp *intel_dp,
*/ */
mask = EDP_PSR_DEBUG_MASK_MEMUP | mask = EDP_PSR_DEBUG_MASK_MEMUP |
EDP_PSR_DEBUG_MASK_HPD | EDP_PSR_DEBUG_MASK_HPD |
EDP_PSR_DEBUG_MASK_LPSP | EDP_PSR_DEBUG_MASK_LPSP;
EDP_PSR_DEBUG_MASK_MAX_SLEEP;
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 * 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 ...@@ -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) 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, return intel_sdvo_set_value(intel_sdvo,
SDVO_CMD_SET_TARGET_INPUT, SDVO_CMD_SET_TARGET_INPUT,
&targets, sizeof(targets)); &targets, sizeof(targets));
......
...@@ -1998,7 +1998,7 @@ void intel_mpllb_state_verify(struct intel_atomic_state *state, ...@@ -1998,7 +1998,7 @@ void intel_mpllb_state_verify(struct intel_atomic_state *state,
struct drm_i915_private *i915 = to_i915(state->base.dev); struct drm_i915_private *i915 = to_i915(state->base.dev);
const struct intel_crtc_state *new_crtc_state = const struct intel_crtc_state *new_crtc_state =
intel_atomic_get_new_crtc_state(state, crtc); 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; const struct intel_mpllb_state *mpllb_sw_state = &new_crtc_state->mpllb_state;
struct intel_encoder *encoder; struct intel_encoder *encoder;
......
...@@ -290,7 +290,7 @@ static ssize_t wm_latency_write(struct file *file, const char __user *ubuf, ...@@ -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 seq_file *m = file->private_data;
struct drm_i915_private *dev_priv = m->private; struct drm_i915_private *dev_priv = m->private;
u16 new[8] = { 0 }; u16 new[8] = {};
int level; int level;
int ret; int ret;
char tmp[32]; char tmp[32];
......
...@@ -836,7 +836,6 @@ static const struct intel_device_info mtl_info = { ...@@ -836,7 +836,6 @@ static const struct intel_device_info mtl_info = {
.has_pxp = 1, .has_pxp = 1,
.memory_regions = REGION_SMEM | REGION_STOLEN_LMEM, .memory_regions = REGION_SMEM | REGION_STOLEN_LMEM,
.platform_engine_mask = BIT(RCS0) | BIT(BCS0) | BIT(CCS0), .platform_engine_mask = BIT(RCS0) | BIT(BCS0) | BIT(CCS0),
.require_force_probe = 1,
MTL_CACHELEVEL, MTL_CACHELEVEL,
}; };
...@@ -923,7 +922,7 @@ static const struct pci_device_id pciidlist[] = { ...@@ -923,7 +922,7 @@ static const struct pci_device_id pciidlist[] = {
INTEL_DG2_IDS(&dg2_info), INTEL_DG2_IDS(&dg2_info),
INTEL_ATS_M_IDS(&ats_m_info), INTEL_ATS_M_IDS(&ats_m_info),
INTEL_MTL_IDS(&mtl_info), INTEL_MTL_IDS(&mtl_info),
{0, 0, 0} {}
}; };
MODULE_DEVICE_TABLE(pci, pciidlist); MODULE_DEVICE_TABLE(pci, pciidlist);
......
...@@ -718,7 +718,11 @@ ...@@ -718,7 +718,11 @@
INTEL_VGA_DEVICE(0x56A5, info), \ INTEL_VGA_DEVICE(0x56A5, info), \
INTEL_VGA_DEVICE(0x56A6, info), \ INTEL_VGA_DEVICE(0x56A6, info), \
INTEL_VGA_DEVICE(0x56B0, 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) \ #define INTEL_DG2_G12_IDS(info) \
INTEL_VGA_DEVICE(0x5696, info), \ INTEL_VGA_DEVICE(0x5696, info), \
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment