Core Changes:
- Some DP/DP_MST DRM helpers (Imre) Driver Changes (i915 Display): - PLL refactoring (Ville) - Limit eDP MSO pipe only for display version 20 (Luca) - More display refactor towards independence from i915 dev_priv (Jani) - QGV/SAGV related refactor (Stanislav) - Few MTL/DSC and a UHBR monitor fix (Imre) - BXT/GLK per-lane vswing and PHY reg cleanup (Ville) -----BEGIN PGP SIGNATURE----- iQEzBAABCAAdFiEEbSBwaO7dZQkcLOKj+mJfZA7rE8oFAmYpM+8ACgkQ+mJfZA7r E8o/Wwf/SY+kzDhOfr+gsyOWxDKOjMO7rE4KIK0+XVKR1JkmuFA7ZiR9UFXnZfqc IvMzWs1Rc9fNL7JbC9tgFXW+G/uMjXvcTaLmmK0+DImwc5dkl2Nm1QhLdnkjoXPW Nm4XLZjbU22dYUZ5g5HZoFyWmBJueKm9vw1Lznr2ojuY9R8KZNssbjFLTVBgL/Ew OA8WjuCc6idPS697NeOtH1r8t3KvOBCeBIIYdOa8seBDAk2fyMfwgInCqGeJxQp8 U1stBD4MwVWNrEXflgR/tSNQQwR304tSBwQ3TaSswV2Sh+4O3wdF6uQKOyQ/Cq+a 80JPV0Tndw+OM11kYHO64yQ93MVBEw== =l8/D -----END PGP SIGNATURE----- Merge tag 'drm-intel-next-2024-04-24' of https://anongit.freedesktop.org/git/drm/drm-intel into drm-next Core Changes: - Some DP/DP_MST DRM helpers (Imre) Driver Changes (i915 Display): - PLL refactoring (Ville) - Limit eDP MSO pipe only for display version 20 (Luca) - More display refactor towards independence from i915 dev_priv (Jani) - QGV/SAGV related refactor (Stanislav) - Few MTL/DSC and a UHBR monitor fix (Imre) - BXT/GLK per-lane vswing and PHY reg cleanup (Ville) Signed-off-by: Dave Airlie <airlied@redhat.com> From: Rodrigo Vivi <rodrigo.vivi@intel.com> Link: https://patchwork.freedesktop.org/patch/msgid/Zik0LKEtN1PwXXGb@intel.com
This commit is contained in:
commit
bfed5b0257
@ -2281,6 +2281,8 @@ static const struct dpcd_quirk dpcd_quirk_list[] = {
|
||||
{ OUI(0x90, 0xCC, 0x24), DEVICE_ID_ANY, true, BIT(DP_DPCD_QUIRK_DSC_WITHOUT_VIRTUAL_DPCD) },
|
||||
/* Synaptics DP1.4 MST hubs require DSC for some modes on which it applies HBLANK expansion. */
|
||||
{ OUI(0x90, 0xCC, 0x24), DEVICE_ID_ANY, true, BIT(DP_DPCD_QUIRK_HBLANK_EXPANSION_REQUIRES_DSC) },
|
||||
/* MediaTek panels (at least in U3224KBA) require DSC for modes with a short HBLANK on UHBR links. */
|
||||
{ OUI(0x00, 0x0C, 0xE7), DEVICE_ID_ANY, false, BIT(DP_DPCD_QUIRK_HBLANK_EXPANSION_REQUIRES_DSC) },
|
||||
/* Apple MacBookPro 2017 15 inch eDP Retina panel reports too low DP_MAX_LINK_RATE */
|
||||
{ OUI(0x00, 0x10, 0xfa), DEVICE_ID(101, 68, 21, 101, 98, 97), false, BIT(DP_DPCD_QUIRK_CAN_DO_MAX_LINK_RATE_3_24_GBPS) },
|
||||
};
|
||||
|
@ -2274,7 +2274,7 @@ drm_dp_mst_port_add_connector(struct drm_dp_mst_branch *mstb,
|
||||
|
||||
if (port->pdt != DP_PEER_DEVICE_NONE &&
|
||||
drm_dp_mst_is_end_device(port->pdt, port->mcs) &&
|
||||
port->port_num >= DP_MST_LOGICAL_PORT_0)
|
||||
drm_dp_mst_port_is_logical(port))
|
||||
port->cached_edid = drm_edid_read_ddc(port->connector,
|
||||
&port->aux.ddc);
|
||||
|
||||
@ -4219,7 +4219,7 @@ drm_dp_mst_detect_port(struct drm_connector *connector,
|
||||
case DP_PEER_DEVICE_SST_SINK:
|
||||
ret = connector_status_connected;
|
||||
/* for logical ports - cache the EDID */
|
||||
if (port->port_num >= DP_MST_LOGICAL_PORT_0 && !port->cached_edid)
|
||||
if (drm_dp_mst_port_is_logical(port) && !port->cached_edid)
|
||||
port->cached_edid = drm_edid_read_ddc(connector, &port->aux.ddc);
|
||||
break;
|
||||
case DP_PEER_DEVICE_DP_LEGACY_CONV:
|
||||
@ -5983,7 +5983,7 @@ static bool drm_dp_mst_is_virtual_dpcd(struct drm_dp_mst_port *port)
|
||||
return false;
|
||||
|
||||
/* Virtual DP Sink (Internal Display Panel) */
|
||||
if (port->port_num >= 8)
|
||||
if (drm_dp_mst_port_is_logical(port))
|
||||
return true;
|
||||
|
||||
/* DP-to-HDMI Protocol Converter */
|
||||
@ -6010,6 +6010,22 @@ static bool drm_dp_mst_is_virtual_dpcd(struct drm_dp_mst_port *port)
|
||||
return false;
|
||||
}
|
||||
|
||||
/**
|
||||
* drm_dp_mst_aux_for_parent() - Get the AUX device for an MST port's parent
|
||||
* @port: MST port whose parent's AUX device is returned
|
||||
*
|
||||
* Return the AUX device for @port's parent or NULL if port's parent is the
|
||||
* root port.
|
||||
*/
|
||||
struct drm_dp_aux *drm_dp_mst_aux_for_parent(struct drm_dp_mst_port *port)
|
||||
{
|
||||
if (!port->parent || !port->parent->port_parent)
|
||||
return NULL;
|
||||
|
||||
return &port->parent->port_parent->aux;
|
||||
}
|
||||
EXPORT_SYMBOL(drm_dp_mst_aux_for_parent);
|
||||
|
||||
/**
|
||||
* drm_dp_mst_dsc_aux_for_port() - Find the correct aux for DSC
|
||||
* @port: The port to check. A leaf of the MST tree with an attached display.
|
||||
|
273
drivers/gpu/drm/i915/display/bxt_dpio_phy_regs.h
Normal file
273
drivers/gpu/drm/i915/display/bxt_dpio_phy_regs.h
Normal file
@ -0,0 +1,273 @@
|
||||
/* SPDX-License-Identifier: MIT */
|
||||
/*
|
||||
* Copyright © 2023 Intel Corporation
|
||||
*/
|
||||
|
||||
#ifndef __BXT_DPIO_PHY_REGS_H__
|
||||
#define __BXT_DPIO_PHY_REGS_H__
|
||||
|
||||
#include "intel_display_reg_defs.h"
|
||||
|
||||
/* BXT PHY registers */
|
||||
#define _BXT_PHY0_BASE 0x6C000
|
||||
#define _BXT_PHY1_BASE 0x162000
|
||||
#define _BXT_PHY2_BASE 0x163000
|
||||
#define BXT_PHY_BASE(phy) \
|
||||
_PICK_EVEN_2RANGES(phy, 1, \
|
||||
_BXT_PHY0_BASE, _BXT_PHY0_BASE, \
|
||||
_BXT_PHY1_BASE, _BXT_PHY2_BASE)
|
||||
|
||||
#define _BXT_PHY(phy, reg) \
|
||||
_MMIO(BXT_PHY_BASE(phy) - _BXT_PHY0_BASE + (reg))
|
||||
|
||||
#define _BXT_PHY_CH(phy, ch, reg_ch0, reg_ch1) \
|
||||
(BXT_PHY_BASE(phy) + _PIPE((ch), (reg_ch0) - _BXT_PHY0_BASE, \
|
||||
(reg_ch1) - _BXT_PHY0_BASE))
|
||||
#define _MMIO_BXT_PHY_CH(phy, ch, reg_ch0, reg_ch1) \
|
||||
_MMIO(_BXT_PHY_CH(phy, ch, reg_ch0, reg_ch1))
|
||||
#define _BXT_LANE_OFFSET(lane) (((lane) >> 1) * 0x200 + \
|
||||
((lane) & 1) * 0x80)
|
||||
#define _MMIO_BXT_PHY_CH_LN(phy, ch, lane, reg_ch0, reg_ch1) \
|
||||
_MMIO(_BXT_PHY_CH(phy, ch, reg_ch0, reg_ch1) + _BXT_LANE_OFFSET(lane))
|
||||
|
||||
/* BXT PHY PLL registers */
|
||||
#define _PORT_PLL_A 0x46074
|
||||
#define _PORT_PLL_B 0x46078
|
||||
#define _PORT_PLL_C 0x4607c
|
||||
#define PORT_PLL_ENABLE REG_BIT(31)
|
||||
#define PORT_PLL_LOCK REG_BIT(30)
|
||||
#define PORT_PLL_REF_SEL REG_BIT(27)
|
||||
#define PORT_PLL_POWER_ENABLE REG_BIT(26)
|
||||
#define PORT_PLL_POWER_STATE REG_BIT(25)
|
||||
#define BXT_PORT_PLL_ENABLE(port) _MMIO_PORT(port, _PORT_PLL_A, _PORT_PLL_B)
|
||||
|
||||
#define _PORT_PLL_EBB_0_A 0x162034
|
||||
#define _PORT_PLL_EBB_0_B 0x6C034
|
||||
#define _PORT_PLL_EBB_0_C 0x6C340
|
||||
#define PORT_PLL_P1_MASK REG_GENMASK(15, 13)
|
||||
#define PORT_PLL_P1(p1) REG_FIELD_PREP(PORT_PLL_P1_MASK, (p1))
|
||||
#define PORT_PLL_P2_MASK REG_GENMASK(12, 8)
|
||||
#define PORT_PLL_P2(p2) REG_FIELD_PREP(PORT_PLL_P2_MASK, (p2))
|
||||
#define BXT_PORT_PLL_EBB_0(phy, ch) _MMIO_BXT_PHY_CH(phy, ch, \
|
||||
_PORT_PLL_EBB_0_B, \
|
||||
_PORT_PLL_EBB_0_C)
|
||||
|
||||
#define _PORT_PLL_EBB_4_A 0x162038
|
||||
#define _PORT_PLL_EBB_4_B 0x6C038
|
||||
#define _PORT_PLL_EBB_4_C 0x6C344
|
||||
#define PORT_PLL_RECALIBRATE REG_BIT(14)
|
||||
#define PORT_PLL_10BIT_CLK_ENABLE REG_BIT(13)
|
||||
#define BXT_PORT_PLL_EBB_4(phy, ch) _MMIO_BXT_PHY_CH(phy, ch, \
|
||||
_PORT_PLL_EBB_4_B, \
|
||||
_PORT_PLL_EBB_4_C)
|
||||
|
||||
#define _PORT_PLL_0_A 0x162100
|
||||
#define _PORT_PLL_0_B 0x6C100
|
||||
#define _PORT_PLL_0_C 0x6C380
|
||||
/* PORT_PLL_0_A */
|
||||
#define PORT_PLL_M2_INT_MASK REG_GENMASK(7, 0)
|
||||
#define PORT_PLL_M2_INT(m2_int) REG_FIELD_PREP(PORT_PLL_M2_INT_MASK, (m2_int))
|
||||
/* PORT_PLL_1_A */
|
||||
#define PORT_PLL_N_MASK REG_GENMASK(11, 8)
|
||||
#define PORT_PLL_N(n) REG_FIELD_PREP(PORT_PLL_N_MASK, (n))
|
||||
/* PORT_PLL_2_A */
|
||||
#define PORT_PLL_M2_FRAC_MASK REG_GENMASK(21, 0)
|
||||
#define PORT_PLL_M2_FRAC(m2_frac) REG_FIELD_PREP(PORT_PLL_M2_FRAC_MASK, (m2_frac))
|
||||
/* PORT_PLL_3_A */
|
||||
#define PORT_PLL_M2_FRAC_ENABLE REG_BIT(16)
|
||||
/* PORT_PLL_6_A */
|
||||
#define PORT_PLL_GAIN_CTL_MASK REG_GENMASK(18, 16)
|
||||
#define PORT_PLL_GAIN_CTL(x) REG_FIELD_PREP(PORT_PLL_GAIN_CTL_MASK, (x))
|
||||
#define PORT_PLL_INT_COEFF_MASK REG_GENMASK(12, 8)
|
||||
#define PORT_PLL_INT_COEFF(x) REG_FIELD_PREP(PORT_PLL_INT_COEFF_MASK, (x))
|
||||
#define PORT_PLL_PROP_COEFF_MASK REG_GENMASK(3, 0)
|
||||
#define PORT_PLL_PROP_COEFF(x) REG_FIELD_PREP(PORT_PLL_PROP_COEFF_MASK, (x))
|
||||
/* PORT_PLL_8_A */
|
||||
#define PORT_PLL_TARGET_CNT_MASK REG_GENMASK(9, 0)
|
||||
#define PORT_PLL_TARGET_CNT(x) REG_FIELD_PREP(PORT_PLL_TARGET_CNT_MASK, (x))
|
||||
/* PORT_PLL_9_A */
|
||||
#define PORT_PLL_LOCK_THRESHOLD_MASK REG_GENMASK(3, 1)
|
||||
#define PORT_PLL_LOCK_THRESHOLD(x) REG_FIELD_PREP(PORT_PLL_LOCK_THRESHOLD_MASK, (x))
|
||||
/* PORT_PLL_10_A */
|
||||
#define PORT_PLL_DCO_AMP_OVR_EN_H REG_BIT(27)
|
||||
#define PORT_PLL_DCO_AMP_MASK REG_GENMASK(13, 10)
|
||||
#define PORT_PLL_DCO_AMP(x) REG_FIELD_PREP(PORT_PLL_DCO_AMP_MASK, (x))
|
||||
#define _PORT_PLL_BASE(phy, ch) _BXT_PHY_CH(phy, ch, \
|
||||
_PORT_PLL_0_B, \
|
||||
_PORT_PLL_0_C)
|
||||
#define BXT_PORT_PLL(phy, ch, idx) _MMIO(_PORT_PLL_BASE(phy, ch) + \
|
||||
(idx) * 4)
|
||||
|
||||
/* BXT PHY common lane registers */
|
||||
#define _PORT_CL1CM_DW0_A 0x162000
|
||||
#define _PORT_CL1CM_DW0_BC 0x6C000
|
||||
#define PHY_POWER_GOOD REG_BIT(16)
|
||||
#define PHY_RESERVED REG_BIT(7)
|
||||
#define BXT_PORT_CL1CM_DW0(phy) _BXT_PHY((phy), _PORT_CL1CM_DW0_BC)
|
||||
|
||||
#define _PORT_CL1CM_DW9_A 0x162024
|
||||
#define _PORT_CL1CM_DW9_BC 0x6C024
|
||||
#define IREF0RC_OFFSET_MASK REG_GENMASK(15, 8)
|
||||
#define IREF0RC_OFFSET(x) REG_FIELD_PREP(IREF0RC_OFFSET_MASK, (x))
|
||||
#define BXT_PORT_CL1CM_DW9(phy) _BXT_PHY((phy), _PORT_CL1CM_DW9_BC)
|
||||
|
||||
#define _PORT_CL1CM_DW10_A 0x162028
|
||||
#define _PORT_CL1CM_DW10_BC 0x6C028
|
||||
#define IREF1RC_OFFSET_MASK REG_GENMASK(15, 8)
|
||||
#define IREF1RC_OFFSET(x) REG_FIELD_PREP(IREF1RC_OFFSET_MASK, (x))
|
||||
#define BXT_PORT_CL1CM_DW10(phy) _BXT_PHY((phy), _PORT_CL1CM_DW10_BC)
|
||||
|
||||
#define _PORT_CL1CM_DW28_A 0x162070
|
||||
#define _PORT_CL1CM_DW28_BC 0x6C070
|
||||
#define OCL1_POWER_DOWN_EN REG_BIT(23)
|
||||
#define DW28_OLDO_DYN_PWR_DOWN_EN REG_BIT(22)
|
||||
#define SUS_CLK_CONFIG REG_GENMASK(1, 0)
|
||||
#define BXT_PORT_CL1CM_DW28(phy) _BXT_PHY((phy), _PORT_CL1CM_DW28_BC)
|
||||
|
||||
#define _PORT_CL1CM_DW30_A 0x162078
|
||||
#define _PORT_CL1CM_DW30_BC 0x6C078
|
||||
#define OCL2_LDOFUSE_PWR_DIS REG_BIT(6)
|
||||
#define BXT_PORT_CL1CM_DW30(phy) _BXT_PHY((phy), _PORT_CL1CM_DW30_BC)
|
||||
|
||||
/* The spec defines this only for BXT PHY0, but lets assume that this
|
||||
* would exist for PHY1 too if it had a second channel.
|
||||
*/
|
||||
#define _PORT_CL2CM_DW6_A 0x162358
|
||||
#define _PORT_CL2CM_DW6_BC 0x6C358
|
||||
#define BXT_PORT_CL2CM_DW6(phy) _BXT_PHY((phy), _PORT_CL2CM_DW6_BC)
|
||||
#define DW6_OLDO_DYN_PWR_DOWN_EN REG_BIT(28)
|
||||
|
||||
/* BXT PHY Ref registers */
|
||||
#define _PORT_REF_DW3_A 0x16218C
|
||||
#define _PORT_REF_DW3_BC 0x6C18C
|
||||
#define GRC_DONE REG_BIT(22)
|
||||
#define BXT_PORT_REF_DW3(phy) _BXT_PHY((phy), _PORT_REF_DW3_BC)
|
||||
|
||||
#define _PORT_REF_DW6_A 0x162198
|
||||
#define _PORT_REF_DW6_BC 0x6C198
|
||||
#define GRC_CODE_MASK REG_GENMASK(31, 24)
|
||||
#define GRC_CODE(x) REG_FIELD_PREP(GRC_CODE_MASK, (x))
|
||||
#define GRC_CODE_FAST_MASK REG_GENMASK(23, 16)
|
||||
#define GRC_CODE_FAST(x) REG_FIELD_PREP(GRC_CODE_FAST_MASK, (x))
|
||||
#define GRC_CODE_SLOW_MASK REG_GENMASK(15, 8)
|
||||
#define GRC_CODE_SLOW(x) REG_FIELD_PREP(GRC_CODE_SLOW_MASK, (x))
|
||||
#define GRC_CODE_NOM_MASK REG_GENMASK(7, 0)
|
||||
#define GRC_CODE_NOM(x) REG_FIELD_PREP(GRC_CODE_NOM_MASK, (x))
|
||||
#define BXT_PORT_REF_DW6(phy) _BXT_PHY((phy), _PORT_REF_DW6_BC)
|
||||
|
||||
#define _PORT_REF_DW8_A 0x1621A0
|
||||
#define _PORT_REF_DW8_BC 0x6C1A0
|
||||
#define GRC_DIS REG_BIT(15)
|
||||
#define GRC_RDY_OVRD REG_BIT(1)
|
||||
#define BXT_PORT_REF_DW8(phy) _BXT_PHY((phy), _PORT_REF_DW8_BC)
|
||||
|
||||
/* BXT PHY PCS registers */
|
||||
#define _PORT_PCS_DW10_LN01_A 0x162428
|
||||
#define _PORT_PCS_DW10_LN01_B 0x6C428
|
||||
#define _PORT_PCS_DW10_LN01_C 0x6C828
|
||||
#define _PORT_PCS_DW10_GRP_A 0x162C28
|
||||
#define _PORT_PCS_DW10_GRP_B 0x6CC28
|
||||
#define _PORT_PCS_DW10_GRP_C 0x6CE28
|
||||
#define BXT_PORT_PCS_DW10_LN01(phy, ch) _MMIO_BXT_PHY_CH(phy, ch, \
|
||||
_PORT_PCS_DW10_LN01_B, \
|
||||
_PORT_PCS_DW10_LN01_C)
|
||||
#define BXT_PORT_PCS_DW10_GRP(phy, ch) _MMIO_BXT_PHY_CH(phy, ch, \
|
||||
_PORT_PCS_DW10_GRP_B, \
|
||||
_PORT_PCS_DW10_GRP_C)
|
||||
|
||||
#define TX2_SWING_CALC_INIT REG_BIT(31)
|
||||
#define TX1_SWING_CALC_INIT REG_BIT(30)
|
||||
|
||||
#define _PORT_PCS_DW12_LN01_A 0x162430
|
||||
#define _PORT_PCS_DW12_LN01_B 0x6C430
|
||||
#define _PORT_PCS_DW12_LN01_C 0x6C830
|
||||
#define _PORT_PCS_DW12_LN23_A 0x162630
|
||||
#define _PORT_PCS_DW12_LN23_B 0x6C630
|
||||
#define _PORT_PCS_DW12_LN23_C 0x6CA30
|
||||
#define _PORT_PCS_DW12_GRP_A 0x162c30
|
||||
#define _PORT_PCS_DW12_GRP_B 0x6CC30
|
||||
#define _PORT_PCS_DW12_GRP_C 0x6CE30
|
||||
#define LANESTAGGER_STRAP_OVRD REG_BIT(6)
|
||||
#define LANE_STAGGER_MASK REG_GENMASK(4, 0)
|
||||
#define BXT_PORT_PCS_DW12_LN01(phy, ch) _MMIO_BXT_PHY_CH(phy, ch, \
|
||||
_PORT_PCS_DW12_LN01_B, \
|
||||
_PORT_PCS_DW12_LN01_C)
|
||||
#define BXT_PORT_PCS_DW12_LN23(phy, ch) _MMIO_BXT_PHY_CH(phy, ch, \
|
||||
_PORT_PCS_DW12_LN23_B, \
|
||||
_PORT_PCS_DW12_LN23_C)
|
||||
#define BXT_PORT_PCS_DW12_GRP(phy, ch) _MMIO_BXT_PHY_CH(phy, ch, \
|
||||
_PORT_PCS_DW12_GRP_B, \
|
||||
_PORT_PCS_DW12_GRP_C)
|
||||
|
||||
/* BXT PHY TX registers */
|
||||
#define _PORT_TX_DW2_LN0_A 0x162508
|
||||
#define _PORT_TX_DW2_LN0_B 0x6C508
|
||||
#define _PORT_TX_DW2_LN0_C 0x6C908
|
||||
#define _PORT_TX_DW2_GRP_A 0x162D08
|
||||
#define _PORT_TX_DW2_GRP_B 0x6CD08
|
||||
#define _PORT_TX_DW2_GRP_C 0x6CF08
|
||||
#define BXT_PORT_TX_DW2_LN(phy, ch, lane) _MMIO_BXT_PHY_CH_LN(phy, ch, lane, \
|
||||
_PORT_TX_DW2_LN0_B, \
|
||||
_PORT_TX_DW2_LN0_C)
|
||||
#define BXT_PORT_TX_DW2_GRP(phy, ch) _MMIO_BXT_PHY_CH(phy, ch, \
|
||||
_PORT_TX_DW2_GRP_B, \
|
||||
_PORT_TX_DW2_GRP_C)
|
||||
#define MARGIN_000_MASK REG_GENMASK(23, 16)
|
||||
#define MARGIN_000(x) REG_FIELD_PREP(MARGIN_000_MASK, (x))
|
||||
#define UNIQ_TRANS_SCALE_MASK REG_GENMASK(15, 8)
|
||||
#define UNIQ_TRANS_SCALE(x) REG_FIELD_PREP(UNIQ_TRANS_SCALE_MASK, (x))
|
||||
|
||||
#define _PORT_TX_DW3_LN0_A 0x16250C
|
||||
#define _PORT_TX_DW3_LN0_B 0x6C50C
|
||||
#define _PORT_TX_DW3_LN0_C 0x6C90C
|
||||
#define _PORT_TX_DW3_GRP_A 0x162D0C
|
||||
#define _PORT_TX_DW3_GRP_B 0x6CD0C
|
||||
#define _PORT_TX_DW3_GRP_C 0x6CF0C
|
||||
#define BXT_PORT_TX_DW3_LN(phy, ch, lane) _MMIO_BXT_PHY_CH_LN(phy, ch, lane, \
|
||||
_PORT_TX_DW3_LN0_B, \
|
||||
_PORT_TX_DW3_LN0_C)
|
||||
#define BXT_PORT_TX_DW3_GRP(phy, ch) _MMIO_BXT_PHY_CH(phy, ch, \
|
||||
_PORT_TX_DW3_GRP_B, \
|
||||
_PORT_TX_DW3_GRP_C)
|
||||
#define SCALE_DCOMP_METHOD REG_BIT(26)
|
||||
#define UNIQUE_TRANGE_EN_METHOD REG_BIT(27)
|
||||
|
||||
#define _PORT_TX_DW4_LN0_A 0x162510
|
||||
#define _PORT_TX_DW4_LN0_B 0x6C510
|
||||
#define _PORT_TX_DW4_LN0_C 0x6C910
|
||||
#define _PORT_TX_DW4_GRP_A 0x162D10
|
||||
#define _PORT_TX_DW4_GRP_B 0x6CD10
|
||||
#define _PORT_TX_DW4_GRP_C 0x6CF10
|
||||
#define BXT_PORT_TX_DW4_LN(phy, ch, lane) _MMIO_BXT_PHY_CH_LN(phy, ch, lane, \
|
||||
_PORT_TX_DW4_LN0_B, \
|
||||
_PORT_TX_DW4_LN0_C)
|
||||
#define BXT_PORT_TX_DW4_GRP(phy, ch) _MMIO_BXT_PHY_CH(phy, ch, \
|
||||
_PORT_TX_DW4_GRP_B, \
|
||||
_PORT_TX_DW4_GRP_C)
|
||||
#define DE_EMPHASIS_MASK REG_GENMASK(31, 24)
|
||||
#define DE_EMPHASIS(x) REG_FIELD_PREP(DE_EMPHASIS_MASK, (x))
|
||||
|
||||
#define _PORT_TX_DW5_LN0_A 0x162514
|
||||
#define _PORT_TX_DW5_LN0_B 0x6C514
|
||||
#define _PORT_TX_DW5_LN0_C 0x6C914
|
||||
#define _PORT_TX_DW5_GRP_A 0x162D14
|
||||
#define _PORT_TX_DW5_GRP_B 0x6CD14
|
||||
#define _PORT_TX_DW5_GRP_C 0x6CF14
|
||||
#define BXT_PORT_TX_DW5_LN(phy, ch, lane) _MMIO_BXT_PHY_CH_LN(phy, ch, lane, \
|
||||
_PORT_TX_DW5_LN0_B, \
|
||||
_PORT_TX_DW5_LN0_C)
|
||||
#define BXT_PORT_TX_DW5_GRP(phy, ch) _MMIO_BXT_PHY_CH(phy, ch, \
|
||||
_PORT_TX_DW5_GRP_B, \
|
||||
_PORT_TX_DW5_GRP_C)
|
||||
#define DCC_DELAY_RANGE_1 REG_BIT(9)
|
||||
#define DCC_DELAY_RANGE_2 REG_BIT(8)
|
||||
|
||||
#define _PORT_TX_DW14_LN0_A 0x162538
|
||||
#define _PORT_TX_DW14_LN0_B 0x6C538
|
||||
#define _PORT_TX_DW14_LN0_C 0x6C938
|
||||
#define LATENCY_OPTIM REG_BIT(30)
|
||||
#define BXT_PORT_TX_DW14_LN(phy, ch, lane) _MMIO_BXT_PHY_CH_LN(phy, ch, lane, \
|
||||
_PORT_TX_DW14_LN0_B, \
|
||||
_PORT_TX_DW14_LN0_C)
|
||||
|
||||
#endif /* __BXT_DPIO_PHY_REGS_H__ */
|
@ -83,16 +83,16 @@ static u32 scale_hw_to_user(struct intel_connector *connector,
|
||||
|
||||
u32 intel_backlight_invert_pwm_level(struct intel_connector *connector, u32 val)
|
||||
{
|
||||
struct drm_i915_private *i915 = to_i915(connector->base.dev);
|
||||
struct intel_display *display = to_intel_display(connector);
|
||||
struct intel_panel *panel = &connector->panel;
|
||||
|
||||
drm_WARN_ON(&i915->drm, panel->backlight.pwm_level_max == 0);
|
||||
drm_WARN_ON(display->drm, panel->backlight.pwm_level_max == 0);
|
||||
|
||||
if (i915->display.params.invert_brightness < 0)
|
||||
if (display->params.invert_brightness < 0)
|
||||
return val;
|
||||
|
||||
if (i915->display.params.invert_brightness > 0 ||
|
||||
intel_has_quirk(i915, QUIRK_INVERT_BRIGHTNESS)) {
|
||||
if (display->params.invert_brightness > 0 ||
|
||||
intel_has_quirk(display, QUIRK_INVERT_BRIGHTNESS)) {
|
||||
return panel->backlight.pwm_level_max - val + panel->backlight.pwm_level_min;
|
||||
}
|
||||
|
||||
@ -126,15 +126,15 @@ u32 intel_backlight_level_to_pwm(struct intel_connector *connector, u32 val)
|
||||
|
||||
u32 intel_backlight_level_from_pwm(struct intel_connector *connector, u32 val)
|
||||
{
|
||||
struct drm_i915_private *i915 = to_i915(connector->base.dev);
|
||||
struct intel_display *display = to_intel_display(connector);
|
||||
struct intel_panel *panel = &connector->panel;
|
||||
|
||||
drm_WARN_ON_ONCE(&i915->drm,
|
||||
drm_WARN_ON_ONCE(display->drm,
|
||||
panel->backlight.max == 0 || panel->backlight.pwm_level_max == 0);
|
||||
|
||||
if (i915->display.params.invert_brightness > 0 ||
|
||||
(i915->display.params.invert_brightness == 0 &&
|
||||
intel_has_quirk(i915, QUIRK_INVERT_BRIGHTNESS)))
|
||||
if (display->params.invert_brightness > 0 ||
|
||||
(display->params.invert_brightness == 0 &&
|
||||
intel_has_quirk(display, QUIRK_INVERT_BRIGHTNESS)))
|
||||
val = panel->backlight.pwm_level_max - (val - panel->backlight.pwm_level_min);
|
||||
|
||||
return scale(val, panel->backlight.pwm_level_min, panel->backlight.pwm_level_max,
|
||||
@ -1642,17 +1642,17 @@ void intel_backlight_update(struct intel_atomic_state *state,
|
||||
|
||||
int intel_backlight_setup(struct intel_connector *connector, enum pipe pipe)
|
||||
{
|
||||
struct drm_i915_private *i915 = to_i915(connector->base.dev);
|
||||
struct intel_display *display = to_intel_display(connector);
|
||||
struct intel_panel *panel = &connector->panel;
|
||||
int ret;
|
||||
|
||||
if (!connector->panel.vbt.backlight.present) {
|
||||
if (intel_has_quirk(i915, QUIRK_BACKLIGHT_PRESENT)) {
|
||||
drm_dbg_kms(&i915->drm,
|
||||
if (intel_has_quirk(display, QUIRK_BACKLIGHT_PRESENT)) {
|
||||
drm_dbg_kms(display->drm,
|
||||
"[CONNECTOR:%d:%s] no backlight present per VBT, but present per quirk\n",
|
||||
connector->base.base.id, connector->base.name);
|
||||
} else {
|
||||
drm_dbg_kms(&i915->drm,
|
||||
drm_dbg_kms(display->drm,
|
||||
"[CONNECTOR:%d:%s] no backlight present per VBT\n",
|
||||
connector->base.base.id, connector->base.name);
|
||||
return 0;
|
||||
@ -1660,16 +1660,16 @@ int intel_backlight_setup(struct intel_connector *connector, enum pipe pipe)
|
||||
}
|
||||
|
||||
/* ensure intel_panel has been initialized first */
|
||||
if (drm_WARN_ON(&i915->drm, !panel->backlight.funcs))
|
||||
if (drm_WARN_ON(display->drm, !panel->backlight.funcs))
|
||||
return -ENODEV;
|
||||
|
||||
/* set level and max in panel struct */
|
||||
mutex_lock(&i915->display.backlight.lock);
|
||||
mutex_lock(&display->backlight.lock);
|
||||
ret = panel->backlight.funcs->setup(connector, pipe);
|
||||
mutex_unlock(&i915->display.backlight.lock);
|
||||
mutex_unlock(&display->backlight.lock);
|
||||
|
||||
if (ret) {
|
||||
drm_dbg_kms(&i915->drm,
|
||||
drm_dbg_kms(display->drm,
|
||||
"[CONNECTOR:%d:%s] failed to setup backlight\n",
|
||||
connector->base.base.id, connector->base.name);
|
||||
return ret;
|
||||
@ -1677,7 +1677,7 @@ int intel_backlight_setup(struct intel_connector *connector, enum pipe pipe)
|
||||
|
||||
panel->backlight.present = true;
|
||||
|
||||
drm_dbg_kms(&i915->drm,
|
||||
drm_dbg_kms(display->drm,
|
||||
"[CONNECTOR:%d:%s] backlight initialized, %s, brightness %u/%u\n",
|
||||
connector->base.base.id, connector->base.name,
|
||||
str_enabled_disabled(panel->backlight.enabled),
|
||||
@ -1821,7 +1821,7 @@ void intel_backlight_init_funcs(struct intel_panel *panel)
|
||||
if (intel_dp_aux_init_backlight_funcs(connector) == 0)
|
||||
return;
|
||||
|
||||
if (!intel_has_quirk(i915, QUIRK_NO_PPS_BACKLIGHT_POWER_HOOK))
|
||||
if (!intel_has_quirk(&i915->display, QUIRK_NO_PPS_BACKLIGHT_POWER_HOOK))
|
||||
connector->panel.backlight.power = intel_pps_backlight_power;
|
||||
}
|
||||
|
||||
|
@ -162,7 +162,9 @@ int icl_pcode_restrict_qgv_points(struct drm_i915_private *dev_priv,
|
||||
1);
|
||||
|
||||
if (ret < 0) {
|
||||
drm_err(&dev_priv->drm, "Failed to disable qgv points (%d) points: 0x%x\n", ret, points_mask);
|
||||
drm_err(&dev_priv->drm,
|
||||
"Failed to disable qgv points (0x%x) points: 0x%x\n",
|
||||
ret, points_mask);
|
||||
return ret;
|
||||
}
|
||||
|
||||
@ -290,8 +292,10 @@ static int icl_get_qgv_points(struct drm_i915_private *dev_priv,
|
||||
struct intel_qgv_point *sp = &qi->points[i];
|
||||
|
||||
ret = intel_read_qgv_point_info(dev_priv, sp, i);
|
||||
if (ret)
|
||||
if (ret) {
|
||||
drm_dbg_kms(&dev_priv->drm, "Could not read QGV %d info\n", i);
|
||||
return ret;
|
||||
}
|
||||
|
||||
drm_dbg_kms(&dev_priv->drm,
|
||||
"QGV %d: DCLK=%d tRP=%d tRDPRE=%d tRAS=%d tRCD=%d tRC=%d\n",
|
||||
@ -659,6 +663,22 @@ static unsigned int adl_psf_bw(struct drm_i915_private *dev_priv,
|
||||
return bi->psf_bw[psf_gv_point];
|
||||
}
|
||||
|
||||
static unsigned int icl_qgv_bw(struct drm_i915_private *i915,
|
||||
int num_active_planes, int qgv_point)
|
||||
{
|
||||
unsigned int idx;
|
||||
|
||||
if (DISPLAY_VER(i915) >= 12)
|
||||
idx = tgl_max_bw_index(i915, num_active_planes, qgv_point);
|
||||
else
|
||||
idx = icl_max_bw_index(i915, num_active_planes, qgv_point);
|
||||
|
||||
if (idx >= ARRAY_SIZE(i915->display.bw.max))
|
||||
return 0;
|
||||
|
||||
return i915->display.bw.max[idx].deratedbw[qgv_point];
|
||||
}
|
||||
|
||||
void intel_bw_init_hw(struct drm_i915_private *dev_priv)
|
||||
{
|
||||
if (!HAS_DISPLAY(dev_priv))
|
||||
@ -735,6 +755,7 @@ void intel_bw_crtc_update(struct intel_bw_state *bw_state,
|
||||
intel_bw_crtc_data_rate(crtc_state);
|
||||
bw_state->num_active_planes[crtc->pipe] =
|
||||
intel_bw_crtc_num_active_planes(crtc_state);
|
||||
bw_state->force_check_qgv = true;
|
||||
|
||||
drm_dbg_kms(&i915->drm, "pipe %c data rate %u num active planes %u\n",
|
||||
pipe_name(crtc->pipe),
|
||||
@ -804,6 +825,80 @@ intel_atomic_get_bw_state(struct intel_atomic_state *state)
|
||||
return to_intel_bw_state(bw_state);
|
||||
}
|
||||
|
||||
static unsigned int icl_max_bw_qgv_point_mask(struct drm_i915_private *i915,
|
||||
int num_active_planes)
|
||||
{
|
||||
unsigned int num_qgv_points = i915->display.bw.max[0].num_qgv_points;
|
||||
unsigned int max_bw_point = 0;
|
||||
unsigned int max_bw = 0;
|
||||
int i;
|
||||
|
||||
for (i = 0; i < num_qgv_points; i++) {
|
||||
unsigned int max_data_rate =
|
||||
icl_qgv_bw(i915, num_active_planes, i);
|
||||
|
||||
/*
|
||||
* We need to know which qgv point gives us
|
||||
* maximum bandwidth in order to disable SAGV
|
||||
* if we find that we exceed SAGV block time
|
||||
* with watermarks. By that moment we already
|
||||
* have those, as it is calculated earlier in
|
||||
* intel_atomic_check,
|
||||
*/
|
||||
if (max_data_rate > max_bw) {
|
||||
max_bw_point = BIT(i);
|
||||
max_bw = max_data_rate;
|
||||
}
|
||||
}
|
||||
|
||||
return max_bw_point;
|
||||
}
|
||||
|
||||
static u16 icl_prepare_qgv_points_mask(struct drm_i915_private *i915,
|
||||
unsigned int qgv_points,
|
||||
unsigned int psf_points)
|
||||
{
|
||||
return ~(ICL_PCODE_REQ_QGV_PT(qgv_points) |
|
||||
ADLS_PCODE_REQ_PSF_PT(psf_points)) & icl_qgv_points_mask(i915);
|
||||
}
|
||||
|
||||
static unsigned int icl_max_bw_psf_gv_point_mask(struct drm_i915_private *i915)
|
||||
{
|
||||
unsigned int num_psf_gv_points = i915->display.bw.max[0].num_psf_gv_points;
|
||||
unsigned int max_bw_point_mask = 0;
|
||||
unsigned int max_bw = 0;
|
||||
int i;
|
||||
|
||||
for (i = 0; i < num_psf_gv_points; i++) {
|
||||
unsigned int max_data_rate = adl_psf_bw(i915, i);
|
||||
|
||||
if (max_data_rate > max_bw) {
|
||||
max_bw_point_mask = BIT(i);
|
||||
max_bw = max_data_rate;
|
||||
} else if (max_data_rate == max_bw) {
|
||||
max_bw_point_mask |= BIT(i);
|
||||
}
|
||||
}
|
||||
|
||||
return max_bw_point_mask;
|
||||
}
|
||||
|
||||
static void icl_force_disable_sagv(struct drm_i915_private *i915,
|
||||
struct intel_bw_state *bw_state)
|
||||
{
|
||||
unsigned int qgv_points = icl_max_bw_qgv_point_mask(i915, 0);
|
||||
unsigned int psf_points = icl_max_bw_psf_gv_point_mask(i915);
|
||||
|
||||
bw_state->qgv_points_mask = icl_prepare_qgv_points_mask(i915,
|
||||
qgv_points,
|
||||
psf_points);
|
||||
|
||||
drm_dbg_kms(&i915->drm, "Forcing SAGV disable: mask 0x%x\n",
|
||||
bw_state->qgv_points_mask);
|
||||
|
||||
icl_pcode_restrict_qgv_points(i915, bw_state->qgv_points_mask);
|
||||
}
|
||||
|
||||
static int mtl_find_qgv_points(struct drm_i915_private *i915,
|
||||
unsigned int data_rate,
|
||||
unsigned int num_active_planes,
|
||||
@ -881,8 +976,6 @@ static int icl_find_qgv_points(struct drm_i915_private *i915,
|
||||
const struct intel_bw_state *old_bw_state,
|
||||
struct intel_bw_state *new_bw_state)
|
||||
{
|
||||
unsigned int max_bw_point = 0;
|
||||
unsigned int max_bw = 0;
|
||||
unsigned int num_psf_gv_points = i915->display.bw.max[0].num_psf_gv_points;
|
||||
unsigned int num_qgv_points = i915->display.bw.max[0].num_qgv_points;
|
||||
u16 psf_points = 0;
|
||||
@ -895,31 +988,8 @@ static int icl_find_qgv_points(struct drm_i915_private *i915,
|
||||
return ret;
|
||||
|
||||
for (i = 0; i < num_qgv_points; i++) {
|
||||
unsigned int idx;
|
||||
unsigned int max_data_rate;
|
||||
|
||||
if (DISPLAY_VER(i915) >= 12)
|
||||
idx = tgl_max_bw_index(i915, num_active_planes, i);
|
||||
else
|
||||
idx = icl_max_bw_index(i915, num_active_planes, i);
|
||||
|
||||
if (idx >= ARRAY_SIZE(i915->display.bw.max))
|
||||
continue;
|
||||
|
||||
max_data_rate = i915->display.bw.max[idx].deratedbw[i];
|
||||
|
||||
/*
|
||||
* We need to know which qgv point gives us
|
||||
* maximum bandwidth in order to disable SAGV
|
||||
* if we find that we exceed SAGV block time
|
||||
* with watermarks. By that moment we already
|
||||
* have those, as it is calculated earlier in
|
||||
* intel_atomic_check,
|
||||
*/
|
||||
if (max_data_rate > max_bw) {
|
||||
max_bw_point = i;
|
||||
max_bw = max_data_rate;
|
||||
}
|
||||
unsigned int max_data_rate = icl_qgv_bw(i915,
|
||||
num_active_planes, i);
|
||||
if (max_data_rate >= data_rate)
|
||||
qgv_points |= BIT(i);
|
||||
|
||||
@ -963,20 +1033,18 @@ static int icl_find_qgv_points(struct drm_i915_private *i915,
|
||||
* cause.
|
||||
*/
|
||||
if (!intel_can_enable_sagv(i915, new_bw_state)) {
|
||||
qgv_points = BIT(max_bw_point);
|
||||
drm_dbg_kms(&i915->drm, "No SAGV, using single QGV point %d\n",
|
||||
max_bw_point);
|
||||
qgv_points = icl_max_bw_qgv_point_mask(i915, num_active_planes);
|
||||
drm_dbg_kms(&i915->drm, "No SAGV, using single QGV point mask 0x%x\n",
|
||||
qgv_points);
|
||||
}
|
||||
|
||||
/*
|
||||
* We store the ones which need to be masked as that is what PCode
|
||||
* actually accepts as a parameter.
|
||||
*/
|
||||
new_bw_state->qgv_points_mask =
|
||||
~(ICL_PCODE_REQ_QGV_PT(qgv_points) |
|
||||
ADLS_PCODE_REQ_PSF_PT(psf_points)) &
|
||||
icl_qgv_points_mask(i915);
|
||||
|
||||
new_bw_state->qgv_points_mask = icl_prepare_qgv_points_mask(i915,
|
||||
qgv_points,
|
||||
psf_points);
|
||||
/*
|
||||
* If the actual mask had changed we need to make sure that
|
||||
* the commits are serialized(in case this is a nomodeset, nonblocking)
|
||||
@ -1272,8 +1340,9 @@ int intel_bw_atomic_check(struct intel_atomic_state *state)
|
||||
new_bw_state = intel_atomic_get_new_bw_state(state);
|
||||
|
||||
if (new_bw_state &&
|
||||
intel_can_enable_sagv(i915, old_bw_state) !=
|
||||
intel_can_enable_sagv(i915, new_bw_state))
|
||||
(intel_can_enable_sagv(i915, old_bw_state) !=
|
||||
intel_can_enable_sagv(i915, new_bw_state) ||
|
||||
new_bw_state->force_check_qgv))
|
||||
changed = true;
|
||||
|
||||
/*
|
||||
@ -1287,6 +1356,8 @@ int intel_bw_atomic_check(struct intel_atomic_state *state)
|
||||
if (ret)
|
||||
return ret;
|
||||
|
||||
new_bw_state->force_check_qgv = false;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
@ -1313,7 +1384,7 @@ static const struct intel_global_state_funcs intel_bw_funcs = {
|
||||
.atomic_destroy_state = intel_bw_destroy_state,
|
||||
};
|
||||
|
||||
int intel_bw_init(struct drm_i915_private *dev_priv)
|
||||
int intel_bw_init(struct drm_i915_private *i915)
|
||||
{
|
||||
struct intel_bw_state *state;
|
||||
|
||||
@ -1321,8 +1392,15 @@ int intel_bw_init(struct drm_i915_private *dev_priv)
|
||||
if (!state)
|
||||
return -ENOMEM;
|
||||
|
||||
intel_atomic_global_obj_init(dev_priv, &dev_priv->display.bw.obj,
|
||||
intel_atomic_global_obj_init(i915, &i915->display.bw.obj,
|
||||
&state->base, &intel_bw_funcs);
|
||||
|
||||
/*
|
||||
* Limit this only if we have SAGV. And for Display version 14 onwards
|
||||
* sagv is handled though pmdemand requests
|
||||
*/
|
||||
if (intel_has_sagv(i915) && IS_DISPLAY_VER(i915, 11, 13))
|
||||
icl_force_disable_sagv(i915, state);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
@ -47,6 +47,12 @@ struct intel_bw_state {
|
||||
*/
|
||||
u16 qgv_points_mask;
|
||||
|
||||
/*
|
||||
* Flag to force the QGV comparison in atomic check right after the
|
||||
* hw state readout
|
||||
*/
|
||||
bool force_check_qgv;
|
||||
|
||||
int min_cdclk[I915_MAX_PIPES];
|
||||
unsigned int data_rate[I915_MAX_PIPES];
|
||||
u8 num_active_planes[I915_MAX_PIPES];
|
||||
|
@ -1827,7 +1827,7 @@ static void intel_c10pll_update_pll(struct intel_crtc_state *crtc_state,
|
||||
struct intel_encoder *encoder)
|
||||
{
|
||||
struct drm_i915_private *i915 = to_i915(encoder->base.dev);
|
||||
struct intel_cx0pll_state *pll_state = &crtc_state->cx0pll_state;
|
||||
struct intel_cx0pll_state *pll_state = &crtc_state->dpll_hw_state.cx0pll;
|
||||
int i;
|
||||
|
||||
if (intel_crtc_has_dp_encoder(crtc_state)) {
|
||||
@ -1859,7 +1859,7 @@ static int intel_c10pll_calc_state(struct intel_crtc_state *crtc_state,
|
||||
|
||||
for (i = 0; tables[i]; i++) {
|
||||
if (crtc_state->port_clock == tables[i]->clock) {
|
||||
crtc_state->cx0pll_state.c10 = *tables[i];
|
||||
crtc_state->dpll_hw_state.cx0pll.c10 = *tables[i];
|
||||
intel_c10pll_update_pll(crtc_state, encoder);
|
||||
|
||||
return 0;
|
||||
@ -1899,7 +1899,7 @@ static void intel_c10_pll_program(struct drm_i915_private *i915,
|
||||
const struct intel_crtc_state *crtc_state,
|
||||
struct intel_encoder *encoder)
|
||||
{
|
||||
const struct intel_c10pll_state *pll_state = &crtc_state->cx0pll_state.c10;
|
||||
const struct intel_c10pll_state *pll_state = &crtc_state->dpll_hw_state.cx0pll.c10;
|
||||
int i;
|
||||
|
||||
intel_cx0_rmw(encoder, INTEL_CX0_BOTH_LANES, PHY_C10_VDR_CONTROL(1),
|
||||
@ -2079,7 +2079,7 @@ static int intel_c20pll_calc_state(struct intel_crtc_state *crtc_state,
|
||||
/* try computed C20 HDMI tables before using consolidated tables */
|
||||
if (intel_crtc_has_type(crtc_state, INTEL_OUTPUT_HDMI)) {
|
||||
if (intel_c20_compute_hdmi_tmds_pll(crtc_state->port_clock,
|
||||
&crtc_state->cx0pll_state.c20) == 0)
|
||||
&crtc_state->dpll_hw_state.cx0pll.c20) == 0)
|
||||
return 0;
|
||||
}
|
||||
|
||||
@ -2089,7 +2089,7 @@ static int intel_c20pll_calc_state(struct intel_crtc_state *crtc_state,
|
||||
|
||||
for (i = 0; tables[i]; i++) {
|
||||
if (crtc_state->port_clock == tables[i]->clock) {
|
||||
crtc_state->cx0pll_state.c20 = *tables[i];
|
||||
crtc_state->dpll_hw_state.cx0pll.c20 = *tables[i];
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
@ -2335,7 +2335,7 @@ static void intel_c20_pll_program(struct drm_i915_private *i915,
|
||||
const struct intel_crtc_state *crtc_state,
|
||||
struct intel_encoder *encoder)
|
||||
{
|
||||
const struct intel_c20pll_state *pll_state = &crtc_state->cx0pll_state.c20;
|
||||
const struct intel_c20pll_state *pll_state = &crtc_state->dpll_hw_state.cx0pll.c20;
|
||||
bool dp = false;
|
||||
int lane = crtc_state->lane_count > 2 ? INTEL_CX0_BOTH_LANES : INTEL_CX0_LANE0;
|
||||
u32 clock = crtc_state->port_clock;
|
||||
@ -2484,9 +2484,9 @@ static void intel_program_port_clock_ctl(struct intel_encoder *encoder,
|
||||
/* TODO: HDMI FRL */
|
||||
/* DP2.0 10G and 20G rates enable MPLLA*/
|
||||
if (crtc_state->port_clock == 1000000 || crtc_state->port_clock == 2000000)
|
||||
val |= crtc_state->cx0pll_state.ssc_enabled ? XELPDP_SSC_ENABLE_PLLA : 0;
|
||||
val |= crtc_state->dpll_hw_state.cx0pll.ssc_enabled ? XELPDP_SSC_ENABLE_PLLA : 0;
|
||||
else
|
||||
val |= crtc_state->cx0pll_state.ssc_enabled ? XELPDP_SSC_ENABLE_PLLB : 0;
|
||||
val |= crtc_state->dpll_hw_state.cx0pll.ssc_enabled ? XELPDP_SSC_ENABLE_PLLB : 0;
|
||||
|
||||
intel_de_rmw(i915, XELPDP_PORT_CLOCK_CTL(i915, encoder->port),
|
||||
XELPDP_LANE1_PHY_CLOCK_SELECT | XELPDP_FORWARD_CLOCK_UNGATE |
|
||||
@ -3025,7 +3025,7 @@ static void intel_c10pll_state_verify(const struct intel_crtc_state *state,
|
||||
struct intel_c10pll_state *mpllb_hw_state)
|
||||
{
|
||||
struct drm_i915_private *i915 = to_i915(crtc->base.dev);
|
||||
const struct intel_c10pll_state *mpllb_sw_state = &state->cx0pll_state.c10;
|
||||
const struct intel_c10pll_state *mpllb_sw_state = &state->dpll_hw_state.cx0pll.c10;
|
||||
int i;
|
||||
|
||||
if (intel_crtc_needs_fastset(state))
|
||||
@ -3075,7 +3075,7 @@ static void intel_c20pll_state_verify(const struct intel_crtc_state *state,
|
||||
struct intel_c20pll_state *mpll_hw_state)
|
||||
{
|
||||
struct drm_i915_private *i915 = to_i915(crtc->base.dev);
|
||||
const struct intel_c20pll_state *mpll_sw_state = &state->cx0pll_state.c20;
|
||||
const struct intel_c20pll_state *mpll_sw_state = &state->dpll_hw_state.cx0pll.c20;
|
||||
bool sw_use_mpllb = intel_c20phy_use_mpllb(mpll_sw_state);
|
||||
bool hw_use_mpllb = intel_c20phy_use_mpllb(mpll_hw_state);
|
||||
int i;
|
||||
|
@ -631,6 +631,7 @@ intel_ddi_config_transcoder_func(struct intel_encoder *encoder,
|
||||
|
||||
void intel_ddi_disable_transcoder_func(const struct intel_crtc_state *crtc_state)
|
||||
{
|
||||
struct intel_display *display = to_intel_display(crtc_state);
|
||||
struct intel_crtc *crtc = to_intel_crtc(crtc_state->uapi.crtc);
|
||||
struct drm_i915_private *dev_priv = to_i915(crtc->base.dev);
|
||||
enum transcoder cpu_transcoder = crtc_state->cpu_transcoder;
|
||||
@ -661,10 +662,9 @@ void intel_ddi_disable_transcoder_func(const struct intel_crtc_state *crtc_state
|
||||
|
||||
intel_de_write(dev_priv, TRANS_DDI_FUNC_CTL(cpu_transcoder), ctl);
|
||||
|
||||
if (intel_has_quirk(dev_priv, QUIRK_INCREASE_DDI_DISABLED_TIME) &&
|
||||
if (intel_has_quirk(display, QUIRK_INCREASE_DDI_DISABLED_TIME) &&
|
||||
intel_crtc_has_type(crtc_state, INTEL_OUTPUT_HDMI)) {
|
||||
drm_dbg_kms(&dev_priv->drm,
|
||||
"Quirk Increase DDI disabled time\n");
|
||||
drm_dbg_kms(display->drm, "Quirk Increase DDI disabled time\n");
|
||||
/* Quirk time at 100ms for reliable operation */
|
||||
msleep(100);
|
||||
}
|
||||
@ -2336,10 +2336,15 @@ static void intel_ddi_power_up_lanes(struct intel_encoder *encoder,
|
||||
}
|
||||
}
|
||||
|
||||
/* Splitter enable for eDP MSO is limited to certain pipes. */
|
||||
/*
|
||||
* Splitter enable for eDP MSO is limited to certain pipes, on certain
|
||||
* platforms.
|
||||
*/
|
||||
static u8 intel_ddi_splitter_pipe_mask(struct drm_i915_private *i915)
|
||||
{
|
||||
if (IS_ALDERLAKE_P(i915))
|
||||
if (DISPLAY_VER(i915) > 20)
|
||||
return ~0;
|
||||
else if (IS_ALDERLAKE_P(i915))
|
||||
return BIT(PIPE_A) | BIT(PIPE_B);
|
||||
else
|
||||
return BIT(PIPE_A);
|
||||
@ -3517,8 +3522,8 @@ intel_ddi_pre_pll_enable(struct intel_atomic_state *state,
|
||||
*/
|
||||
intel_tc_port_set_fia_lane_count(dig_port, crtc_state->lane_count);
|
||||
else if (IS_GEMINILAKE(dev_priv) || IS_BROXTON(dev_priv))
|
||||
bxt_ddi_phy_set_lane_optim_mask(encoder,
|
||||
crtc_state->lane_lat_optim_mask);
|
||||
bxt_dpio_phy_set_lane_optim_mask(encoder,
|
||||
crtc_state->lane_lat_optim_mask);
|
||||
}
|
||||
|
||||
static void adlp_tbt_to_dp_alt_switch_wa(struct intel_encoder *encoder)
|
||||
@ -3950,7 +3955,7 @@ static void intel_ddi_get_config(struct intel_encoder *encoder,
|
||||
|
||||
if (IS_GEMINILAKE(dev_priv) || IS_BROXTON(dev_priv))
|
||||
pipe_config->lane_lat_optim_mask =
|
||||
bxt_ddi_phy_get_lane_lat_optim_mask(encoder);
|
||||
bxt_dpio_phy_get_lane_lat_optim_mask(encoder);
|
||||
|
||||
intel_ddi_compute_min_voltage_level(pipe_config);
|
||||
|
||||
@ -4011,8 +4016,8 @@ static void mtl_ddi_get_config(struct intel_encoder *encoder,
|
||||
if (intel_tc_port_in_tbt_alt_mode(dig_port)) {
|
||||
crtc_state->port_clock = intel_mtl_tbt_calc_port_clock(encoder);
|
||||
} else {
|
||||
intel_cx0pll_readout_hw_state(encoder, &crtc_state->cx0pll_state);
|
||||
crtc_state->port_clock = intel_cx0pll_calc_port_clock(encoder, &crtc_state->cx0pll_state);
|
||||
intel_cx0pll_readout_hw_state(encoder, &crtc_state->dpll_hw_state.cx0pll);
|
||||
crtc_state->port_clock = intel_cx0pll_calc_port_clock(encoder, &crtc_state->dpll_hw_state.cx0pll);
|
||||
}
|
||||
|
||||
intel_ddi_get_config(encoder, crtc_state);
|
||||
@ -4021,8 +4026,8 @@ static void mtl_ddi_get_config(struct intel_encoder *encoder,
|
||||
static void dg2_ddi_get_config(struct intel_encoder *encoder,
|
||||
struct intel_crtc_state *crtc_state)
|
||||
{
|
||||
intel_mpllb_readout_hw_state(encoder, &crtc_state->mpllb_state);
|
||||
crtc_state->port_clock = intel_mpllb_calc_port_clock(encoder, &crtc_state->mpllb_state);
|
||||
intel_mpllb_readout_hw_state(encoder, &crtc_state->dpll_hw_state.mpllb);
|
||||
crtc_state->port_clock = intel_mpllb_calc_port_clock(encoder, &crtc_state->dpll_hw_state.mpllb);
|
||||
|
||||
intel_ddi_get_config(encoder, crtc_state);
|
||||
}
|
||||
@ -4227,7 +4232,7 @@ static int intel_ddi_compute_config(struct intel_encoder *encoder,
|
||||
|
||||
if (IS_GEMINILAKE(dev_priv) || IS_BROXTON(dev_priv))
|
||||
pipe_config->lane_lat_optim_mask =
|
||||
bxt_ddi_phy_calc_lane_lat_optim_mask(pipe_config->lane_count);
|
||||
bxt_dpio_phy_calc_lane_lat_optim_mask(pipe_config->lane_count);
|
||||
|
||||
intel_ddi_compute_min_voltage_level(pipe_config);
|
||||
|
||||
@ -5079,7 +5084,7 @@ void intel_ddi_init(struct drm_i915_private *dev_priv,
|
||||
else
|
||||
encoder->set_signal_levels = icl_mg_phy_set_signal_levels;
|
||||
} else if (IS_GEMINILAKE(dev_priv) || IS_BROXTON(dev_priv)) {
|
||||
encoder->set_signal_levels = bxt_ddi_phy_set_signal_levels;
|
||||
encoder->set_signal_levels = bxt_dpio_phy_set_signal_levels;
|
||||
} else {
|
||||
encoder->set_signal_levels = hsw_set_signal_levels;
|
||||
}
|
||||
|
@ -10,161 +10,185 @@
|
||||
#include "i915_trace.h"
|
||||
#include "intel_uncore.h"
|
||||
|
||||
static inline struct intel_uncore *__to_uncore(struct intel_display *display)
|
||||
{
|
||||
return &to_i915(display->drm)->uncore;
|
||||
}
|
||||
|
||||
static inline u32
|
||||
intel_de_read(struct drm_i915_private *i915, i915_reg_t reg)
|
||||
__intel_de_read(struct intel_display *display, i915_reg_t reg)
|
||||
{
|
||||
u32 val;
|
||||
|
||||
intel_dmc_wl_get(i915, reg);
|
||||
intel_dmc_wl_get(display, reg);
|
||||
|
||||
val = intel_uncore_read(&i915->uncore, reg);
|
||||
val = intel_uncore_read(__to_uncore(display), reg);
|
||||
|
||||
intel_dmc_wl_put(i915, reg);
|
||||
intel_dmc_wl_put(display, reg);
|
||||
|
||||
return val;
|
||||
}
|
||||
#define intel_de_read(p,...) __intel_de_read(__to_intel_display(p), __VA_ARGS__)
|
||||
|
||||
static inline u8
|
||||
intel_de_read8(struct drm_i915_private *i915, i915_reg_t reg)
|
||||
__intel_de_read8(struct intel_display *display, i915_reg_t reg)
|
||||
{
|
||||
u8 val;
|
||||
|
||||
intel_dmc_wl_get(i915, reg);
|
||||
intel_dmc_wl_get(display, reg);
|
||||
|
||||
val = intel_uncore_read8(&i915->uncore, reg);
|
||||
val = intel_uncore_read8(__to_uncore(display), reg);
|
||||
|
||||
intel_dmc_wl_put(i915, reg);
|
||||
intel_dmc_wl_put(display, reg);
|
||||
|
||||
return val;
|
||||
}
|
||||
#define intel_de_read8(p,...) __intel_de_read8(__to_intel_display(p), __VA_ARGS__)
|
||||
|
||||
static inline u64
|
||||
intel_de_read64_2x32(struct drm_i915_private *i915,
|
||||
i915_reg_t lower_reg, i915_reg_t upper_reg)
|
||||
__intel_de_read64_2x32(struct intel_display *display,
|
||||
i915_reg_t lower_reg, i915_reg_t upper_reg)
|
||||
{
|
||||
u64 val;
|
||||
|
||||
intel_dmc_wl_get(i915, lower_reg);
|
||||
intel_dmc_wl_get(i915, upper_reg);
|
||||
intel_dmc_wl_get(display, lower_reg);
|
||||
intel_dmc_wl_get(display, upper_reg);
|
||||
|
||||
val = intel_uncore_read64_2x32(&i915->uncore, lower_reg, upper_reg);
|
||||
val = intel_uncore_read64_2x32(__to_uncore(display), lower_reg,
|
||||
upper_reg);
|
||||
|
||||
intel_dmc_wl_put(i915, upper_reg);
|
||||
intel_dmc_wl_put(i915, lower_reg);
|
||||
intel_dmc_wl_put(display, upper_reg);
|
||||
intel_dmc_wl_put(display, lower_reg);
|
||||
|
||||
return val;
|
||||
}
|
||||
#define intel_de_read64_2x32(p,...) __intel_de_read64_2x32(__to_intel_display(p), __VA_ARGS__)
|
||||
|
||||
static inline void
|
||||
intel_de_posting_read(struct drm_i915_private *i915, i915_reg_t reg)
|
||||
__intel_de_posting_read(struct intel_display *display, i915_reg_t reg)
|
||||
{
|
||||
intel_dmc_wl_get(i915, reg);
|
||||
intel_dmc_wl_get(display, reg);
|
||||
|
||||
intel_uncore_posting_read(&i915->uncore, reg);
|
||||
intel_uncore_posting_read(__to_uncore(display), reg);
|
||||
|
||||
intel_dmc_wl_put(i915, reg);
|
||||
intel_dmc_wl_put(display, reg);
|
||||
}
|
||||
#define intel_de_posting_read(p,...) __intel_de_posting_read(__to_intel_display(p), __VA_ARGS__)
|
||||
|
||||
static inline void
|
||||
intel_de_write(struct drm_i915_private *i915, i915_reg_t reg, u32 val)
|
||||
__intel_de_write(struct intel_display *display, i915_reg_t reg, u32 val)
|
||||
{
|
||||
intel_dmc_wl_get(i915, reg);
|
||||
intel_dmc_wl_get(display, reg);
|
||||
|
||||
intel_uncore_write(&i915->uncore, reg, val);
|
||||
intel_uncore_write(__to_uncore(display), reg, val);
|
||||
|
||||
intel_dmc_wl_put(i915, reg);
|
||||
intel_dmc_wl_put(display, reg);
|
||||
}
|
||||
#define intel_de_write(p,...) __intel_de_write(__to_intel_display(p), __VA_ARGS__)
|
||||
|
||||
static inline u32
|
||||
__intel_de_rmw_nowl(struct drm_i915_private *i915, i915_reg_t reg,
|
||||
u32 clear, u32 set)
|
||||
____intel_de_rmw_nowl(struct intel_display *display, i915_reg_t reg,
|
||||
u32 clear, u32 set)
|
||||
{
|
||||
return intel_uncore_rmw(&i915->uncore, reg, clear, set);
|
||||
return intel_uncore_rmw(__to_uncore(display), reg, clear, set);
|
||||
}
|
||||
#define __intel_de_rmw_nowl(p,...) ____intel_de_rmw_nowl(__to_intel_display(p), __VA_ARGS__)
|
||||
|
||||
static inline u32
|
||||
intel_de_rmw(struct drm_i915_private *i915, i915_reg_t reg, u32 clear, u32 set)
|
||||
__intel_de_rmw(struct intel_display *display, i915_reg_t reg, u32 clear,
|
||||
u32 set)
|
||||
{
|
||||
u32 val;
|
||||
|
||||
intel_dmc_wl_get(i915, reg);
|
||||
intel_dmc_wl_get(display, reg);
|
||||
|
||||
val = __intel_de_rmw_nowl(i915, reg, clear, set);
|
||||
val = __intel_de_rmw_nowl(display, reg, clear, set);
|
||||
|
||||
intel_dmc_wl_put(i915, reg);
|
||||
intel_dmc_wl_put(display, reg);
|
||||
|
||||
return val;
|
||||
}
|
||||
#define intel_de_rmw(p,...) __intel_de_rmw(__to_intel_display(p), __VA_ARGS__)
|
||||
|
||||
static inline int
|
||||
__intel_wait_for_register_nowl(struct drm_i915_private *i915, i915_reg_t reg,
|
||||
u32 mask, u32 value, unsigned int timeout)
|
||||
____intel_de_wait_for_register_nowl(struct intel_display *display,
|
||||
i915_reg_t reg,
|
||||
u32 mask, u32 value, unsigned int timeout)
|
||||
{
|
||||
return intel_wait_for_register(&i915->uncore, reg, mask,
|
||||
return intel_wait_for_register(__to_uncore(display), reg, mask,
|
||||
value, timeout);
|
||||
}
|
||||
#define __intel_de_wait_for_register_nowl(p,...) ____intel_de_wait_for_register_nowl(__to_intel_display(p), __VA_ARGS__)
|
||||
|
||||
static inline int
|
||||
intel_de_wait(struct drm_i915_private *i915, i915_reg_t reg,
|
||||
u32 mask, u32 value, unsigned int timeout)
|
||||
__intel_de_wait(struct intel_display *display, i915_reg_t reg,
|
||||
u32 mask, u32 value, unsigned int timeout)
|
||||
{
|
||||
int ret;
|
||||
|
||||
intel_dmc_wl_get(i915, reg);
|
||||
intel_dmc_wl_get(display, reg);
|
||||
|
||||
ret = __intel_wait_for_register_nowl(i915, reg, mask, value, timeout);
|
||||
ret = __intel_de_wait_for_register_nowl(display, reg, mask, value,
|
||||
timeout);
|
||||
|
||||
intel_dmc_wl_put(i915, reg);
|
||||
intel_dmc_wl_put(display, reg);
|
||||
|
||||
return ret;
|
||||
}
|
||||
#define intel_de_wait(p,...) __intel_de_wait(__to_intel_display(p), __VA_ARGS__)
|
||||
|
||||
static inline int
|
||||
intel_de_wait_fw(struct drm_i915_private *i915, i915_reg_t reg,
|
||||
u32 mask, u32 value, unsigned int timeout)
|
||||
__intel_de_wait_fw(struct intel_display *display, i915_reg_t reg,
|
||||
u32 mask, u32 value, unsigned int timeout)
|
||||
{
|
||||
int ret;
|
||||
|
||||
intel_dmc_wl_get(i915, reg);
|
||||
intel_dmc_wl_get(display, reg);
|
||||
|
||||
ret = intel_wait_for_register_fw(&i915->uncore, reg, mask, value, timeout);
|
||||
ret = intel_wait_for_register_fw(__to_uncore(display), reg, mask,
|
||||
value, timeout);
|
||||
|
||||
intel_dmc_wl_put(i915, reg);
|
||||
intel_dmc_wl_put(display, reg);
|
||||
|
||||
return ret;
|
||||
}
|
||||
#define intel_de_wait_fw(p,...) __intel_de_wait_fw(__to_intel_display(p), __VA_ARGS__)
|
||||
|
||||
static inline int
|
||||
intel_de_wait_custom(struct drm_i915_private *i915, i915_reg_t reg,
|
||||
u32 mask, u32 value,
|
||||
unsigned int fast_timeout_us,
|
||||
unsigned int slow_timeout_ms, u32 *out_value)
|
||||
__intel_de_wait_custom(struct intel_display *display, i915_reg_t reg,
|
||||
u32 mask, u32 value,
|
||||
unsigned int fast_timeout_us,
|
||||
unsigned int slow_timeout_ms, u32 *out_value)
|
||||
{
|
||||
int ret;
|
||||
|
||||
intel_dmc_wl_get(i915, reg);
|
||||
intel_dmc_wl_get(display, reg);
|
||||
|
||||
ret = __intel_wait_for_register(&i915->uncore, reg, mask, value,
|
||||
ret = __intel_wait_for_register(__to_uncore(display), reg, mask,
|
||||
value,
|
||||
fast_timeout_us, slow_timeout_ms, out_value);
|
||||
|
||||
intel_dmc_wl_put(i915, reg);
|
||||
intel_dmc_wl_put(display, reg);
|
||||
|
||||
return ret;
|
||||
}
|
||||
#define intel_de_wait_custom(p,...) __intel_de_wait_custom(__to_intel_display(p), __VA_ARGS__)
|
||||
|
||||
static inline int
|
||||
intel_de_wait_for_set(struct drm_i915_private *i915, i915_reg_t reg,
|
||||
u32 mask, unsigned int timeout)
|
||||
{
|
||||
return intel_de_wait(i915, reg, mask, mask, timeout);
|
||||
}
|
||||
|
||||
static inline int
|
||||
intel_de_wait_for_clear(struct drm_i915_private *i915, i915_reg_t reg,
|
||||
__intel_de_wait_for_set(struct intel_display *display, i915_reg_t reg,
|
||||
u32 mask, unsigned int timeout)
|
||||
{
|
||||
return intel_de_wait(i915, reg, mask, 0, timeout);
|
||||
return intel_de_wait(display, reg, mask, mask, timeout);
|
||||
}
|
||||
#define intel_de_wait_for_set(p,...) __intel_de_wait_for_set(__to_intel_display(p), __VA_ARGS__)
|
||||
|
||||
static inline int
|
||||
__intel_de_wait_for_clear(struct intel_display *display, i915_reg_t reg,
|
||||
u32 mask, unsigned int timeout)
|
||||
{
|
||||
return intel_de_wait(display, reg, mask, 0, timeout);
|
||||
}
|
||||
#define intel_de_wait_for_clear(p,...) __intel_de_wait_for_clear(__to_intel_display(p), __VA_ARGS__)
|
||||
|
||||
/*
|
||||
* Unlocked mmio-accessors, think carefully before using these.
|
||||
@ -175,33 +199,38 @@ intel_de_wait_for_clear(struct drm_i915_private *i915, i915_reg_t reg,
|
||||
* a more localised lock guarding all access to that bank of registers.
|
||||
*/
|
||||
static inline u32
|
||||
intel_de_read_fw(struct drm_i915_private *i915, i915_reg_t reg)
|
||||
__intel_de_read_fw(struct intel_display *display, i915_reg_t reg)
|
||||
{
|
||||
u32 val;
|
||||
|
||||
val = intel_uncore_read_fw(&i915->uncore, reg);
|
||||
val = intel_uncore_read_fw(__to_uncore(display), reg);
|
||||
trace_i915_reg_rw(false, reg, val, sizeof(val), true);
|
||||
|
||||
return val;
|
||||
}
|
||||
#define intel_de_read_fw(p,...) __intel_de_read_fw(__to_intel_display(p), __VA_ARGS__)
|
||||
|
||||
static inline void
|
||||
intel_de_write_fw(struct drm_i915_private *i915, i915_reg_t reg, u32 val)
|
||||
__intel_de_write_fw(struct intel_display *display, i915_reg_t reg, u32 val)
|
||||
{
|
||||
trace_i915_reg_rw(true, reg, val, sizeof(val), true);
|
||||
intel_uncore_write_fw(&i915->uncore, reg, val);
|
||||
intel_uncore_write_fw(__to_uncore(display), reg, val);
|
||||
}
|
||||
#define intel_de_write_fw(p,...) __intel_de_write_fw(__to_intel_display(p), __VA_ARGS__)
|
||||
|
||||
static inline u32
|
||||
intel_de_read_notrace(struct drm_i915_private *i915, i915_reg_t reg)
|
||||
__intel_de_read_notrace(struct intel_display *display, i915_reg_t reg)
|
||||
{
|
||||
return intel_uncore_read_notrace(&i915->uncore, reg);
|
||||
return intel_uncore_read_notrace(__to_uncore(display), reg);
|
||||
}
|
||||
#define intel_de_read_notrace(p,...) __intel_de_read_notrace(__to_intel_display(p), __VA_ARGS__)
|
||||
|
||||
static inline void
|
||||
intel_de_write_notrace(struct drm_i915_private *i915, i915_reg_t reg, u32 val)
|
||||
__intel_de_write_notrace(struct intel_display *display, i915_reg_t reg,
|
||||
u32 val)
|
||||
{
|
||||
intel_uncore_write_notrace(&i915->uncore, reg, val);
|
||||
intel_uncore_write_notrace(__to_uncore(display), reg, val);
|
||||
}
|
||||
#define intel_de_write_notrace(p,...) __intel_de_write_notrace(__to_intel_display(p), __VA_ARGS__)
|
||||
|
||||
#endif /* __INTEL_DE_H__ */
|
||||
|
@ -3071,19 +3071,16 @@ static bool i9xx_get_pipe_config(struct intel_crtc *crtc,
|
||||
|
||||
i9xx_get_pfit_config(pipe_config);
|
||||
|
||||
i9xx_dpll_get_hw_state(crtc, &pipe_config->dpll_hw_state);
|
||||
|
||||
if (DISPLAY_VER(dev_priv) >= 4) {
|
||||
/* No way to read it out on pipes B and C */
|
||||
if (IS_CHERRYVIEW(dev_priv) && crtc->pipe != PIPE_A)
|
||||
tmp = dev_priv->display.state.chv_dpll_md[crtc->pipe];
|
||||
else
|
||||
tmp = intel_de_read(dev_priv, DPLL_MD(crtc->pipe));
|
||||
tmp = pipe_config->dpll_hw_state.i9xx.dpll_md;
|
||||
pipe_config->pixel_multiplier =
|
||||
((tmp & DPLL_MD_UDI_MULTIPLIER_MASK)
|
||||
>> DPLL_MD_UDI_MULTIPLIER_SHIFT) + 1;
|
||||
pipe_config->dpll_hw_state.dpll_md = tmp;
|
||||
} else if (IS_I945G(dev_priv) || IS_I945GM(dev_priv) ||
|
||||
IS_G33(dev_priv) || IS_PINEVIEW(dev_priv)) {
|
||||
tmp = intel_de_read(dev_priv, DPLL(crtc->pipe));
|
||||
tmp = pipe_config->dpll_hw_state.i9xx.dpll;
|
||||
pipe_config->pixel_multiplier =
|
||||
((tmp & SDVO_MULTIPLIER_MASK)
|
||||
>> SDVO_MULTIPLIER_SHIFT_HIRES) + 1;
|
||||
@ -3093,26 +3090,13 @@ static bool i9xx_get_pipe_config(struct intel_crtc *crtc,
|
||||
* function. */
|
||||
pipe_config->pixel_multiplier = 1;
|
||||
}
|
||||
pipe_config->dpll_hw_state.dpll = intel_de_read(dev_priv,
|
||||
DPLL(crtc->pipe));
|
||||
if (!IS_VALLEYVIEW(dev_priv) && !IS_CHERRYVIEW(dev_priv)) {
|
||||
pipe_config->dpll_hw_state.fp0 = intel_de_read(dev_priv,
|
||||
FP0(crtc->pipe));
|
||||
pipe_config->dpll_hw_state.fp1 = intel_de_read(dev_priv,
|
||||
FP1(crtc->pipe));
|
||||
} else {
|
||||
/* Mask out read-only status bits. */
|
||||
pipe_config->dpll_hw_state.dpll &= ~(DPLL_LOCK_VLV |
|
||||
DPLL_PORTC_READY_MASK |
|
||||
DPLL_PORTB_READY_MASK);
|
||||
}
|
||||
|
||||
if (IS_CHERRYVIEW(dev_priv))
|
||||
chv_crtc_clock_get(crtc, pipe_config);
|
||||
chv_crtc_clock_get(pipe_config);
|
||||
else if (IS_VALLEYVIEW(dev_priv))
|
||||
vlv_crtc_clock_get(crtc, pipe_config);
|
||||
vlv_crtc_clock_get(pipe_config);
|
||||
else
|
||||
i9xx_crtc_clock_get(crtc, pipe_config);
|
||||
i9xx_crtc_clock_get(pipe_config);
|
||||
|
||||
/*
|
||||
* Normally the dotclock is filled in by the encoder .get_config()
|
||||
@ -3738,8 +3722,8 @@ static bool bxt_get_dsi_transcoder_state(struct intel_crtc *crtc,
|
||||
struct intel_crtc_state *pipe_config,
|
||||
struct intel_display_power_domain_set *power_domain_set)
|
||||
{
|
||||
struct drm_device *dev = crtc->base.dev;
|
||||
struct drm_i915_private *dev_priv = to_i915(dev);
|
||||
struct intel_display *display = to_intel_display(crtc);
|
||||
struct drm_i915_private *dev_priv = to_i915(crtc->base.dev);
|
||||
enum transcoder cpu_transcoder;
|
||||
enum port port;
|
||||
u32 tmp;
|
||||
@ -3765,11 +3749,11 @@ static bool bxt_get_dsi_transcoder_state(struct intel_crtc *crtc,
|
||||
break;
|
||||
|
||||
/* XXX: this works for video mode only */
|
||||
tmp = intel_de_read(dev_priv, BXT_MIPI_PORT_CTRL(port));
|
||||
tmp = intel_de_read(display, BXT_MIPI_PORT_CTRL(port));
|
||||
if (!(tmp & DPI_ENABLE))
|
||||
continue;
|
||||
|
||||
tmp = intel_de_read(dev_priv, MIPI_CTRL(port));
|
||||
tmp = intel_de_read(display, MIPI_CTRL(display, port));
|
||||
if ((tmp & BXT_PIPE_SELECT_MASK) != BXT_PIPE_SELECT(crtc->pipe))
|
||||
continue;
|
||||
|
||||
|
22
drivers/gpu/drm/i915/display/intel_display_conversion.h
Normal file
22
drivers/gpu/drm/i915/display/intel_display_conversion.h
Normal file
@ -0,0 +1,22 @@
|
||||
/* SPDX-License-Identifier: MIT */
|
||||
/* Copyright © 2024 Intel Corporation */
|
||||
|
||||
/*
|
||||
* This header is for transitional struct intel_display conversion helpers only.
|
||||
*/
|
||||
|
||||
#ifndef __INTEL_DISPLAY_CONVERSION__
|
||||
#define __INTEL_DISPLAY_CONVERSION__
|
||||
|
||||
/*
|
||||
* Transitional macro to optionally convert struct drm_i915_private * to struct
|
||||
* intel_display *, also accepting the latter.
|
||||
*/
|
||||
#define __to_intel_display(p) \
|
||||
_Generic(p, \
|
||||
const struct drm_i915_private *: (&((const struct drm_i915_private *)(p))->display), \
|
||||
struct drm_i915_private *: (&((struct drm_i915_private *)(p))->display), \
|
||||
const struct intel_display *: (p), \
|
||||
struct intel_display *: (p))
|
||||
|
||||
#endif /* __INTEL_DISPLAY_CONVERSION__ */
|
@ -283,6 +283,9 @@ struct intel_wm {
|
||||
};
|
||||
|
||||
struct intel_display {
|
||||
/* drm device backpointer */
|
||||
struct drm_device *drm;
|
||||
|
||||
/* Display functions */
|
||||
struct {
|
||||
/* Top level crtc-ish functions */
|
||||
|
@ -638,51 +638,24 @@ static int i915_display_capabilities(struct seq_file *m, void *unused)
|
||||
static int i915_shared_dplls_info(struct seq_file *m, void *unused)
|
||||
{
|
||||
struct drm_i915_private *dev_priv = node_to_i915(m->private);
|
||||
struct drm_printer p = drm_seq_file_printer(m);
|
||||
struct intel_shared_dpll *pll;
|
||||
int i;
|
||||
|
||||
drm_modeset_lock_all(&dev_priv->drm);
|
||||
|
||||
seq_printf(m, "PLL refclks: non-SSC: %d kHz, SSC: %d kHz\n",
|
||||
drm_printf(&p, "PLL refclks: non-SSC: %d kHz, SSC: %d kHz\n",
|
||||
dev_priv->display.dpll.ref_clks.nssc,
|
||||
dev_priv->display.dpll.ref_clks.ssc);
|
||||
|
||||
for_each_shared_dpll(dev_priv, pll, i) {
|
||||
seq_printf(m, "DPLL%i: %s, id: %i\n", pll->index,
|
||||
drm_printf(&p, "DPLL%i: %s, id: %i\n", pll->index,
|
||||
pll->info->name, pll->info->id);
|
||||
seq_printf(m, " pipe_mask: 0x%x, active: 0x%x, on: %s\n",
|
||||
drm_printf(&p, " pipe_mask: 0x%x, active: 0x%x, on: %s\n",
|
||||
pll->state.pipe_mask, pll->active_mask,
|
||||
str_yes_no(pll->on));
|
||||
seq_printf(m, " tracked hardware state:\n");
|
||||
seq_printf(m, " dpll: 0x%08x\n", pll->state.hw_state.dpll);
|
||||
seq_printf(m, " dpll_md: 0x%08x\n",
|
||||
pll->state.hw_state.dpll_md);
|
||||
seq_printf(m, " fp0: 0x%08x\n", pll->state.hw_state.fp0);
|
||||
seq_printf(m, " fp1: 0x%08x\n", pll->state.hw_state.fp1);
|
||||
seq_printf(m, " wrpll: 0x%08x\n", pll->state.hw_state.wrpll);
|
||||
seq_printf(m, " cfgcr0: 0x%08x\n", pll->state.hw_state.cfgcr0);
|
||||
seq_printf(m, " cfgcr1: 0x%08x\n", pll->state.hw_state.cfgcr1);
|
||||
seq_printf(m, " div0: 0x%08x\n", pll->state.hw_state.div0);
|
||||
seq_printf(m, " mg_refclkin_ctl: 0x%08x\n",
|
||||
pll->state.hw_state.mg_refclkin_ctl);
|
||||
seq_printf(m, " mg_clktop2_coreclkctl1: 0x%08x\n",
|
||||
pll->state.hw_state.mg_clktop2_coreclkctl1);
|
||||
seq_printf(m, " mg_clktop2_hsclkctl: 0x%08x\n",
|
||||
pll->state.hw_state.mg_clktop2_hsclkctl);
|
||||
seq_printf(m, " mg_pll_div0: 0x%08x\n",
|
||||
pll->state.hw_state.mg_pll_div0);
|
||||
seq_printf(m, " mg_pll_div1: 0x%08x\n",
|
||||
pll->state.hw_state.mg_pll_div1);
|
||||
seq_printf(m, " mg_pll_lf: 0x%08x\n",
|
||||
pll->state.hw_state.mg_pll_lf);
|
||||
seq_printf(m, " mg_pll_frac_lock: 0x%08x\n",
|
||||
pll->state.hw_state.mg_pll_frac_lock);
|
||||
seq_printf(m, " mg_pll_ssc: 0x%08x\n",
|
||||
pll->state.hw_state.mg_pll_ssc);
|
||||
seq_printf(m, " mg_pll_bias: 0x%08x\n",
|
||||
pll->state.hw_state.mg_pll_bias);
|
||||
seq_printf(m, " mg_pll_tdc_coldst_bias: 0x%08x\n",
|
||||
pll->state.hw_state.mg_pll_tdc_coldst_bias);
|
||||
drm_printf(&p, " tracked hardware state:\n");
|
||||
intel_dpll_dump_hw_state(dev_priv, &p, &pll->state.hw_state);
|
||||
}
|
||||
drm_modeset_unlock_all(&dev_priv->drm);
|
||||
|
||||
|
@ -927,6 +927,9 @@ void intel_display_device_probe(struct drm_i915_private *i915)
|
||||
const struct intel_display_device_info *info;
|
||||
u16 ver, rel, step;
|
||||
|
||||
/* Add drm device backpointer as early as possible. */
|
||||
i915->display.drm = &i915->drm;
|
||||
|
||||
if (HAS_GMD_ID(i915))
|
||||
info = probe_gmdid_display(i915, &ver, &rel, &step);
|
||||
else
|
||||
|
@ -8,6 +8,7 @@
|
||||
|
||||
#include <linux/types.h>
|
||||
|
||||
#include "intel_display_conversion.h"
|
||||
#include "intel_display_limits.h"
|
||||
|
||||
struct drm_i915_private;
|
||||
@ -100,8 +101,8 @@ struct drm_printer;
|
||||
(IS_DISPLAY_IP_RANGE((__i915), (ipver), (ipver)) && \
|
||||
IS_DISPLAY_STEP((__i915), (from), (until)))
|
||||
|
||||
#define DISPLAY_INFO(i915) ((i915)->display.info.__device_info)
|
||||
#define DISPLAY_RUNTIME_INFO(i915) (&(i915)->display.info.__runtime_info)
|
||||
#define DISPLAY_INFO(i915) (__to_intel_display(i915)->info.__device_info)
|
||||
#define DISPLAY_RUNTIME_INFO(i915) (&__to_intel_display(i915)->info.__runtime_info)
|
||||
|
||||
#define DISPLAY_VER(i915) (DISPLAY_RUNTIME_INFO(i915)->ip.ver)
|
||||
#define DISPLAY_VER_FULL(i915) IP_VER(DISPLAY_RUNTIME_INFO(i915)->ip.ver, \
|
||||
|
@ -198,12 +198,13 @@ void intel_display_driver_early_probe(struct drm_i915_private *i915)
|
||||
intel_dpll_init_clock_hook(i915);
|
||||
intel_init_display_hooks(i915);
|
||||
intel_fdi_init_hook(i915);
|
||||
intel_dmc_wl_init(i915);
|
||||
intel_dmc_wl_init(&i915->display);
|
||||
}
|
||||
|
||||
/* part #1: call before irq install */
|
||||
int intel_display_driver_probe_noirq(struct drm_i915_private *i915)
|
||||
{
|
||||
struct intel_display *display = &i915->display;
|
||||
int ret;
|
||||
|
||||
if (i915_inject_probe_failure(i915))
|
||||
@ -262,7 +263,7 @@ int intel_display_driver_probe_noirq(struct drm_i915_private *i915)
|
||||
if (ret)
|
||||
goto cleanup_vga_client_pw_domain_dmc;
|
||||
|
||||
intel_init_quirks(i915);
|
||||
intel_init_quirks(display);
|
||||
|
||||
intel_fbc_init(i915);
|
||||
|
||||
|
@ -27,6 +27,10 @@ static struct intel_display_params intel_display_modparams __read_mostly = {
|
||||
* debugfs mode to 0.
|
||||
*/
|
||||
|
||||
intel_display_param_named_unsafe(dmc_firmware_path, charp, 0400,
|
||||
"DMC firmware path to use instead of the default one. "
|
||||
"Use /dev/null to disable DMC and runtime PM.");
|
||||
|
||||
intel_display_param_named_unsafe(vbt_firmware, charp, 0400,
|
||||
"Load VBT from specified file under /lib/firmware");
|
||||
|
||||
|
@ -24,6 +24,7 @@ struct drm_i915_private;
|
||||
* debugfs file
|
||||
*/
|
||||
#define INTEL_DISPLAY_PARAMS_FOR_EACH(param) \
|
||||
param(char *, dmc_firmware_path, NULL, 0400) \
|
||||
param(char *, vbt_firmware, NULL, 0400) \
|
||||
param(int, lvds_channel_mode, 0, 0400) \
|
||||
param(int, panel_use_ssc, -1, 0600) \
|
||||
|
@ -822,7 +822,7 @@ void gen9_enable_dc5(struct drm_i915_private *dev_priv)
|
||||
intel_de_rmw(dev_priv, GEN8_CHICKEN_DCPR_1,
|
||||
0, SKL_SELECT_ALTERNATE_DC_EXIT);
|
||||
|
||||
intel_dmc_wl_enable(dev_priv);
|
||||
intel_dmc_wl_enable(&dev_priv->display);
|
||||
|
||||
gen9_set_dc_state(dev_priv, DC_STATE_EN_UPTO_DC5);
|
||||
}
|
||||
@ -853,7 +853,7 @@ void skl_enable_dc6(struct drm_i915_private *dev_priv)
|
||||
intel_de_rmw(dev_priv, GEN8_CHICKEN_DCPR_1,
|
||||
0, SKL_SELECT_ALTERNATE_DC_EXIT);
|
||||
|
||||
intel_dmc_wl_enable(dev_priv);
|
||||
intel_dmc_wl_enable(&dev_priv->display);
|
||||
|
||||
gen9_set_dc_state(dev_priv, DC_STATE_EN_UPTO_DC6);
|
||||
}
|
||||
@ -905,39 +905,39 @@ static void hsw_power_well_sync_hw(struct drm_i915_private *dev_priv,
|
||||
static void bxt_dpio_cmn_power_well_enable(struct drm_i915_private *dev_priv,
|
||||
struct i915_power_well *power_well)
|
||||
{
|
||||
bxt_ddi_phy_init(dev_priv, i915_power_well_instance(power_well)->bxt.phy);
|
||||
bxt_dpio_phy_init(dev_priv, i915_power_well_instance(power_well)->bxt.phy);
|
||||
}
|
||||
|
||||
static void bxt_dpio_cmn_power_well_disable(struct drm_i915_private *dev_priv,
|
||||
struct i915_power_well *power_well)
|
||||
{
|
||||
bxt_ddi_phy_uninit(dev_priv, i915_power_well_instance(power_well)->bxt.phy);
|
||||
bxt_dpio_phy_uninit(dev_priv, i915_power_well_instance(power_well)->bxt.phy);
|
||||
}
|
||||
|
||||
static bool bxt_dpio_cmn_power_well_enabled(struct drm_i915_private *dev_priv,
|
||||
struct i915_power_well *power_well)
|
||||
{
|
||||
return bxt_ddi_phy_is_enabled(dev_priv, i915_power_well_instance(power_well)->bxt.phy);
|
||||
return bxt_dpio_phy_is_enabled(dev_priv, i915_power_well_instance(power_well)->bxt.phy);
|
||||
}
|
||||
|
||||
static void bxt_verify_ddi_phy_power_wells(struct drm_i915_private *dev_priv)
|
||||
static void bxt_verify_dpio_phy_power_wells(struct drm_i915_private *dev_priv)
|
||||
{
|
||||
struct i915_power_well *power_well;
|
||||
|
||||
power_well = lookup_power_well(dev_priv, BXT_DISP_PW_DPIO_CMN_A);
|
||||
if (intel_power_well_refcount(power_well) > 0)
|
||||
bxt_ddi_phy_verify_state(dev_priv, i915_power_well_instance(power_well)->bxt.phy);
|
||||
bxt_dpio_phy_verify_state(dev_priv, i915_power_well_instance(power_well)->bxt.phy);
|
||||
|
||||
power_well = lookup_power_well(dev_priv, VLV_DISP_PW_DPIO_CMN_BC);
|
||||
if (intel_power_well_refcount(power_well) > 0)
|
||||
bxt_ddi_phy_verify_state(dev_priv, i915_power_well_instance(power_well)->bxt.phy);
|
||||
bxt_dpio_phy_verify_state(dev_priv, i915_power_well_instance(power_well)->bxt.phy);
|
||||
|
||||
if (IS_GEMINILAKE(dev_priv)) {
|
||||
power_well = lookup_power_well(dev_priv,
|
||||
GLK_DISP_PW_DPIO_CMN_C);
|
||||
if (intel_power_well_refcount(power_well) > 0)
|
||||
bxt_ddi_phy_verify_state(dev_priv,
|
||||
i915_power_well_instance(power_well)->bxt.phy);
|
||||
bxt_dpio_phy_verify_state(dev_priv,
|
||||
i915_power_well_instance(power_well)->bxt.phy);
|
||||
}
|
||||
}
|
||||
|
||||
@ -975,7 +975,7 @@ void gen9_disable_dc_states(struct drm_i915_private *dev_priv)
|
||||
if (!HAS_DISPLAY(dev_priv))
|
||||
return;
|
||||
|
||||
intel_dmc_wl_disable(dev_priv);
|
||||
intel_dmc_wl_disable(&dev_priv->display);
|
||||
|
||||
intel_cdclk_get_cdclk(dev_priv, &cdclk_config);
|
||||
/* Can't read out voltage_level so can't use intel_cdclk_changed() */
|
||||
@ -986,7 +986,7 @@ void gen9_disable_dc_states(struct drm_i915_private *dev_priv)
|
||||
gen9_assert_dbuf_enabled(dev_priv);
|
||||
|
||||
if (IS_GEMINILAKE(dev_priv) || IS_BROXTON(dev_priv))
|
||||
bxt_verify_ddi_phy_power_wells(dev_priv);
|
||||
bxt_verify_dpio_phy_power_wells(dev_priv);
|
||||
|
||||
if (DISPLAY_VER(dev_priv) >= 11)
|
||||
/*
|
||||
|
@ -1004,18 +1004,6 @@ enum intel_output_format {
|
||||
INTEL_OUTPUT_FORMAT_YCBCR444,
|
||||
};
|
||||
|
||||
struct intel_mpllb_state {
|
||||
u32 clock; /* in KHz */
|
||||
u32 ref_control;
|
||||
u32 mpllb_cp;
|
||||
u32 mpllb_div;
|
||||
u32 mpllb_div2;
|
||||
u32 mpllb_fracn1;
|
||||
u32 mpllb_fracn2;
|
||||
u32 mpllb_sscen;
|
||||
u32 mpllb_sscstep;
|
||||
};
|
||||
|
||||
/* Used by dp and fdi links */
|
||||
struct intel_link_m_n {
|
||||
u32 tu;
|
||||
@ -1031,31 +1019,6 @@ struct intel_csc_matrix {
|
||||
u16 postoff[3];
|
||||
};
|
||||
|
||||
struct intel_c10pll_state {
|
||||
u32 clock; /* in KHz */
|
||||
u8 tx;
|
||||
u8 cmn;
|
||||
u8 pll[20];
|
||||
};
|
||||
|
||||
struct intel_c20pll_state {
|
||||
u32 clock; /* in kHz */
|
||||
u16 tx[3];
|
||||
u16 cmn[4];
|
||||
union {
|
||||
u16 mplla[10];
|
||||
u16 mpllb[11];
|
||||
};
|
||||
};
|
||||
|
||||
struct intel_cx0pll_state {
|
||||
union {
|
||||
struct intel_c10pll_state c10;
|
||||
struct intel_c20pll_state c20;
|
||||
};
|
||||
bool ssc_enabled;
|
||||
};
|
||||
|
||||
struct intel_crtc_state {
|
||||
/*
|
||||
* uapi (drm) state. This is the software state shown to userspace.
|
||||
@ -1200,11 +1163,7 @@ struct intel_crtc_state {
|
||||
struct intel_shared_dpll *shared_dpll;
|
||||
|
||||
/* Actual register state of the dpll, for shared dpll cross-checking. */
|
||||
union {
|
||||
struct intel_dpll_hw_state dpll_hw_state;
|
||||
struct intel_mpllb_state mpllb_state;
|
||||
struct intel_cx0pll_state cx0pll_state;
|
||||
};
|
||||
struct intel_dpll_hw_state dpll_hw_state;
|
||||
|
||||
/*
|
||||
* ICL reserved DPLLs for the CRTC/port. The active PLL is selected by
|
||||
@ -2197,4 +2156,41 @@ static inline int to_bpp_x16(int bpp)
|
||||
return bpp << 4;
|
||||
}
|
||||
|
||||
/*
|
||||
* Conversion functions/macros from various pointer types to struct
|
||||
* intel_display pointer.
|
||||
*/
|
||||
#define __drm_device_to_intel_display(p) \
|
||||
(&to_i915(p)->display)
|
||||
#define __intel_connector_to_intel_display(p) \
|
||||
__drm_device_to_intel_display((p)->base.dev)
|
||||
#define __intel_crtc_to_intel_display(p) \
|
||||
__drm_device_to_intel_display((p)->base.dev)
|
||||
#define __intel_crtc_state_to_intel_display(p) \
|
||||
__drm_device_to_intel_display((p)->uapi.crtc->dev)
|
||||
#define __intel_digital_port_to_intel_display(p) \
|
||||
__drm_device_to_intel_display((p)->base.base.dev)
|
||||
#define __intel_dp_to_intel_display(p) \
|
||||
__drm_device_to_intel_display(dp_to_dig_port(p)->base.base.dev)
|
||||
#define __intel_encoder_to_intel_display(p) \
|
||||
__drm_device_to_intel_display((p)->base.dev)
|
||||
#define __intel_hdmi_to_intel_display(p) \
|
||||
__drm_device_to_intel_display(hdmi_to_dig_port(p)->base.base.dev)
|
||||
|
||||
/* Helper for generic association. Map types to conversion functions/macros. */
|
||||
#define __assoc(type, p) \
|
||||
struct type: __##type##_to_intel_display((struct type *)(p))
|
||||
|
||||
/* Convert various pointer types to struct intel_display pointer. */
|
||||
#define to_intel_display(p) \
|
||||
_Generic(*p, \
|
||||
__assoc(drm_device, p), \
|
||||
__assoc(intel_connector, p), \
|
||||
__assoc(intel_crtc, p), \
|
||||
__assoc(intel_crtc_state, p), \
|
||||
__assoc(intel_digital_port, p), \
|
||||
__assoc(intel_dp, p), \
|
||||
__assoc(intel_encoder, p), \
|
||||
__assoc(intel_hdmi, p))
|
||||
|
||||
#endif /* __INTEL_DISPLAY_TYPES_H__ */
|
||||
|
@ -73,6 +73,21 @@ static struct intel_dmc *i915_to_dmc(struct drm_i915_private *i915)
|
||||
return i915->display.dmc.dmc;
|
||||
}
|
||||
|
||||
static const char *dmc_firmware_param(struct drm_i915_private *i915)
|
||||
{
|
||||
const char *p = i915->display.params.dmc_firmware_path;
|
||||
|
||||
return p && *p ? p : NULL;
|
||||
}
|
||||
|
||||
static bool dmc_firmware_param_disabled(struct drm_i915_private *i915)
|
||||
{
|
||||
const char *p = dmc_firmware_param(i915);
|
||||
|
||||
/* Magic path to indicate disabled */
|
||||
return p && !strcmp(p, "/dev/null");
|
||||
}
|
||||
|
||||
#define DMC_VERSION(major, minor) ((major) << 16 | (minor))
|
||||
#define DMC_VERSION_MAJOR(version) ((version) >> 16)
|
||||
#define DMC_VERSION_MINOR(version) ((version) & 0xffff)
|
||||
@ -142,6 +157,59 @@ MODULE_FIRMWARE(SKL_DMC_PATH);
|
||||
#define BXT_DMC_MAX_FW_SIZE 0x3000
|
||||
MODULE_FIRMWARE(BXT_DMC_PATH);
|
||||
|
||||
static const char *dmc_firmware_default(struct drm_i915_private *i915, u32 *size)
|
||||
{
|
||||
const char *fw_path = NULL;
|
||||
u32 max_fw_size = 0;
|
||||
|
||||
if (DISPLAY_VER_FULL(i915) == IP_VER(20, 0)) {
|
||||
fw_path = XE2LPD_DMC_PATH;
|
||||
max_fw_size = XE2LPD_DMC_MAX_FW_SIZE;
|
||||
} else if (DISPLAY_VER_FULL(i915) == IP_VER(14, 0)) {
|
||||
fw_path = MTL_DMC_PATH;
|
||||
max_fw_size = XELPDP_DMC_MAX_FW_SIZE;
|
||||
} else if (IS_DG2(i915)) {
|
||||
fw_path = DG2_DMC_PATH;
|
||||
max_fw_size = DISPLAY_VER13_DMC_MAX_FW_SIZE;
|
||||
} else if (IS_ALDERLAKE_P(i915)) {
|
||||
fw_path = ADLP_DMC_PATH;
|
||||
max_fw_size = DISPLAY_VER13_DMC_MAX_FW_SIZE;
|
||||
} else if (IS_ALDERLAKE_S(i915)) {
|
||||
fw_path = ADLS_DMC_PATH;
|
||||
max_fw_size = DISPLAY_VER12_DMC_MAX_FW_SIZE;
|
||||
} else if (IS_DG1(i915)) {
|
||||
fw_path = DG1_DMC_PATH;
|
||||
max_fw_size = DISPLAY_VER12_DMC_MAX_FW_SIZE;
|
||||
} else if (IS_ROCKETLAKE(i915)) {
|
||||
fw_path = RKL_DMC_PATH;
|
||||
max_fw_size = DISPLAY_VER12_DMC_MAX_FW_SIZE;
|
||||
} else if (IS_TIGERLAKE(i915)) {
|
||||
fw_path = TGL_DMC_PATH;
|
||||
max_fw_size = DISPLAY_VER12_DMC_MAX_FW_SIZE;
|
||||
} else if (DISPLAY_VER(i915) == 11) {
|
||||
fw_path = ICL_DMC_PATH;
|
||||
max_fw_size = ICL_DMC_MAX_FW_SIZE;
|
||||
} else if (IS_GEMINILAKE(i915)) {
|
||||
fw_path = GLK_DMC_PATH;
|
||||
max_fw_size = GLK_DMC_MAX_FW_SIZE;
|
||||
} else if (IS_KABYLAKE(i915) ||
|
||||
IS_COFFEELAKE(i915) ||
|
||||
IS_COMETLAKE(i915)) {
|
||||
fw_path = KBL_DMC_PATH;
|
||||
max_fw_size = KBL_DMC_MAX_FW_SIZE;
|
||||
} else if (IS_SKYLAKE(i915)) {
|
||||
fw_path = SKL_DMC_PATH;
|
||||
max_fw_size = SKL_DMC_MAX_FW_SIZE;
|
||||
} else if (IS_BROXTON(i915)) {
|
||||
fw_path = BXT_DMC_PATH;
|
||||
max_fw_size = BXT_DMC_MAX_FW_SIZE;
|
||||
}
|
||||
|
||||
*size = max_fw_size;
|
||||
|
||||
return fw_path;
|
||||
}
|
||||
|
||||
#define DMC_DEFAULT_FW_OFFSET 0xFFFFFFFF
|
||||
#define PACKAGE_MAX_FW_INFO_ENTRIES 20
|
||||
#define PACKAGE_V2_MAX_FW_INFO_ENTRIES 32
|
||||
@ -553,7 +621,7 @@ void intel_dmc_disable_program(struct drm_i915_private *i915)
|
||||
disable_all_event_handlers(i915);
|
||||
pipedmc_clock_gating_wa(i915, false);
|
||||
|
||||
intel_dmc_wl_disable(i915);
|
||||
intel_dmc_wl_disable(&i915->display);
|
||||
}
|
||||
|
||||
void assert_dmc_loaded(struct drm_i915_private *i915)
|
||||
@ -853,7 +921,7 @@ static u32 parse_dmc_fw_css(struct intel_dmc *dmc,
|
||||
return sizeof(struct intel_css_header);
|
||||
}
|
||||
|
||||
static void parse_dmc_fw(struct intel_dmc *dmc, const struct firmware *fw)
|
||||
static int parse_dmc_fw(struct intel_dmc *dmc, const struct firmware *fw)
|
||||
{
|
||||
struct drm_i915_private *i915 = dmc->i915;
|
||||
struct intel_css_header *css_header;
|
||||
@ -866,13 +934,13 @@ static void parse_dmc_fw(struct intel_dmc *dmc, const struct firmware *fw)
|
||||
u32 r, offset;
|
||||
|
||||
if (!fw)
|
||||
return;
|
||||
return -EINVAL;
|
||||
|
||||
/* Extract CSS Header information */
|
||||
css_header = (struct intel_css_header *)fw->data;
|
||||
r = parse_dmc_fw_css(dmc, css_header, fw->size);
|
||||
if (!r)
|
||||
return;
|
||||
return -EINVAL;
|
||||
|
||||
readcount += r;
|
||||
|
||||
@ -880,7 +948,7 @@ static void parse_dmc_fw(struct intel_dmc *dmc, const struct firmware *fw)
|
||||
package_header = (struct intel_package_header *)&fw->data[readcount];
|
||||
r = parse_dmc_fw_package(dmc, package_header, si, fw->size - readcount);
|
||||
if (!r)
|
||||
return;
|
||||
return -EINVAL;
|
||||
|
||||
readcount += r;
|
||||
|
||||
@ -897,6 +965,13 @@ static void parse_dmc_fw(struct intel_dmc *dmc, const struct firmware *fw)
|
||||
dmc_header = (struct intel_dmc_header_base *)&fw->data[offset];
|
||||
parse_dmc_fw_header(dmc, dmc_header, fw->size - offset, dmc_id);
|
||||
}
|
||||
|
||||
if (!intel_dmc_has_payload(i915)) {
|
||||
drm_err(&i915->drm, "DMC firmware main program not found\n");
|
||||
return -ENOENT;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static void intel_dmc_runtime_pm_get(struct drm_i915_private *i915)
|
||||
@ -931,7 +1006,7 @@ static void dmc_load_work_fn(struct work_struct *work)
|
||||
|
||||
err = request_firmware(&fw, dmc->fw_path, i915->drm.dev);
|
||||
|
||||
if (err == -ENOENT && !i915->params.dmc_firmware_path) {
|
||||
if (err == -ENOENT && !dmc_firmware_param(i915)) {
|
||||
fallback_path = dmc_fallback_path(i915);
|
||||
if (fallback_path) {
|
||||
drm_dbg_kms(&i915->drm, "%s not found, falling back to %s\n",
|
||||
@ -942,24 +1017,31 @@ static void dmc_load_work_fn(struct work_struct *work)
|
||||
}
|
||||
}
|
||||
|
||||
parse_dmc_fw(dmc, fw);
|
||||
|
||||
if (intel_dmc_has_payload(i915)) {
|
||||
intel_dmc_load_program(i915);
|
||||
intel_dmc_runtime_pm_put(i915);
|
||||
|
||||
drm_info(&i915->drm, "Finished loading DMC firmware %s (v%u.%u)\n",
|
||||
dmc->fw_path, DMC_VERSION_MAJOR(dmc->version),
|
||||
DMC_VERSION_MINOR(dmc->version));
|
||||
} else {
|
||||
if (err) {
|
||||
drm_notice(&i915->drm,
|
||||
"Failed to load DMC firmware %s."
|
||||
" Disabling runtime power management.\n",
|
||||
dmc->fw_path);
|
||||
"Failed to load DMC firmware %s (%pe). Disabling runtime power management.\n",
|
||||
dmc->fw_path, ERR_PTR(err));
|
||||
drm_notice(&i915->drm, "DMC firmware homepage: %s",
|
||||
INTEL_DMC_FIRMWARE_URL);
|
||||
return;
|
||||
}
|
||||
|
||||
err = parse_dmc_fw(dmc, fw);
|
||||
if (err) {
|
||||
drm_notice(&i915->drm,
|
||||
"Failed to parse DMC firmware %s (%pe). Disabling runtime power management.\n",
|
||||
dmc->fw_path, ERR_PTR(err));
|
||||
goto out;
|
||||
}
|
||||
|
||||
intel_dmc_load_program(i915);
|
||||
intel_dmc_runtime_pm_put(i915);
|
||||
|
||||
drm_info(&i915->drm, "Finished loading DMC firmware %s (v%u.%u)\n",
|
||||
dmc->fw_path, DMC_VERSION_MAJOR(dmc->version),
|
||||
DMC_VERSION_MINOR(dmc->version));
|
||||
|
||||
out:
|
||||
release_firmware(fw);
|
||||
}
|
||||
|
||||
@ -995,58 +1077,15 @@ void intel_dmc_init(struct drm_i915_private *i915)
|
||||
|
||||
INIT_WORK(&dmc->work, dmc_load_work_fn);
|
||||
|
||||
if (DISPLAY_VER_FULL(i915) == IP_VER(20, 0)) {
|
||||
dmc->fw_path = XE2LPD_DMC_PATH;
|
||||
dmc->max_fw_size = XE2LPD_DMC_MAX_FW_SIZE;
|
||||
} else if (DISPLAY_VER_FULL(i915) == IP_VER(14, 0)) {
|
||||
dmc->fw_path = MTL_DMC_PATH;
|
||||
dmc->max_fw_size = XELPDP_DMC_MAX_FW_SIZE;
|
||||
} else if (IS_DG2(i915)) {
|
||||
dmc->fw_path = DG2_DMC_PATH;
|
||||
dmc->max_fw_size = DISPLAY_VER13_DMC_MAX_FW_SIZE;
|
||||
} else if (IS_ALDERLAKE_P(i915)) {
|
||||
dmc->fw_path = ADLP_DMC_PATH;
|
||||
dmc->max_fw_size = DISPLAY_VER13_DMC_MAX_FW_SIZE;
|
||||
} else if (IS_ALDERLAKE_S(i915)) {
|
||||
dmc->fw_path = ADLS_DMC_PATH;
|
||||
dmc->max_fw_size = DISPLAY_VER12_DMC_MAX_FW_SIZE;
|
||||
} else if (IS_DG1(i915)) {
|
||||
dmc->fw_path = DG1_DMC_PATH;
|
||||
dmc->max_fw_size = DISPLAY_VER12_DMC_MAX_FW_SIZE;
|
||||
} else if (IS_ROCKETLAKE(i915)) {
|
||||
dmc->fw_path = RKL_DMC_PATH;
|
||||
dmc->max_fw_size = DISPLAY_VER12_DMC_MAX_FW_SIZE;
|
||||
} else if (IS_TIGERLAKE(i915)) {
|
||||
dmc->fw_path = TGL_DMC_PATH;
|
||||
dmc->max_fw_size = DISPLAY_VER12_DMC_MAX_FW_SIZE;
|
||||
} else if (DISPLAY_VER(i915) == 11) {
|
||||
dmc->fw_path = ICL_DMC_PATH;
|
||||
dmc->max_fw_size = ICL_DMC_MAX_FW_SIZE;
|
||||
} else if (IS_GEMINILAKE(i915)) {
|
||||
dmc->fw_path = GLK_DMC_PATH;
|
||||
dmc->max_fw_size = GLK_DMC_MAX_FW_SIZE;
|
||||
} else if (IS_KABYLAKE(i915) ||
|
||||
IS_COFFEELAKE(i915) ||
|
||||
IS_COMETLAKE(i915)) {
|
||||
dmc->fw_path = KBL_DMC_PATH;
|
||||
dmc->max_fw_size = KBL_DMC_MAX_FW_SIZE;
|
||||
} else if (IS_SKYLAKE(i915)) {
|
||||
dmc->fw_path = SKL_DMC_PATH;
|
||||
dmc->max_fw_size = SKL_DMC_MAX_FW_SIZE;
|
||||
} else if (IS_BROXTON(i915)) {
|
||||
dmc->fw_path = BXT_DMC_PATH;
|
||||
dmc->max_fw_size = BXT_DMC_MAX_FW_SIZE;
|
||||
dmc->fw_path = dmc_firmware_default(i915, &dmc->max_fw_size);
|
||||
|
||||
if (dmc_firmware_param_disabled(i915)) {
|
||||
drm_info(&i915->drm, "Disabling DMC firmware and runtime PM\n");
|
||||
goto out;
|
||||
}
|
||||
|
||||
if (i915->params.dmc_firmware_path) {
|
||||
if (strlen(i915->params.dmc_firmware_path) == 0) {
|
||||
drm_info(&i915->drm,
|
||||
"Disabling DMC firmware and runtime PM\n");
|
||||
goto out;
|
||||
}
|
||||
|
||||
dmc->fw_path = i915->params.dmc_firmware_path;
|
||||
}
|
||||
if (dmc_firmware_param(i915))
|
||||
dmc->fw_path = dmc_firmware_param(i915);
|
||||
|
||||
if (!dmc->fw_path) {
|
||||
drm_dbg_kms(&i915->drm,
|
||||
@ -1083,7 +1122,7 @@ void intel_dmc_suspend(struct drm_i915_private *i915)
|
||||
if (dmc)
|
||||
flush_work(&dmc->work);
|
||||
|
||||
intel_dmc_wl_disable(i915);
|
||||
intel_dmc_wl_disable(&i915->display);
|
||||
|
||||
/* Drop the reference held in case DMC isn't loaded. */
|
||||
if (!intel_dmc_has_payload(i915))
|
||||
|
@ -51,9 +51,10 @@ static struct intel_dmc_wl_range lnl_wl_range[] = {
|
||||
{ .start = 0x60000, .end = 0x7ffff },
|
||||
};
|
||||
|
||||
static void __intel_dmc_wl_release(struct drm_i915_private *i915)
|
||||
static void __intel_dmc_wl_release(struct intel_display *display)
|
||||
{
|
||||
struct intel_dmc_wl *wl = &i915->display.wl;
|
||||
struct drm_i915_private *i915 = to_i915(display->drm);
|
||||
struct intel_dmc_wl *wl = &display->wl;
|
||||
|
||||
WARN_ON(refcount_read(&wl->refcount));
|
||||
|
||||
@ -65,8 +66,8 @@ static void intel_dmc_wl_work(struct work_struct *work)
|
||||
{
|
||||
struct intel_dmc_wl *wl =
|
||||
container_of(work, struct intel_dmc_wl, work.work);
|
||||
struct drm_i915_private *i915 =
|
||||
container_of(wl, struct drm_i915_private, display.wl);
|
||||
struct intel_display *display =
|
||||
container_of(wl, struct intel_display, wl);
|
||||
unsigned long flags;
|
||||
|
||||
spin_lock_irqsave(&wl->lock, flags);
|
||||
@ -75,11 +76,11 @@ static void intel_dmc_wl_work(struct work_struct *work)
|
||||
if (!refcount_read(&wl->refcount))
|
||||
goto out_unlock;
|
||||
|
||||
__intel_de_rmw_nowl(i915, DMC_WAKELOCK1_CTL, DMC_WAKELOCK_CTL_REQ, 0);
|
||||
__intel_de_rmw_nowl(display, DMC_WAKELOCK1_CTL, DMC_WAKELOCK_CTL_REQ, 0);
|
||||
|
||||
if (__intel_wait_for_register_nowl(i915, DMC_WAKELOCK1_CTL,
|
||||
DMC_WAKELOCK_CTL_ACK, 0,
|
||||
DMC_WAKELOCK_CTL_TIMEOUT)) {
|
||||
if (__intel_de_wait_for_register_nowl(display, DMC_WAKELOCK1_CTL,
|
||||
DMC_WAKELOCK_CTL_ACK, 0,
|
||||
DMC_WAKELOCK_CTL_TIMEOUT)) {
|
||||
WARN_RATELIMIT(1, "DMC wakelock release timed out");
|
||||
goto out_unlock;
|
||||
}
|
||||
@ -106,23 +107,24 @@ static bool intel_dmc_wl_check_range(u32 address)
|
||||
return wl_needed;
|
||||
}
|
||||
|
||||
static bool __intel_dmc_wl_supported(struct drm_i915_private *i915)
|
||||
static bool __intel_dmc_wl_supported(struct intel_display *display)
|
||||
{
|
||||
if (DISPLAY_VER(i915) < 20 ||
|
||||
struct drm_i915_private *i915 = to_i915(display->drm);
|
||||
|
||||
if (DISPLAY_VER(display) < 20 ||
|
||||
!intel_dmc_has_payload(i915) ||
|
||||
!i915->display.params.enable_dmc_wl)
|
||||
!display->params.enable_dmc_wl)
|
||||
return false;
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
void intel_dmc_wl_init(struct drm_i915_private *i915)
|
||||
void intel_dmc_wl_init(struct intel_display *display)
|
||||
{
|
||||
struct intel_dmc_wl *wl = &i915->display.wl;
|
||||
struct intel_dmc_wl *wl = &display->wl;
|
||||
|
||||
/* don't call __intel_dmc_wl_supported(), DMC is not loaded yet */
|
||||
if (DISPLAY_VER(i915) < 20 ||
|
||||
!i915->display.params.enable_dmc_wl)
|
||||
if (DISPLAY_VER(display) < 20 || !display->params.enable_dmc_wl)
|
||||
return;
|
||||
|
||||
INIT_DELAYED_WORK(&wl->work, intel_dmc_wl_work);
|
||||
@ -130,12 +132,12 @@ void intel_dmc_wl_init(struct drm_i915_private *i915)
|
||||
refcount_set(&wl->refcount, 0);
|
||||
}
|
||||
|
||||
void intel_dmc_wl_enable(struct drm_i915_private *i915)
|
||||
void intel_dmc_wl_enable(struct intel_display *display)
|
||||
{
|
||||
struct intel_dmc_wl *wl = &i915->display.wl;
|
||||
struct intel_dmc_wl *wl = &display->wl;
|
||||
unsigned long flags;
|
||||
|
||||
if (!__intel_dmc_wl_supported(i915))
|
||||
if (!__intel_dmc_wl_supported(display))
|
||||
return;
|
||||
|
||||
spin_lock_irqsave(&wl->lock, flags);
|
||||
@ -148,7 +150,7 @@ void intel_dmc_wl_enable(struct drm_i915_private *i915)
|
||||
* wakelock, because we're just enabling it, so call the
|
||||
* non-locking version directly here.
|
||||
*/
|
||||
__intel_de_rmw_nowl(i915, DMC_WAKELOCK_CFG, 0, DMC_WAKELOCK_CFG_ENABLE);
|
||||
__intel_de_rmw_nowl(display, DMC_WAKELOCK_CFG, 0, DMC_WAKELOCK_CFG_ENABLE);
|
||||
|
||||
wl->enabled = true;
|
||||
wl->taken = false;
|
||||
@ -157,12 +159,12 @@ out_unlock:
|
||||
spin_unlock_irqrestore(&wl->lock, flags);
|
||||
}
|
||||
|
||||
void intel_dmc_wl_disable(struct drm_i915_private *i915)
|
||||
void intel_dmc_wl_disable(struct intel_display *display)
|
||||
{
|
||||
struct intel_dmc_wl *wl = &i915->display.wl;
|
||||
struct intel_dmc_wl *wl = &display->wl;
|
||||
unsigned long flags;
|
||||
|
||||
if (!__intel_dmc_wl_supported(i915))
|
||||
if (!__intel_dmc_wl_supported(display))
|
||||
return;
|
||||
|
||||
flush_delayed_work(&wl->work);
|
||||
@ -173,7 +175,7 @@ void intel_dmc_wl_disable(struct drm_i915_private *i915)
|
||||
goto out_unlock;
|
||||
|
||||
/* Disable wakelock in DMC */
|
||||
__intel_de_rmw_nowl(i915, DMC_WAKELOCK_CFG, DMC_WAKELOCK_CFG_ENABLE, 0);
|
||||
__intel_de_rmw_nowl(display, DMC_WAKELOCK_CFG, DMC_WAKELOCK_CFG_ENABLE, 0);
|
||||
|
||||
refcount_set(&wl->refcount, 0);
|
||||
wl->enabled = false;
|
||||
@ -183,12 +185,12 @@ out_unlock:
|
||||
spin_unlock_irqrestore(&wl->lock, flags);
|
||||
}
|
||||
|
||||
void intel_dmc_wl_get(struct drm_i915_private *i915, i915_reg_t reg)
|
||||
void intel_dmc_wl_get(struct intel_display *display, i915_reg_t reg)
|
||||
{
|
||||
struct intel_dmc_wl *wl = &i915->display.wl;
|
||||
struct intel_dmc_wl *wl = &display->wl;
|
||||
unsigned long flags;
|
||||
|
||||
if (!__intel_dmc_wl_supported(i915))
|
||||
if (!__intel_dmc_wl_supported(display))
|
||||
return;
|
||||
|
||||
if (!intel_dmc_wl_check_range(reg.reg))
|
||||
@ -213,13 +215,13 @@ void intel_dmc_wl_get(struct drm_i915_private *i915, i915_reg_t reg)
|
||||
* run yet.
|
||||
*/
|
||||
if (!wl->taken) {
|
||||
__intel_de_rmw_nowl(i915, DMC_WAKELOCK1_CTL, 0,
|
||||
__intel_de_rmw_nowl(display, DMC_WAKELOCK1_CTL, 0,
|
||||
DMC_WAKELOCK_CTL_REQ);
|
||||
|
||||
if (__intel_wait_for_register_nowl(i915, DMC_WAKELOCK1_CTL,
|
||||
DMC_WAKELOCK_CTL_ACK,
|
||||
DMC_WAKELOCK_CTL_ACK,
|
||||
DMC_WAKELOCK_CTL_TIMEOUT)) {
|
||||
if (__intel_de_wait_for_register_nowl(display, DMC_WAKELOCK1_CTL,
|
||||
DMC_WAKELOCK_CTL_ACK,
|
||||
DMC_WAKELOCK_CTL_ACK,
|
||||
DMC_WAKELOCK_CTL_TIMEOUT)) {
|
||||
WARN_RATELIMIT(1, "DMC wakelock ack timed out");
|
||||
goto out_unlock;
|
||||
}
|
||||
@ -231,12 +233,12 @@ out_unlock:
|
||||
spin_unlock_irqrestore(&wl->lock, flags);
|
||||
}
|
||||
|
||||
void intel_dmc_wl_put(struct drm_i915_private *i915, i915_reg_t reg)
|
||||
void intel_dmc_wl_put(struct intel_display *display, i915_reg_t reg)
|
||||
{
|
||||
struct intel_dmc_wl *wl = &i915->display.wl;
|
||||
struct intel_dmc_wl *wl = &display->wl;
|
||||
unsigned long flags;
|
||||
|
||||
if (!__intel_dmc_wl_supported(i915))
|
||||
if (!__intel_dmc_wl_supported(display))
|
||||
return;
|
||||
|
||||
if (!intel_dmc_wl_check_range(reg.reg))
|
||||
@ -252,7 +254,7 @@ void intel_dmc_wl_put(struct drm_i915_private *i915, i915_reg_t reg)
|
||||
goto out_unlock;
|
||||
|
||||
if (refcount_dec_and_test(&wl->refcount)) {
|
||||
__intel_dmc_wl_release(i915);
|
||||
__intel_dmc_wl_release(display);
|
||||
|
||||
goto out_unlock;
|
||||
}
|
||||
|
@ -12,7 +12,7 @@
|
||||
|
||||
#include "i915_reg_defs.h"
|
||||
|
||||
struct drm_i915_private;
|
||||
struct intel_display;
|
||||
|
||||
struct intel_dmc_wl {
|
||||
spinlock_t lock; /* protects enabled, taken and refcount */
|
||||
@ -22,10 +22,10 @@ struct intel_dmc_wl {
|
||||
struct delayed_work work;
|
||||
};
|
||||
|
||||
void intel_dmc_wl_init(struct drm_i915_private *i915);
|
||||
void intel_dmc_wl_enable(struct drm_i915_private *i915);
|
||||
void intel_dmc_wl_disable(struct drm_i915_private *i915);
|
||||
void intel_dmc_wl_get(struct drm_i915_private *i915, i915_reg_t reg);
|
||||
void intel_dmc_wl_put(struct drm_i915_private *i915, i915_reg_t reg);
|
||||
void intel_dmc_wl_init(struct intel_display *display);
|
||||
void intel_dmc_wl_enable(struct intel_display *display);
|
||||
void intel_dmc_wl_disable(struct intel_display *display);
|
||||
void intel_dmc_wl_get(struct intel_display *display, i915_reg_t reg);
|
||||
void intel_dmc_wl_put(struct intel_display *display, i915_reg_t reg);
|
||||
|
||||
#endif /* __INTEL_WAKELOCK_H__ */
|
||||
|
@ -89,6 +89,9 @@
|
||||
#define DP_DSC_MAX_ENC_THROUGHPUT_0 340000
|
||||
#define DP_DSC_MAX_ENC_THROUGHPUT_1 400000
|
||||
|
||||
/* Max DSC line buffer depth supported by HW. */
|
||||
#define INTEL_DP_DSC_MAX_LINE_BUF_DEPTH 13
|
||||
|
||||
/* DP DSC FEC Overhead factor in ppm = 1/(0.972261) = 1.028530 */
|
||||
#define DP_DSC_FEC_OVERHEAD_FACTOR 1028530
|
||||
|
||||
@ -222,7 +225,7 @@ static void intel_dp_set_dpcd_sink_rates(struct intel_dp *intel_dp)
|
||||
* Sink rates for 128b/132b. If set, sink should support all 8b/10b
|
||||
* rates and 10 Gbps.
|
||||
*/
|
||||
if (intel_dp->dpcd[DP_MAIN_LINK_CHANNEL_CODING] & DP_CAP_ANSI_128B132B) {
|
||||
if (drm_dp_128b132b_supported(intel_dp->dpcd)) {
|
||||
u8 uhbr_rates = 0;
|
||||
|
||||
BUILD_BUG_ON(ARRAY_SIZE(intel_dp->sink_rates) < ARRAY_SIZE(dp_rates) + 3);
|
||||
@ -1705,7 +1708,6 @@ static int intel_dp_dsc_compute_params(const struct intel_connector *connector,
|
||||
{
|
||||
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;
|
||||
|
||||
/*
|
||||
@ -1734,20 +1736,14 @@ static int intel_dp_dsc_compute_params(const struct intel_connector *connector,
|
||||
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(connector->dp.dsc_dpcd);
|
||||
if (!line_buf_depth) {
|
||||
vdsc_cfg->line_buf_depth = min(INTEL_DP_DSC_MAX_LINE_BUF_DEPTH,
|
||||
drm_dp_dsc_sink_line_buf_depth(connector->dp.dsc_dpcd));
|
||||
if (!vdsc_cfg->line_buf_depth) {
|
||||
drm_dbg_kms(&i915->drm,
|
||||
"DSC Sink Line Buffer Depth invalid\n");
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
if (vdsc_cfg->dsc_version_minor == 2)
|
||||
vdsc_cfg->line_buf_depth = (line_buf_depth == DSC_1_2_MAX_LINEBUF_DEPTH_BITS) ?
|
||||
DSC_1_2_MAX_LINEBUF_DEPTH_VAL : line_buf_depth;
|
||||
else
|
||||
vdsc_cfg->line_buf_depth = (line_buf_depth > DSC_1_1_MAX_LINEBUF_DEPTH_BITS) ?
|
||||
DSC_1_1_MAX_LINEBUF_DEPTH_BITS : line_buf_depth;
|
||||
|
||||
vdsc_cfg->block_pred_enable =
|
||||
connector->dp.dsc_dpcd[DP_DSC_BLK_PREDICTION_SUPPORT - DP_DSC_SUPPORT] &
|
||||
DP_DSC_BLK_PREDICTION_IS_SUPPORTED;
|
||||
|
@ -334,7 +334,7 @@ static bool has_per_lane_signal_levels(struct intel_dp *intel_dp,
|
||||
struct drm_i915_private *i915 = dp_to_i915(intel_dp);
|
||||
|
||||
return !intel_dp_phy_is_downstream_of_source(intel_dp, dp_phy) ||
|
||||
DISPLAY_VER(i915) >= 11;
|
||||
DISPLAY_VER(i915) >= 10 || IS_BROXTON(i915);
|
||||
}
|
||||
|
||||
/* 128b/132b */
|
||||
|
@ -51,25 +51,39 @@
|
||||
#include "intel_vdsc.h"
|
||||
#include "skl_scaler.h"
|
||||
|
||||
static int intel_dp_mst_check_constraints(struct drm_i915_private *i915, int bpp,
|
||||
const struct drm_display_mode *adjusted_mode,
|
||||
struct intel_crtc_state *crtc_state,
|
||||
bool dsc)
|
||||
static int intel_dp_mst_max_dpt_bpp(const struct intel_crtc_state *crtc_state,
|
||||
bool dsc)
|
||||
{
|
||||
if (intel_dp_is_uhbr(crtc_state) && DISPLAY_VER(i915) < 14 && dsc) {
|
||||
int output_bpp = bpp;
|
||||
/* DisplayPort 2 128b/132b, bits per lane is always 32 */
|
||||
int symbol_clock = crtc_state->port_clock / 32;
|
||||
struct drm_i915_private *i915 = to_i915(crtc_state->uapi.crtc->dev);
|
||||
const struct drm_display_mode *adjusted_mode =
|
||||
&crtc_state->hw.adjusted_mode;
|
||||
|
||||
if (output_bpp * adjusted_mode->crtc_clock >=
|
||||
symbol_clock * 72) {
|
||||
drm_dbg_kms(&i915->drm, "UHBR check failed(required bw %d available %d)\n",
|
||||
output_bpp * adjusted_mode->crtc_clock, symbol_clock * 72);
|
||||
return -EINVAL;
|
||||
}
|
||||
}
|
||||
if (!intel_dp_is_uhbr(crtc_state) || DISPLAY_VER(i915) >= 20 || !dsc)
|
||||
return INT_MAX;
|
||||
|
||||
return 0;
|
||||
/*
|
||||
* DSC->DPT interface width:
|
||||
* ICL-MTL: 72 bits (each branch has 72 bits, only left branch is used)
|
||||
* LNL+: 144 bits (not a bottleneck in any config)
|
||||
*
|
||||
* Bspec/49259 suggests that the FEC overhead needs to be
|
||||
* applied here, though HW people claim that neither this FEC
|
||||
* or any other overhead is applicable here (that is the actual
|
||||
* available_bw is just symbol_clock * 72). However based on
|
||||
* testing on MTL-P the
|
||||
* - DELL U3224KBA display
|
||||
* - Unigraf UCD-500 CTS test sink
|
||||
* devices the
|
||||
* - 5120x2880/995.59Mhz
|
||||
* - 6016x3384/1357.23Mhz
|
||||
* - 6144x3456/1413.39Mhz
|
||||
* modes (all the ones having a DPT limit on the above devices),
|
||||
* both the channel coding efficiency and an additional 3%
|
||||
* overhead needs to be accounted for.
|
||||
*/
|
||||
return div64_u64(mul_u32_u32(intel_dp_link_symbol_clock(crtc_state->port_clock) * 72,
|
||||
drm_dp_bw_channel_coding_efficiency(true)),
|
||||
mul_u32_u32(adjusted_mode->crtc_clock, 1030000));
|
||||
}
|
||||
|
||||
static int intel_dp_mst_bw_overhead(const struct intel_crtc_state *crtc_state,
|
||||
@ -157,6 +171,7 @@ static int intel_dp_mst_find_vcpi_slots_for_bpp(struct intel_encoder *encoder,
|
||||
const struct drm_display_mode *adjusted_mode =
|
||||
&crtc_state->hw.adjusted_mode;
|
||||
int bpp, slots = -EINVAL;
|
||||
int max_dpt_bpp;
|
||||
int ret = 0;
|
||||
|
||||
mst_state = drm_atomic_get_mst_topology_state(state, &intel_dp->mst_mgr);
|
||||
@ -177,6 +192,13 @@ static int intel_dp_mst_find_vcpi_slots_for_bpp(struct intel_encoder *encoder,
|
||||
crtc_state->port_clock,
|
||||
crtc_state->lane_count);
|
||||
|
||||
max_dpt_bpp = intel_dp_mst_max_dpt_bpp(crtc_state, dsc);
|
||||
if (max_bpp > max_dpt_bpp) {
|
||||
drm_dbg_kms(&i915->drm, "Limiting bpp to max DPT bpp (%d -> %d)\n",
|
||||
max_bpp, max_dpt_bpp);
|
||||
max_bpp = max_dpt_bpp;
|
||||
}
|
||||
|
||||
drm_dbg_kms(&i915->drm, "Looking for slots in range min bpp %d max bpp %d\n",
|
||||
min_bpp, max_bpp);
|
||||
|
||||
@ -188,10 +210,6 @@ static int intel_dp_mst_find_vcpi_slots_for_bpp(struct intel_encoder *encoder,
|
||||
|
||||
drm_dbg_kms(&i915->drm, "Trying bpp %d\n", bpp);
|
||||
|
||||
ret = intel_dp_mst_check_constraints(i915, bpp, adjusted_mode, crtc_state, dsc);
|
||||
if (ret)
|
||||
continue;
|
||||
|
||||
link_bpp_x16 = to_bpp_x16(dsc ? bpp :
|
||||
intel_dp_output_bpp(crtc_state->output_format, bpp));
|
||||
|
||||
@ -403,15 +421,22 @@ static int mode_hblank_period_ns(const struct drm_display_mode *mode)
|
||||
|
||||
static bool
|
||||
hblank_expansion_quirk_needs_dsc(const struct intel_connector *connector,
|
||||
const struct intel_crtc_state *crtc_state)
|
||||
const struct intel_crtc_state *crtc_state,
|
||||
const struct link_config_limits *limits)
|
||||
{
|
||||
const struct drm_display_mode *adjusted_mode =
|
||||
&crtc_state->hw.adjusted_mode;
|
||||
bool is_uhbr_sink = connector->mst_port &&
|
||||
drm_dp_128b132b_supported(connector->mst_port->dpcd);
|
||||
int hblank_limit = is_uhbr_sink ? 500 : 300;
|
||||
|
||||
if (!connector->dp.dsc_hblank_expansion_quirk)
|
||||
return false;
|
||||
|
||||
if (mode_hblank_period_ns(adjusted_mode) > 300)
|
||||
if (is_uhbr_sink && !drm_dp_is_uhbr_rate(limits->max_rate))
|
||||
return false;
|
||||
|
||||
if (mode_hblank_period_ns(adjusted_mode) > hblank_limit)
|
||||
return false;
|
||||
|
||||
return true;
|
||||
@ -427,7 +452,7 @@ adjust_limits_for_dsc_hblank_expansion_quirk(const struct intel_connector *conne
|
||||
const struct intel_crtc *crtc = to_intel_crtc(crtc_state->uapi.crtc);
|
||||
int min_bpp_x16 = limits->link.min_bpp_x16;
|
||||
|
||||
if (!hblank_expansion_quirk_needs_dsc(connector, crtc_state))
|
||||
if (!hblank_expansion_quirk_needs_dsc(connector, crtc_state, limits))
|
||||
return true;
|
||||
|
||||
if (!dsc) {
|
||||
@ -620,7 +645,7 @@ static int intel_dp_mst_compute_config(struct intel_encoder *encoder,
|
||||
|
||||
if (IS_GEMINILAKE(dev_priv) || IS_BROXTON(dev_priv))
|
||||
pipe_config->lane_lat_optim_mask =
|
||||
bxt_ddi_phy_calc_lane_lat_optim_mask(pipe_config->lane_count);
|
||||
bxt_dpio_phy_calc_lane_lat_optim_mask(pipe_config->lane_count);
|
||||
|
||||
intel_dp_audio_compute_config(encoder, pipe_config, conn_state);
|
||||
|
||||
@ -1559,24 +1584,41 @@ intel_dp_mst_read_decompression_port_dsc_caps(struct intel_dp *intel_dp,
|
||||
static bool detect_dsc_hblank_expansion_quirk(const struct intel_connector *connector)
|
||||
{
|
||||
struct drm_i915_private *i915 = to_i915(connector->base.dev);
|
||||
struct drm_dp_aux *aux = connector->dp.dsc_decompression_aux;
|
||||
struct drm_dp_desc desc;
|
||||
u8 dpcd[DP_RECEIVER_CAP_SIZE];
|
||||
|
||||
if (!connector->dp.dsc_decompression_aux)
|
||||
if (!aux)
|
||||
return false;
|
||||
|
||||
if (drm_dp_read_desc(connector->dp.dsc_decompression_aux,
|
||||
&desc, true) < 0)
|
||||
/*
|
||||
* A logical port's OUI (at least for affected sinks) is all 0, so
|
||||
* instead of that the parent port's OUI is used for identification.
|
||||
*/
|
||||
if (drm_dp_mst_port_is_logical(connector->port)) {
|
||||
aux = drm_dp_mst_aux_for_parent(connector->port);
|
||||
if (!aux)
|
||||
aux = &connector->mst_port->aux;
|
||||
}
|
||||
|
||||
if (drm_dp_read_dpcd_caps(aux, dpcd) < 0)
|
||||
return false;
|
||||
|
||||
if (drm_dp_read_desc(aux, &desc, drm_dp_is_branch(dpcd)) < 0)
|
||||
return false;
|
||||
|
||||
if (!drm_dp_has_quirk(&desc,
|
||||
DP_DPCD_QUIRK_HBLANK_EXPANSION_REQUIRES_DSC))
|
||||
return false;
|
||||
|
||||
if (drm_dp_read_dpcd_caps(connector->dp.dsc_decompression_aux, dpcd) < 0)
|
||||
return false;
|
||||
|
||||
if (!(dpcd[DP_RECEIVE_PORT_0_CAP_0] & DP_HBLANK_EXPANSION_CAPABLE))
|
||||
/*
|
||||
* UHBR (MST sink) devices requiring this quirk don't advertise the
|
||||
* HBLANK expansion support. Presuming that they perform HBLANK
|
||||
* expansion internally, or are affected by this issue on modes with a
|
||||
* short HBLANK for other reasons.
|
||||
*/
|
||||
if (!drm_dp_128b132b_supported(dpcd) &&
|
||||
!(dpcd[DP_RECEIVE_PORT_0_CAP_0] & DP_HBLANK_EXPANSION_CAPABLE))
|
||||
return false;
|
||||
|
||||
drm_dbg_kms(&i915->drm,
|
||||
|
@ -21,6 +21,7 @@
|
||||
* DEALINGS IN THE SOFTWARE.
|
||||
*/
|
||||
|
||||
#include "bxt_dpio_phy_regs.h"
|
||||
#include "i915_reg.h"
|
||||
#include "intel_ddi.h"
|
||||
#include "intel_ddi_buf_trans.h"
|
||||
@ -123,9 +124,9 @@
|
||||
*/
|
||||
|
||||
/**
|
||||
* struct bxt_ddi_phy_info - Hold info for a broxton DDI phy
|
||||
* struct bxt_dpio_phy_info - Hold info for a broxton DDI phy
|
||||
*/
|
||||
struct bxt_ddi_phy_info {
|
||||
struct bxt_dpio_phy_info {
|
||||
/**
|
||||
* @dual_channel: true if this phy has a second channel.
|
||||
*/
|
||||
@ -161,7 +162,7 @@ struct bxt_ddi_phy_info {
|
||||
} channel[2];
|
||||
};
|
||||
|
||||
static const struct bxt_ddi_phy_info bxt_ddi_phy_info[] = {
|
||||
static const struct bxt_dpio_phy_info bxt_dpio_phy_info[] = {
|
||||
[DPIO_PHY0] = {
|
||||
.dual_channel = true,
|
||||
.rcomp_phy = DPIO_PHY1,
|
||||
@ -183,7 +184,7 @@ static const struct bxt_ddi_phy_info bxt_ddi_phy_info[] = {
|
||||
},
|
||||
};
|
||||
|
||||
static const struct bxt_ddi_phy_info glk_ddi_phy_info[] = {
|
||||
static const struct bxt_dpio_phy_info glk_dpio_phy_info[] = {
|
||||
[DPIO_PHY0] = {
|
||||
.dual_channel = false,
|
||||
.rcomp_phy = DPIO_PHY1,
|
||||
@ -216,23 +217,23 @@ static const struct bxt_ddi_phy_info glk_ddi_phy_info[] = {
|
||||
},
|
||||
};
|
||||
|
||||
static const struct bxt_ddi_phy_info *
|
||||
static const struct bxt_dpio_phy_info *
|
||||
bxt_get_phy_list(struct drm_i915_private *dev_priv, int *count)
|
||||
{
|
||||
if (IS_GEMINILAKE(dev_priv)) {
|
||||
*count = ARRAY_SIZE(glk_ddi_phy_info);
|
||||
return glk_ddi_phy_info;
|
||||
*count = ARRAY_SIZE(glk_dpio_phy_info);
|
||||
return glk_dpio_phy_info;
|
||||
} else {
|
||||
*count = ARRAY_SIZE(bxt_ddi_phy_info);
|
||||
return bxt_ddi_phy_info;
|
||||
*count = ARRAY_SIZE(bxt_dpio_phy_info);
|
||||
return bxt_dpio_phy_info;
|
||||
}
|
||||
}
|
||||
|
||||
static const struct bxt_ddi_phy_info *
|
||||
static const struct bxt_dpio_phy_info *
|
||||
bxt_get_phy_info(struct drm_i915_private *dev_priv, enum dpio_phy phy)
|
||||
{
|
||||
int count;
|
||||
const struct bxt_ddi_phy_info *phy_list =
|
||||
const struct bxt_dpio_phy_info *phy_list =
|
||||
bxt_get_phy_list(dev_priv, &count);
|
||||
|
||||
return &phy_list[phy];
|
||||
@ -241,7 +242,7 @@ bxt_get_phy_info(struct drm_i915_private *dev_priv, enum dpio_phy phy)
|
||||
void bxt_port_to_phy_channel(struct drm_i915_private *dev_priv, enum port port,
|
||||
enum dpio_phy *phy, enum dpio_channel *ch)
|
||||
{
|
||||
const struct bxt_ddi_phy_info *phy_info, *phys;
|
||||
const struct bxt_dpio_phy_info *phy_info, *phys;
|
||||
int i, count;
|
||||
|
||||
phys = bxt_get_phy_list(dev_priv, &count);
|
||||
@ -269,16 +270,32 @@ void bxt_port_to_phy_channel(struct drm_i915_private *dev_priv, enum port port,
|
||||
*ch = DPIO_CH0;
|
||||
}
|
||||
|
||||
void bxt_ddi_phy_set_signal_levels(struct intel_encoder *encoder,
|
||||
const struct intel_crtc_state *crtc_state)
|
||||
/*
|
||||
* Like intel_de_rmw() but reads from a single per-lane register and
|
||||
* writes to the group register to write the same value to all the lanes.
|
||||
*/
|
||||
static u32 bxt_dpio_phy_rmw_grp(struct drm_i915_private *i915,
|
||||
i915_reg_t reg_single,
|
||||
i915_reg_t reg_group,
|
||||
u32 clear, u32 set)
|
||||
{
|
||||
u32 old, val;
|
||||
|
||||
old = intel_de_read(i915, reg_single);
|
||||
val = (old & ~clear) | set;
|
||||
intel_de_write(i915, reg_group, val);
|
||||
|
||||
return old;
|
||||
}
|
||||
|
||||
void bxt_dpio_phy_set_signal_levels(struct intel_encoder *encoder,
|
||||
const struct intel_crtc_state *crtc_state)
|
||||
{
|
||||
struct drm_i915_private *dev_priv = to_i915(encoder->base.dev);
|
||||
int level = intel_ddi_level(encoder, crtc_state, 0);
|
||||
const struct intel_ddi_buf_trans *trans;
|
||||
enum dpio_channel ch;
|
||||
enum dpio_phy phy;
|
||||
int n_entries;
|
||||
u32 val;
|
||||
int lane, n_entries;
|
||||
|
||||
trans = encoder->get_buf_trans(encoder, crtc_state, &n_entries);
|
||||
if (drm_WARN_ON_ONCE(&dev_priv->drm, !trans))
|
||||
@ -290,41 +307,51 @@ void bxt_ddi_phy_set_signal_levels(struct intel_encoder *encoder,
|
||||
* While we write to the group register to program all lanes at once we
|
||||
* can read only lane registers and we pick lanes 0/1 for that.
|
||||
*/
|
||||
val = intel_de_read(dev_priv, BXT_PORT_PCS_DW10_LN01(phy, ch));
|
||||
val &= ~(TX2_SWING_CALC_INIT | TX1_SWING_CALC_INIT);
|
||||
intel_de_write(dev_priv, BXT_PORT_PCS_DW10_GRP(phy, ch), val);
|
||||
bxt_dpio_phy_rmw_grp(dev_priv, BXT_PORT_PCS_DW10_LN01(phy, ch),
|
||||
BXT_PORT_PCS_DW10_GRP(phy, ch),
|
||||
TX2_SWING_CALC_INIT | TX1_SWING_CALC_INIT, 0);
|
||||
|
||||
val = intel_de_read(dev_priv, BXT_PORT_TX_DW2_LN0(phy, ch));
|
||||
val &= ~(MARGIN_000 | UNIQ_TRANS_SCALE);
|
||||
val |= trans->entries[level].bxt.margin << MARGIN_000_SHIFT |
|
||||
trans->entries[level].bxt.scale << UNIQ_TRANS_SCALE_SHIFT;
|
||||
intel_de_write(dev_priv, BXT_PORT_TX_DW2_GRP(phy, ch), val);
|
||||
for (lane = 0; lane < crtc_state->lane_count; lane++) {
|
||||
int level = intel_ddi_level(encoder, crtc_state, lane);
|
||||
|
||||
val = intel_de_read(dev_priv, BXT_PORT_TX_DW3_LN0(phy, ch));
|
||||
val &= ~SCALE_DCOMP_METHOD;
|
||||
if (trans->entries[level].bxt.enable)
|
||||
val |= SCALE_DCOMP_METHOD;
|
||||
intel_de_rmw(dev_priv, BXT_PORT_TX_DW2_LN(phy, ch, lane),
|
||||
MARGIN_000_MASK | UNIQ_TRANS_SCALE_MASK,
|
||||
MARGIN_000(trans->entries[level].bxt.margin) |
|
||||
UNIQ_TRANS_SCALE(trans->entries[level].bxt.scale));
|
||||
}
|
||||
|
||||
if ((val & UNIQUE_TRANGE_EN_METHOD) && !(val & SCALE_DCOMP_METHOD))
|
||||
drm_err(&dev_priv->drm,
|
||||
"Disabled scaling while ouniqetrangenmethod was set");
|
||||
for (lane = 0; lane < crtc_state->lane_count; lane++) {
|
||||
int level = intel_ddi_level(encoder, crtc_state, lane);
|
||||
u32 val;
|
||||
|
||||
intel_de_write(dev_priv, BXT_PORT_TX_DW3_GRP(phy, ch), val);
|
||||
intel_de_rmw(dev_priv, BXT_PORT_TX_DW3_LN(phy, ch, lane),
|
||||
SCALE_DCOMP_METHOD,
|
||||
trans->entries[level].bxt.enable ?
|
||||
SCALE_DCOMP_METHOD : 0);
|
||||
|
||||
val = intel_de_read(dev_priv, BXT_PORT_TX_DW4_LN0(phy, ch));
|
||||
val &= ~DE_EMPHASIS;
|
||||
val |= trans->entries[level].bxt.deemphasis << DEEMPH_SHIFT;
|
||||
intel_de_write(dev_priv, BXT_PORT_TX_DW4_GRP(phy, ch), val);
|
||||
val = intel_de_read(dev_priv, BXT_PORT_TX_DW3_LN(phy, ch, lane));
|
||||
if ((val & UNIQUE_TRANGE_EN_METHOD) && !(val & SCALE_DCOMP_METHOD))
|
||||
drm_err(&dev_priv->drm,
|
||||
"Disabled scaling while ouniqetrangenmethod was set");
|
||||
}
|
||||
|
||||
val = intel_de_read(dev_priv, BXT_PORT_PCS_DW10_LN01(phy, ch));
|
||||
val |= TX2_SWING_CALC_INIT | TX1_SWING_CALC_INIT;
|
||||
intel_de_write(dev_priv, BXT_PORT_PCS_DW10_GRP(phy, ch), val);
|
||||
for (lane = 0; lane < crtc_state->lane_count; lane++) {
|
||||
int level = intel_ddi_level(encoder, crtc_state, lane);
|
||||
|
||||
intel_de_rmw(dev_priv, BXT_PORT_TX_DW4_LN(phy, ch, lane),
|
||||
DE_EMPHASIS_MASK,
|
||||
DE_EMPHASIS(trans->entries[level].bxt.deemphasis));
|
||||
}
|
||||
|
||||
bxt_dpio_phy_rmw_grp(dev_priv, BXT_PORT_PCS_DW10_LN01(phy, ch),
|
||||
BXT_PORT_PCS_DW10_GRP(phy, ch),
|
||||
0, TX2_SWING_CALC_INIT | TX1_SWING_CALC_INIT);
|
||||
}
|
||||
|
||||
bool bxt_ddi_phy_is_enabled(struct drm_i915_private *dev_priv,
|
||||
enum dpio_phy phy)
|
||||
bool bxt_dpio_phy_is_enabled(struct drm_i915_private *dev_priv,
|
||||
enum dpio_phy phy)
|
||||
{
|
||||
const struct bxt_ddi_phy_info *phy_info;
|
||||
const struct bxt_dpio_phy_info *phy_info;
|
||||
|
||||
phy_info = bxt_get_phy_info(dev_priv, phy);
|
||||
|
||||
@ -353,7 +380,7 @@ static u32 bxt_get_grc(struct drm_i915_private *dev_priv, enum dpio_phy phy)
|
||||
{
|
||||
u32 val = intel_de_read(dev_priv, BXT_PORT_REF_DW6(phy));
|
||||
|
||||
return (val & GRC_CODE_MASK) >> GRC_CODE_SHIFT;
|
||||
return REG_FIELD_GET(GRC_CODE_MASK, val);
|
||||
}
|
||||
|
||||
static void bxt_phy_wait_grc_done(struct drm_i915_private *dev_priv,
|
||||
@ -365,20 +392,20 @@ static void bxt_phy_wait_grc_done(struct drm_i915_private *dev_priv,
|
||||
phy);
|
||||
}
|
||||
|
||||
static void _bxt_ddi_phy_init(struct drm_i915_private *dev_priv,
|
||||
enum dpio_phy phy)
|
||||
static void _bxt_dpio_phy_init(struct drm_i915_private *dev_priv,
|
||||
enum dpio_phy phy)
|
||||
{
|
||||
const struct bxt_ddi_phy_info *phy_info;
|
||||
const struct bxt_dpio_phy_info *phy_info;
|
||||
u32 val;
|
||||
|
||||
phy_info = bxt_get_phy_info(dev_priv, phy);
|
||||
|
||||
if (bxt_ddi_phy_is_enabled(dev_priv, phy)) {
|
||||
if (bxt_dpio_phy_is_enabled(dev_priv, phy)) {
|
||||
/* Still read out the GRC value for state verification */
|
||||
if (phy_info->rcomp_phy != -1)
|
||||
dev_priv->display.state.bxt_phy_grc = bxt_get_grc(dev_priv, phy);
|
||||
|
||||
if (bxt_ddi_phy_verify_state(dev_priv, phy)) {
|
||||
if (bxt_dpio_phy_verify_state(dev_priv, phy)) {
|
||||
drm_dbg(&dev_priv->drm, "DDI PHY %d already enabled, "
|
||||
"won't reprogram it\n", phy);
|
||||
return;
|
||||
@ -405,11 +432,11 @@ static void _bxt_ddi_phy_init(struct drm_i915_private *dev_priv,
|
||||
phy);
|
||||
|
||||
/* Program PLL Rcomp code offset */
|
||||
intel_de_rmw(dev_priv, BXT_PORT_CL1CM_DW9(phy), IREF0RC_OFFSET_MASK,
|
||||
0xE4 << IREF0RC_OFFSET_SHIFT);
|
||||
intel_de_rmw(dev_priv, BXT_PORT_CL1CM_DW9(phy),
|
||||
IREF0RC_OFFSET_MASK, IREF0RC_OFFSET(0xE4));
|
||||
|
||||
intel_de_rmw(dev_priv, BXT_PORT_CL1CM_DW10(phy), IREF1RC_OFFSET_MASK,
|
||||
0xE4 << IREF1RC_OFFSET_SHIFT);
|
||||
intel_de_rmw(dev_priv, BXT_PORT_CL1CM_DW10(phy),
|
||||
IREF1RC_OFFSET_MASK, IREF1RC_OFFSET(0xE4));
|
||||
|
||||
/* Program power gating */
|
||||
intel_de_rmw(dev_priv, BXT_PORT_CL1CM_DW28(phy), 0,
|
||||
@ -432,9 +459,9 @@ static void _bxt_ddi_phy_init(struct drm_i915_private *dev_priv,
|
||||
val = bxt_get_grc(dev_priv, phy_info->rcomp_phy);
|
||||
dev_priv->display.state.bxt_phy_grc = val;
|
||||
|
||||
grc_code = val << GRC_CODE_FAST_SHIFT |
|
||||
val << GRC_CODE_SLOW_SHIFT |
|
||||
val;
|
||||
grc_code = GRC_CODE_FAST(val) |
|
||||
GRC_CODE_SLOW(val) |
|
||||
GRC_CODE_NOM(val);
|
||||
intel_de_write(dev_priv, BXT_PORT_REF_DW6(phy), grc_code);
|
||||
intel_de_rmw(dev_priv, BXT_PORT_REF_DW8(phy),
|
||||
0, GRC_DIS | GRC_RDY_OVRD);
|
||||
@ -446,9 +473,9 @@ static void _bxt_ddi_phy_init(struct drm_i915_private *dev_priv,
|
||||
intel_de_rmw(dev_priv, BXT_PHY_CTL_FAMILY(phy), 0, COMMON_RESET_DIS);
|
||||
}
|
||||
|
||||
void bxt_ddi_phy_uninit(struct drm_i915_private *dev_priv, enum dpio_phy phy)
|
||||
void bxt_dpio_phy_uninit(struct drm_i915_private *dev_priv, enum dpio_phy phy)
|
||||
{
|
||||
const struct bxt_ddi_phy_info *phy_info;
|
||||
const struct bxt_dpio_phy_info *phy_info;
|
||||
|
||||
phy_info = bxt_get_phy_info(dev_priv, phy);
|
||||
|
||||
@ -457,9 +484,9 @@ void bxt_ddi_phy_uninit(struct drm_i915_private *dev_priv, enum dpio_phy phy)
|
||||
intel_de_rmw(dev_priv, BXT_P_CR_GT_DISP_PWRON, phy_info->pwron_mask, 0);
|
||||
}
|
||||
|
||||
void bxt_ddi_phy_init(struct drm_i915_private *dev_priv, enum dpio_phy phy)
|
||||
void bxt_dpio_phy_init(struct drm_i915_private *dev_priv, enum dpio_phy phy)
|
||||
{
|
||||
const struct bxt_ddi_phy_info *phy_info =
|
||||
const struct bxt_dpio_phy_info *phy_info =
|
||||
bxt_get_phy_info(dev_priv, phy);
|
||||
enum dpio_phy rcomp_phy = phy_info->rcomp_phy;
|
||||
bool was_enabled;
|
||||
@ -468,19 +495,19 @@ void bxt_ddi_phy_init(struct drm_i915_private *dev_priv, enum dpio_phy phy)
|
||||
|
||||
was_enabled = true;
|
||||
if (rcomp_phy != -1)
|
||||
was_enabled = bxt_ddi_phy_is_enabled(dev_priv, rcomp_phy);
|
||||
was_enabled = bxt_dpio_phy_is_enabled(dev_priv, rcomp_phy);
|
||||
|
||||
/*
|
||||
* We need to copy the GRC calibration value from rcomp_phy,
|
||||
* so make sure it's powered up.
|
||||
*/
|
||||
if (!was_enabled)
|
||||
_bxt_ddi_phy_init(dev_priv, rcomp_phy);
|
||||
_bxt_dpio_phy_init(dev_priv, rcomp_phy);
|
||||
|
||||
_bxt_ddi_phy_init(dev_priv, phy);
|
||||
_bxt_dpio_phy_init(dev_priv, phy);
|
||||
|
||||
if (!was_enabled)
|
||||
bxt_ddi_phy_uninit(dev_priv, rcomp_phy);
|
||||
bxt_dpio_phy_uninit(dev_priv, rcomp_phy);
|
||||
}
|
||||
|
||||
static bool __printf(6, 7)
|
||||
@ -510,10 +537,10 @@ __phy_reg_verify_state(struct drm_i915_private *dev_priv, enum dpio_phy phy,
|
||||
return false;
|
||||
}
|
||||
|
||||
bool bxt_ddi_phy_verify_state(struct drm_i915_private *dev_priv,
|
||||
enum dpio_phy phy)
|
||||
bool bxt_dpio_phy_verify_state(struct drm_i915_private *dev_priv,
|
||||
enum dpio_phy phy)
|
||||
{
|
||||
const struct bxt_ddi_phy_info *phy_info;
|
||||
const struct bxt_dpio_phy_info *phy_info;
|
||||
u32 mask;
|
||||
bool ok;
|
||||
|
||||
@ -523,23 +550,23 @@ bool bxt_ddi_phy_verify_state(struct drm_i915_private *dev_priv,
|
||||
__phy_reg_verify_state(dev_priv, phy, reg, mask, exp, fmt, \
|
||||
## __VA_ARGS__)
|
||||
|
||||
if (!bxt_ddi_phy_is_enabled(dev_priv, phy))
|
||||
if (!bxt_dpio_phy_is_enabled(dev_priv, phy))
|
||||
return false;
|
||||
|
||||
ok = true;
|
||||
|
||||
/* PLL Rcomp code offset */
|
||||
ok &= _CHK(BXT_PORT_CL1CM_DW9(phy),
|
||||
IREF0RC_OFFSET_MASK, 0xe4 << IREF0RC_OFFSET_SHIFT,
|
||||
"BXT_PORT_CL1CM_DW9(%d)", phy);
|
||||
IREF0RC_OFFSET_MASK, IREF0RC_OFFSET(0xe4),
|
||||
"BXT_PORT_CL1CM_DW9(%d)", phy);
|
||||
ok &= _CHK(BXT_PORT_CL1CM_DW10(phy),
|
||||
IREF1RC_OFFSET_MASK, 0xe4 << IREF1RC_OFFSET_SHIFT,
|
||||
"BXT_PORT_CL1CM_DW10(%d)", phy);
|
||||
IREF1RC_OFFSET_MASK, IREF1RC_OFFSET(0xe4),
|
||||
"BXT_PORT_CL1CM_DW10(%d)", phy);
|
||||
|
||||
/* Power gating */
|
||||
mask = OCL1_POWER_DOWN_EN | DW28_OLDO_DYN_PWR_DOWN_EN | SUS_CLK_CONFIG;
|
||||
ok &= _CHK(BXT_PORT_CL1CM_DW28(phy), mask, mask,
|
||||
"BXT_PORT_CL1CM_DW28(%d)", phy);
|
||||
"BXT_PORT_CL1CM_DW28(%d)", phy);
|
||||
|
||||
if (phy_info->dual_channel)
|
||||
ok &= _CHK(BXT_PORT_CL2CM_DW6(phy),
|
||||
@ -549,9 +576,9 @@ bool bxt_ddi_phy_verify_state(struct drm_i915_private *dev_priv,
|
||||
if (phy_info->rcomp_phy != -1) {
|
||||
u32 grc_code = dev_priv->display.state.bxt_phy_grc;
|
||||
|
||||
grc_code = grc_code << GRC_CODE_FAST_SHIFT |
|
||||
grc_code << GRC_CODE_SLOW_SHIFT |
|
||||
grc_code;
|
||||
grc_code = GRC_CODE_FAST(grc_code) |
|
||||
GRC_CODE_SLOW(grc_code) |
|
||||
GRC_CODE_NOM(grc_code);
|
||||
mask = GRC_CODE_FAST_MASK | GRC_CODE_SLOW_MASK |
|
||||
GRC_CODE_NOM_MASK;
|
||||
ok &= _CHK(BXT_PORT_REF_DW6(phy), mask, grc_code,
|
||||
@ -559,7 +586,7 @@ bool bxt_ddi_phy_verify_state(struct drm_i915_private *dev_priv,
|
||||
|
||||
mask = GRC_DIS | GRC_RDY_OVRD;
|
||||
ok &= _CHK(BXT_PORT_REF_DW8(phy), mask, mask,
|
||||
"BXT_PORT_REF_DW8(%d)", phy);
|
||||
"BXT_PORT_REF_DW8(%d)", phy);
|
||||
}
|
||||
|
||||
return ok;
|
||||
@ -567,7 +594,7 @@ bool bxt_ddi_phy_verify_state(struct drm_i915_private *dev_priv,
|
||||
}
|
||||
|
||||
u8
|
||||
bxt_ddi_phy_calc_lane_lat_optim_mask(u8 lane_count)
|
||||
bxt_dpio_phy_calc_lane_lat_optim_mask(u8 lane_count)
|
||||
{
|
||||
switch (lane_count) {
|
||||
case 1:
|
||||
@ -583,8 +610,8 @@ bxt_ddi_phy_calc_lane_lat_optim_mask(u8 lane_count)
|
||||
}
|
||||
}
|
||||
|
||||
void bxt_ddi_phy_set_lane_optim_mask(struct intel_encoder *encoder,
|
||||
u8 lane_lat_optim_mask)
|
||||
void bxt_dpio_phy_set_lane_optim_mask(struct intel_encoder *encoder,
|
||||
u8 lane_lat_optim_mask)
|
||||
{
|
||||
struct drm_i915_private *dev_priv = to_i915(encoder->base.dev);
|
||||
enum port port = encoder->port;
|
||||
@ -595,24 +622,18 @@ void bxt_ddi_phy_set_lane_optim_mask(struct intel_encoder *encoder,
|
||||
bxt_port_to_phy_channel(dev_priv, port, &phy, &ch);
|
||||
|
||||
for (lane = 0; lane < 4; lane++) {
|
||||
u32 val = intel_de_read(dev_priv,
|
||||
BXT_PORT_TX_DW14_LN(phy, ch, lane));
|
||||
|
||||
/*
|
||||
* Note that on CHV this flag is called UPAR, but has
|
||||
* the same function.
|
||||
*/
|
||||
val &= ~LATENCY_OPTIM;
|
||||
if (lane_lat_optim_mask & BIT(lane))
|
||||
val |= LATENCY_OPTIM;
|
||||
|
||||
intel_de_write(dev_priv, BXT_PORT_TX_DW14_LN(phy, ch, lane),
|
||||
val);
|
||||
intel_de_rmw(dev_priv, BXT_PORT_TX_DW14_LN(phy, ch, lane),
|
||||
LATENCY_OPTIM,
|
||||
lane_lat_optim_mask & BIT(lane) ? LATENCY_OPTIM : 0);
|
||||
}
|
||||
}
|
||||
|
||||
u8
|
||||
bxt_ddi_phy_get_lane_lat_optim_mask(struct intel_encoder *encoder)
|
||||
bxt_dpio_phy_get_lane_lat_optim_mask(struct intel_encoder *encoder)
|
||||
{
|
||||
struct drm_i915_private *dev_priv = to_i915(encoder->base.dev);
|
||||
enum port port = encoder->port;
|
||||
|
@ -29,18 +29,18 @@ enum dpio_phy {
|
||||
#ifdef I915
|
||||
void bxt_port_to_phy_channel(struct drm_i915_private *dev_priv, enum port port,
|
||||
enum dpio_phy *phy, enum dpio_channel *ch);
|
||||
void bxt_ddi_phy_set_signal_levels(struct intel_encoder *encoder,
|
||||
const struct intel_crtc_state *crtc_state);
|
||||
void bxt_ddi_phy_init(struct drm_i915_private *dev_priv, enum dpio_phy phy);
|
||||
void bxt_ddi_phy_uninit(struct drm_i915_private *dev_priv, enum dpio_phy phy);
|
||||
bool bxt_ddi_phy_is_enabled(struct drm_i915_private *dev_priv,
|
||||
enum dpio_phy phy);
|
||||
bool bxt_ddi_phy_verify_state(struct drm_i915_private *dev_priv,
|
||||
enum dpio_phy phy);
|
||||
u8 bxt_ddi_phy_calc_lane_lat_optim_mask(u8 lane_count);
|
||||
void bxt_ddi_phy_set_lane_optim_mask(struct intel_encoder *encoder,
|
||||
u8 lane_lat_optim_mask);
|
||||
u8 bxt_ddi_phy_get_lane_lat_optim_mask(struct intel_encoder *encoder);
|
||||
void bxt_dpio_phy_set_signal_levels(struct intel_encoder *encoder,
|
||||
const struct intel_crtc_state *crtc_state);
|
||||
void bxt_dpio_phy_init(struct drm_i915_private *dev_priv, enum dpio_phy phy);
|
||||
void bxt_dpio_phy_uninit(struct drm_i915_private *dev_priv, enum dpio_phy phy);
|
||||
bool bxt_dpio_phy_is_enabled(struct drm_i915_private *dev_priv,
|
||||
enum dpio_phy phy);
|
||||
bool bxt_dpio_phy_verify_state(struct drm_i915_private *dev_priv,
|
||||
enum dpio_phy phy);
|
||||
u8 bxt_dpio_phy_calc_lane_lat_optim_mask(u8 lane_count);
|
||||
void bxt_dpio_phy_set_lane_optim_mask(struct intel_encoder *encoder,
|
||||
u8 lane_lat_optim_mask);
|
||||
u8 bxt_dpio_phy_get_lane_lat_optim_mask(struct intel_encoder *encoder);
|
||||
|
||||
enum dpio_channel vlv_dig_port_to_channel(struct intel_digital_port *dig_port);
|
||||
enum dpio_phy vlv_dig_port_to_phy(struct intel_digital_port *dig_port);
|
||||
@ -77,35 +77,35 @@ static inline void bxt_port_to_phy_channel(struct drm_i915_private *dev_priv, en
|
||||
enum dpio_phy *phy, enum dpio_channel *ch)
|
||||
{
|
||||
}
|
||||
static inline void bxt_ddi_phy_set_signal_levels(struct intel_encoder *encoder,
|
||||
const struct intel_crtc_state *crtc_state)
|
||||
static inline void bxt_dpio_phy_set_signal_levels(struct intel_encoder *encoder,
|
||||
const struct intel_crtc_state *crtc_state)
|
||||
{
|
||||
}
|
||||
static inline void bxt_ddi_phy_init(struct drm_i915_private *dev_priv, enum dpio_phy phy)
|
||||
static inline void bxt_dpio_phy_init(struct drm_i915_private *dev_priv, enum dpio_phy phy)
|
||||
{
|
||||
}
|
||||
static inline void bxt_ddi_phy_uninit(struct drm_i915_private *dev_priv, enum dpio_phy phy)
|
||||
static inline void bxt_dpio_phy_uninit(struct drm_i915_private *dev_priv, enum dpio_phy phy)
|
||||
{
|
||||
}
|
||||
static inline bool bxt_ddi_phy_is_enabled(struct drm_i915_private *dev_priv,
|
||||
enum dpio_phy phy)
|
||||
static inline bool bxt_dpio_phy_is_enabled(struct drm_i915_private *dev_priv,
|
||||
enum dpio_phy phy)
|
||||
{
|
||||
return false;
|
||||
}
|
||||
static inline bool bxt_ddi_phy_verify_state(struct drm_i915_private *dev_priv,
|
||||
enum dpio_phy phy)
|
||||
static inline bool bxt_dpio_phy_verify_state(struct drm_i915_private *dev_priv,
|
||||
enum dpio_phy phy)
|
||||
{
|
||||
return true;
|
||||
}
|
||||
static inline u8 bxt_ddi_phy_calc_lane_lat_optim_mask(u8 lane_count)
|
||||
static inline u8 bxt_dpio_phy_calc_lane_lat_optim_mask(u8 lane_count)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
static inline void bxt_ddi_phy_set_lane_optim_mask(struct intel_encoder *encoder,
|
||||
u8 lane_lat_optim_mask)
|
||||
static inline void bxt_dpio_phy_set_lane_optim_mask(struct intel_encoder *encoder,
|
||||
u8 lane_lat_optim_mask)
|
||||
{
|
||||
}
|
||||
static inline u8 bxt_ddi_phy_get_lane_lat_optim_mask(struct intel_encoder *encoder)
|
||||
static inline u8 bxt_dpio_phy_get_lane_lat_optim_mask(struct intel_encoder *encoder)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
@ -369,38 +369,68 @@ int chv_calc_dpll_params(int refclk, struct dpll *clock)
|
||||
return clock->dot;
|
||||
}
|
||||
|
||||
static int i9xx_pll_refclk(struct drm_device *dev,
|
||||
const struct intel_crtc_state *pipe_config)
|
||||
static int i9xx_pll_refclk(const struct intel_crtc_state *crtc_state)
|
||||
{
|
||||
struct drm_i915_private *dev_priv = to_i915(dev);
|
||||
u32 dpll = pipe_config->dpll_hw_state.dpll;
|
||||
struct drm_i915_private *i915 = to_i915(crtc_state->uapi.crtc->dev);
|
||||
const struct i9xx_dpll_hw_state *hw_state = &crtc_state->dpll_hw_state.i9xx;
|
||||
|
||||
if ((dpll & PLL_REF_INPUT_MASK) == PLLB_REF_INPUT_SPREADSPECTRUMIN)
|
||||
return dev_priv->display.vbt.lvds_ssc_freq;
|
||||
else if (HAS_PCH_SPLIT(dev_priv))
|
||||
if ((hw_state->dpll & PLL_REF_INPUT_MASK) == PLLB_REF_INPUT_SPREADSPECTRUMIN)
|
||||
return i915->display.vbt.lvds_ssc_freq;
|
||||
else if (HAS_PCH_SPLIT(i915))
|
||||
return 120000;
|
||||
else if (DISPLAY_VER(dev_priv) != 2)
|
||||
else if (DISPLAY_VER(i915) != 2)
|
||||
return 96000;
|
||||
else
|
||||
return 48000;
|
||||
}
|
||||
|
||||
/* Returns the clock of the currently programmed mode of the given pipe. */
|
||||
void i9xx_crtc_clock_get(struct intel_crtc *crtc,
|
||||
struct intel_crtc_state *pipe_config)
|
||||
void i9xx_dpll_get_hw_state(struct intel_crtc *crtc,
|
||||
struct intel_dpll_hw_state *dpll_hw_state)
|
||||
{
|
||||
struct drm_device *dev = crtc->base.dev;
|
||||
struct drm_i915_private *dev_priv = to_i915(dev);
|
||||
u32 dpll = pipe_config->dpll_hw_state.dpll;
|
||||
struct drm_i915_private *dev_priv = to_i915(crtc->base.dev);
|
||||
struct i9xx_dpll_hw_state *hw_state = &dpll_hw_state->i9xx;
|
||||
|
||||
if (DISPLAY_VER(dev_priv) >= 4) {
|
||||
u32 tmp;
|
||||
|
||||
/* No way to read it out on pipes B and C */
|
||||
if (IS_CHERRYVIEW(dev_priv) && crtc->pipe != PIPE_A)
|
||||
tmp = dev_priv->display.state.chv_dpll_md[crtc->pipe];
|
||||
else
|
||||
tmp = intel_de_read(dev_priv, DPLL_MD(crtc->pipe));
|
||||
|
||||
hw_state->dpll_md = tmp;
|
||||
}
|
||||
|
||||
hw_state->dpll = intel_de_read(dev_priv, DPLL(crtc->pipe));
|
||||
|
||||
if (!IS_VALLEYVIEW(dev_priv) && !IS_CHERRYVIEW(dev_priv)) {
|
||||
hw_state->fp0 = intel_de_read(dev_priv, FP0(crtc->pipe));
|
||||
hw_state->fp1 = intel_de_read(dev_priv, FP1(crtc->pipe));
|
||||
} else {
|
||||
/* Mask out read-only status bits. */
|
||||
hw_state->dpll &= ~(DPLL_LOCK_VLV |
|
||||
DPLL_PORTC_READY_MASK |
|
||||
DPLL_PORTB_READY_MASK);
|
||||
}
|
||||
}
|
||||
|
||||
/* Returns the clock of the currently programmed mode of the given pipe. */
|
||||
void i9xx_crtc_clock_get(struct intel_crtc_state *crtc_state)
|
||||
{
|
||||
struct intel_crtc *crtc = to_intel_crtc(crtc_state->uapi.crtc);
|
||||
struct drm_i915_private *dev_priv = to_i915(crtc->base.dev);
|
||||
const struct i9xx_dpll_hw_state *hw_state = &crtc_state->dpll_hw_state.i9xx;
|
||||
u32 dpll = hw_state->dpll;
|
||||
u32 fp;
|
||||
struct dpll clock;
|
||||
int port_clock;
|
||||
int refclk = i9xx_pll_refclk(dev, pipe_config);
|
||||
int refclk = i9xx_pll_refclk(crtc_state);
|
||||
|
||||
if ((dpll & DISPLAY_RATE_SELECT_FPA1) == 0)
|
||||
fp = pipe_config->dpll_hw_state.fp0;
|
||||
fp = hw_state->fp0;
|
||||
else
|
||||
fp = pipe_config->dpll_hw_state.fp1;
|
||||
fp = hw_state->fp1;
|
||||
|
||||
clock.m1 = (fp & FP_M1_DIV_MASK) >> FP_M1_DIV_SHIFT;
|
||||
if (IS_PINEVIEW(dev_priv)) {
|
||||
@ -475,21 +505,21 @@ void i9xx_crtc_clock_get(struct intel_crtc *crtc,
|
||||
* port_clock to compute adjusted_mode.crtc_clock in the
|
||||
* encoder's get_config() function.
|
||||
*/
|
||||
pipe_config->port_clock = port_clock;
|
||||
crtc_state->port_clock = port_clock;
|
||||
}
|
||||
|
||||
void vlv_crtc_clock_get(struct intel_crtc *crtc,
|
||||
struct intel_crtc_state *pipe_config)
|
||||
void vlv_crtc_clock_get(struct intel_crtc_state *crtc_state)
|
||||
{
|
||||
struct drm_device *dev = crtc->base.dev;
|
||||
struct drm_i915_private *dev_priv = to_i915(dev);
|
||||
struct intel_crtc *crtc = to_intel_crtc(crtc_state->uapi.crtc);
|
||||
struct drm_i915_private *dev_priv = to_i915(crtc->base.dev);
|
||||
enum dpio_phy phy = vlv_pipe_to_phy(crtc->pipe);
|
||||
const struct i9xx_dpll_hw_state *hw_state = &crtc_state->dpll_hw_state.i9xx;
|
||||
struct dpll clock;
|
||||
u32 mdiv;
|
||||
int refclk = 100000;
|
||||
|
||||
/* In case of DSI, DPLL will not be used */
|
||||
if ((pipe_config->dpll_hw_state.dpll & DPLL_VCO_ENABLE) == 0)
|
||||
if ((hw_state->dpll & DPLL_VCO_ENABLE) == 0)
|
||||
return;
|
||||
|
||||
vlv_dpio_get(dev_priv);
|
||||
@ -502,22 +532,22 @@ void vlv_crtc_clock_get(struct intel_crtc *crtc,
|
||||
clock.p1 = (mdiv >> DPIO_P1_SHIFT) & 7;
|
||||
clock.p2 = (mdiv >> DPIO_P2_SHIFT) & 0x1f;
|
||||
|
||||
pipe_config->port_clock = vlv_calc_dpll_params(refclk, &clock);
|
||||
crtc_state->port_clock = vlv_calc_dpll_params(refclk, &clock);
|
||||
}
|
||||
|
||||
void chv_crtc_clock_get(struct intel_crtc *crtc,
|
||||
struct intel_crtc_state *pipe_config)
|
||||
void chv_crtc_clock_get(struct intel_crtc_state *crtc_state)
|
||||
{
|
||||
struct drm_device *dev = crtc->base.dev;
|
||||
struct drm_i915_private *dev_priv = to_i915(dev);
|
||||
struct intel_crtc *crtc = to_intel_crtc(crtc_state->uapi.crtc);
|
||||
struct drm_i915_private *dev_priv = to_i915(crtc->base.dev);
|
||||
enum dpio_channel port = vlv_pipe_to_channel(crtc->pipe);
|
||||
enum dpio_phy phy = vlv_pipe_to_phy(crtc->pipe);
|
||||
const struct i9xx_dpll_hw_state *hw_state = &crtc_state->dpll_hw_state.i9xx;
|
||||
struct dpll clock;
|
||||
u32 cmn_dw13, pll_dw0, pll_dw1, pll_dw2, pll_dw3;
|
||||
int refclk = 100000;
|
||||
|
||||
/* In case of DSI, DPLL will not be used */
|
||||
if ((pipe_config->dpll_hw_state.dpll & DPLL_VCO_ENABLE) == 0)
|
||||
if ((hw_state->dpll & DPLL_VCO_ENABLE) == 0)
|
||||
return;
|
||||
|
||||
vlv_dpio_get(dev_priv);
|
||||
@ -536,7 +566,7 @@ void chv_crtc_clock_get(struct intel_crtc *crtc,
|
||||
clock.p1 = (cmn_dw13 >> DPIO_CHV_P1_DIV_SHIFT) & 0x7;
|
||||
clock.p2 = (cmn_dw13 >> DPIO_CHV_P2_DIV_SHIFT) & 0x1f;
|
||||
|
||||
pipe_config->port_clock = chv_calc_dpll_params(refclk, &clock);
|
||||
crtc_state->port_clock = chv_calc_dpll_params(refclk, &clock);
|
||||
}
|
||||
|
||||
/*
|
||||
@ -958,37 +988,20 @@ static u32 pnv_dpll_compute_fp(const struct dpll *dpll)
|
||||
return (1 << dpll->n) << 16 | dpll->m2;
|
||||
}
|
||||
|
||||
static void i9xx_update_pll_dividers(struct intel_crtc_state *crtc_state,
|
||||
const struct dpll *clock,
|
||||
const struct dpll *reduced_clock)
|
||||
static u32 i965_dpll_md(const struct intel_crtc_state *crtc_state)
|
||||
{
|
||||
struct intel_crtc *crtc = to_intel_crtc(crtc_state->uapi.crtc);
|
||||
struct drm_i915_private *dev_priv = to_i915(crtc->base.dev);
|
||||
u32 fp, fp2;
|
||||
|
||||
if (IS_PINEVIEW(dev_priv)) {
|
||||
fp = pnv_dpll_compute_fp(clock);
|
||||
fp2 = pnv_dpll_compute_fp(reduced_clock);
|
||||
} else {
|
||||
fp = i9xx_dpll_compute_fp(clock);
|
||||
fp2 = i9xx_dpll_compute_fp(reduced_clock);
|
||||
}
|
||||
|
||||
crtc_state->dpll_hw_state.fp0 = fp;
|
||||
crtc_state->dpll_hw_state.fp1 = fp2;
|
||||
return (crtc_state->pixel_multiplier - 1) << DPLL_MD_UDI_MULTIPLIER_SHIFT;
|
||||
}
|
||||
|
||||
static void i9xx_compute_dpll(struct intel_crtc_state *crtc_state,
|
||||
const struct dpll *clock,
|
||||
const struct dpll *reduced_clock)
|
||||
static u32 i9xx_dpll(const struct intel_crtc_state *crtc_state,
|
||||
const struct dpll *clock,
|
||||
const struct dpll *reduced_clock)
|
||||
{
|
||||
struct intel_crtc *crtc = to_intel_crtc(crtc_state->uapi.crtc);
|
||||
struct drm_i915_private *dev_priv = to_i915(crtc->base.dev);
|
||||
u32 dpll;
|
||||
|
||||
i9xx_update_pll_dividers(crtc_state, clock, reduced_clock);
|
||||
|
||||
dpll = DPLL_VGA_MODE_DIS;
|
||||
dpll = DPLL_VCO_ENABLE | DPLL_VGA_MODE_DIS;
|
||||
|
||||
if (intel_crtc_has_type(crtc_state, INTEL_OUTPUT_LVDS))
|
||||
dpll |= DPLLB_MODE_LVDS;
|
||||
@ -1047,27 +1060,40 @@ static void i9xx_compute_dpll(struct intel_crtc_state *crtc_state,
|
||||
else
|
||||
dpll |= PLL_REF_INPUT_DREFCLK;
|
||||
|
||||
dpll |= DPLL_VCO_ENABLE;
|
||||
crtc_state->dpll_hw_state.dpll = dpll;
|
||||
|
||||
if (DISPLAY_VER(dev_priv) >= 4) {
|
||||
u32 dpll_md = (crtc_state->pixel_multiplier - 1)
|
||||
<< DPLL_MD_UDI_MULTIPLIER_SHIFT;
|
||||
crtc_state->dpll_hw_state.dpll_md = dpll_md;
|
||||
}
|
||||
return dpll;
|
||||
}
|
||||
|
||||
static void i8xx_compute_dpll(struct intel_crtc_state *crtc_state,
|
||||
static void i9xx_compute_dpll(struct intel_crtc_state *crtc_state,
|
||||
const struct dpll *clock,
|
||||
const struct dpll *reduced_clock)
|
||||
{
|
||||
struct intel_crtc *crtc = to_intel_crtc(crtc_state->uapi.crtc);
|
||||
struct drm_i915_private *dev_priv = to_i915(crtc->base.dev);
|
||||
struct i9xx_dpll_hw_state *hw_state = &crtc_state->dpll_hw_state.i9xx;
|
||||
|
||||
if (IS_PINEVIEW(dev_priv)) {
|
||||
hw_state->fp0 = pnv_dpll_compute_fp(clock);
|
||||
hw_state->fp1 = pnv_dpll_compute_fp(reduced_clock);
|
||||
} else {
|
||||
hw_state->fp0 = i9xx_dpll_compute_fp(clock);
|
||||
hw_state->fp1 = i9xx_dpll_compute_fp(reduced_clock);
|
||||
}
|
||||
|
||||
hw_state->dpll = i9xx_dpll(crtc_state, clock, reduced_clock);
|
||||
|
||||
if (DISPLAY_VER(dev_priv) >= 4)
|
||||
hw_state->dpll_md = i965_dpll_md(crtc_state);
|
||||
}
|
||||
|
||||
static u32 i8xx_dpll(const struct intel_crtc_state *crtc_state,
|
||||
const struct dpll *clock,
|
||||
const struct dpll *reduced_clock)
|
||||
{
|
||||
struct intel_crtc *crtc = to_intel_crtc(crtc_state->uapi.crtc);
|
||||
struct drm_i915_private *dev_priv = to_i915(crtc->base.dev);
|
||||
u32 dpll;
|
||||
|
||||
i9xx_update_pll_dividers(crtc_state, clock, reduced_clock);
|
||||
|
||||
dpll = DPLL_VGA_MODE_DIS;
|
||||
dpll = DPLL_VCO_ENABLE | DPLL_VGA_MODE_DIS;
|
||||
|
||||
if (intel_crtc_has_type(crtc_state, INTEL_OUTPUT_LVDS)) {
|
||||
dpll |= (1 << (clock->p1 - 1)) << DPLL_FPA01_P1_POST_DIV_SHIFT;
|
||||
@ -1104,8 +1130,19 @@ static void i8xx_compute_dpll(struct intel_crtc_state *crtc_state,
|
||||
else
|
||||
dpll |= PLL_REF_INPUT_DREFCLK;
|
||||
|
||||
dpll |= DPLL_VCO_ENABLE;
|
||||
crtc_state->dpll_hw_state.dpll = dpll;
|
||||
return dpll;
|
||||
}
|
||||
|
||||
static void i8xx_compute_dpll(struct intel_crtc_state *crtc_state,
|
||||
const struct dpll *clock,
|
||||
const struct dpll *reduced_clock)
|
||||
{
|
||||
struct i9xx_dpll_hw_state *hw_state = &crtc_state->dpll_hw_state.i9xx;
|
||||
|
||||
hw_state->fp0 = i9xx_dpll_compute_fp(clock);
|
||||
hw_state->fp1 = i9xx_dpll_compute_fp(reduced_clock);
|
||||
|
||||
hw_state->dpll = i8xx_dpll(crtc_state, clock, reduced_clock);
|
||||
}
|
||||
|
||||
static int hsw_crtc_compute_clock(struct intel_atomic_state *state,
|
||||
@ -1185,62 +1222,54 @@ static int mtl_crtc_compute_clock(struct intel_atomic_state *state,
|
||||
return ret;
|
||||
|
||||
/* TODO: Do the readback via intel_compute_shared_dplls() */
|
||||
crtc_state->port_clock = intel_cx0pll_calc_port_clock(encoder, &crtc_state->cx0pll_state);
|
||||
crtc_state->port_clock = intel_cx0pll_calc_port_clock(encoder, &crtc_state->dpll_hw_state.cx0pll);
|
||||
|
||||
crtc_state->hw.adjusted_mode.crtc_clock = intel_crtc_dotclock(crtc_state);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int ilk_fb_cb_factor(const 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);
|
||||
|
||||
if (intel_crtc_has_type(crtc_state, INTEL_OUTPUT_LVDS) &&
|
||||
((intel_panel_use_ssc(i915) && i915->display.vbt.lvds_ssc_freq == 100000) ||
|
||||
(HAS_PCH_IBX(i915) && intel_is_dual_link_lvds(i915))))
|
||||
return 25;
|
||||
|
||||
if (crtc_state->sdvo_tv_clock)
|
||||
return 20;
|
||||
|
||||
return 21;
|
||||
}
|
||||
|
||||
static bool ilk_needs_fb_cb_tune(const struct dpll *dpll, int factor)
|
||||
{
|
||||
return dpll->m < factor * dpll->n;
|
||||
}
|
||||
|
||||
static void ilk_update_pll_dividers(struct intel_crtc_state *crtc_state,
|
||||
const struct dpll *clock,
|
||||
const struct dpll *reduced_clock)
|
||||
static u32 ilk_dpll_compute_fp(const struct dpll *clock, int factor)
|
||||
{
|
||||
struct intel_crtc *crtc = to_intel_crtc(crtc_state->uapi.crtc);
|
||||
struct drm_i915_private *dev_priv = to_i915(crtc->base.dev);
|
||||
u32 fp, fp2;
|
||||
int factor;
|
||||
|
||||
/* Enable autotuning of the PLL clock (if permissible) */
|
||||
factor = 21;
|
||||
if (intel_crtc_has_type(crtc_state, INTEL_OUTPUT_LVDS)) {
|
||||
if ((intel_panel_use_ssc(dev_priv) &&
|
||||
dev_priv->display.vbt.lvds_ssc_freq == 100000) ||
|
||||
(HAS_PCH_IBX(dev_priv) &&
|
||||
intel_is_dual_link_lvds(dev_priv)))
|
||||
factor = 25;
|
||||
} else if (crtc_state->sdvo_tv_clock) {
|
||||
factor = 20;
|
||||
}
|
||||
u32 fp;
|
||||
|
||||
fp = i9xx_dpll_compute_fp(clock);
|
||||
if (ilk_needs_fb_cb_tune(clock, factor))
|
||||
fp |= FP_CB_TUNE;
|
||||
|
||||
fp2 = i9xx_dpll_compute_fp(reduced_clock);
|
||||
if (ilk_needs_fb_cb_tune(reduced_clock, factor))
|
||||
fp2 |= FP_CB_TUNE;
|
||||
|
||||
crtc_state->dpll_hw_state.fp0 = fp;
|
||||
crtc_state->dpll_hw_state.fp1 = fp2;
|
||||
return fp;
|
||||
}
|
||||
|
||||
static void ilk_compute_dpll(struct intel_crtc_state *crtc_state,
|
||||
const struct dpll *clock,
|
||||
const struct dpll *reduced_clock)
|
||||
static u32 ilk_dpll(const struct intel_crtc_state *crtc_state,
|
||||
const struct dpll *clock,
|
||||
const struct dpll *reduced_clock)
|
||||
{
|
||||
struct intel_crtc *crtc = to_intel_crtc(crtc_state->uapi.crtc);
|
||||
struct drm_i915_private *dev_priv = to_i915(crtc->base.dev);
|
||||
u32 dpll;
|
||||
|
||||
ilk_update_pll_dividers(crtc_state, clock, reduced_clock);
|
||||
|
||||
dpll = 0;
|
||||
dpll = DPLL_VCO_ENABLE;
|
||||
|
||||
if (intel_crtc_has_type(crtc_state, INTEL_OUTPUT_LVDS))
|
||||
dpll |= DPLLB_MODE_LVDS;
|
||||
@ -1302,9 +1331,20 @@ static void ilk_compute_dpll(struct intel_crtc_state *crtc_state,
|
||||
else
|
||||
dpll |= PLL_REF_INPUT_DREFCLK;
|
||||
|
||||
dpll |= DPLL_VCO_ENABLE;
|
||||
return dpll;
|
||||
}
|
||||
|
||||
crtc_state->dpll_hw_state.dpll = dpll;
|
||||
static void ilk_compute_dpll(struct intel_crtc_state *crtc_state,
|
||||
const struct dpll *clock,
|
||||
const struct dpll *reduced_clock)
|
||||
{
|
||||
struct i9xx_dpll_hw_state *hw_state = &crtc_state->dpll_hw_state.i9xx;
|
||||
int factor = ilk_fb_cb_factor(crtc_state);
|
||||
|
||||
hw_state->fp0 = ilk_dpll_compute_fp(clock, factor);
|
||||
hw_state->fp1 = ilk_dpll_compute_fp(reduced_clock, factor);
|
||||
|
||||
hw_state->dpll = ilk_dpll(crtc_state, clock, reduced_clock);
|
||||
}
|
||||
|
||||
static int ilk_crtc_compute_clock(struct intel_atomic_state *state,
|
||||
@ -1377,39 +1417,56 @@ static int ilk_crtc_get_shared_dpll(struct intel_atomic_state *state,
|
||||
return intel_reserve_shared_dplls(state, crtc, NULL);
|
||||
}
|
||||
|
||||
void vlv_compute_dpll(struct intel_crtc_state *crtc_state)
|
||||
static u32 vlv_dpll(const struct intel_crtc_state *crtc_state)
|
||||
{
|
||||
struct intel_crtc *crtc = to_intel_crtc(crtc_state->uapi.crtc);
|
||||
u32 dpll;
|
||||
|
||||
crtc_state->dpll_hw_state.dpll = DPLL_INTEGRATED_REF_CLK_VLV |
|
||||
dpll = DPLL_INTEGRATED_REF_CLK_VLV |
|
||||
DPLL_REF_CLK_ENABLE_VLV | DPLL_VGA_MODE_DIS;
|
||||
|
||||
if (crtc->pipe != PIPE_A)
|
||||
crtc_state->dpll_hw_state.dpll |= DPLL_INTEGRATED_CRI_CLK_VLV;
|
||||
dpll |= DPLL_INTEGRATED_CRI_CLK_VLV;
|
||||
|
||||
/* DPLL not used with DSI, but still need the rest set up */
|
||||
if (!intel_crtc_has_type(crtc_state, INTEL_OUTPUT_DSI))
|
||||
crtc_state->dpll_hw_state.dpll |= DPLL_VCO_ENABLE |
|
||||
DPLL_EXT_BUFFER_ENABLE_VLV;
|
||||
dpll |= DPLL_VCO_ENABLE | DPLL_EXT_BUFFER_ENABLE_VLV;
|
||||
|
||||
crtc_state->dpll_hw_state.dpll_md =
|
||||
(crtc_state->pixel_multiplier - 1) << DPLL_MD_UDI_MULTIPLIER_SHIFT;
|
||||
return dpll;
|
||||
}
|
||||
|
||||
void vlv_compute_dpll(struct intel_crtc_state *crtc_state)
|
||||
{
|
||||
struct i9xx_dpll_hw_state *hw_state = &crtc_state->dpll_hw_state.i9xx;
|
||||
|
||||
hw_state->dpll = vlv_dpll(crtc_state);
|
||||
hw_state->dpll_md = i965_dpll_md(crtc_state);
|
||||
}
|
||||
|
||||
static u32 chv_dpll(const struct intel_crtc_state *crtc_state)
|
||||
{
|
||||
struct intel_crtc *crtc = to_intel_crtc(crtc_state->uapi.crtc);
|
||||
u32 dpll;
|
||||
|
||||
dpll = DPLL_SSC_REF_CLK_CHV |
|
||||
DPLL_REF_CLK_ENABLE_VLV | DPLL_VGA_MODE_DIS;
|
||||
|
||||
if (crtc->pipe != PIPE_A)
|
||||
dpll |= DPLL_INTEGRATED_CRI_CLK_VLV;
|
||||
|
||||
/* DPLL not used with DSI, but still need the rest set up */
|
||||
if (!intel_crtc_has_type(crtc_state, INTEL_OUTPUT_DSI))
|
||||
dpll |= DPLL_VCO_ENABLE;
|
||||
|
||||
return dpll;
|
||||
}
|
||||
|
||||
void chv_compute_dpll(struct intel_crtc_state *crtc_state)
|
||||
{
|
||||
struct intel_crtc *crtc = to_intel_crtc(crtc_state->uapi.crtc);
|
||||
struct i9xx_dpll_hw_state *hw_state = &crtc_state->dpll_hw_state.i9xx;
|
||||
|
||||
crtc_state->dpll_hw_state.dpll = DPLL_SSC_REF_CLK_CHV |
|
||||
DPLL_REF_CLK_ENABLE_VLV | DPLL_VGA_MODE_DIS;
|
||||
if (crtc->pipe != PIPE_A)
|
||||
crtc_state->dpll_hw_state.dpll |= DPLL_INTEGRATED_CRI_CLK_VLV;
|
||||
|
||||
/* DPLL not used with DSI, but still need the rest set up */
|
||||
if (!intel_crtc_has_type(crtc_state, INTEL_OUTPUT_DSI))
|
||||
crtc_state->dpll_hw_state.dpll |= DPLL_VCO_ENABLE;
|
||||
|
||||
crtc_state->dpll_hw_state.dpll_md =
|
||||
(crtc_state->pixel_multiplier - 1) << DPLL_MD_UDI_MULTIPLIER_SHIFT;
|
||||
hw_state->dpll = chv_dpll(crtc_state);
|
||||
hw_state->dpll_md = i965_dpll_md(crtc_state);
|
||||
}
|
||||
|
||||
static int chv_crtc_compute_clock(struct intel_atomic_state *state,
|
||||
@ -1765,7 +1822,7 @@ void i9xx_enable_pll(const struct intel_crtc_state *crtc_state)
|
||||
{
|
||||
struct intel_crtc *crtc = to_intel_crtc(crtc_state->uapi.crtc);
|
||||
struct drm_i915_private *dev_priv = to_i915(crtc->base.dev);
|
||||
u32 dpll = crtc_state->dpll_hw_state.dpll;
|
||||
const struct i9xx_dpll_hw_state *hw_state = &crtc_state->dpll_hw_state.i9xx;
|
||||
enum pipe pipe = crtc->pipe;
|
||||
int i;
|
||||
|
||||
@ -1775,36 +1832,35 @@ void i9xx_enable_pll(const struct intel_crtc_state *crtc_state)
|
||||
if (i9xx_has_pps(dev_priv))
|
||||
assert_pps_unlocked(dev_priv, pipe);
|
||||
|
||||
intel_de_write(dev_priv, FP0(pipe), crtc_state->dpll_hw_state.fp0);
|
||||
intel_de_write(dev_priv, FP1(pipe), crtc_state->dpll_hw_state.fp1);
|
||||
intel_de_write(dev_priv, FP0(pipe), hw_state->fp0);
|
||||
intel_de_write(dev_priv, FP1(pipe), hw_state->fp1);
|
||||
|
||||
/*
|
||||
* Apparently we need to have VGA mode enabled prior to changing
|
||||
* the P1/P2 dividers. Otherwise the DPLL will keep using the old
|
||||
* dividers, even though the register value does change.
|
||||
*/
|
||||
intel_de_write(dev_priv, DPLL(pipe), dpll & ~DPLL_VGA_MODE_DIS);
|
||||
intel_de_write(dev_priv, DPLL(pipe), dpll);
|
||||
intel_de_write(dev_priv, DPLL(pipe), hw_state->dpll & ~DPLL_VGA_MODE_DIS);
|
||||
intel_de_write(dev_priv, DPLL(pipe), hw_state->dpll);
|
||||
|
||||
/* Wait for the clocks to stabilize. */
|
||||
intel_de_posting_read(dev_priv, DPLL(pipe));
|
||||
udelay(150);
|
||||
|
||||
if (DISPLAY_VER(dev_priv) >= 4) {
|
||||
intel_de_write(dev_priv, DPLL_MD(pipe),
|
||||
crtc_state->dpll_hw_state.dpll_md);
|
||||
intel_de_write(dev_priv, DPLL_MD(pipe), hw_state->dpll_md);
|
||||
} else {
|
||||
/* The pixel multiplier can only be updated once the
|
||||
* DPLL is enabled and the clocks are stable.
|
||||
*
|
||||
* So write it again.
|
||||
*/
|
||||
intel_de_write(dev_priv, DPLL(pipe), dpll);
|
||||
intel_de_write(dev_priv, DPLL(pipe), hw_state->dpll);
|
||||
}
|
||||
|
||||
/* We do this three times for luck */
|
||||
for (i = 0; i < 3; i++) {
|
||||
intel_de_write(dev_priv, DPLL(pipe), dpll);
|
||||
intel_de_write(dev_priv, DPLL(pipe), hw_state->dpll);
|
||||
intel_de_posting_read(dev_priv, DPLL(pipe));
|
||||
udelay(150); /* wait for warmup */
|
||||
}
|
||||
@ -1934,9 +1990,10 @@ static void _vlv_enable_pll(const struct intel_crtc_state *crtc_state)
|
||||
{
|
||||
struct intel_crtc *crtc = to_intel_crtc(crtc_state->uapi.crtc);
|
||||
struct drm_i915_private *dev_priv = to_i915(crtc->base.dev);
|
||||
const struct i9xx_dpll_hw_state *hw_state = &crtc_state->dpll_hw_state.i9xx;
|
||||
enum pipe pipe = crtc->pipe;
|
||||
|
||||
intel_de_write(dev_priv, DPLL(pipe), crtc_state->dpll_hw_state.dpll);
|
||||
intel_de_write(dev_priv, DPLL(pipe), hw_state->dpll);
|
||||
intel_de_posting_read(dev_priv, DPLL(pipe));
|
||||
udelay(150);
|
||||
|
||||
@ -1948,6 +2005,7 @@ void vlv_enable_pll(const struct intel_crtc_state *crtc_state)
|
||||
{
|
||||
struct intel_crtc *crtc = to_intel_crtc(crtc_state->uapi.crtc);
|
||||
struct drm_i915_private *dev_priv = to_i915(crtc->base.dev);
|
||||
const struct i9xx_dpll_hw_state *hw_state = &crtc_state->dpll_hw_state.i9xx;
|
||||
enum pipe pipe = crtc->pipe;
|
||||
|
||||
assert_transcoder_disabled(dev_priv, crtc_state->cpu_transcoder);
|
||||
@ -1957,16 +2015,14 @@ void vlv_enable_pll(const struct intel_crtc_state *crtc_state)
|
||||
|
||||
/* Enable Refclk */
|
||||
intel_de_write(dev_priv, DPLL(pipe),
|
||||
crtc_state->dpll_hw_state.dpll &
|
||||
~(DPLL_VCO_ENABLE | DPLL_EXT_BUFFER_ENABLE_VLV));
|
||||
hw_state->dpll & ~(DPLL_VCO_ENABLE | DPLL_EXT_BUFFER_ENABLE_VLV));
|
||||
|
||||
if (crtc_state->dpll_hw_state.dpll & DPLL_VCO_ENABLE) {
|
||||
if (hw_state->dpll & DPLL_VCO_ENABLE) {
|
||||
vlv_prepare_pll(crtc_state);
|
||||
_vlv_enable_pll(crtc_state);
|
||||
}
|
||||
|
||||
intel_de_write(dev_priv, DPLL_MD(pipe),
|
||||
crtc_state->dpll_hw_state.dpll_md);
|
||||
intel_de_write(dev_priv, DPLL_MD(pipe), hw_state->dpll_md);
|
||||
intel_de_posting_read(dev_priv, DPLL_MD(pipe));
|
||||
}
|
||||
|
||||
@ -2069,6 +2125,7 @@ static void _chv_enable_pll(const struct intel_crtc_state *crtc_state)
|
||||
{
|
||||
struct intel_crtc *crtc = to_intel_crtc(crtc_state->uapi.crtc);
|
||||
struct drm_i915_private *dev_priv = to_i915(crtc->base.dev);
|
||||
const struct i9xx_dpll_hw_state *hw_state = &crtc_state->dpll_hw_state.i9xx;
|
||||
enum pipe pipe = crtc->pipe;
|
||||
enum dpio_channel port = vlv_pipe_to_channel(pipe);
|
||||
enum dpio_phy phy = vlv_pipe_to_phy(crtc->pipe);
|
||||
@ -2089,7 +2146,7 @@ static void _chv_enable_pll(const struct intel_crtc_state *crtc_state)
|
||||
udelay(1);
|
||||
|
||||
/* Enable PLL */
|
||||
intel_de_write(dev_priv, DPLL(pipe), crtc_state->dpll_hw_state.dpll);
|
||||
intel_de_write(dev_priv, DPLL(pipe), hw_state->dpll);
|
||||
|
||||
/* Check PLL is locked */
|
||||
if (intel_de_wait_for_set(dev_priv, DPLL(pipe), DPLL_LOCK_VLV, 1))
|
||||
@ -2100,6 +2157,7 @@ void chv_enable_pll(const struct intel_crtc_state *crtc_state)
|
||||
{
|
||||
struct intel_crtc *crtc = to_intel_crtc(crtc_state->uapi.crtc);
|
||||
struct drm_i915_private *dev_priv = to_i915(crtc->base.dev);
|
||||
const struct i9xx_dpll_hw_state *hw_state = &crtc_state->dpll_hw_state.i9xx;
|
||||
enum pipe pipe = crtc->pipe;
|
||||
|
||||
assert_transcoder_disabled(dev_priv, crtc_state->cpu_transcoder);
|
||||
@ -2109,9 +2167,9 @@ void chv_enable_pll(const struct intel_crtc_state *crtc_state)
|
||||
|
||||
/* Enable Refclk and SSC */
|
||||
intel_de_write(dev_priv, DPLL(pipe),
|
||||
crtc_state->dpll_hw_state.dpll & ~DPLL_VCO_ENABLE);
|
||||
hw_state->dpll & ~DPLL_VCO_ENABLE);
|
||||
|
||||
if (crtc_state->dpll_hw_state.dpll & DPLL_VCO_ENABLE) {
|
||||
if (hw_state->dpll & DPLL_VCO_ENABLE) {
|
||||
chv_prepare_pll(crtc_state);
|
||||
_chv_enable_pll(crtc_state);
|
||||
}
|
||||
@ -2124,10 +2182,9 @@ void chv_enable_pll(const struct intel_crtc_state *crtc_state)
|
||||
* the value from DPLLBMD to either pipe B or C.
|
||||
*/
|
||||
intel_de_write(dev_priv, CBR4_VLV, CBR_DPLLBMD_PIPE(pipe));
|
||||
intel_de_write(dev_priv, DPLL_MD(PIPE_B),
|
||||
crtc_state->dpll_hw_state.dpll_md);
|
||||
intel_de_write(dev_priv, DPLL_MD(PIPE_B), hw_state->dpll_md);
|
||||
intel_de_write(dev_priv, CBR4_VLV, 0);
|
||||
dev_priv->display.state.chv_dpll_md[pipe] = crtc_state->dpll_hw_state.dpll_md;
|
||||
dev_priv->display.state.chv_dpll_md[pipe] = hw_state->dpll_md;
|
||||
|
||||
/*
|
||||
* DPLLB VGA mode also seems to cause problems.
|
||||
@ -2137,8 +2194,7 @@ void chv_enable_pll(const struct intel_crtc_state *crtc_state)
|
||||
(intel_de_read(dev_priv, DPLL(PIPE_B)) &
|
||||
DPLL_VGA_MODE_DIS) == 0);
|
||||
} else {
|
||||
intel_de_write(dev_priv, DPLL_MD(pipe),
|
||||
crtc_state->dpll_hw_state.dpll_md);
|
||||
intel_de_write(dev_priv, DPLL_MD(pipe), hw_state->dpll_md);
|
||||
intel_de_posting_read(dev_priv, DPLL_MD(pipe));
|
||||
}
|
||||
}
|
||||
|
@ -13,6 +13,7 @@ struct drm_i915_private;
|
||||
struct intel_atomic_state;
|
||||
struct intel_crtc;
|
||||
struct intel_crtc_state;
|
||||
struct intel_dpll_hw_state;
|
||||
enum pipe;
|
||||
|
||||
void intel_dpll_init_clock_hook(struct drm_i915_private *dev_priv);
|
||||
@ -22,6 +23,8 @@ int intel_dpll_crtc_get_shared_dpll(struct intel_atomic_state *state,
|
||||
struct intel_crtc *crtc);
|
||||
int i9xx_calc_dpll_params(int refclk, struct dpll *clock);
|
||||
u32 i9xx_dpll_compute_fp(const struct dpll *dpll);
|
||||
void i9xx_dpll_get_hw_state(struct intel_crtc *crtc,
|
||||
struct intel_dpll_hw_state *dpll_hw_state);
|
||||
void vlv_compute_dpll(struct intel_crtc_state *crtc_state);
|
||||
void chv_compute_dpll(struct intel_crtc_state *crtc_state);
|
||||
|
||||
@ -39,12 +42,9 @@ bool bxt_find_best_dpll(struct intel_crtc_state *crtc_state,
|
||||
struct dpll *best_clock);
|
||||
int chv_calc_dpll_params(int refclk, struct dpll *pll_clock);
|
||||
|
||||
void i9xx_crtc_clock_get(struct intel_crtc *crtc,
|
||||
struct intel_crtc_state *pipe_config);
|
||||
void vlv_crtc_clock_get(struct intel_crtc *crtc,
|
||||
struct intel_crtc_state *pipe_config);
|
||||
void chv_crtc_clock_get(struct intel_crtc *crtc,
|
||||
struct intel_crtc_state *pipe_config);
|
||||
void i9xx_crtc_clock_get(struct intel_crtc_state *crtc_state);
|
||||
void vlv_crtc_clock_get(struct intel_crtc_state *crtc_state);
|
||||
void chv_crtc_clock_get(struct intel_crtc_state *crtc_state);
|
||||
|
||||
void assert_pll_enabled(struct drm_i915_private *i915, enum pipe pipe);
|
||||
void assert_pll_disabled(struct drm_i915_private *i915, enum pipe pipe);
|
||||
|
File diff suppressed because it is too large
Load Diff
@ -181,18 +181,19 @@ enum icl_port_dpll_id {
|
||||
ICL_PORT_DPLL_COUNT,
|
||||
};
|
||||
|
||||
struct intel_dpll_hw_state {
|
||||
/* i9xx, pch plls */
|
||||
struct i9xx_dpll_hw_state {
|
||||
u32 dpll;
|
||||
u32 dpll_md;
|
||||
u32 fp0;
|
||||
u32 fp1;
|
||||
};
|
||||
|
||||
/* hsw, bdw */
|
||||
struct hsw_dpll_hw_state {
|
||||
u32 wrpll;
|
||||
u32 spll;
|
||||
};
|
||||
|
||||
/* skl */
|
||||
struct skl_dpll_hw_state {
|
||||
/*
|
||||
* DPLL_CTRL1 has 6 bits for each each this DPLL. We store those in
|
||||
* lower part of ctrl1 and they get shifted into position when writing
|
||||
@ -202,20 +203,18 @@ struct intel_dpll_hw_state {
|
||||
u32 ctrl1;
|
||||
/* HDMI only, 0 when used for DP */
|
||||
u32 cfgcr1, cfgcr2;
|
||||
};
|
||||
|
||||
/* icl */
|
||||
u32 cfgcr0;
|
||||
struct bxt_dpll_hw_state {
|
||||
u32 ebb0, ebb4, pll0, pll1, pll2, pll3, pll6, pll8, pll9, pll10, pcsdw12;
|
||||
};
|
||||
|
||||
struct icl_dpll_hw_state {
|
||||
u32 cfgcr0, cfgcr1;
|
||||
|
||||
/* tgl */
|
||||
u32 div0;
|
||||
|
||||
/* bxt */
|
||||
u32 ebb0, ebb4, pll0, pll1, pll2, pll3, pll6, pll8, pll9, pll10, pcsdw12;
|
||||
|
||||
/*
|
||||
* ICL uses the following, already defined:
|
||||
* u32 cfgcr0, cfgcr1;
|
||||
*/
|
||||
u32 mg_refclkin_ctl;
|
||||
u32 mg_clktop2_coreclkctl1;
|
||||
u32 mg_clktop2_hsclkctl;
|
||||
@ -230,6 +229,55 @@ struct intel_dpll_hw_state {
|
||||
u32 mg_pll_tdc_coldst_bias_mask;
|
||||
};
|
||||
|
||||
struct intel_mpllb_state {
|
||||
u32 clock; /* in KHz */
|
||||
u32 ref_control;
|
||||
u32 mpllb_cp;
|
||||
u32 mpllb_div;
|
||||
u32 mpllb_div2;
|
||||
u32 mpllb_fracn1;
|
||||
u32 mpllb_fracn2;
|
||||
u32 mpllb_sscen;
|
||||
u32 mpllb_sscstep;
|
||||
};
|
||||
|
||||
struct intel_c10pll_state {
|
||||
u32 clock; /* in KHz */
|
||||
u8 tx;
|
||||
u8 cmn;
|
||||
u8 pll[20];
|
||||
};
|
||||
|
||||
struct intel_c20pll_state {
|
||||
u32 clock; /* in kHz */
|
||||
u16 tx[3];
|
||||
u16 cmn[4];
|
||||
union {
|
||||
u16 mplla[10];
|
||||
u16 mpllb[11];
|
||||
};
|
||||
};
|
||||
|
||||
struct intel_cx0pll_state {
|
||||
union {
|
||||
struct intel_c10pll_state c10;
|
||||
struct intel_c20pll_state c20;
|
||||
};
|
||||
bool ssc_enabled;
|
||||
};
|
||||
|
||||
struct intel_dpll_hw_state {
|
||||
union {
|
||||
struct i9xx_dpll_hw_state i9xx;
|
||||
struct hsw_dpll_hw_state hsw;
|
||||
struct skl_dpll_hw_state skl;
|
||||
struct bxt_dpll_hw_state bxt;
|
||||
struct icl_dpll_hw_state icl;
|
||||
struct intel_mpllb_state mpllb;
|
||||
struct intel_cx0pll_state cx0pll;
|
||||
};
|
||||
};
|
||||
|
||||
/**
|
||||
* struct intel_shared_dpll_state - hold the DPLL atomic state
|
||||
*
|
||||
@ -365,10 +413,10 @@ void intel_update_active_dpll(struct intel_atomic_state *state,
|
||||
struct intel_encoder *encoder);
|
||||
int intel_dpll_get_freq(struct drm_i915_private *i915,
|
||||
const struct intel_shared_dpll *pll,
|
||||
const struct intel_dpll_hw_state *pll_state);
|
||||
const struct intel_dpll_hw_state *dpll_hw_state);
|
||||
bool intel_dpll_get_hw_state(struct drm_i915_private *i915,
|
||||
struct intel_shared_dpll *pll,
|
||||
struct intel_dpll_hw_state *hw_state);
|
||||
struct intel_dpll_hw_state *dpll_hw_state);
|
||||
void intel_enable_shared_dpll(const struct intel_crtc_state *crtc_state);
|
||||
void intel_disable_shared_dpll(const struct intel_crtc_state *crtc_state);
|
||||
void intel_shared_dpll_swap_state(struct intel_atomic_state *state);
|
||||
@ -379,7 +427,7 @@ void intel_dpll_sanitize_state(struct drm_i915_private *i915);
|
||||
|
||||
void intel_dpll_dump_hw_state(struct drm_i915_private *i915,
|
||||
struct drm_printer *p,
|
||||
const struct intel_dpll_hw_state *hw_state);
|
||||
const struct intel_dpll_hw_state *dpll_hw_state);
|
||||
bool intel_dpll_compare_hw_state(struct drm_i915_private *i915,
|
||||
const struct intel_dpll_hw_state *a,
|
||||
const struct intel_dpll_hw_state *b);
|
||||
|
@ -47,10 +47,12 @@
|
||||
|
||||
bool intel_panel_use_ssc(struct drm_i915_private *i915)
|
||||
{
|
||||
if (i915->display.params.panel_use_ssc >= 0)
|
||||
return i915->display.params.panel_use_ssc != 0;
|
||||
return i915->display.vbt.lvds_use_ssc &&
|
||||
!intel_has_quirk(i915, QUIRK_LVDS_SSC_DISABLE);
|
||||
struct intel_display *display = &i915->display;
|
||||
|
||||
if (display->params.panel_use_ssc >= 0)
|
||||
return display->params.panel_use_ssc != 0;
|
||||
return display->vbt.lvds_use_ssc &&
|
||||
!intel_has_quirk(display, QUIRK_LVDS_SSC_DISABLE);
|
||||
}
|
||||
|
||||
const struct drm_display_mode *
|
||||
|
@ -474,7 +474,7 @@ static void ilk_pch_clock_get(struct intel_crtc_state *crtc_state)
|
||||
struct drm_i915_private *dev_priv = to_i915(crtc->base.dev);
|
||||
|
||||
/* read out port_clock from the DPLL */
|
||||
i9xx_crtc_clock_get(crtc, crtc_state);
|
||||
i9xx_crtc_clock_get(crtc_state);
|
||||
|
||||
/*
|
||||
* In case there is an active pipe without active ports,
|
||||
@ -529,7 +529,7 @@ void ilk_pch_get_config(struct intel_crtc_state *crtc_state)
|
||||
&crtc_state->dpll_hw_state);
|
||||
drm_WARN_ON(&dev_priv->drm, !pll_active);
|
||||
|
||||
tmp = crtc_state->dpll_hw_state.dpll;
|
||||
tmp = crtc_state->dpll_hw_state.i9xx.dpll;
|
||||
crtc_state->pixel_multiplier =
|
||||
((tmp & PLL_REF_SDVO_HDMI_MULTIPLIER_MASK)
|
||||
>> PLL_REF_SDVO_HDMI_MULTIPLIER_SHIFT) + 1;
|
||||
|
@ -1350,7 +1350,7 @@ static void pps_init_delays_bios(struct intel_dp *intel_dp,
|
||||
static void pps_init_delays_vbt(struct intel_dp *intel_dp,
|
||||
struct edp_power_seq *vbt)
|
||||
{
|
||||
struct drm_i915_private *dev_priv = dp_to_i915(intel_dp);
|
||||
struct intel_display *display = to_intel_display(intel_dp);
|
||||
struct intel_connector *connector = intel_dp->attached_connector;
|
||||
|
||||
*vbt = connector->panel.vbt.edp.pps;
|
||||
@ -1363,9 +1363,9 @@ static void pps_init_delays_vbt(struct intel_dp *intel_dp,
|
||||
* just fails to power back on. Increasing the delay to 800ms
|
||||
* seems sufficient to avoid this problem.
|
||||
*/
|
||||
if (intel_has_quirk(dev_priv, QUIRK_INCREASE_T12_DELAY)) {
|
||||
if (intel_has_quirk(display, QUIRK_INCREASE_T12_DELAY)) {
|
||||
vbt->t11_t12 = max_t(u16, vbt->t11_t12, 1300 * 10);
|
||||
drm_dbg_kms(&dev_priv->drm,
|
||||
drm_dbg_kms(display->drm,
|
||||
"Increasing T12 panel delay as per the quirk to %d\n",
|
||||
vbt->t11_t12);
|
||||
}
|
||||
|
@ -9,72 +9,72 @@
|
||||
#include "intel_display_types.h"
|
||||
#include "intel_quirks.h"
|
||||
|
||||
static void intel_set_quirk(struct drm_i915_private *i915, enum intel_quirk_id quirk)
|
||||
static void intel_set_quirk(struct intel_display *display, enum intel_quirk_id quirk)
|
||||
{
|
||||
i915->display.quirks.mask |= BIT(quirk);
|
||||
display->quirks.mask |= BIT(quirk);
|
||||
}
|
||||
|
||||
/*
|
||||
* Some machines (Lenovo U160) do not work with SSC on LVDS for some reason
|
||||
*/
|
||||
static void quirk_ssc_force_disable(struct drm_i915_private *i915)
|
||||
static void quirk_ssc_force_disable(struct intel_display *display)
|
||||
{
|
||||
intel_set_quirk(i915, QUIRK_LVDS_SSC_DISABLE);
|
||||
drm_info(&i915->drm, "applying lvds SSC disable quirk\n");
|
||||
intel_set_quirk(display, QUIRK_LVDS_SSC_DISABLE);
|
||||
drm_info(display->drm, "applying lvds SSC disable quirk\n");
|
||||
}
|
||||
|
||||
/*
|
||||
* A machine (e.g. Acer Aspire 5734Z) may need to invert the panel backlight
|
||||
* brightness value
|
||||
*/
|
||||
static void quirk_invert_brightness(struct drm_i915_private *i915)
|
||||
static void quirk_invert_brightness(struct intel_display *display)
|
||||
{
|
||||
intel_set_quirk(i915, QUIRK_INVERT_BRIGHTNESS);
|
||||
drm_info(&i915->drm, "applying inverted panel brightness quirk\n");
|
||||
intel_set_quirk(display, QUIRK_INVERT_BRIGHTNESS);
|
||||
drm_info(display->drm, "applying inverted panel brightness quirk\n");
|
||||
}
|
||||
|
||||
/* Some VBT's incorrectly indicate no backlight is present */
|
||||
static void quirk_backlight_present(struct drm_i915_private *i915)
|
||||
static void quirk_backlight_present(struct intel_display *display)
|
||||
{
|
||||
intel_set_quirk(i915, QUIRK_BACKLIGHT_PRESENT);
|
||||
drm_info(&i915->drm, "applying backlight present quirk\n");
|
||||
intel_set_quirk(display, QUIRK_BACKLIGHT_PRESENT);
|
||||
drm_info(display->drm, "applying backlight present quirk\n");
|
||||
}
|
||||
|
||||
/* Toshiba Satellite P50-C-18C requires T12 delay to be min 800ms
|
||||
* which is 300 ms greater than eDP spec T12 min.
|
||||
*/
|
||||
static void quirk_increase_t12_delay(struct drm_i915_private *i915)
|
||||
static void quirk_increase_t12_delay(struct intel_display *display)
|
||||
{
|
||||
intel_set_quirk(i915, QUIRK_INCREASE_T12_DELAY);
|
||||
drm_info(&i915->drm, "Applying T12 delay quirk\n");
|
||||
intel_set_quirk(display, QUIRK_INCREASE_T12_DELAY);
|
||||
drm_info(display->drm, "Applying T12 delay quirk\n");
|
||||
}
|
||||
|
||||
/*
|
||||
* GeminiLake NUC HDMI outputs require additional off time
|
||||
* this allows the onboard retimer to correctly sync to signal
|
||||
*/
|
||||
static void quirk_increase_ddi_disabled_time(struct drm_i915_private *i915)
|
||||
static void quirk_increase_ddi_disabled_time(struct intel_display *display)
|
||||
{
|
||||
intel_set_quirk(i915, QUIRK_INCREASE_DDI_DISABLED_TIME);
|
||||
drm_info(&i915->drm, "Applying Increase DDI Disabled quirk\n");
|
||||
intel_set_quirk(display, QUIRK_INCREASE_DDI_DISABLED_TIME);
|
||||
drm_info(display->drm, "Applying Increase DDI Disabled quirk\n");
|
||||
}
|
||||
|
||||
static void quirk_no_pps_backlight_power_hook(struct drm_i915_private *i915)
|
||||
static void quirk_no_pps_backlight_power_hook(struct intel_display *display)
|
||||
{
|
||||
intel_set_quirk(i915, QUIRK_NO_PPS_BACKLIGHT_POWER_HOOK);
|
||||
drm_info(&i915->drm, "Applying no pps backlight power quirk\n");
|
||||
intel_set_quirk(display, QUIRK_NO_PPS_BACKLIGHT_POWER_HOOK);
|
||||
drm_info(display->drm, "Applying no pps backlight power quirk\n");
|
||||
}
|
||||
|
||||
struct intel_quirk {
|
||||
int device;
|
||||
int subsystem_vendor;
|
||||
int subsystem_device;
|
||||
void (*hook)(struct drm_i915_private *i915);
|
||||
void (*hook)(struct intel_display *display);
|
||||
};
|
||||
|
||||
/* For systems that don't have a meaningful PCI subdevice/subvendor ID */
|
||||
struct intel_dmi_quirk {
|
||||
void (*hook)(struct drm_i915_private *i915);
|
||||
void (*hook)(struct intel_display *display);
|
||||
const struct dmi_system_id (*dmi_id_list)[];
|
||||
};
|
||||
|
||||
@ -203,9 +203,9 @@ static struct intel_quirk intel_quirks[] = {
|
||||
{ 0x0f31, 0x103c, 0x220f, quirk_invert_brightness },
|
||||
};
|
||||
|
||||
void intel_init_quirks(struct drm_i915_private *i915)
|
||||
void intel_init_quirks(struct intel_display *display)
|
||||
{
|
||||
struct pci_dev *d = to_pci_dev(i915->drm.dev);
|
||||
struct pci_dev *d = to_pci_dev(display->drm->dev);
|
||||
int i;
|
||||
|
||||
for (i = 0; i < ARRAY_SIZE(intel_quirks); i++) {
|
||||
@ -216,15 +216,15 @@ void intel_init_quirks(struct drm_i915_private *i915)
|
||||
q->subsystem_vendor == PCI_ANY_ID) &&
|
||||
(d->subsystem_device == q->subsystem_device ||
|
||||
q->subsystem_device == PCI_ANY_ID))
|
||||
q->hook(i915);
|
||||
q->hook(display);
|
||||
}
|
||||
for (i = 0; i < ARRAY_SIZE(intel_dmi_quirks); i++) {
|
||||
if (dmi_check_system(*intel_dmi_quirks[i].dmi_id_list) != 0)
|
||||
intel_dmi_quirks[i].hook(i915);
|
||||
intel_dmi_quirks[i].hook(display);
|
||||
}
|
||||
}
|
||||
|
||||
bool intel_has_quirk(struct drm_i915_private *i915, enum intel_quirk_id quirk)
|
||||
bool intel_has_quirk(struct intel_display *display, enum intel_quirk_id quirk)
|
||||
{
|
||||
return i915->display.quirks.mask & BIT(quirk);
|
||||
return display->quirks.mask & BIT(quirk);
|
||||
}
|
||||
|
@ -8,7 +8,7 @@
|
||||
|
||||
#include <linux/types.h>
|
||||
|
||||
struct drm_i915_private;
|
||||
struct intel_display;
|
||||
|
||||
enum intel_quirk_id {
|
||||
QUIRK_BACKLIGHT_PRESENT,
|
||||
@ -19,7 +19,7 @@ enum intel_quirk_id {
|
||||
QUIRK_NO_PPS_BACKLIGHT_POWER_HOOK,
|
||||
};
|
||||
|
||||
void intel_init_quirks(struct drm_i915_private *i915);
|
||||
bool intel_has_quirk(struct drm_i915_private *i915, enum intel_quirk_id quirk);
|
||||
void intel_init_quirks(struct intel_display *display);
|
||||
bool intel_has_quirk(struct intel_display *display, enum intel_quirk_id quirk);
|
||||
|
||||
#endif /* __INTEL_QUIRKS_H__ */
|
||||
|
@ -1811,7 +1811,7 @@ int intel_mpllb_calc_state(struct intel_crtc_state *crtc_state,
|
||||
|
||||
for (i = 0; tables[i]; i++) {
|
||||
if (crtc_state->port_clock == tables[i]->clock) {
|
||||
crtc_state->mpllb_state = *tables[i];
|
||||
crtc_state->dpll_hw_state.mpllb = *tables[i];
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
@ -1823,7 +1823,7 @@ void intel_mpllb_enable(struct intel_encoder *encoder,
|
||||
const struct intel_crtc_state *crtc_state)
|
||||
{
|
||||
struct drm_i915_private *dev_priv = to_i915(encoder->base.dev);
|
||||
const struct intel_mpllb_state *pll_state = &crtc_state->mpllb_state;
|
||||
const struct intel_mpllb_state *pll_state = &crtc_state->dpll_hw_state.mpllb;
|
||||
enum phy phy = intel_encoder_to_phy(encoder);
|
||||
i915_reg_t enable_reg = (phy <= PHY_D ?
|
||||
DG2_PLL_ENABLE(phy) : MG_PLL_ENABLE(0));
|
||||
@ -2001,7 +2001,7 @@ void intel_mpllb_state_verify(struct intel_atomic_state *state,
|
||||
const struct intel_crtc_state *new_crtc_state =
|
||||
intel_atomic_get_new_crtc_state(state, crtc);
|
||||
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->dpll_hw_state.mpllb;
|
||||
struct intel_encoder *encoder;
|
||||
|
||||
if (!IS_DG2(i915))
|
||||
|
@ -70,7 +70,7 @@ static bool skl_needs_memory_bw_wa(struct drm_i915_private *i915)
|
||||
return DISPLAY_VER(i915) == 9;
|
||||
}
|
||||
|
||||
static bool
|
||||
bool
|
||||
intel_has_sagv(struct drm_i915_private *i915)
|
||||
{
|
||||
return HAS_SAGV(i915) &&
|
||||
|
@ -25,6 +25,7 @@ void intel_sagv_pre_plane_update(struct intel_atomic_state *state);
|
||||
void intel_sagv_post_plane_update(struct intel_atomic_state *state);
|
||||
bool intel_can_enable_sagv(struct drm_i915_private *i915,
|
||||
const struct intel_bw_state *bw_state);
|
||||
bool intel_has_sagv(struct drm_i915_private *i915);
|
||||
|
||||
u32 skl_ddb_dbuf_slice_mask(struct drm_i915_private *i915,
|
||||
const struct skl_ddb_entry *entry);
|
||||
|
File diff suppressed because it is too large
Load Diff
@ -365,13 +365,13 @@ u32 bxt_dsi_get_pclk(struct intel_encoder *encoder,
|
||||
|
||||
void vlv_dsi_reset_clocks(struct intel_encoder *encoder, enum port port)
|
||||
{
|
||||
u32 temp;
|
||||
struct drm_i915_private *dev_priv = to_i915(encoder->base.dev);
|
||||
struct intel_display *display = to_intel_display(encoder);
|
||||
struct intel_dsi *intel_dsi = enc_to_intel_dsi(encoder);
|
||||
u32 temp;
|
||||
|
||||
temp = intel_de_read(dev_priv, MIPI_CTRL(port));
|
||||
temp = intel_de_read(display, MIPI_CTRL(display, port));
|
||||
temp &= ~ESCAPE_CLOCK_DIVIDER_MASK;
|
||||
intel_de_write(dev_priv, MIPI_CTRL(port),
|
||||
intel_de_write(display, MIPI_CTRL(display, port),
|
||||
temp | intel_dsi->escape_clk_div << ESCAPE_CLOCK_DIVIDER_SHIFT);
|
||||
}
|
||||
|
||||
@ -570,24 +570,24 @@ void bxt_dsi_pll_enable(struct intel_encoder *encoder,
|
||||
|
||||
void bxt_dsi_reset_clocks(struct intel_encoder *encoder, enum port port)
|
||||
{
|
||||
struct intel_display *display = to_intel_display(encoder);
|
||||
struct drm_i915_private *dev_priv = to_i915(encoder->base.dev);
|
||||
u32 tmp;
|
||||
struct drm_device *dev = encoder->base.dev;
|
||||
struct drm_i915_private *dev_priv = to_i915(dev);
|
||||
|
||||
/* Clear old configurations */
|
||||
if (IS_BROXTON(dev_priv)) {
|
||||
tmp = intel_de_read(dev_priv, BXT_MIPI_CLOCK_CTL);
|
||||
tmp = intel_de_read(display, BXT_MIPI_CLOCK_CTL);
|
||||
tmp &= ~(BXT_MIPI_TX_ESCLK_FIXDIV_MASK(port));
|
||||
tmp &= ~(BXT_MIPI_RX_ESCLK_UPPER_FIXDIV_MASK(port));
|
||||
tmp &= ~(BXT_MIPI_8X_BY3_DIVIDER_MASK(port));
|
||||
tmp &= ~(BXT_MIPI_RX_ESCLK_LOWER_FIXDIV_MASK(port));
|
||||
intel_de_write(dev_priv, BXT_MIPI_CLOCK_CTL, tmp);
|
||||
intel_de_write(display, BXT_MIPI_CLOCK_CTL, tmp);
|
||||
} else {
|
||||
intel_de_rmw(dev_priv, MIPIO_TXESC_CLK_DIV1, GLK_TX_ESC_CLK_DIV1_MASK, 0);
|
||||
intel_de_rmw(display, MIPIO_TXESC_CLK_DIV1, GLK_TX_ESC_CLK_DIV1_MASK, 0);
|
||||
|
||||
intel_de_rmw(dev_priv, MIPIO_TXESC_CLK_DIV2, GLK_TX_ESC_CLK_DIV2_MASK, 0);
|
||||
intel_de_rmw(display, MIPIO_TXESC_CLK_DIV2, GLK_TX_ESC_CLK_DIV2_MASK, 0);
|
||||
}
|
||||
intel_de_write(dev_priv, MIPI_EOT_DISABLE(port), CLOCKSTOP);
|
||||
intel_de_write(display, MIPI_EOT_DISABLE(display, port), CLOCKSTOP);
|
||||
}
|
||||
|
||||
static void assert_dsi_pll(struct drm_i915_private *i915, bool state)
|
||||
|
@ -11,26 +11,23 @@
|
||||
#define VLV_MIPI_BASE VLV_DISPLAY_BASE
|
||||
#define BXT_MIPI_BASE 0x60000
|
||||
|
||||
#define _MIPI_MMIO_BASE(__i915) ((__i915)->display.dsi.mmio_base)
|
||||
#define _MIPI_MMIO_BASE(display) ((display)->dsi.mmio_base)
|
||||
|
||||
#define _MIPI_PORT(port, a, c) (((port) == PORT_A) ? a : c) /* ports A and C only */
|
||||
#define _MMIO_MIPI(port, a, c) _MMIO(_MIPI_PORT(port, a, c))
|
||||
#define _MMIO_MIPI(base, port, a, c) _MMIO((base) + _MIPI_PORT(port, a, c))
|
||||
|
||||
/* BXT MIPI mode configure */
|
||||
#define _BXT_MIPIA_TRANS_HACTIVE 0x6B0F8
|
||||
#define _BXT_MIPIC_TRANS_HACTIVE 0x6B8F8
|
||||
#define BXT_MIPI_TRANS_HACTIVE(tc) _MMIO_MIPI(tc, \
|
||||
_BXT_MIPIA_TRANS_HACTIVE, _BXT_MIPIC_TRANS_HACTIVE)
|
||||
#define _BXT_MIPIA_TRANS_HACTIVE 0xb0f8
|
||||
#define _BXT_MIPIC_TRANS_HACTIVE 0xb8f8
|
||||
#define BXT_MIPI_TRANS_HACTIVE(tc) _MMIO_MIPI(BXT_MIPI_BASE, tc, _BXT_MIPIA_TRANS_HACTIVE, _BXT_MIPIC_TRANS_HACTIVE)
|
||||
|
||||
#define _BXT_MIPIA_TRANS_VACTIVE 0x6B0FC
|
||||
#define _BXT_MIPIC_TRANS_VACTIVE 0x6B8FC
|
||||
#define BXT_MIPI_TRANS_VACTIVE(tc) _MMIO_MIPI(tc, \
|
||||
_BXT_MIPIA_TRANS_VACTIVE, _BXT_MIPIC_TRANS_VACTIVE)
|
||||
#define _BXT_MIPIA_TRANS_VACTIVE 0xb0fc
|
||||
#define _BXT_MIPIC_TRANS_VACTIVE 0xb8fc
|
||||
#define BXT_MIPI_TRANS_VACTIVE(tc) _MMIO_MIPI(BXT_MIPI_BASE, tc, _BXT_MIPIA_TRANS_VACTIVE, _BXT_MIPIC_TRANS_VACTIVE)
|
||||
|
||||
#define _BXT_MIPIA_TRANS_VTOTAL 0x6B100
|
||||
#define _BXT_MIPIC_TRANS_VTOTAL 0x6B900
|
||||
#define BXT_MIPI_TRANS_VTOTAL(tc) _MMIO_MIPI(tc, \
|
||||
_BXT_MIPIA_TRANS_VTOTAL, _BXT_MIPIC_TRANS_VTOTAL)
|
||||
#define _BXT_MIPIA_TRANS_VTOTAL 0xb100
|
||||
#define _BXT_MIPIC_TRANS_VTOTAL 0xb900
|
||||
#define BXT_MIPI_TRANS_VTOTAL(tc) _MMIO_MIPI(BXT_MIPI_BASE, tc, _BXT_MIPIA_TRANS_VTOTAL, _BXT_MIPIC_TRANS_VTOTAL)
|
||||
|
||||
#define BXT_P_DSI_REGULATOR_CFG _MMIO(0x160020)
|
||||
#define STAP_SELECT (1 << 0)
|
||||
@ -38,14 +35,14 @@
|
||||
#define BXT_P_DSI_REGULATOR_TX_CTRL _MMIO(0x160054)
|
||||
#define HS_IO_CTRL_SELECT (1 << 0)
|
||||
|
||||
#define _MIPIA_PORT_CTRL (VLV_DISPLAY_BASE + 0x61190)
|
||||
#define _MIPIC_PORT_CTRL (VLV_DISPLAY_BASE + 0x61700)
|
||||
#define MIPI_PORT_CTRL(port) _MMIO_MIPI(port, _MIPIA_PORT_CTRL, _MIPIC_PORT_CTRL)
|
||||
#define _MIPIA_PORT_CTRL 0x61190
|
||||
#define _MIPIC_PORT_CTRL 0x61700
|
||||
#define VLV_MIPI_PORT_CTRL(port) _MMIO_MIPI(VLV_MIPI_BASE, port, _MIPIA_PORT_CTRL, _MIPIC_PORT_CTRL)
|
||||
|
||||
/* BXT port control */
|
||||
#define _BXT_MIPIA_PORT_CTRL 0x6B0C0
|
||||
#define _BXT_MIPIC_PORT_CTRL 0x6B8C0
|
||||
#define BXT_MIPI_PORT_CTRL(tc) _MMIO_MIPI(tc, _BXT_MIPIA_PORT_CTRL, _BXT_MIPIC_PORT_CTRL)
|
||||
#define _BXT_MIPIA_PORT_CTRL 0xb0c0
|
||||
#define _BXT_MIPIC_PORT_CTRL 0xb8c0
|
||||
#define BXT_MIPI_PORT_CTRL(tc) _MMIO_MIPI(BXT_MIPI_BASE, tc, _BXT_MIPIA_PORT_CTRL, _BXT_MIPIC_PORT_CTRL)
|
||||
|
||||
#define DPI_ENABLE (1 << 31) /* A + C */
|
||||
#define MIPIA_MIPI4DPHY_DELAY_COUNT_SHIFT 27
|
||||
@ -87,20 +84,17 @@
|
||||
#define LANE_CONFIGURATION_DUAL_LINK_A (1 << 0)
|
||||
#define LANE_CONFIGURATION_DUAL_LINK_B (2 << 0)
|
||||
|
||||
#define _MIPIA_TEARING_CTRL (VLV_DISPLAY_BASE + 0x61194)
|
||||
#define _MIPIC_TEARING_CTRL (VLV_DISPLAY_BASE + 0x61704)
|
||||
#define MIPI_TEARING_CTRL(port) _MMIO_MIPI(port, _MIPIA_TEARING_CTRL, _MIPIC_TEARING_CTRL)
|
||||
#define _MIPIA_TEARING_CTRL 0x61194
|
||||
#define _MIPIC_TEARING_CTRL 0x61704
|
||||
#define VLV_MIPI_TEARING_CTRL(port) _MMIO_MIPI(VLV_MIPI_BASE, port, _MIPIA_TEARING_CTRL, _MIPIC_TEARING_CTRL)
|
||||
#define TEARING_EFFECT_DELAY_SHIFT 0
|
||||
#define TEARING_EFFECT_DELAY_MASK (0xffff << 0)
|
||||
|
||||
/* XXX: all bits reserved */
|
||||
#define _MIPIA_AUTOPWG (VLV_DISPLAY_BASE + 0x611a0)
|
||||
|
||||
/* MIPI DSI Controller and D-PHY registers */
|
||||
|
||||
#define _MIPIA_DEVICE_READY (_MIPI_MMIO_BASE(dev_priv) + 0xb000)
|
||||
#define _MIPIC_DEVICE_READY (_MIPI_MMIO_BASE(dev_priv) + 0xb800)
|
||||
#define MIPI_DEVICE_READY(port) _MMIO_MIPI(port, _MIPIA_DEVICE_READY, _MIPIC_DEVICE_READY)
|
||||
#define _MIPIA_DEVICE_READY 0xb000
|
||||
#define _MIPIC_DEVICE_READY 0xb800
|
||||
#define MIPI_DEVICE_READY(display, port) _MMIO_MIPI(_MIPI_MMIO_BASE(display), port, _MIPIA_DEVICE_READY, _MIPIC_DEVICE_READY)
|
||||
#define BUS_POSSESSION (1 << 3) /* set to give bus to receiver */
|
||||
#define ULPS_STATE_MASK (3 << 1)
|
||||
#define ULPS_STATE_ENTER (2 << 1)
|
||||
@ -108,12 +102,12 @@
|
||||
#define ULPS_STATE_NORMAL_OPERATION (0 << 1)
|
||||
#define DEVICE_READY (1 << 0)
|
||||
|
||||
#define _MIPIA_INTR_STAT (_MIPI_MMIO_BASE(dev_priv) + 0xb004)
|
||||
#define _MIPIC_INTR_STAT (_MIPI_MMIO_BASE(dev_priv) + 0xb804)
|
||||
#define MIPI_INTR_STAT(port) _MMIO_MIPI(port, _MIPIA_INTR_STAT, _MIPIC_INTR_STAT)
|
||||
#define _MIPIA_INTR_EN (_MIPI_MMIO_BASE(dev_priv) + 0xb008)
|
||||
#define _MIPIC_INTR_EN (_MIPI_MMIO_BASE(dev_priv) + 0xb808)
|
||||
#define MIPI_INTR_EN(port) _MMIO_MIPI(port, _MIPIA_INTR_EN, _MIPIC_INTR_EN)
|
||||
#define _MIPIA_INTR_STAT 0xb004
|
||||
#define _MIPIC_INTR_STAT 0xb804
|
||||
#define MIPI_INTR_STAT(display, port) _MMIO_MIPI(_MIPI_MMIO_BASE(display), port, _MIPIA_INTR_STAT, _MIPIC_INTR_STAT)
|
||||
#define _MIPIA_INTR_EN 0xb008
|
||||
#define _MIPIC_INTR_EN 0xb808
|
||||
#define MIPI_INTR_EN(display, port) _MMIO_MIPI(_MIPI_MMIO_BASE(display), port, _MIPIA_INTR_EN, _MIPIC_INTR_EN)
|
||||
#define TEARING_EFFECT (1 << 31)
|
||||
#define SPL_PKT_SENT_INTERRUPT (1 << 30)
|
||||
#define GEN_READ_DATA_AVAIL (1 << 29)
|
||||
@ -147,9 +141,9 @@
|
||||
#define RXSOT_SYNC_ERROR (1 << 1)
|
||||
#define RXSOT_ERROR (1 << 0)
|
||||
|
||||
#define _MIPIA_DSI_FUNC_PRG (_MIPI_MMIO_BASE(dev_priv) + 0xb00c)
|
||||
#define _MIPIC_DSI_FUNC_PRG (_MIPI_MMIO_BASE(dev_priv) + 0xb80c)
|
||||
#define MIPI_DSI_FUNC_PRG(port) _MMIO_MIPI(port, _MIPIA_DSI_FUNC_PRG, _MIPIC_DSI_FUNC_PRG)
|
||||
#define _MIPIA_DSI_FUNC_PRG 0xb00c
|
||||
#define _MIPIC_DSI_FUNC_PRG 0xb80c
|
||||
#define MIPI_DSI_FUNC_PRG(display, port) _MMIO_MIPI(_MIPI_MMIO_BASE(display), port, _MIPIA_DSI_FUNC_PRG, _MIPIC_DSI_FUNC_PRG)
|
||||
#define CMD_MODE_DATA_WIDTH_MASK (7 << 13)
|
||||
#define CMD_MODE_NOT_SUPPORTED (0 << 13)
|
||||
#define CMD_MODE_DATA_WIDTH_16_BIT (1 << 13)
|
||||
@ -170,77 +164,77 @@
|
||||
#define DATA_LANES_PRG_REG_SHIFT 0
|
||||
#define DATA_LANES_PRG_REG_MASK (7 << 0)
|
||||
|
||||
#define _MIPIA_HS_TX_TIMEOUT (_MIPI_MMIO_BASE(dev_priv) + 0xb010)
|
||||
#define _MIPIC_HS_TX_TIMEOUT (_MIPI_MMIO_BASE(dev_priv) + 0xb810)
|
||||
#define MIPI_HS_TX_TIMEOUT(port) _MMIO_MIPI(port, _MIPIA_HS_TX_TIMEOUT, _MIPIC_HS_TX_TIMEOUT)
|
||||
#define _MIPIA_HS_TX_TIMEOUT 0xb010
|
||||
#define _MIPIC_HS_TX_TIMEOUT 0xb810
|
||||
#define MIPI_HS_TX_TIMEOUT(display, port) _MMIO_MIPI(_MIPI_MMIO_BASE(display), port, _MIPIA_HS_TX_TIMEOUT, _MIPIC_HS_TX_TIMEOUT)
|
||||
#define HIGH_SPEED_TX_TIMEOUT_COUNTER_MASK 0xffffff
|
||||
|
||||
#define _MIPIA_LP_RX_TIMEOUT (_MIPI_MMIO_BASE(dev_priv) + 0xb014)
|
||||
#define _MIPIC_LP_RX_TIMEOUT (_MIPI_MMIO_BASE(dev_priv) + 0xb814)
|
||||
#define MIPI_LP_RX_TIMEOUT(port) _MMIO_MIPI(port, _MIPIA_LP_RX_TIMEOUT, _MIPIC_LP_RX_TIMEOUT)
|
||||
#define _MIPIA_LP_RX_TIMEOUT 0xb014
|
||||
#define _MIPIC_LP_RX_TIMEOUT 0xb814
|
||||
#define MIPI_LP_RX_TIMEOUT(display, port) _MMIO_MIPI(_MIPI_MMIO_BASE(display), port, _MIPIA_LP_RX_TIMEOUT, _MIPIC_LP_RX_TIMEOUT)
|
||||
#define LOW_POWER_RX_TIMEOUT_COUNTER_MASK 0xffffff
|
||||
|
||||
#define _MIPIA_TURN_AROUND_TIMEOUT (_MIPI_MMIO_BASE(dev_priv) + 0xb018)
|
||||
#define _MIPIC_TURN_AROUND_TIMEOUT (_MIPI_MMIO_BASE(dev_priv) + 0xb818)
|
||||
#define MIPI_TURN_AROUND_TIMEOUT(port) _MMIO_MIPI(port, _MIPIA_TURN_AROUND_TIMEOUT, _MIPIC_TURN_AROUND_TIMEOUT)
|
||||
#define _MIPIA_TURN_AROUND_TIMEOUT 0xb018
|
||||
#define _MIPIC_TURN_AROUND_TIMEOUT 0xb818
|
||||
#define MIPI_TURN_AROUND_TIMEOUT(display, port) _MMIO_MIPI(_MIPI_MMIO_BASE(display), port, _MIPIA_TURN_AROUND_TIMEOUT, _MIPIC_TURN_AROUND_TIMEOUT)
|
||||
#define TURN_AROUND_TIMEOUT_MASK 0x3f
|
||||
|
||||
#define _MIPIA_DEVICE_RESET_TIMER (_MIPI_MMIO_BASE(dev_priv) + 0xb01c)
|
||||
#define _MIPIC_DEVICE_RESET_TIMER (_MIPI_MMIO_BASE(dev_priv) + 0xb81c)
|
||||
#define MIPI_DEVICE_RESET_TIMER(port) _MMIO_MIPI(port, _MIPIA_DEVICE_RESET_TIMER, _MIPIC_DEVICE_RESET_TIMER)
|
||||
#define _MIPIA_DEVICE_RESET_TIMER 0xb01c
|
||||
#define _MIPIC_DEVICE_RESET_TIMER 0xb81c
|
||||
#define MIPI_DEVICE_RESET_TIMER(display, port) _MMIO_MIPI(_MIPI_MMIO_BASE(display), port, _MIPIA_DEVICE_RESET_TIMER, _MIPIC_DEVICE_RESET_TIMER)
|
||||
#define DEVICE_RESET_TIMER_MASK 0xffff
|
||||
|
||||
#define _MIPIA_DPI_RESOLUTION (_MIPI_MMIO_BASE(dev_priv) + 0xb020)
|
||||
#define _MIPIC_DPI_RESOLUTION (_MIPI_MMIO_BASE(dev_priv) + 0xb820)
|
||||
#define MIPI_DPI_RESOLUTION(port) _MMIO_MIPI(port, _MIPIA_DPI_RESOLUTION, _MIPIC_DPI_RESOLUTION)
|
||||
#define _MIPIA_DPI_RESOLUTION 0xb020
|
||||
#define _MIPIC_DPI_RESOLUTION 0xb820
|
||||
#define MIPI_DPI_RESOLUTION(display, port) _MMIO_MIPI(_MIPI_MMIO_BASE(display), port, _MIPIA_DPI_RESOLUTION, _MIPIC_DPI_RESOLUTION)
|
||||
#define VERTICAL_ADDRESS_SHIFT 16
|
||||
#define VERTICAL_ADDRESS_MASK (0xffff << 16)
|
||||
#define HORIZONTAL_ADDRESS_SHIFT 0
|
||||
#define HORIZONTAL_ADDRESS_MASK 0xffff
|
||||
|
||||
#define _MIPIA_DBI_FIFO_THROTTLE (_MIPI_MMIO_BASE(dev_priv) + 0xb024)
|
||||
#define _MIPIC_DBI_FIFO_THROTTLE (_MIPI_MMIO_BASE(dev_priv) + 0xb824)
|
||||
#define MIPI_DBI_FIFO_THROTTLE(port) _MMIO_MIPI(port, _MIPIA_DBI_FIFO_THROTTLE, _MIPIC_DBI_FIFO_THROTTLE)
|
||||
#define _MIPIA_DBI_FIFO_THROTTLE 0xb024
|
||||
#define _MIPIC_DBI_FIFO_THROTTLE 0xb824
|
||||
#define MIPI_DBI_FIFO_THROTTLE(display, port) _MMIO_MIPI(_MIPI_MMIO_BASE(display), port, _MIPIA_DBI_FIFO_THROTTLE, _MIPIC_DBI_FIFO_THROTTLE)
|
||||
#define DBI_FIFO_EMPTY_HALF (0 << 0)
|
||||
#define DBI_FIFO_EMPTY_QUARTER (1 << 0)
|
||||
#define DBI_FIFO_EMPTY_7_LOCATIONS (2 << 0)
|
||||
|
||||
/* regs below are bits 15:0 */
|
||||
#define _MIPIA_HSYNC_PADDING_COUNT (_MIPI_MMIO_BASE(dev_priv) + 0xb028)
|
||||
#define _MIPIC_HSYNC_PADDING_COUNT (_MIPI_MMIO_BASE(dev_priv) + 0xb828)
|
||||
#define MIPI_HSYNC_PADDING_COUNT(port) _MMIO_MIPI(port, _MIPIA_HSYNC_PADDING_COUNT, _MIPIC_HSYNC_PADDING_COUNT)
|
||||
#define _MIPIA_HSYNC_PADDING_COUNT 0xb028
|
||||
#define _MIPIC_HSYNC_PADDING_COUNT 0xb828
|
||||
#define MIPI_HSYNC_PADDING_COUNT(display, port) _MMIO_MIPI(_MIPI_MMIO_BASE(display), port, _MIPIA_HSYNC_PADDING_COUNT, _MIPIC_HSYNC_PADDING_COUNT)
|
||||
|
||||
#define _MIPIA_HBP_COUNT (_MIPI_MMIO_BASE(dev_priv) + 0xb02c)
|
||||
#define _MIPIC_HBP_COUNT (_MIPI_MMIO_BASE(dev_priv) + 0xb82c)
|
||||
#define MIPI_HBP_COUNT(port) _MMIO_MIPI(port, _MIPIA_HBP_COUNT, _MIPIC_HBP_COUNT)
|
||||
#define _MIPIA_HBP_COUNT 0xb02c
|
||||
#define _MIPIC_HBP_COUNT 0xb82c
|
||||
#define MIPI_HBP_COUNT(display, port) _MMIO_MIPI(_MIPI_MMIO_BASE(display), port, _MIPIA_HBP_COUNT, _MIPIC_HBP_COUNT)
|
||||
|
||||
#define _MIPIA_HFP_COUNT (_MIPI_MMIO_BASE(dev_priv) + 0xb030)
|
||||
#define _MIPIC_HFP_COUNT (_MIPI_MMIO_BASE(dev_priv) + 0xb830)
|
||||
#define MIPI_HFP_COUNT(port) _MMIO_MIPI(port, _MIPIA_HFP_COUNT, _MIPIC_HFP_COUNT)
|
||||
#define _MIPIA_HFP_COUNT 0xb030
|
||||
#define _MIPIC_HFP_COUNT 0xb830
|
||||
#define MIPI_HFP_COUNT(display, port) _MMIO_MIPI(_MIPI_MMIO_BASE(display), port, _MIPIA_HFP_COUNT, _MIPIC_HFP_COUNT)
|
||||
|
||||
#define _MIPIA_HACTIVE_AREA_COUNT (_MIPI_MMIO_BASE(dev_priv) + 0xb034)
|
||||
#define _MIPIC_HACTIVE_AREA_COUNT (_MIPI_MMIO_BASE(dev_priv) + 0xb834)
|
||||
#define MIPI_HACTIVE_AREA_COUNT(port) _MMIO_MIPI(port, _MIPIA_HACTIVE_AREA_COUNT, _MIPIC_HACTIVE_AREA_COUNT)
|
||||
#define _MIPIA_HACTIVE_AREA_COUNT 0xb034
|
||||
#define _MIPIC_HACTIVE_AREA_COUNT 0xb834
|
||||
#define MIPI_HACTIVE_AREA_COUNT(display, port) _MMIO_MIPI(_MIPI_MMIO_BASE(display), port, _MIPIA_HACTIVE_AREA_COUNT, _MIPIC_HACTIVE_AREA_COUNT)
|
||||
|
||||
#define _MIPIA_VSYNC_PADDING_COUNT (_MIPI_MMIO_BASE(dev_priv) + 0xb038)
|
||||
#define _MIPIC_VSYNC_PADDING_COUNT (_MIPI_MMIO_BASE(dev_priv) + 0xb838)
|
||||
#define MIPI_VSYNC_PADDING_COUNT(port) _MMIO_MIPI(port, _MIPIA_VSYNC_PADDING_COUNT, _MIPIC_VSYNC_PADDING_COUNT)
|
||||
#define _MIPIA_VSYNC_PADDING_COUNT 0xb038
|
||||
#define _MIPIC_VSYNC_PADDING_COUNT 0xb838
|
||||
#define MIPI_VSYNC_PADDING_COUNT(display, port) _MMIO_MIPI(_MIPI_MMIO_BASE(display), port, _MIPIA_VSYNC_PADDING_COUNT, _MIPIC_VSYNC_PADDING_COUNT)
|
||||
|
||||
#define _MIPIA_VBP_COUNT (_MIPI_MMIO_BASE(dev_priv) + 0xb03c)
|
||||
#define _MIPIC_VBP_COUNT (_MIPI_MMIO_BASE(dev_priv) + 0xb83c)
|
||||
#define MIPI_VBP_COUNT(port) _MMIO_MIPI(port, _MIPIA_VBP_COUNT, _MIPIC_VBP_COUNT)
|
||||
#define _MIPIA_VBP_COUNT 0xb03c
|
||||
#define _MIPIC_VBP_COUNT 0xb83c
|
||||
#define MIPI_VBP_COUNT(display, port) _MMIO_MIPI(_MIPI_MMIO_BASE(display), port, _MIPIA_VBP_COUNT, _MIPIC_VBP_COUNT)
|
||||
|
||||
#define _MIPIA_VFP_COUNT (_MIPI_MMIO_BASE(dev_priv) + 0xb040)
|
||||
#define _MIPIC_VFP_COUNT (_MIPI_MMIO_BASE(dev_priv) + 0xb840)
|
||||
#define MIPI_VFP_COUNT(port) _MMIO_MIPI(port, _MIPIA_VFP_COUNT, _MIPIC_VFP_COUNT)
|
||||
#define _MIPIA_VFP_COUNT 0xb040
|
||||
#define _MIPIC_VFP_COUNT 0xb840
|
||||
#define MIPI_VFP_COUNT(display, port) _MMIO_MIPI(_MIPI_MMIO_BASE(display), port, _MIPIA_VFP_COUNT, _MIPIC_VFP_COUNT)
|
||||
|
||||
#define _MIPIA_HIGH_LOW_SWITCH_COUNT (_MIPI_MMIO_BASE(dev_priv) + 0xb044)
|
||||
#define _MIPIC_HIGH_LOW_SWITCH_COUNT (_MIPI_MMIO_BASE(dev_priv) + 0xb844)
|
||||
#define MIPI_HIGH_LOW_SWITCH_COUNT(port) _MMIO_MIPI(port, _MIPIA_HIGH_LOW_SWITCH_COUNT, _MIPIC_HIGH_LOW_SWITCH_COUNT)
|
||||
#define _MIPIA_HIGH_LOW_SWITCH_COUNT 0xb044
|
||||
#define _MIPIC_HIGH_LOW_SWITCH_COUNT 0xb844
|
||||
#define MIPI_HIGH_LOW_SWITCH_COUNT(display, port) _MMIO_MIPI(_MIPI_MMIO_BASE(display), port, _MIPIA_HIGH_LOW_SWITCH_COUNT, _MIPIC_HIGH_LOW_SWITCH_COUNT)
|
||||
|
||||
#define _MIPIA_DPI_CONTROL (_MIPI_MMIO_BASE(dev_priv) + 0xb048)
|
||||
#define _MIPIC_DPI_CONTROL (_MIPI_MMIO_BASE(dev_priv) + 0xb848)
|
||||
#define MIPI_DPI_CONTROL(port) _MMIO_MIPI(port, _MIPIA_DPI_CONTROL, _MIPIC_DPI_CONTROL)
|
||||
#define _MIPIA_DPI_CONTROL 0xb048
|
||||
#define _MIPIC_DPI_CONTROL 0xb848
|
||||
#define MIPI_DPI_CONTROL(display, port) _MMIO_MIPI(_MIPI_MMIO_BASE(display), port, _MIPIA_DPI_CONTROL, _MIPIC_DPI_CONTROL)
|
||||
#define DPI_LP_MODE (1 << 6)
|
||||
#define BACKLIGHT_OFF (1 << 5)
|
||||
#define BACKLIGHT_ON (1 << 4)
|
||||
@ -249,28 +243,27 @@
|
||||
#define TURN_ON (1 << 1)
|
||||
#define SHUTDOWN (1 << 0)
|
||||
|
||||
#define _MIPIA_DPI_DATA (_MIPI_MMIO_BASE(dev_priv) + 0xb04c)
|
||||
#define _MIPIC_DPI_DATA (_MIPI_MMIO_BASE(dev_priv) + 0xb84c)
|
||||
#define MIPI_DPI_DATA(port) _MMIO_MIPI(port, _MIPIA_DPI_DATA, _MIPIC_DPI_DATA)
|
||||
#define _MIPIA_DPI_DATA 0xb04c
|
||||
#define _MIPIC_DPI_DATA 0xb84c
|
||||
#define MIPI_DPI_DATA(display, port) _MMIO_MIPI(_MIPI_MMIO_BASE(display), port, _MIPIA_DPI_DATA, _MIPIC_DPI_DATA)
|
||||
#define COMMAND_BYTE_SHIFT 0
|
||||
#define COMMAND_BYTE_MASK (0x3f << 0)
|
||||
|
||||
#define _MIPIA_INIT_COUNT (_MIPI_MMIO_BASE(dev_priv) + 0xb050)
|
||||
#define _MIPIC_INIT_COUNT (_MIPI_MMIO_BASE(dev_priv) + 0xb850)
|
||||
#define MIPI_INIT_COUNT(port) _MMIO_MIPI(port, _MIPIA_INIT_COUNT, _MIPIC_INIT_COUNT)
|
||||
#define _MIPIA_INIT_COUNT 0xb050
|
||||
#define _MIPIC_INIT_COUNT 0xb850
|
||||
#define MIPI_INIT_COUNT(display, port) _MMIO_MIPI(_MIPI_MMIO_BASE(display), port, _MIPIA_INIT_COUNT, _MIPIC_INIT_COUNT)
|
||||
#define MASTER_INIT_TIMER_SHIFT 0
|
||||
#define MASTER_INIT_TIMER_MASK (0xffff << 0)
|
||||
|
||||
#define _MIPIA_MAX_RETURN_PKT_SIZE (_MIPI_MMIO_BASE(dev_priv) + 0xb054)
|
||||
#define _MIPIC_MAX_RETURN_PKT_SIZE (_MIPI_MMIO_BASE(dev_priv) + 0xb854)
|
||||
#define MIPI_MAX_RETURN_PKT_SIZE(port) _MMIO_MIPI(port, \
|
||||
_MIPIA_MAX_RETURN_PKT_SIZE, _MIPIC_MAX_RETURN_PKT_SIZE)
|
||||
#define _MIPIA_MAX_RETURN_PKT_SIZE 0xb054
|
||||
#define _MIPIC_MAX_RETURN_PKT_SIZE 0xb854
|
||||
#define MIPI_MAX_RETURN_PKT_SIZE(display, port) _MMIO_MIPI(_MIPI_MMIO_BASE(display), port, _MIPIA_MAX_RETURN_PKT_SIZE, _MIPIC_MAX_RETURN_PKT_SIZE)
|
||||
#define MAX_RETURN_PKT_SIZE_SHIFT 0
|
||||
#define MAX_RETURN_PKT_SIZE_MASK (0x3ff << 0)
|
||||
|
||||
#define _MIPIA_VIDEO_MODE_FORMAT (_MIPI_MMIO_BASE(dev_priv) + 0xb058)
|
||||
#define _MIPIC_VIDEO_MODE_FORMAT (_MIPI_MMIO_BASE(dev_priv) + 0xb858)
|
||||
#define MIPI_VIDEO_MODE_FORMAT(port) _MMIO_MIPI(port, _MIPIA_VIDEO_MODE_FORMAT, _MIPIC_VIDEO_MODE_FORMAT)
|
||||
#define _MIPIA_VIDEO_MODE_FORMAT 0xb058
|
||||
#define _MIPIC_VIDEO_MODE_FORMAT 0xb858
|
||||
#define MIPI_VIDEO_MODE_FORMAT(display, port) _MMIO_MIPI(_MIPI_MMIO_BASE(display), port, _MIPIA_VIDEO_MODE_FORMAT, _MIPIC_VIDEO_MODE_FORMAT)
|
||||
#define RANDOM_DPI_DISPLAY_RESOLUTION (1 << 4)
|
||||
#define DISABLE_VIDEO_BTA (1 << 3)
|
||||
#define IP_TG_CONFIG (1 << 2)
|
||||
@ -278,9 +271,9 @@
|
||||
#define VIDEO_MODE_NON_BURST_WITH_SYNC_EVENTS (2 << 0)
|
||||
#define VIDEO_MODE_BURST (3 << 0)
|
||||
|
||||
#define _MIPIA_EOT_DISABLE (_MIPI_MMIO_BASE(dev_priv) + 0xb05c)
|
||||
#define _MIPIC_EOT_DISABLE (_MIPI_MMIO_BASE(dev_priv) + 0xb85c)
|
||||
#define MIPI_EOT_DISABLE(port) _MMIO_MIPI(port, _MIPIA_EOT_DISABLE, _MIPIC_EOT_DISABLE)
|
||||
#define _MIPIA_EOT_DISABLE 0xb05c
|
||||
#define _MIPIC_EOT_DISABLE 0xb85c
|
||||
#define MIPI_EOT_DISABLE(display, port) _MMIO_MIPI(_MIPI_MMIO_BASE(display), port, _MIPIA_EOT_DISABLE, _MIPIC_EOT_DISABLE)
|
||||
#define BXT_DEFEATURE_DPI_FIFO_CTR (1 << 9)
|
||||
#define BXT_DPHY_DEFEATURE_EN (1 << 8)
|
||||
#define LP_RX_TIMEOUT_ERROR_RECOVERY_DISABLE (1 << 7)
|
||||
@ -292,36 +285,36 @@
|
||||
#define CLOCKSTOP (1 << 1)
|
||||
#define EOT_DISABLE (1 << 0)
|
||||
|
||||
#define _MIPIA_LP_BYTECLK (_MIPI_MMIO_BASE(dev_priv) + 0xb060)
|
||||
#define _MIPIC_LP_BYTECLK (_MIPI_MMIO_BASE(dev_priv) + 0xb860)
|
||||
#define MIPI_LP_BYTECLK(port) _MMIO_MIPI(port, _MIPIA_LP_BYTECLK, _MIPIC_LP_BYTECLK)
|
||||
#define _MIPIA_LP_BYTECLK 0xb060
|
||||
#define _MIPIC_LP_BYTECLK 0xb860
|
||||
#define MIPI_LP_BYTECLK(display, port) _MMIO_MIPI(_MIPI_MMIO_BASE(display), port, _MIPIA_LP_BYTECLK, _MIPIC_LP_BYTECLK)
|
||||
#define LP_BYTECLK_SHIFT 0
|
||||
#define LP_BYTECLK_MASK (0xffff << 0)
|
||||
|
||||
#define _MIPIA_TLPX_TIME_COUNT (_MIPI_MMIO_BASE(dev_priv) + 0xb0a4)
|
||||
#define _MIPIC_TLPX_TIME_COUNT (_MIPI_MMIO_BASE(dev_priv) + 0xb8a4)
|
||||
#define MIPI_TLPX_TIME_COUNT(port) _MMIO_MIPI(port, _MIPIA_TLPX_TIME_COUNT, _MIPIC_TLPX_TIME_COUNT)
|
||||
#define _MIPIA_TLPX_TIME_COUNT 0xb0a4
|
||||
#define _MIPIC_TLPX_TIME_COUNT 0xb8a4
|
||||
#define MIPI_TLPX_TIME_COUNT(display, port) _MMIO_MIPI(_MIPI_MMIO_BASE(display), port, _MIPIA_TLPX_TIME_COUNT, _MIPIC_TLPX_TIME_COUNT)
|
||||
|
||||
#define _MIPIA_CLK_LANE_TIMING (_MIPI_MMIO_BASE(dev_priv) + 0xb098)
|
||||
#define _MIPIC_CLK_LANE_TIMING (_MIPI_MMIO_BASE(dev_priv) + 0xb898)
|
||||
#define MIPI_CLK_LANE_TIMING(port) _MMIO_MIPI(port, _MIPIA_CLK_LANE_TIMING, _MIPIC_CLK_LANE_TIMING)
|
||||
#define _MIPIA_CLK_LANE_TIMING 0xb098
|
||||
#define _MIPIC_CLK_LANE_TIMING 0xb898
|
||||
#define MIPI_CLK_LANE_TIMING(display, port) _MMIO_MIPI(_MIPI_MMIO_BASE(display), port, _MIPIA_CLK_LANE_TIMING, _MIPIC_CLK_LANE_TIMING)
|
||||
|
||||
/* bits 31:0 */
|
||||
#define _MIPIA_LP_GEN_DATA (_MIPI_MMIO_BASE(dev_priv) + 0xb064)
|
||||
#define _MIPIC_LP_GEN_DATA (_MIPI_MMIO_BASE(dev_priv) + 0xb864)
|
||||
#define MIPI_LP_GEN_DATA(port) _MMIO_MIPI(port, _MIPIA_LP_GEN_DATA, _MIPIC_LP_GEN_DATA)
|
||||
#define _MIPIA_LP_GEN_DATA 0xb064
|
||||
#define _MIPIC_LP_GEN_DATA 0xb864
|
||||
#define MIPI_LP_GEN_DATA(display, port) _MMIO_MIPI(_MIPI_MMIO_BASE(display), port, _MIPIA_LP_GEN_DATA, _MIPIC_LP_GEN_DATA)
|
||||
|
||||
/* bits 31:0 */
|
||||
#define _MIPIA_HS_GEN_DATA (_MIPI_MMIO_BASE(dev_priv) + 0xb068)
|
||||
#define _MIPIC_HS_GEN_DATA (_MIPI_MMIO_BASE(dev_priv) + 0xb868)
|
||||
#define MIPI_HS_GEN_DATA(port) _MMIO_MIPI(port, _MIPIA_HS_GEN_DATA, _MIPIC_HS_GEN_DATA)
|
||||
#define _MIPIA_HS_GEN_DATA 0xb068
|
||||
#define _MIPIC_HS_GEN_DATA 0xb868
|
||||
#define MIPI_HS_GEN_DATA(display, port) _MMIO_MIPI(_MIPI_MMIO_BASE(display), port, _MIPIA_HS_GEN_DATA, _MIPIC_HS_GEN_DATA)
|
||||
|
||||
#define _MIPIA_LP_GEN_CTRL (_MIPI_MMIO_BASE(dev_priv) + 0xb06c)
|
||||
#define _MIPIC_LP_GEN_CTRL (_MIPI_MMIO_BASE(dev_priv) + 0xb86c)
|
||||
#define MIPI_LP_GEN_CTRL(port) _MMIO_MIPI(port, _MIPIA_LP_GEN_CTRL, _MIPIC_LP_GEN_CTRL)
|
||||
#define _MIPIA_HS_GEN_CTRL (_MIPI_MMIO_BASE(dev_priv) + 0xb070)
|
||||
#define _MIPIC_HS_GEN_CTRL (_MIPI_MMIO_BASE(dev_priv) + 0xb870)
|
||||
#define MIPI_HS_GEN_CTRL(port) _MMIO_MIPI(port, _MIPIA_HS_GEN_CTRL, _MIPIC_HS_GEN_CTRL)
|
||||
#define _MIPIA_LP_GEN_CTRL 0xb06c
|
||||
#define _MIPIC_LP_GEN_CTRL 0xb86c
|
||||
#define MIPI_LP_GEN_CTRL(display, port) _MMIO_MIPI(_MIPI_MMIO_BASE(display), port, _MIPIA_LP_GEN_CTRL, _MIPIC_LP_GEN_CTRL)
|
||||
#define _MIPIA_HS_GEN_CTRL 0xb070
|
||||
#define _MIPIC_HS_GEN_CTRL 0xb870
|
||||
#define MIPI_HS_GEN_CTRL(display, port) _MMIO_MIPI(_MIPI_MMIO_BASE(display), port, _MIPIA_HS_GEN_CTRL, _MIPIC_HS_GEN_CTRL)
|
||||
#define LONG_PACKET_WORD_COUNT_SHIFT 8
|
||||
#define LONG_PACKET_WORD_COUNT_MASK (0xffff << 8)
|
||||
#define SHORT_PACKET_PARAM_SHIFT 8
|
||||
@ -332,9 +325,9 @@
|
||||
#define DATA_TYPE_MASK (0x3f << 0)
|
||||
/* data type values, see include/video/mipi_display.h */
|
||||
|
||||
#define _MIPIA_GEN_FIFO_STAT (_MIPI_MMIO_BASE(dev_priv) + 0xb074)
|
||||
#define _MIPIC_GEN_FIFO_STAT (_MIPI_MMIO_BASE(dev_priv) + 0xb874)
|
||||
#define MIPI_GEN_FIFO_STAT(port) _MMIO_MIPI(port, _MIPIA_GEN_FIFO_STAT, _MIPIC_GEN_FIFO_STAT)
|
||||
#define _MIPIA_GEN_FIFO_STAT 0xb074
|
||||
#define _MIPIC_GEN_FIFO_STAT 0xb874
|
||||
#define MIPI_GEN_FIFO_STAT(display, port) _MMIO_MIPI(_MIPI_MMIO_BASE(display), port, _MIPIA_GEN_FIFO_STAT, _MIPIC_GEN_FIFO_STAT)
|
||||
#define DPI_FIFO_EMPTY (1 << 28)
|
||||
#define DBI_FIFO_EMPTY (1 << 27)
|
||||
#define LP_CTRL_FIFO_EMPTY (1 << 26)
|
||||
@ -350,16 +343,16 @@
|
||||
#define HS_DATA_FIFO_HALF_EMPTY (1 << 1)
|
||||
#define HS_DATA_FIFO_FULL (1 << 0)
|
||||
|
||||
#define _MIPIA_HS_LS_DBI_ENABLE (_MIPI_MMIO_BASE(dev_priv) + 0xb078)
|
||||
#define _MIPIC_HS_LS_DBI_ENABLE (_MIPI_MMIO_BASE(dev_priv) + 0xb878)
|
||||
#define MIPI_HS_LP_DBI_ENABLE(port) _MMIO_MIPI(port, _MIPIA_HS_LS_DBI_ENABLE, _MIPIC_HS_LS_DBI_ENABLE)
|
||||
#define _MIPIA_HS_LS_DBI_ENABLE 0xb078
|
||||
#define _MIPIC_HS_LS_DBI_ENABLE 0xb878
|
||||
#define MIPI_HS_LP_DBI_ENABLE(display, port) _MMIO_MIPI(_MIPI_MMIO_BASE(display), port, _MIPIA_HS_LS_DBI_ENABLE, _MIPIC_HS_LS_DBI_ENABLE)
|
||||
#define DBI_HS_LP_MODE_MASK (1 << 0)
|
||||
#define DBI_LP_MODE (1 << 0)
|
||||
#define DBI_HS_MODE (0 << 0)
|
||||
|
||||
#define _MIPIA_DPHY_PARAM (_MIPI_MMIO_BASE(dev_priv) + 0xb080)
|
||||
#define _MIPIC_DPHY_PARAM (_MIPI_MMIO_BASE(dev_priv) + 0xb880)
|
||||
#define MIPI_DPHY_PARAM(port) _MMIO_MIPI(port, _MIPIA_DPHY_PARAM, _MIPIC_DPHY_PARAM)
|
||||
#define _MIPIA_DPHY_PARAM 0xb080
|
||||
#define _MIPIC_DPHY_PARAM 0xb880
|
||||
#define MIPI_DPHY_PARAM(display, port) _MMIO_MIPI(_MIPI_MMIO_BASE(display), port, _MIPIA_DPHY_PARAM, _MIPIC_DPHY_PARAM)
|
||||
#define EXIT_ZERO_COUNT_SHIFT 24
|
||||
#define EXIT_ZERO_COUNT_MASK (0x3f << 24)
|
||||
#define TRAIL_COUNT_SHIFT 16
|
||||
@ -369,34 +362,34 @@
|
||||
#define PREPARE_COUNT_SHIFT 0
|
||||
#define PREPARE_COUNT_MASK (0x3f << 0)
|
||||
|
||||
#define _MIPIA_DBI_BW_CTRL (_MIPI_MMIO_BASE(dev_priv) + 0xb084)
|
||||
#define _MIPIC_DBI_BW_CTRL (_MIPI_MMIO_BASE(dev_priv) + 0xb884)
|
||||
#define MIPI_DBI_BW_CTRL(port) _MMIO_MIPI(port, _MIPIA_DBI_BW_CTRL, _MIPIC_DBI_BW_CTRL)
|
||||
#define _MIPIA_DBI_BW_CTRL 0xb084
|
||||
#define _MIPIC_DBI_BW_CTRL 0xb884
|
||||
#define MIPI_DBI_BW_CTRL(display, port) _MMIO_MIPI(_MIPI_MMIO_BASE(display), port, _MIPIA_DBI_BW_CTRL, _MIPIC_DBI_BW_CTRL)
|
||||
|
||||
#define _MIPIA_CLK_LANE_SWITCH_TIME_CNT (_MIPI_MMIO_BASE(dev_priv) + 0xb088)
|
||||
#define _MIPIC_CLK_LANE_SWITCH_TIME_CNT (_MIPI_MMIO_BASE(dev_priv) + 0xb888)
|
||||
#define MIPI_CLK_LANE_SWITCH_TIME_CNT(port) _MMIO_MIPI(port, _MIPIA_CLK_LANE_SWITCH_TIME_CNT, _MIPIC_CLK_LANE_SWITCH_TIME_CNT)
|
||||
#define _MIPIA_CLK_LANE_SWITCH_TIME_CNT 0xb088
|
||||
#define _MIPIC_CLK_LANE_SWITCH_TIME_CNT 0xb888
|
||||
#define MIPI_CLK_LANE_SWITCH_TIME_CNT(display, port) _MMIO_MIPI(_MIPI_MMIO_BASE(display), port, _MIPIA_CLK_LANE_SWITCH_TIME_CNT, _MIPIC_CLK_LANE_SWITCH_TIME_CNT)
|
||||
#define LP_HS_SSW_CNT_SHIFT 16
|
||||
#define LP_HS_SSW_CNT_MASK (0xffff << 16)
|
||||
#define HS_LP_PWR_SW_CNT_SHIFT 0
|
||||
#define HS_LP_PWR_SW_CNT_MASK (0xffff << 0)
|
||||
|
||||
#define _MIPIA_STOP_STATE_STALL (_MIPI_MMIO_BASE(dev_priv) + 0xb08c)
|
||||
#define _MIPIC_STOP_STATE_STALL (_MIPI_MMIO_BASE(dev_priv) + 0xb88c)
|
||||
#define MIPI_STOP_STATE_STALL(port) _MMIO_MIPI(port, _MIPIA_STOP_STATE_STALL, _MIPIC_STOP_STATE_STALL)
|
||||
#define _MIPIA_STOP_STATE_STALL 0xb08c
|
||||
#define _MIPIC_STOP_STATE_STALL 0xb88c
|
||||
#define MIPI_STOP_STATE_STALL(display, port) _MMIO_MIPI(_MIPI_MMIO_BASE(display), port, _MIPIA_STOP_STATE_STALL, _MIPIC_STOP_STATE_STALL)
|
||||
#define STOP_STATE_STALL_COUNTER_SHIFT 0
|
||||
#define STOP_STATE_STALL_COUNTER_MASK (0xff << 0)
|
||||
|
||||
#define _MIPIA_INTR_STAT_REG_1 (_MIPI_MMIO_BASE(dev_priv) + 0xb090)
|
||||
#define _MIPIC_INTR_STAT_REG_1 (_MIPI_MMIO_BASE(dev_priv) + 0xb890)
|
||||
#define MIPI_INTR_STAT_REG_1(port) _MMIO_MIPI(port, _MIPIA_INTR_STAT_REG_1, _MIPIC_INTR_STAT_REG_1)
|
||||
#define _MIPIA_INTR_EN_REG_1 (_MIPI_MMIO_BASE(dev_priv) + 0xb094)
|
||||
#define _MIPIC_INTR_EN_REG_1 (_MIPI_MMIO_BASE(dev_priv) + 0xb894)
|
||||
#define MIPI_INTR_EN_REG_1(port) _MMIO_MIPI(port, _MIPIA_INTR_EN_REG_1, _MIPIC_INTR_EN_REG_1)
|
||||
#define _MIPIA_INTR_STAT_REG_1 0xb090
|
||||
#define _MIPIC_INTR_STAT_REG_1 0xb890
|
||||
#define MIPI_INTR_STAT_REG_1(display, port) _MMIO_MIPI(_MIPI_MMIO_BASE(display), port, _MIPIA_INTR_STAT_REG_1, _MIPIC_INTR_STAT_REG_1)
|
||||
#define _MIPIA_INTR_EN_REG_1 0xb094
|
||||
#define _MIPIC_INTR_EN_REG_1 0xb894
|
||||
#define MIPI_INTR_EN_REG_1(display, port) _MMIO_MIPI(_MIPI_MMIO_BASE(display), port, _MIPIA_INTR_EN_REG_1, _MIPIC_INTR_EN_REG_1)
|
||||
#define RX_CONTENTION_DETECTED (1 << 0)
|
||||
|
||||
/* XXX: only pipe A ?!? */
|
||||
#define MIPIA_DBI_TYPEC_CTRL (_MIPI_MMIO_BASE(dev_priv) + 0xb100)
|
||||
#define MIPIA_DBI_TYPEC_CTRL(display) (_MIPI_MMIO_BASE(display) + 0xb100)
|
||||
#define DBI_TYPEC_ENABLE (1 << 31)
|
||||
#define DBI_TYPEC_WIP (1 << 30)
|
||||
#define DBI_TYPEC_OPTION_SHIFT 28
|
||||
@ -409,9 +402,9 @@
|
||||
|
||||
/* MIPI adapter registers */
|
||||
|
||||
#define _MIPIA_CTRL (_MIPI_MMIO_BASE(dev_priv) + 0xb104)
|
||||
#define _MIPIC_CTRL (_MIPI_MMIO_BASE(dev_priv) + 0xb904)
|
||||
#define MIPI_CTRL(port) _MMIO_MIPI(port, _MIPIA_CTRL, _MIPIC_CTRL)
|
||||
#define _MIPIA_CTRL 0xb104
|
||||
#define _MIPIC_CTRL 0xb904
|
||||
#define MIPI_CTRL(display, port) _MMIO_MIPI(_MIPI_MMIO_BASE(display), port, _MIPIA_CTRL, _MIPIC_CTRL)
|
||||
#define ESCAPE_CLOCK_DIVIDER_SHIFT 5 /* A only */
|
||||
#define ESCAPE_CLOCK_DIVIDER_MASK (3 << 5)
|
||||
#define ESCAPE_CLOCK_DIVIDER_1 (0 << 5)
|
||||
@ -442,41 +435,41 @@
|
||||
#define GLK_MIPIIO_PORT_POWERED (1 << 1) /* RO */
|
||||
#define GLK_MIPIIO_ENABLE (1 << 0)
|
||||
|
||||
#define _MIPIA_DATA_ADDRESS (_MIPI_MMIO_BASE(dev_priv) + 0xb108)
|
||||
#define _MIPIC_DATA_ADDRESS (_MIPI_MMIO_BASE(dev_priv) + 0xb908)
|
||||
#define MIPI_DATA_ADDRESS(port) _MMIO_MIPI(port, _MIPIA_DATA_ADDRESS, _MIPIC_DATA_ADDRESS)
|
||||
#define _MIPIA_DATA_ADDRESS 0xb108
|
||||
#define _MIPIC_DATA_ADDRESS 0xb908
|
||||
#define MIPI_DATA_ADDRESS(display, port) _MMIO_MIPI(_MIPI_MMIO_BASE(display), port, _MIPIA_DATA_ADDRESS, _MIPIC_DATA_ADDRESS)
|
||||
#define DATA_MEM_ADDRESS_SHIFT 5
|
||||
#define DATA_MEM_ADDRESS_MASK (0x7ffffff << 5)
|
||||
#define DATA_VALID (1 << 0)
|
||||
|
||||
#define _MIPIA_DATA_LENGTH (_MIPI_MMIO_BASE(dev_priv) + 0xb10c)
|
||||
#define _MIPIC_DATA_LENGTH (_MIPI_MMIO_BASE(dev_priv) + 0xb90c)
|
||||
#define MIPI_DATA_LENGTH(port) _MMIO_MIPI(port, _MIPIA_DATA_LENGTH, _MIPIC_DATA_LENGTH)
|
||||
#define _MIPIA_DATA_LENGTH 0xb10c
|
||||
#define _MIPIC_DATA_LENGTH 0xb90c
|
||||
#define MIPI_DATA_LENGTH(display, port) _MMIO_MIPI(_MIPI_MMIO_BASE(display), port, _MIPIA_DATA_LENGTH, _MIPIC_DATA_LENGTH)
|
||||
#define DATA_LENGTH_SHIFT 0
|
||||
#define DATA_LENGTH_MASK (0xfffff << 0)
|
||||
|
||||
#define _MIPIA_COMMAND_ADDRESS (_MIPI_MMIO_BASE(dev_priv) + 0xb110)
|
||||
#define _MIPIC_COMMAND_ADDRESS (_MIPI_MMIO_BASE(dev_priv) + 0xb910)
|
||||
#define MIPI_COMMAND_ADDRESS(port) _MMIO_MIPI(port, _MIPIA_COMMAND_ADDRESS, _MIPIC_COMMAND_ADDRESS)
|
||||
#define _MIPIA_COMMAND_ADDRESS 0xb110
|
||||
#define _MIPIC_COMMAND_ADDRESS 0xb910
|
||||
#define MIPI_COMMAND_ADDRESS(display, port) _MMIO_MIPI(_MIPI_MMIO_BASE(display), port, _MIPIA_COMMAND_ADDRESS, _MIPIC_COMMAND_ADDRESS)
|
||||
#define COMMAND_MEM_ADDRESS_SHIFT 5
|
||||
#define COMMAND_MEM_ADDRESS_MASK (0x7ffffff << 5)
|
||||
#define AUTO_PWG_ENABLE (1 << 2)
|
||||
#define MEMORY_WRITE_DATA_FROM_PIPE_RENDERING (1 << 1)
|
||||
#define COMMAND_VALID (1 << 0)
|
||||
|
||||
#define _MIPIA_COMMAND_LENGTH (_MIPI_MMIO_BASE(dev_priv) + 0xb114)
|
||||
#define _MIPIC_COMMAND_LENGTH (_MIPI_MMIO_BASE(dev_priv) + 0xb914)
|
||||
#define MIPI_COMMAND_LENGTH(port) _MMIO_MIPI(port, _MIPIA_COMMAND_LENGTH, _MIPIC_COMMAND_LENGTH)
|
||||
#define _MIPIA_COMMAND_LENGTH 0xb114
|
||||
#define _MIPIC_COMMAND_LENGTH 0xb914
|
||||
#define MIPI_COMMAND_LENGTH(display, port) _MMIO_MIPI(_MIPI_MMIO_BASE(display), port, _MIPIA_COMMAND_LENGTH, _MIPIC_COMMAND_LENGTH)
|
||||
#define COMMAND_LENGTH_SHIFT(n) (8 * (n)) /* n: 0...3 */
|
||||
#define COMMAND_LENGTH_MASK(n) (0xff << (8 * (n)))
|
||||
|
||||
#define _MIPIA_READ_DATA_RETURN0 (_MIPI_MMIO_BASE(dev_priv) + 0xb118)
|
||||
#define _MIPIC_READ_DATA_RETURN0 (_MIPI_MMIO_BASE(dev_priv) + 0xb918)
|
||||
#define MIPI_READ_DATA_RETURN(port, n) _MMIO(_MIPI(port, _MIPIA_READ_DATA_RETURN0, _MIPIC_READ_DATA_RETURN0) + 4 * (n)) /* n: 0...7 */
|
||||
#define _MIPIA_READ_DATA_RETURN0 0xb118
|
||||
#define _MIPIC_READ_DATA_RETURN0 0xb918
|
||||
#define MIPI_READ_DATA_RETURN(display, port, n) _MMIO_MIPI(_MIPI_MMIO_BASE(display) + 4 * (n), port, _MIPIA_READ_DATA_RETURN0, _MIPIC_READ_DATA_RETURN0) /* n: 0...7 */
|
||||
|
||||
#define _MIPIA_READ_DATA_VALID (_MIPI_MMIO_BASE(dev_priv) + 0xb138)
|
||||
#define _MIPIC_READ_DATA_VALID (_MIPI_MMIO_BASE(dev_priv) + 0xb938)
|
||||
#define MIPI_READ_DATA_VALID(port) _MMIO_MIPI(port, _MIPIA_READ_DATA_VALID, _MIPIC_READ_DATA_VALID)
|
||||
#define _MIPIA_READ_DATA_VALID 0xb138
|
||||
#define _MIPIC_READ_DATA_VALID 0xb938
|
||||
#define MIPI_READ_DATA_VALID(display, port) _MMIO_MIPI(_MIPI_MMIO_BASE(display), port, _MIPIA_READ_DATA_VALID, _MIPIC_READ_DATA_VALID)
|
||||
#define READ_DATA_VALID(n) (1 << (n))
|
||||
|
||||
#endif /* __VLV_DSI_REGS_H__ */
|
||||
|
@ -36,6 +36,7 @@
|
||||
#include "i915_reg.h"
|
||||
#include "gvt.h"
|
||||
|
||||
#include "display/bxt_dpio_phy_regs.h"
|
||||
#include "display/intel_display.h"
|
||||
#include "display/intel_dpio_phy.h"
|
||||
|
||||
|
@ -41,6 +41,7 @@
|
||||
#include "gvt.h"
|
||||
#include "i915_pvinfo.h"
|
||||
#include "intel_mchbar_regs.h"
|
||||
#include "display/bxt_dpio_phy_regs.h"
|
||||
#include "display/intel_display_types.h"
|
||||
#include "display/intel_dmc_regs.h"
|
||||
#include "display/intel_dp_aux_regs.h"
|
||||
@ -2763,15 +2764,15 @@ static int init_bxt_mmio_info(struct intel_gvt *gvt)
|
||||
|
||||
MMIO_DH(BXT_PORT_PCS_DW12_GRP(DPIO_PHY0, DPIO_CH0), D_BXT,
|
||||
NULL, bxt_pcs_dw12_grp_write);
|
||||
MMIO_DH(BXT_PORT_TX_DW3_LN0(DPIO_PHY0, DPIO_CH0), D_BXT,
|
||||
MMIO_DH(BXT_PORT_TX_DW3_LN(DPIO_PHY0, DPIO_CH0, 0), D_BXT,
|
||||
bxt_port_tx_dw3_read, NULL);
|
||||
MMIO_DH(BXT_PORT_PCS_DW12_GRP(DPIO_PHY0, DPIO_CH1), D_BXT,
|
||||
NULL, bxt_pcs_dw12_grp_write);
|
||||
MMIO_DH(BXT_PORT_TX_DW3_LN0(DPIO_PHY0, DPIO_CH1), D_BXT,
|
||||
MMIO_DH(BXT_PORT_TX_DW3_LN(DPIO_PHY0, DPIO_CH1, 0), D_BXT,
|
||||
bxt_port_tx_dw3_read, NULL);
|
||||
MMIO_DH(BXT_PORT_PCS_DW12_GRP(DPIO_PHY1, DPIO_CH0), D_BXT,
|
||||
NULL, bxt_pcs_dw12_grp_write);
|
||||
MMIO_DH(BXT_PORT_TX_DW3_LN0(DPIO_PHY1, DPIO_CH0), D_BXT,
|
||||
MMIO_DH(BXT_PORT_TX_DW3_LN(DPIO_PHY1, DPIO_CH0, 0), D_BXT,
|
||||
bxt_port_tx_dw3_read, NULL);
|
||||
MMIO_DH(BXT_DE_PLL_ENABLE, D_BXT, NULL, bxt_de_pll_enable_write);
|
||||
MMIO_DFH(GEN8_L3SQCREG1, D_BXT, F_CMD_ACCESS, NULL, NULL);
|
||||
|
@ -37,6 +37,7 @@
|
||||
#include "i915_reg.h"
|
||||
#include "gvt.h"
|
||||
|
||||
#include "display/bxt_dpio_phy_regs.h"
|
||||
#include "display/intel_dpio_phy.h"
|
||||
#include "gt/intel_gt_regs.h"
|
||||
|
||||
|
@ -108,9 +108,6 @@ i915_param_named_unsafe(guc_firmware_path, charp, 0400,
|
||||
i915_param_named_unsafe(huc_firmware_path, charp, 0400,
|
||||
"HuC firmware path to use instead of the default one");
|
||||
|
||||
i915_param_named_unsafe(dmc_firmware_path, charp, 0400,
|
||||
"DMC firmware path to use instead of the default one");
|
||||
|
||||
i915_param_named_unsafe(gsc_firmware_path, charp, 0400,
|
||||
"GSC firmware path to use instead of the default one");
|
||||
|
||||
|
@ -51,7 +51,6 @@ struct drm_printer;
|
||||
param(int, guc_log_level, -1, 0400) \
|
||||
param(char *, guc_firmware_path, NULL, 0400) \
|
||||
param(char *, huc_firmware_path, NULL, 0400) \
|
||||
param(char *, dmc_firmware_path, NULL, 0400) \
|
||||
param(char *, gsc_firmware_path, NULL, 0400) \
|
||||
param(bool, memtest, false, 0400) \
|
||||
param(int, mmio_debug, -IS_ENABLED(CONFIG_DRM_I915_DEBUG_MMIO), 0600) \
|
||||
|
@ -538,24 +538,6 @@
|
||||
#define CHV_TX_DW14(ch, lane) _TXLANE(ch, lane, 0xb8)
|
||||
#define DPIO_UPAR_SHIFT 30
|
||||
|
||||
/* BXT PHY registers */
|
||||
#define _BXT_PHY0_BASE 0x6C000
|
||||
#define _BXT_PHY1_BASE 0x162000
|
||||
#define _BXT_PHY2_BASE 0x163000
|
||||
#define BXT_PHY_BASE(phy) \
|
||||
_PICK_EVEN_2RANGES(phy, 1, \
|
||||
_BXT_PHY0_BASE, _BXT_PHY0_BASE, \
|
||||
_BXT_PHY1_BASE, _BXT_PHY2_BASE)
|
||||
|
||||
#define _BXT_PHY(phy, reg) \
|
||||
_MMIO(BXT_PHY_BASE(phy) - _BXT_PHY0_BASE + (reg))
|
||||
|
||||
#define _BXT_PHY_CH(phy, ch, reg_ch0, reg_ch1) \
|
||||
(BXT_PHY_BASE(phy) + _PIPE((ch), (reg_ch0) - _BXT_PHY0_BASE, \
|
||||
(reg_ch1) - _BXT_PHY0_BASE))
|
||||
#define _MMIO_BXT_PHY_CH(phy, ch, reg_ch0, reg_ch1) \
|
||||
_MMIO(_BXT_PHY_CH(phy, ch, reg_ch0, reg_ch1))
|
||||
|
||||
#define BXT_P_CR_GT_DISP_PWRON _MMIO(0x138090)
|
||||
#define MIPIO_RST_CTRL (1 << 2)
|
||||
|
||||
@ -577,250 +559,6 @@
|
||||
_PHY_CTL_FAMILY_DDI, _PHY_CTL_FAMILY_DDI, \
|
||||
_PHY_CTL_FAMILY_EDP, _PHY_CTL_FAMILY_DDI_C))
|
||||
|
||||
/* BXT PHY PLL registers */
|
||||
#define _PORT_PLL_A 0x46074
|
||||
#define _PORT_PLL_B 0x46078
|
||||
#define _PORT_PLL_C 0x4607c
|
||||
#define PORT_PLL_ENABLE REG_BIT(31)
|
||||
#define PORT_PLL_LOCK REG_BIT(30)
|
||||
#define PORT_PLL_REF_SEL REG_BIT(27)
|
||||
#define PORT_PLL_POWER_ENABLE REG_BIT(26)
|
||||
#define PORT_PLL_POWER_STATE REG_BIT(25)
|
||||
#define BXT_PORT_PLL_ENABLE(port) _MMIO_PORT(port, _PORT_PLL_A, _PORT_PLL_B)
|
||||
|
||||
#define _PORT_PLL_EBB_0_A 0x162034
|
||||
#define _PORT_PLL_EBB_0_B 0x6C034
|
||||
#define _PORT_PLL_EBB_0_C 0x6C340
|
||||
#define PORT_PLL_P1_MASK REG_GENMASK(15, 13)
|
||||
#define PORT_PLL_P1(p1) REG_FIELD_PREP(PORT_PLL_P1_MASK, (p1))
|
||||
#define PORT_PLL_P2_MASK REG_GENMASK(12, 8)
|
||||
#define PORT_PLL_P2(p2) REG_FIELD_PREP(PORT_PLL_P2_MASK, (p2))
|
||||
#define BXT_PORT_PLL_EBB_0(phy, ch) _MMIO_BXT_PHY_CH(phy, ch, \
|
||||
_PORT_PLL_EBB_0_B, \
|
||||
_PORT_PLL_EBB_0_C)
|
||||
|
||||
#define _PORT_PLL_EBB_4_A 0x162038
|
||||
#define _PORT_PLL_EBB_4_B 0x6C038
|
||||
#define _PORT_PLL_EBB_4_C 0x6C344
|
||||
#define PORT_PLL_RECALIBRATE REG_BIT(14)
|
||||
#define PORT_PLL_10BIT_CLK_ENABLE REG_BIT(13)
|
||||
#define BXT_PORT_PLL_EBB_4(phy, ch) _MMIO_BXT_PHY_CH(phy, ch, \
|
||||
_PORT_PLL_EBB_4_B, \
|
||||
_PORT_PLL_EBB_4_C)
|
||||
|
||||
#define _PORT_PLL_0_A 0x162100
|
||||
#define _PORT_PLL_0_B 0x6C100
|
||||
#define _PORT_PLL_0_C 0x6C380
|
||||
/* PORT_PLL_0_A */
|
||||
#define PORT_PLL_M2_INT_MASK REG_GENMASK(7, 0)
|
||||
#define PORT_PLL_M2_INT(m2_int) REG_FIELD_PREP(PORT_PLL_M2_INT_MASK, (m2_int))
|
||||
/* PORT_PLL_1_A */
|
||||
#define PORT_PLL_N_MASK REG_GENMASK(11, 8)
|
||||
#define PORT_PLL_N(n) REG_FIELD_PREP(PORT_PLL_N_MASK, (n))
|
||||
/* PORT_PLL_2_A */
|
||||
#define PORT_PLL_M2_FRAC_MASK REG_GENMASK(21, 0)
|
||||
#define PORT_PLL_M2_FRAC(m2_frac) REG_FIELD_PREP(PORT_PLL_M2_FRAC_MASK, (m2_frac))
|
||||
/* PORT_PLL_3_A */
|
||||
#define PORT_PLL_M2_FRAC_ENABLE REG_BIT(16)
|
||||
/* PORT_PLL_6_A */
|
||||
#define PORT_PLL_GAIN_CTL_MASK REG_GENMASK(18, 16)
|
||||
#define PORT_PLL_GAIN_CTL(x) REG_FIELD_PREP(PORT_PLL_GAIN_CTL_MASK, (x))
|
||||
#define PORT_PLL_INT_COEFF_MASK REG_GENMASK(12, 8)
|
||||
#define PORT_PLL_INT_COEFF(x) REG_FIELD_PREP(PORT_PLL_INT_COEFF_MASK, (x))
|
||||
#define PORT_PLL_PROP_COEFF_MASK REG_GENMASK(3, 0)
|
||||
#define PORT_PLL_PROP_COEFF(x) REG_FIELD_PREP(PORT_PLL_PROP_COEFF_MASK, (x))
|
||||
/* PORT_PLL_8_A */
|
||||
#define PORT_PLL_TARGET_CNT_MASK REG_GENMASK(9, 0)
|
||||
#define PORT_PLL_TARGET_CNT(x) REG_FIELD_PREP(PORT_PLL_TARGET_CNT_MASK, (x))
|
||||
/* PORT_PLL_9_A */
|
||||
#define PORT_PLL_LOCK_THRESHOLD_MASK REG_GENMASK(3, 1)
|
||||
#define PORT_PLL_LOCK_THRESHOLD(x) REG_FIELD_PREP(PORT_PLL_LOCK_THRESHOLD_MASK, (x))
|
||||
/* PORT_PLL_10_A */
|
||||
#define PORT_PLL_DCO_AMP_OVR_EN_H REG_BIT(27)
|
||||
#define PORT_PLL_DCO_AMP_MASK REG_GENMASK(13, 10)
|
||||
#define PORT_PLL_DCO_AMP(x) REG_FIELD_PREP(PORT_PLL_DCO_AMP_MASK, (x))
|
||||
#define _PORT_PLL_BASE(phy, ch) _BXT_PHY_CH(phy, ch, \
|
||||
_PORT_PLL_0_B, \
|
||||
_PORT_PLL_0_C)
|
||||
#define BXT_PORT_PLL(phy, ch, idx) _MMIO(_PORT_PLL_BASE(phy, ch) + \
|
||||
(idx) * 4)
|
||||
|
||||
/* BXT PHY common lane registers */
|
||||
#define _PORT_CL1CM_DW0_A 0x162000
|
||||
#define _PORT_CL1CM_DW0_BC 0x6C000
|
||||
#define PHY_POWER_GOOD (1 << 16)
|
||||
#define PHY_RESERVED (1 << 7)
|
||||
#define BXT_PORT_CL1CM_DW0(phy) _BXT_PHY((phy), _PORT_CL1CM_DW0_BC)
|
||||
|
||||
#define _PORT_CL1CM_DW9_A 0x162024
|
||||
#define _PORT_CL1CM_DW9_BC 0x6C024
|
||||
#define IREF0RC_OFFSET_SHIFT 8
|
||||
#define IREF0RC_OFFSET_MASK (0xFF << IREF0RC_OFFSET_SHIFT)
|
||||
#define BXT_PORT_CL1CM_DW9(phy) _BXT_PHY((phy), _PORT_CL1CM_DW9_BC)
|
||||
|
||||
#define _PORT_CL1CM_DW10_A 0x162028
|
||||
#define _PORT_CL1CM_DW10_BC 0x6C028
|
||||
#define IREF1RC_OFFSET_SHIFT 8
|
||||
#define IREF1RC_OFFSET_MASK (0xFF << IREF1RC_OFFSET_SHIFT)
|
||||
#define BXT_PORT_CL1CM_DW10(phy) _BXT_PHY((phy), _PORT_CL1CM_DW10_BC)
|
||||
|
||||
#define _PORT_CL1CM_DW28_A 0x162070
|
||||
#define _PORT_CL1CM_DW28_BC 0x6C070
|
||||
#define OCL1_POWER_DOWN_EN (1 << 23)
|
||||
#define DW28_OLDO_DYN_PWR_DOWN_EN (1 << 22)
|
||||
#define SUS_CLK_CONFIG 0x3
|
||||
#define BXT_PORT_CL1CM_DW28(phy) _BXT_PHY((phy), _PORT_CL1CM_DW28_BC)
|
||||
|
||||
#define _PORT_CL1CM_DW30_A 0x162078
|
||||
#define _PORT_CL1CM_DW30_BC 0x6C078
|
||||
#define OCL2_LDOFUSE_PWR_DIS (1 << 6)
|
||||
#define BXT_PORT_CL1CM_DW30(phy) _BXT_PHY((phy), _PORT_CL1CM_DW30_BC)
|
||||
|
||||
/* The spec defines this only for BXT PHY0, but lets assume that this
|
||||
* would exist for PHY1 too if it had a second channel.
|
||||
*/
|
||||
#define _PORT_CL2CM_DW6_A 0x162358
|
||||
#define _PORT_CL2CM_DW6_BC 0x6C358
|
||||
#define BXT_PORT_CL2CM_DW6(phy) _BXT_PHY((phy), _PORT_CL2CM_DW6_BC)
|
||||
#define DW6_OLDO_DYN_PWR_DOWN_EN (1 << 28)
|
||||
|
||||
/* BXT PHY Ref registers */
|
||||
#define _PORT_REF_DW3_A 0x16218C
|
||||
#define _PORT_REF_DW3_BC 0x6C18C
|
||||
#define GRC_DONE (1 << 22)
|
||||
#define BXT_PORT_REF_DW3(phy) _BXT_PHY((phy), _PORT_REF_DW3_BC)
|
||||
|
||||
#define _PORT_REF_DW6_A 0x162198
|
||||
#define _PORT_REF_DW6_BC 0x6C198
|
||||
#define GRC_CODE_SHIFT 24
|
||||
#define GRC_CODE_MASK (0xFF << GRC_CODE_SHIFT)
|
||||
#define GRC_CODE_FAST_SHIFT 16
|
||||
#define GRC_CODE_FAST_MASK (0xFF << GRC_CODE_FAST_SHIFT)
|
||||
#define GRC_CODE_SLOW_SHIFT 8
|
||||
#define GRC_CODE_SLOW_MASK (0xFF << GRC_CODE_SLOW_SHIFT)
|
||||
#define GRC_CODE_NOM_MASK 0xFF
|
||||
#define BXT_PORT_REF_DW6(phy) _BXT_PHY((phy), _PORT_REF_DW6_BC)
|
||||
|
||||
#define _PORT_REF_DW8_A 0x1621A0
|
||||
#define _PORT_REF_DW8_BC 0x6C1A0
|
||||
#define GRC_DIS (1 << 15)
|
||||
#define GRC_RDY_OVRD (1 << 1)
|
||||
#define BXT_PORT_REF_DW8(phy) _BXT_PHY((phy), _PORT_REF_DW8_BC)
|
||||
|
||||
/* BXT PHY PCS registers */
|
||||
#define _PORT_PCS_DW10_LN01_A 0x162428
|
||||
#define _PORT_PCS_DW10_LN01_B 0x6C428
|
||||
#define _PORT_PCS_DW10_LN01_C 0x6C828
|
||||
#define _PORT_PCS_DW10_GRP_A 0x162C28
|
||||
#define _PORT_PCS_DW10_GRP_B 0x6CC28
|
||||
#define _PORT_PCS_DW10_GRP_C 0x6CE28
|
||||
#define BXT_PORT_PCS_DW10_LN01(phy, ch) _MMIO_BXT_PHY_CH(phy, ch, \
|
||||
_PORT_PCS_DW10_LN01_B, \
|
||||
_PORT_PCS_DW10_LN01_C)
|
||||
#define BXT_PORT_PCS_DW10_GRP(phy, ch) _MMIO_BXT_PHY_CH(phy, ch, \
|
||||
_PORT_PCS_DW10_GRP_B, \
|
||||
_PORT_PCS_DW10_GRP_C)
|
||||
|
||||
#define TX2_SWING_CALC_INIT (1 << 31)
|
||||
#define TX1_SWING_CALC_INIT (1 << 30)
|
||||
|
||||
#define _PORT_PCS_DW12_LN01_A 0x162430
|
||||
#define _PORT_PCS_DW12_LN01_B 0x6C430
|
||||
#define _PORT_PCS_DW12_LN01_C 0x6C830
|
||||
#define _PORT_PCS_DW12_LN23_A 0x162630
|
||||
#define _PORT_PCS_DW12_LN23_B 0x6C630
|
||||
#define _PORT_PCS_DW12_LN23_C 0x6CA30
|
||||
#define _PORT_PCS_DW12_GRP_A 0x162c30
|
||||
#define _PORT_PCS_DW12_GRP_B 0x6CC30
|
||||
#define _PORT_PCS_DW12_GRP_C 0x6CE30
|
||||
#define LANESTAGGER_STRAP_OVRD (1 << 6)
|
||||
#define LANE_STAGGER_MASK 0x1F
|
||||
#define BXT_PORT_PCS_DW12_LN01(phy, ch) _MMIO_BXT_PHY_CH(phy, ch, \
|
||||
_PORT_PCS_DW12_LN01_B, \
|
||||
_PORT_PCS_DW12_LN01_C)
|
||||
#define BXT_PORT_PCS_DW12_LN23(phy, ch) _MMIO_BXT_PHY_CH(phy, ch, \
|
||||
_PORT_PCS_DW12_LN23_B, \
|
||||
_PORT_PCS_DW12_LN23_C)
|
||||
#define BXT_PORT_PCS_DW12_GRP(phy, ch) _MMIO_BXT_PHY_CH(phy, ch, \
|
||||
_PORT_PCS_DW12_GRP_B, \
|
||||
_PORT_PCS_DW12_GRP_C)
|
||||
|
||||
/* BXT PHY TX registers */
|
||||
#define _BXT_LANE_OFFSET(lane) (((lane) >> 1) * 0x200 + \
|
||||
((lane) & 1) * 0x80)
|
||||
|
||||
#define _PORT_TX_DW2_LN0_A 0x162508
|
||||
#define _PORT_TX_DW2_LN0_B 0x6C508
|
||||
#define _PORT_TX_DW2_LN0_C 0x6C908
|
||||
#define _PORT_TX_DW2_GRP_A 0x162D08
|
||||
#define _PORT_TX_DW2_GRP_B 0x6CD08
|
||||
#define _PORT_TX_DW2_GRP_C 0x6CF08
|
||||
#define BXT_PORT_TX_DW2_LN0(phy, ch) _MMIO_BXT_PHY_CH(phy, ch, \
|
||||
_PORT_TX_DW2_LN0_B, \
|
||||
_PORT_TX_DW2_LN0_C)
|
||||
#define BXT_PORT_TX_DW2_GRP(phy, ch) _MMIO_BXT_PHY_CH(phy, ch, \
|
||||
_PORT_TX_DW2_GRP_B, \
|
||||
_PORT_TX_DW2_GRP_C)
|
||||
#define MARGIN_000_SHIFT 16
|
||||
#define MARGIN_000 (0xFF << MARGIN_000_SHIFT)
|
||||
#define UNIQ_TRANS_SCALE_SHIFT 8
|
||||
#define UNIQ_TRANS_SCALE (0xFF << UNIQ_TRANS_SCALE_SHIFT)
|
||||
|
||||
#define _PORT_TX_DW3_LN0_A 0x16250C
|
||||
#define _PORT_TX_DW3_LN0_B 0x6C50C
|
||||
#define _PORT_TX_DW3_LN0_C 0x6C90C
|
||||
#define _PORT_TX_DW3_GRP_A 0x162D0C
|
||||
#define _PORT_TX_DW3_GRP_B 0x6CD0C
|
||||
#define _PORT_TX_DW3_GRP_C 0x6CF0C
|
||||
#define BXT_PORT_TX_DW3_LN0(phy, ch) _MMIO_BXT_PHY_CH(phy, ch, \
|
||||
_PORT_TX_DW3_LN0_B, \
|
||||
_PORT_TX_DW3_LN0_C)
|
||||
#define BXT_PORT_TX_DW3_GRP(phy, ch) _MMIO_BXT_PHY_CH(phy, ch, \
|
||||
_PORT_TX_DW3_GRP_B, \
|
||||
_PORT_TX_DW3_GRP_C)
|
||||
#define SCALE_DCOMP_METHOD (1 << 26)
|
||||
#define UNIQUE_TRANGE_EN_METHOD (1 << 27)
|
||||
|
||||
#define _PORT_TX_DW4_LN0_A 0x162510
|
||||
#define _PORT_TX_DW4_LN0_B 0x6C510
|
||||
#define _PORT_TX_DW4_LN0_C 0x6C910
|
||||
#define _PORT_TX_DW4_GRP_A 0x162D10
|
||||
#define _PORT_TX_DW4_GRP_B 0x6CD10
|
||||
#define _PORT_TX_DW4_GRP_C 0x6CF10
|
||||
#define BXT_PORT_TX_DW4_LN0(phy, ch) _MMIO_BXT_PHY_CH(phy, ch, \
|
||||
_PORT_TX_DW4_LN0_B, \
|
||||
_PORT_TX_DW4_LN0_C)
|
||||
#define BXT_PORT_TX_DW4_GRP(phy, ch) _MMIO_BXT_PHY_CH(phy, ch, \
|
||||
_PORT_TX_DW4_GRP_B, \
|
||||
_PORT_TX_DW4_GRP_C)
|
||||
#define DEEMPH_SHIFT 24
|
||||
#define DE_EMPHASIS (0xFF << DEEMPH_SHIFT)
|
||||
|
||||
#define _PORT_TX_DW5_LN0_A 0x162514
|
||||
#define _PORT_TX_DW5_LN0_B 0x6C514
|
||||
#define _PORT_TX_DW5_LN0_C 0x6C914
|
||||
#define _PORT_TX_DW5_GRP_A 0x162D14
|
||||
#define _PORT_TX_DW5_GRP_B 0x6CD14
|
||||
#define _PORT_TX_DW5_GRP_C 0x6CF14
|
||||
#define BXT_PORT_TX_DW5_LN0(phy, ch) _MMIO_BXT_PHY_CH(phy, ch, \
|
||||
_PORT_TX_DW5_LN0_B, \
|
||||
_PORT_TX_DW5_LN0_C)
|
||||
#define BXT_PORT_TX_DW5_GRP(phy, ch) _MMIO_BXT_PHY_CH(phy, ch, \
|
||||
_PORT_TX_DW5_GRP_B, \
|
||||
_PORT_TX_DW5_GRP_C)
|
||||
#define DCC_DELAY_RANGE_1 (1 << 9)
|
||||
#define DCC_DELAY_RANGE_2 (1 << 8)
|
||||
|
||||
#define _PORT_TX_DW14_LN0_A 0x162538
|
||||
#define _PORT_TX_DW14_LN0_B 0x6C538
|
||||
#define _PORT_TX_DW14_LN0_C 0x6C938
|
||||
#define LATENCY_OPTIM_SHIFT 30
|
||||
#define LATENCY_OPTIM (1 << LATENCY_OPTIM_SHIFT)
|
||||
#define BXT_PORT_TX_DW14_LN(phy, ch, lane) \
|
||||
_MMIO(_BXT_PHY_CH(phy, ch, _PORT_TX_DW14_LN0_B, \
|
||||
_PORT_TX_DW14_LN0_C) + \
|
||||
_BXT_LANE_OFFSET(lane))
|
||||
|
||||
/* UAIMI scratch pad register 1 */
|
||||
#define UAIMI_SPR1 _MMIO(0x4F074)
|
||||
/* SKL VccIO mask */
|
||||
|
@ -3,6 +3,7 @@
|
||||
* Copyright © 2020 Intel Corporation
|
||||
*/
|
||||
|
||||
#include "display/bxt_dpio_phy_regs.h"
|
||||
#include "display/intel_audio_regs.h"
|
||||
#include "display/intel_backlight_regs.h"
|
||||
#include "display/intel_color_regs.h"
|
||||
@ -1155,11 +1156,11 @@ static int iterate_bxt_mmio(struct intel_gvt_mmio_table_iter *iter)
|
||||
MMIO_D(BXT_PORT_PCS_DW12_LN01(DPIO_PHY0, DPIO_CH0));
|
||||
MMIO_D(BXT_PORT_PCS_DW12_LN23(DPIO_PHY0, DPIO_CH0));
|
||||
MMIO_D(BXT_PORT_PCS_DW12_GRP(DPIO_PHY0, DPIO_CH0));
|
||||
MMIO_D(BXT_PORT_TX_DW2_LN0(DPIO_PHY0, DPIO_CH0));
|
||||
MMIO_D(BXT_PORT_TX_DW2_LN(DPIO_PHY0, DPIO_CH0, 0));
|
||||
MMIO_D(BXT_PORT_TX_DW2_GRP(DPIO_PHY0, DPIO_CH0));
|
||||
MMIO_D(BXT_PORT_TX_DW3_LN0(DPIO_PHY0, DPIO_CH0));
|
||||
MMIO_D(BXT_PORT_TX_DW3_LN(DPIO_PHY0, DPIO_CH0, 0));
|
||||
MMIO_D(BXT_PORT_TX_DW3_GRP(DPIO_PHY0, DPIO_CH0));
|
||||
MMIO_D(BXT_PORT_TX_DW4_LN0(DPIO_PHY0, DPIO_CH0));
|
||||
MMIO_D(BXT_PORT_TX_DW4_LN(DPIO_PHY0, DPIO_CH0, 0));
|
||||
MMIO_D(BXT_PORT_TX_DW4_GRP(DPIO_PHY0, DPIO_CH0));
|
||||
MMIO_D(BXT_PORT_TX_DW14_LN(DPIO_PHY0, DPIO_CH0, 0));
|
||||
MMIO_D(BXT_PORT_TX_DW14_LN(DPIO_PHY0, DPIO_CH0, 1));
|
||||
@ -1180,11 +1181,11 @@ static int iterate_bxt_mmio(struct intel_gvt_mmio_table_iter *iter)
|
||||
MMIO_D(BXT_PORT_PCS_DW12_LN01(DPIO_PHY0, DPIO_CH1));
|
||||
MMIO_D(BXT_PORT_PCS_DW12_LN23(DPIO_PHY0, DPIO_CH1));
|
||||
MMIO_D(BXT_PORT_PCS_DW12_GRP(DPIO_PHY0, DPIO_CH1));
|
||||
MMIO_D(BXT_PORT_TX_DW2_LN0(DPIO_PHY0, DPIO_CH1));
|
||||
MMIO_D(BXT_PORT_TX_DW2_LN(DPIO_PHY0, DPIO_CH1, 0));
|
||||
MMIO_D(BXT_PORT_TX_DW2_GRP(DPIO_PHY0, DPIO_CH1));
|
||||
MMIO_D(BXT_PORT_TX_DW3_LN0(DPIO_PHY0, DPIO_CH1));
|
||||
MMIO_D(BXT_PORT_TX_DW3_LN(DPIO_PHY0, DPIO_CH1, 0));
|
||||
MMIO_D(BXT_PORT_TX_DW3_GRP(DPIO_PHY0, DPIO_CH1));
|
||||
MMIO_D(BXT_PORT_TX_DW4_LN0(DPIO_PHY0, DPIO_CH1));
|
||||
MMIO_D(BXT_PORT_TX_DW4_LN(DPIO_PHY0, DPIO_CH1, 0));
|
||||
MMIO_D(BXT_PORT_TX_DW4_GRP(DPIO_PHY0, DPIO_CH1));
|
||||
MMIO_D(BXT_PORT_TX_DW14_LN(DPIO_PHY0, DPIO_CH1, 0));
|
||||
MMIO_D(BXT_PORT_TX_DW14_LN(DPIO_PHY0, DPIO_CH1, 1));
|
||||
@ -1205,11 +1206,11 @@ static int iterate_bxt_mmio(struct intel_gvt_mmio_table_iter *iter)
|
||||
MMIO_D(BXT_PORT_PCS_DW12_LN01(DPIO_PHY1, DPIO_CH0));
|
||||
MMIO_D(BXT_PORT_PCS_DW12_LN23(DPIO_PHY1, DPIO_CH0));
|
||||
MMIO_D(BXT_PORT_PCS_DW12_GRP(DPIO_PHY1, DPIO_CH0));
|
||||
MMIO_D(BXT_PORT_TX_DW2_LN0(DPIO_PHY1, DPIO_CH0));
|
||||
MMIO_D(BXT_PORT_TX_DW2_LN(DPIO_PHY1, DPIO_CH0, 0));
|
||||
MMIO_D(BXT_PORT_TX_DW2_GRP(DPIO_PHY1, DPIO_CH0));
|
||||
MMIO_D(BXT_PORT_TX_DW3_LN0(DPIO_PHY1, DPIO_CH0));
|
||||
MMIO_D(BXT_PORT_TX_DW3_LN(DPIO_PHY1, DPIO_CH0, 0));
|
||||
MMIO_D(BXT_PORT_TX_DW3_GRP(DPIO_PHY1, DPIO_CH0));
|
||||
MMIO_D(BXT_PORT_TX_DW4_LN0(DPIO_PHY1, DPIO_CH0));
|
||||
MMIO_D(BXT_PORT_TX_DW4_LN(DPIO_PHY1, DPIO_CH0, 0));
|
||||
MMIO_D(BXT_PORT_TX_DW4_GRP(DPIO_PHY1, DPIO_CH0));
|
||||
MMIO_D(BXT_PORT_TX_DW14_LN(DPIO_PHY1, DPIO_CH0, 0));
|
||||
MMIO_D(BXT_PORT_TX_DW14_LN(DPIO_PHY1, DPIO_CH0, 1));
|
||||
|
@ -681,6 +681,8 @@ void intel_dram_detect(struct drm_i915_private *i915)
|
||||
if (ret)
|
||||
return;
|
||||
|
||||
drm_dbg_kms(&i915->drm, "Num qgv points %u\n", dram_info->num_qgv_points);
|
||||
|
||||
drm_dbg_kms(&i915->drm, "DRAM channels: %u\n", dram_info->num_channels);
|
||||
|
||||
drm_dbg_kms(&i915->drm, "Watermark level 0 adjustment needed: %s\n",
|
||||
|
@ -516,9 +516,6 @@ struct xe_device {
|
||||
unsigned int czclk_freq;
|
||||
unsigned int fsb_freq, mem_freq, is_ddr3;
|
||||
};
|
||||
struct {
|
||||
const char *dmc_firmware_path;
|
||||
} params;
|
||||
|
||||
void *pxp;
|
||||
#endif
|
||||
|
@ -251,6 +251,12 @@ drm_dp_channel_coding_supported(const u8 dpcd[DP_RECEIVER_CAP_SIZE])
|
||||
return dpcd[DP_MAIN_LINK_CHANNEL_CODING] & DP_CAP_ANSI_8B10B;
|
||||
}
|
||||
|
||||
static inline bool
|
||||
drm_dp_128b132b_supported(const u8 dpcd[DP_RECEIVER_CAP_SIZE])
|
||||
{
|
||||
return dpcd[DP_MAIN_LINK_CHANNEL_CODING] & DP_CAP_ANSI_128B132B;
|
||||
}
|
||||
|
||||
static inline bool
|
||||
drm_dp_alternate_scrambler_reset_cap(const u8 dpcd[DP_RECEIVER_CAP_SIZE])
|
||||
{
|
||||
|
@ -948,6 +948,13 @@ int __must_check drm_dp_mst_root_conn_atomic_check(struct drm_connector_state *n
|
||||
void drm_dp_mst_get_port_malloc(struct drm_dp_mst_port *port);
|
||||
void drm_dp_mst_put_port_malloc(struct drm_dp_mst_port *port);
|
||||
|
||||
static inline
|
||||
bool drm_dp_mst_port_is_logical(struct drm_dp_mst_port *port)
|
||||
{
|
||||
return port->port_num >= DP_MST_LOGICAL_PORT_0;
|
||||
}
|
||||
|
||||
struct drm_dp_aux *drm_dp_mst_aux_for_parent(struct drm_dp_mst_port *port);
|
||||
struct drm_dp_aux *drm_dp_mst_dsc_aux_for_port(struct drm_dp_mst_port *port);
|
||||
|
||||
static inline struct drm_dp_mst_topology_state *
|
||||
|
@ -40,9 +40,6 @@
|
||||
#define DSC_PPS_RC_RANGE_MINQP_SHIFT 11
|
||||
#define DSC_PPS_RC_RANGE_MAXQP_SHIFT 6
|
||||
#define DSC_PPS_NATIVE_420_SHIFT 1
|
||||
#define DSC_1_2_MAX_LINEBUF_DEPTH_BITS 16
|
||||
#define DSC_1_2_MAX_LINEBUF_DEPTH_VAL 0
|
||||
#define DSC_1_1_MAX_LINEBUF_DEPTH_BITS 13
|
||||
|
||||
/**
|
||||
* struct drm_dsc_rc_range_parameters - DSC Rate Control range parameters
|
||||
|
@ -24,7 +24,7 @@
|
||||
#ifndef _I915_COMPONENT_H_
|
||||
#define _I915_COMPONENT_H_
|
||||
|
||||
#include "drm_audio_component.h"
|
||||
#include <drm/drm_audio_component.h>
|
||||
|
||||
enum i915_component_type {
|
||||
I915_COMPONENT_AUDIO = 1,
|
||||
|
Loading…
x
Reference in New Issue
Block a user