forked from Minki/linux
- Fix DP-MST crtc_mask
- Fix dsc dpp calculations - Fix g4x sprite scaling stride check with GTT remapping Short summary of fixes pull (less than what git shortlog provides): - explain anything non-fixes (e.g. cleanups) and why it's appropriate - highlight regressions - summarize pull requests contained This shouldn't be more than a few lines (or it indicates your fixes pull is a bit too big). -----BEGIN PGP SIGNATURE----- iQEcBAABAgAGBQJdlkvzAAoJEPpiX2QO6xPKKXgIALMMAvQGqQ1zYK852zBl74fJ ou4Ig0xQN25lhx0cMiefAolsT3pbo/FZ/RQmhDuVMrg2xxWx3vVm0y1kPMefs/Zs Hrva65elI6DaYG7mXTclPTz8sPDQ66Mn5vXpb9biSvZc9DBEORYPsmGOPHdcQ1NG GBie/Ct66nDja1taREFqPIu/Z6TKlGtJRcslDmChLfPq9GXYPAfFB3NpP0f1yomd mSEURPo8kYC2seFfV6nJoAMijnT6oBkgM1AickK1qGvvbmmFs4g/kW+jkjqrl5Sl oMZ8OXL5LOZ1OgVN+Uf5P2X3dB7TeUEVInWQkS5beCJIL9p3aGSwzXjUJGgu/m0= =j1HZ -----END PGP SIGNATURE----- Merge tag 'drm-intel-fixes-2019-10-03-1' of git://anongit.freedesktop.org/drm/drm-intel into drm-fixes - Fix DP-MST crtc_mask - Fix dsc dpp calculations - Fix g4x sprite scaling stride check with GTT remapping Signed-off-by: Dave Airlie <airlied@redhat.com> From: Rodrigo Vivi <rodrigo.vivi@intel.com> Link: https://patchwork.freedesktop.org/patch/msgid/20191003193051.GA26421@intel.com
This commit is contained in:
commit
07bba341c9
@ -7261,7 +7261,7 @@ retry:
|
||||
pipe_config->fdi_lanes = lane;
|
||||
|
||||
intel_link_compute_m_n(pipe_config->pipe_bpp, lane, fdi_dotclock,
|
||||
link_bw, &pipe_config->fdi_m_n, false);
|
||||
link_bw, &pipe_config->fdi_m_n, false, false);
|
||||
|
||||
ret = ironlake_check_fdi_lanes(dev, intel_crtc->pipe, pipe_config);
|
||||
if (ret == -EDEADLK)
|
||||
@ -7508,11 +7508,15 @@ void
|
||||
intel_link_compute_m_n(u16 bits_per_pixel, int nlanes,
|
||||
int pixel_clock, int link_clock,
|
||||
struct intel_link_m_n *m_n,
|
||||
bool constant_n)
|
||||
bool constant_n, bool fec_enable)
|
||||
{
|
||||
m_n->tu = 64;
|
||||
u32 data_clock = bits_per_pixel * pixel_clock;
|
||||
|
||||
compute_m_n(bits_per_pixel * pixel_clock,
|
||||
if (fec_enable)
|
||||
data_clock = intel_dp_mode_to_fec_clock(data_clock);
|
||||
|
||||
m_n->tu = 64;
|
||||
compute_m_n(data_clock,
|
||||
link_clock * nlanes * 8,
|
||||
&m_n->gmch_m, &m_n->gmch_n,
|
||||
constant_n);
|
||||
|
@ -414,7 +414,7 @@ enum phy_fia {
|
||||
void intel_link_compute_m_n(u16 bpp, int nlanes,
|
||||
int pixel_clock, int link_clock,
|
||||
struct intel_link_m_n *m_n,
|
||||
bool constant_n);
|
||||
bool constant_n, bool fec_enable);
|
||||
bool is_ccs_modifier(u64 modifier);
|
||||
void lpt_disable_clkout_dp(struct drm_i915_private *dev_priv);
|
||||
u32 intel_plane_fb_max_stride(struct drm_i915_private *dev_priv,
|
||||
|
@ -78,8 +78,8 @@
|
||||
#define DP_DSC_MAX_ENC_THROUGHPUT_0 340000
|
||||
#define DP_DSC_MAX_ENC_THROUGHPUT_1 400000
|
||||
|
||||
/* DP DSC FEC Overhead factor = (100 - 2.4)/100 */
|
||||
#define DP_DSC_FEC_OVERHEAD_FACTOR 976
|
||||
/* DP DSC FEC Overhead factor = 1/(0.972261) */
|
||||
#define DP_DSC_FEC_OVERHEAD_FACTOR 972261
|
||||
|
||||
/* Compliance test status bits */
|
||||
#define INTEL_DP_RESOLUTION_SHIFT_MASK 0
|
||||
@ -494,6 +494,97 @@ int intel_dp_get_link_train_fallback_values(struct intel_dp *intel_dp,
|
||||
return 0;
|
||||
}
|
||||
|
||||
u32 intel_dp_mode_to_fec_clock(u32 mode_clock)
|
||||
{
|
||||
return div_u64(mul_u32_u32(mode_clock, 1000000U),
|
||||
DP_DSC_FEC_OVERHEAD_FACTOR);
|
||||
}
|
||||
|
||||
static u16 intel_dp_dsc_get_output_bpp(u32 link_clock, u32 lane_count,
|
||||
u32 mode_clock, u32 mode_hdisplay)
|
||||
{
|
||||
u32 bits_per_pixel, max_bpp_small_joiner_ram;
|
||||
int i;
|
||||
|
||||
/*
|
||||
* Available Link Bandwidth(Kbits/sec) = (NumberOfLanes)*
|
||||
* (LinkSymbolClock)* 8 * (TimeSlotsPerMTP)
|
||||
* for SST -> TimeSlotsPerMTP is 1,
|
||||
* for MST -> TimeSlotsPerMTP has to be calculated
|
||||
*/
|
||||
bits_per_pixel = (link_clock * lane_count * 8) /
|
||||
intel_dp_mode_to_fec_clock(mode_clock);
|
||||
DRM_DEBUG_KMS("Max link bpp: %u\n", bits_per_pixel);
|
||||
|
||||
/* Small Joiner Check: output bpp <= joiner RAM (bits) / Horiz. width */
|
||||
max_bpp_small_joiner_ram = DP_DSC_MAX_SMALL_JOINER_RAM_BUFFER / mode_hdisplay;
|
||||
DRM_DEBUG_KMS("Max small joiner bpp: %u\n", max_bpp_small_joiner_ram);
|
||||
|
||||
/*
|
||||
* Greatest allowed DSC BPP = MIN (output BPP from available Link BW
|
||||
* check, output bpp from small joiner RAM check)
|
||||
*/
|
||||
bits_per_pixel = min(bits_per_pixel, max_bpp_small_joiner_ram);
|
||||
|
||||
/* Error out if the max bpp is less than smallest allowed valid bpp */
|
||||
if (bits_per_pixel < valid_dsc_bpp[0]) {
|
||||
DRM_DEBUG_KMS("Unsupported BPP %u, min %u\n",
|
||||
bits_per_pixel, valid_dsc_bpp[0]);
|
||||
return 0;
|
||||
}
|
||||
|
||||
/* Find the nearest match in the array of known BPPs from VESA */
|
||||
for (i = 0; i < ARRAY_SIZE(valid_dsc_bpp) - 1; i++) {
|
||||
if (bits_per_pixel < valid_dsc_bpp[i + 1])
|
||||
break;
|
||||
}
|
||||
bits_per_pixel = valid_dsc_bpp[i];
|
||||
|
||||
/*
|
||||
* Compressed BPP in U6.4 format so multiply by 16, for Gen 11,
|
||||
* fractional part is 0
|
||||
*/
|
||||
return bits_per_pixel << 4;
|
||||
}
|
||||
|
||||
static u8 intel_dp_dsc_get_slice_count(struct intel_dp *intel_dp,
|
||||
int mode_clock, int mode_hdisplay)
|
||||
{
|
||||
u8 min_slice_count, i;
|
||||
int max_slice_width;
|
||||
|
||||
if (mode_clock <= DP_DSC_PEAK_PIXEL_RATE)
|
||||
min_slice_count = DIV_ROUND_UP(mode_clock,
|
||||
DP_DSC_MAX_ENC_THROUGHPUT_0);
|
||||
else
|
||||
min_slice_count = DIV_ROUND_UP(mode_clock,
|
||||
DP_DSC_MAX_ENC_THROUGHPUT_1);
|
||||
|
||||
max_slice_width = drm_dp_dsc_sink_max_slice_width(intel_dp->dsc_dpcd);
|
||||
if (max_slice_width < DP_DSC_MIN_SLICE_WIDTH_VALUE) {
|
||||
DRM_DEBUG_KMS("Unsupported slice width %d by DP DSC Sink device\n",
|
||||
max_slice_width);
|
||||
return 0;
|
||||
}
|
||||
/* Also take into account max slice width */
|
||||
min_slice_count = min_t(u8, min_slice_count,
|
||||
DIV_ROUND_UP(mode_hdisplay,
|
||||
max_slice_width));
|
||||
|
||||
/* Find the closest match to the valid slice count values */
|
||||
for (i = 0; i < ARRAY_SIZE(valid_dsc_slicecount); i++) {
|
||||
if (valid_dsc_slicecount[i] >
|
||||
drm_dp_dsc_sink_max_slice_count(intel_dp->dsc_dpcd,
|
||||
false))
|
||||
break;
|
||||
if (min_slice_count <= valid_dsc_slicecount[i])
|
||||
return valid_dsc_slicecount[i];
|
||||
}
|
||||
|
||||
DRM_DEBUG_KMS("Unsupported Slice Count %d\n", min_slice_count);
|
||||
return 0;
|
||||
}
|
||||
|
||||
static enum drm_mode_status
|
||||
intel_dp_mode_valid(struct drm_connector *connector,
|
||||
struct drm_display_mode *mode)
|
||||
@ -2226,7 +2317,7 @@ intel_dp_compute_config(struct intel_encoder *encoder,
|
||||
adjusted_mode->crtc_clock,
|
||||
pipe_config->port_clock,
|
||||
&pipe_config->dp_m_n,
|
||||
constant_n);
|
||||
constant_n, pipe_config->fec_enable);
|
||||
|
||||
if (intel_connector->panel.downclock_mode != NULL &&
|
||||
dev_priv->drrs.type == SEAMLESS_DRRS_SUPPORT) {
|
||||
@ -2236,7 +2327,7 @@ intel_dp_compute_config(struct intel_encoder *encoder,
|
||||
intel_connector->panel.downclock_mode->clock,
|
||||
pipe_config->port_clock,
|
||||
&pipe_config->dp_m2_n2,
|
||||
constant_n);
|
||||
constant_n, pipe_config->fec_enable);
|
||||
}
|
||||
|
||||
if (!HAS_DDI(dev_priv))
|
||||
@ -4323,91 +4414,6 @@ intel_dp_get_sink_irq_esi(struct intel_dp *intel_dp, u8 *sink_irq_vector)
|
||||
DP_DPRX_ESI_LEN;
|
||||
}
|
||||
|
||||
u16 intel_dp_dsc_get_output_bpp(int link_clock, u8 lane_count,
|
||||
int mode_clock, int mode_hdisplay)
|
||||
{
|
||||
u16 bits_per_pixel, max_bpp_small_joiner_ram;
|
||||
int i;
|
||||
|
||||
/*
|
||||
* Available Link Bandwidth(Kbits/sec) = (NumberOfLanes)*
|
||||
* (LinkSymbolClock)* 8 * ((100-FECOverhead)/100)*(TimeSlotsPerMTP)
|
||||
* FECOverhead = 2.4%, for SST -> TimeSlotsPerMTP is 1,
|
||||
* for MST -> TimeSlotsPerMTP has to be calculated
|
||||
*/
|
||||
bits_per_pixel = (link_clock * lane_count * 8 *
|
||||
DP_DSC_FEC_OVERHEAD_FACTOR) /
|
||||
mode_clock;
|
||||
|
||||
/* Small Joiner Check: output bpp <= joiner RAM (bits) / Horiz. width */
|
||||
max_bpp_small_joiner_ram = DP_DSC_MAX_SMALL_JOINER_RAM_BUFFER /
|
||||
mode_hdisplay;
|
||||
|
||||
/*
|
||||
* Greatest allowed DSC BPP = MIN (output BPP from avaialble Link BW
|
||||
* check, output bpp from small joiner RAM check)
|
||||
*/
|
||||
bits_per_pixel = min(bits_per_pixel, max_bpp_small_joiner_ram);
|
||||
|
||||
/* Error out if the max bpp is less than smallest allowed valid bpp */
|
||||
if (bits_per_pixel < valid_dsc_bpp[0]) {
|
||||
DRM_DEBUG_KMS("Unsupported BPP %d\n", bits_per_pixel);
|
||||
return 0;
|
||||
}
|
||||
|
||||
/* Find the nearest match in the array of known BPPs from VESA */
|
||||
for (i = 0; i < ARRAY_SIZE(valid_dsc_bpp) - 1; i++) {
|
||||
if (bits_per_pixel < valid_dsc_bpp[i + 1])
|
||||
break;
|
||||
}
|
||||
bits_per_pixel = valid_dsc_bpp[i];
|
||||
|
||||
/*
|
||||
* Compressed BPP in U6.4 format so multiply by 16, for Gen 11,
|
||||
* fractional part is 0
|
||||
*/
|
||||
return bits_per_pixel << 4;
|
||||
}
|
||||
|
||||
u8 intel_dp_dsc_get_slice_count(struct intel_dp *intel_dp,
|
||||
int mode_clock,
|
||||
int mode_hdisplay)
|
||||
{
|
||||
u8 min_slice_count, i;
|
||||
int max_slice_width;
|
||||
|
||||
if (mode_clock <= DP_DSC_PEAK_PIXEL_RATE)
|
||||
min_slice_count = DIV_ROUND_UP(mode_clock,
|
||||
DP_DSC_MAX_ENC_THROUGHPUT_0);
|
||||
else
|
||||
min_slice_count = DIV_ROUND_UP(mode_clock,
|
||||
DP_DSC_MAX_ENC_THROUGHPUT_1);
|
||||
|
||||
max_slice_width = drm_dp_dsc_sink_max_slice_width(intel_dp->dsc_dpcd);
|
||||
if (max_slice_width < DP_DSC_MIN_SLICE_WIDTH_VALUE) {
|
||||
DRM_DEBUG_KMS("Unsupported slice width %d by DP DSC Sink device\n",
|
||||
max_slice_width);
|
||||
return 0;
|
||||
}
|
||||
/* Also take into account max slice width */
|
||||
min_slice_count = min_t(u8, min_slice_count,
|
||||
DIV_ROUND_UP(mode_hdisplay,
|
||||
max_slice_width));
|
||||
|
||||
/* Find the closest match to the valid slice count values */
|
||||
for (i = 0; i < ARRAY_SIZE(valid_dsc_slicecount); i++) {
|
||||
if (valid_dsc_slicecount[i] >
|
||||
drm_dp_dsc_sink_max_slice_count(intel_dp->dsc_dpcd,
|
||||
false))
|
||||
break;
|
||||
if (min_slice_count <= valid_dsc_slicecount[i])
|
||||
return valid_dsc_slicecount[i];
|
||||
}
|
||||
|
||||
DRM_DEBUG_KMS("Unsupported Slice Count %d\n", min_slice_count);
|
||||
return 0;
|
||||
}
|
||||
|
||||
static void
|
||||
intel_pixel_encoding_setup_vsc(struct intel_dp *intel_dp,
|
||||
const struct intel_crtc_state *crtc_state)
|
||||
|
@ -102,10 +102,6 @@ bool intel_dp_source_supports_hbr2(struct intel_dp *intel_dp);
|
||||
bool intel_dp_source_supports_hbr3(struct intel_dp *intel_dp);
|
||||
bool
|
||||
intel_dp_get_link_status(struct intel_dp *intel_dp, u8 *link_status);
|
||||
u16 intel_dp_dsc_get_output_bpp(int link_clock, u8 lane_count,
|
||||
int mode_clock, int mode_hdisplay);
|
||||
u8 intel_dp_dsc_get_slice_count(struct intel_dp *intel_dp, int mode_clock,
|
||||
int mode_hdisplay);
|
||||
|
||||
bool intel_dp_read_dpcd(struct intel_dp *intel_dp);
|
||||
bool intel_dp_get_colorimetry_status(struct intel_dp *intel_dp);
|
||||
@ -118,4 +114,6 @@ static inline unsigned int intel_dp_unused_lane_mask(int lane_count)
|
||||
return ~((1 << lane_count) - 1) & 0xf;
|
||||
}
|
||||
|
||||
u32 intel_dp_mode_to_fec_clock(u32 mode_clock);
|
||||
|
||||
#endif /* __INTEL_DP_H__ */
|
||||
|
@ -81,7 +81,7 @@ static int intel_dp_mst_compute_link_config(struct intel_encoder *encoder,
|
||||
adjusted_mode->crtc_clock,
|
||||
crtc_state->port_clock,
|
||||
&crtc_state->dp_m_n,
|
||||
constant_n);
|
||||
constant_n, crtc_state->fec_enable);
|
||||
crtc_state->dp_m_n.tu = slots;
|
||||
|
||||
return 0;
|
||||
@ -615,7 +615,7 @@ intel_dp_create_fake_mst_encoder(struct intel_digital_port *intel_dig_port, enum
|
||||
intel_encoder->type = INTEL_OUTPUT_DP_MST;
|
||||
intel_encoder->power_domain = intel_dig_port->base.power_domain;
|
||||
intel_encoder->port = intel_dig_port->base.port;
|
||||
intel_encoder->crtc_mask = BIT(pipe);
|
||||
intel_encoder->crtc_mask = 0x7;
|
||||
intel_encoder->cloneable = 0;
|
||||
|
||||
intel_encoder->compute_config = intel_dp_mst_compute_config;
|
||||
|
@ -1528,6 +1528,7 @@ g4x_sprite_check_scaling(struct intel_crtc_state *crtc_state,
|
||||
int src_x, src_w, src_h, crtc_w, crtc_h;
|
||||
const struct drm_display_mode *adjusted_mode =
|
||||
&crtc_state->base.adjusted_mode;
|
||||
unsigned int stride = plane_state->color_plane[0].stride;
|
||||
unsigned int cpp = fb->format->cpp[0];
|
||||
unsigned int width_bytes;
|
||||
int min_width, min_height;
|
||||
@ -1569,9 +1570,9 @@ g4x_sprite_check_scaling(struct intel_crtc_state *crtc_state,
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
if (width_bytes > 4096 || fb->pitches[0] > 4096) {
|
||||
if (stride > 4096) {
|
||||
DRM_DEBUG_KMS("Stride (%u) exceeds hardware max with scaling (%u)\n",
|
||||
fb->pitches[0], 4096);
|
||||
stride, 4096);
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user