mirror of
https://github.com/ukui/kernel.git
synced 2026-03-09 10:07:04 -07:00
drm/i915/skl: Buffer translation improvements
This patch adds support for 0.85V VccIO on Skylake Y, separate buffer translation tables for Skylake U, and support for I_boost for the entries that needs this. Changes in v2: * Refactored the code a bit to move all DDI signal level setup to intel_ddi.c Issue: VIZ-5677 Signed-off-by: David Weinehall <david.weinehall@linux.intel.com> Reviewed-by: Antti Koskipää <antti.koskipaa@linux.intel.com> [danvet: Apply style polish checkpatch suggested.] Signed-off-by: Daniel Vetter <daniel.vetter@ffwll.ch>
This commit is contained in:
committed by
Daniel Vetter
parent
2cb389b7e4
commit
f8896f5d58
@@ -2436,6 +2436,14 @@ struct drm_i915_cmd_table {
|
||||
/* ULX machines are also considered ULT. */
|
||||
#define IS_HSW_ULX(dev) (INTEL_DEVID(dev) == 0x0A0E || \
|
||||
INTEL_DEVID(dev) == 0x0A1E)
|
||||
#define IS_SKL_ULT(dev) (INTEL_DEVID(dev) == 0x1906 || \
|
||||
INTEL_DEVID(dev) == 0x1913 || \
|
||||
INTEL_DEVID(dev) == 0x1916 || \
|
||||
INTEL_DEVID(dev) == 0x1921 || \
|
||||
INTEL_DEVID(dev) == 0x1926)
|
||||
#define IS_SKL_ULX(dev) (INTEL_DEVID(dev) == 0x190E || \
|
||||
INTEL_DEVID(dev) == 0x1915 || \
|
||||
INTEL_DEVID(dev) == 0x191E)
|
||||
#define IS_PRELIMINARY_HW(intel_info) ((intel_info)->is_preliminary)
|
||||
|
||||
#define SKL_REVID_A0 (0x0)
|
||||
|
||||
@@ -1384,6 +1384,18 @@ enum skl_disp_power_wells {
|
||||
_PORT_TX_DW14_LN0_C) + \
|
||||
_BXT_LANE_OFFSET(lane))
|
||||
|
||||
/* UAIMI scratch pad register 1 */
|
||||
#define UAIMI_SPR1 0x4F074
|
||||
/* SKL VccIO mask */
|
||||
#define SKL_VCCIO_MASK 0x1
|
||||
/* SKL balance leg register */
|
||||
#define DISPIO_CR_TX_BMU_CR0 0x6C00C
|
||||
/* I_boost values */
|
||||
#define BALANCE_LEG_SHIFT(port) (8+3*(port))
|
||||
#define BALANCE_LEG_MASK(port) (7<<(8+3*(port)))
|
||||
/* Balance leg disable bits */
|
||||
#define BALANCE_LEG_DISABLE_SHIFT 23
|
||||
|
||||
/*
|
||||
* Fence registers
|
||||
*/
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
@@ -3424,92 +3424,6 @@ gen7_edp_signal_levels(uint8_t train_set)
|
||||
}
|
||||
}
|
||||
|
||||
/* Gen7.5's (HSW) DP voltage swing and pre-emphasis control */
|
||||
static uint32_t
|
||||
hsw_signal_levels(uint8_t train_set)
|
||||
{
|
||||
int signal_levels = train_set & (DP_TRAIN_VOLTAGE_SWING_MASK |
|
||||
DP_TRAIN_PRE_EMPHASIS_MASK);
|
||||
switch (signal_levels) {
|
||||
case DP_TRAIN_VOLTAGE_SWING_LEVEL_0 | DP_TRAIN_PRE_EMPH_LEVEL_0:
|
||||
return DDI_BUF_TRANS_SELECT(0);
|
||||
case DP_TRAIN_VOLTAGE_SWING_LEVEL_0 | DP_TRAIN_PRE_EMPH_LEVEL_1:
|
||||
return DDI_BUF_TRANS_SELECT(1);
|
||||
case DP_TRAIN_VOLTAGE_SWING_LEVEL_0 | DP_TRAIN_PRE_EMPH_LEVEL_2:
|
||||
return DDI_BUF_TRANS_SELECT(2);
|
||||
case DP_TRAIN_VOLTAGE_SWING_LEVEL_0 | DP_TRAIN_PRE_EMPH_LEVEL_3:
|
||||
return DDI_BUF_TRANS_SELECT(3);
|
||||
|
||||
case DP_TRAIN_VOLTAGE_SWING_LEVEL_1 | DP_TRAIN_PRE_EMPH_LEVEL_0:
|
||||
return DDI_BUF_TRANS_SELECT(4);
|
||||
case DP_TRAIN_VOLTAGE_SWING_LEVEL_1 | DP_TRAIN_PRE_EMPH_LEVEL_1:
|
||||
return DDI_BUF_TRANS_SELECT(5);
|
||||
case DP_TRAIN_VOLTAGE_SWING_LEVEL_1 | DP_TRAIN_PRE_EMPH_LEVEL_2:
|
||||
return DDI_BUF_TRANS_SELECT(6);
|
||||
|
||||
case DP_TRAIN_VOLTAGE_SWING_LEVEL_2 | DP_TRAIN_PRE_EMPH_LEVEL_0:
|
||||
return DDI_BUF_TRANS_SELECT(7);
|
||||
case DP_TRAIN_VOLTAGE_SWING_LEVEL_2 | DP_TRAIN_PRE_EMPH_LEVEL_1:
|
||||
return DDI_BUF_TRANS_SELECT(8);
|
||||
|
||||
case DP_TRAIN_VOLTAGE_SWING_LEVEL_3 | DP_TRAIN_PRE_EMPH_LEVEL_0:
|
||||
return DDI_BUF_TRANS_SELECT(9);
|
||||
default:
|
||||
DRM_DEBUG_KMS("Unsupported voltage swing/pre-emphasis level:"
|
||||
"0x%x\n", signal_levels);
|
||||
return DDI_BUF_TRANS_SELECT(0);
|
||||
}
|
||||
}
|
||||
|
||||
static void bxt_signal_levels(struct intel_dp *intel_dp)
|
||||
{
|
||||
struct intel_digital_port *dport = dp_to_dig_port(intel_dp);
|
||||
enum port port = dport->port;
|
||||
struct drm_device *dev = dport->base.base.dev;
|
||||
struct intel_encoder *encoder = &dport->base;
|
||||
uint8_t train_set = intel_dp->train_set[0];
|
||||
uint32_t level = 0;
|
||||
|
||||
int signal_levels = train_set & (DP_TRAIN_VOLTAGE_SWING_MASK |
|
||||
DP_TRAIN_PRE_EMPHASIS_MASK);
|
||||
switch (signal_levels) {
|
||||
default:
|
||||
DRM_DEBUG_KMS("Unsupported voltage swing/pre-emph level\n");
|
||||
case DP_TRAIN_VOLTAGE_SWING_LEVEL_0 | DP_TRAIN_PRE_EMPH_LEVEL_0:
|
||||
level = 0;
|
||||
break;
|
||||
case DP_TRAIN_VOLTAGE_SWING_LEVEL_0 | DP_TRAIN_PRE_EMPH_LEVEL_1:
|
||||
level = 1;
|
||||
break;
|
||||
case DP_TRAIN_VOLTAGE_SWING_LEVEL_0 | DP_TRAIN_PRE_EMPH_LEVEL_2:
|
||||
level = 2;
|
||||
break;
|
||||
case DP_TRAIN_VOLTAGE_SWING_LEVEL_0 | DP_TRAIN_PRE_EMPH_LEVEL_3:
|
||||
level = 3;
|
||||
break;
|
||||
case DP_TRAIN_VOLTAGE_SWING_LEVEL_1 | DP_TRAIN_PRE_EMPH_LEVEL_0:
|
||||
level = 4;
|
||||
break;
|
||||
case DP_TRAIN_VOLTAGE_SWING_LEVEL_1 | DP_TRAIN_PRE_EMPH_LEVEL_1:
|
||||
level = 5;
|
||||
break;
|
||||
case DP_TRAIN_VOLTAGE_SWING_LEVEL_1 | DP_TRAIN_PRE_EMPH_LEVEL_2:
|
||||
level = 6;
|
||||
break;
|
||||
case DP_TRAIN_VOLTAGE_SWING_LEVEL_2 | DP_TRAIN_PRE_EMPH_LEVEL_0:
|
||||
level = 7;
|
||||
break;
|
||||
case DP_TRAIN_VOLTAGE_SWING_LEVEL_2 | DP_TRAIN_PRE_EMPH_LEVEL_1:
|
||||
level = 8;
|
||||
break;
|
||||
case DP_TRAIN_VOLTAGE_SWING_LEVEL_3 | DP_TRAIN_PRE_EMPH_LEVEL_0:
|
||||
level = 9;
|
||||
break;
|
||||
}
|
||||
|
||||
bxt_ddi_vswing_sequence(dev, level, port, encoder->type);
|
||||
}
|
||||
|
||||
/* Properly updates "DP" with the correct signal levels. */
|
||||
static void
|
||||
intel_dp_set_signal_levels(struct intel_dp *intel_dp, uint32_t *DP)
|
||||
@@ -3517,22 +3431,20 @@ intel_dp_set_signal_levels(struct intel_dp *intel_dp, uint32_t *DP)
|
||||
struct intel_digital_port *intel_dig_port = dp_to_dig_port(intel_dp);
|
||||
enum port port = intel_dig_port->port;
|
||||
struct drm_device *dev = intel_dig_port->base.base.dev;
|
||||
uint32_t signal_levels, mask;
|
||||
uint32_t signal_levels, mask = 0;
|
||||
uint8_t train_set = intel_dp->train_set[0];
|
||||
|
||||
if (IS_BROXTON(dev)) {
|
||||
signal_levels = 0;
|
||||
bxt_signal_levels(intel_dp);
|
||||
mask = 0;
|
||||
} else if (HAS_DDI(dev)) {
|
||||
signal_levels = hsw_signal_levels(train_set);
|
||||
mask = DDI_BUF_EMP_MASK;
|
||||
if (HAS_DDI(dev)) {
|
||||
signal_levels = ddi_signal_levels(intel_dp);
|
||||
|
||||
if (IS_BROXTON(dev))
|
||||
signal_levels = 0;
|
||||
else
|
||||
mask = DDI_BUF_EMP_MASK;
|
||||
} else if (IS_CHERRYVIEW(dev)) {
|
||||
signal_levels = chv_signal_levels(intel_dp);
|
||||
mask = 0;
|
||||
} else if (IS_VALLEYVIEW(dev)) {
|
||||
signal_levels = vlv_signal_levels(intel_dp);
|
||||
mask = 0;
|
||||
} else if (IS_GEN7(dev) && port == PORT_A) {
|
||||
signal_levels = gen7_edp_signal_levels(train_set);
|
||||
mask = EDP_LINK_TRAIN_VOL_EMP_MASK_IVB;
|
||||
|
||||
@@ -968,8 +968,7 @@ void intel_ddi_init_dp_buf_reg(struct intel_encoder *encoder);
|
||||
void intel_ddi_clock_get(struct intel_encoder *encoder,
|
||||
struct intel_crtc_state *pipe_config);
|
||||
void intel_ddi_set_vc_payload_alloc(struct drm_crtc *crtc, bool state);
|
||||
void bxt_ddi_vswing_sequence(struct drm_device *dev, u32 level,
|
||||
enum port port, int type);
|
||||
uint32_t ddi_signal_levels(struct intel_dp *intel_dp);
|
||||
|
||||
/* intel_frontbuffer.c */
|
||||
void intel_fb_obj_invalidate(struct drm_i915_gem_object *obj,
|
||||
|
||||
Reference in New Issue
Block a user