[Intel-gfx] [PATCH v2 02/13] drm/i915/tgl: Finish modular FIA support on registers
Lucas De Marchi
lucas.de.marchi at gmail.com
Thu Sep 19 01:25:34 UTC 2019
On Wed, Sep 18, 2019 at 5:07 PM José Roberto de Souza
<jose.souza at intel.com> wrote:
>
> If platform supports and has modular FIA is enabled, the registers
> bits also change, example: reading TC3 registers with modular FIA
> enabled, driver should read from FIA2 but with TC1 bits offsets.
>
> It is described in BSpec 50231 for DFLEXDPSP, other registers don't
> have the BSpec description but testing in real hardware have proven
> that it had moved for all other registers too.
>
> v2:
> - Caching index in tc_phy_fia_idx, instead of calculate it each time
>
> Cc: Lucas De Marchi <lucas.demarchi at intel.com>
> Signed-off-by: José Roberto de Souza <jose.souza at intel.com>
> ---
> .../drm/i915/display/intel_display_types.h | 1 +
> drivers/gpu/drm/i915/display/intel_tc.c | 46 +++++++++++--------
> drivers/gpu/drm/i915/display/intel_tc.h | 1 +
> drivers/gpu/drm/i915/i915_reg.h | 28 +++++------
> 4 files changed, 43 insertions(+), 33 deletions(-)
>
> diff --git a/drivers/gpu/drm/i915/display/intel_display_types.h b/drivers/gpu/drm/i915/display/intel_display_types.h
> index d5cc4b810d9e..d258a48f77d3 100644
> --- a/drivers/gpu/drm/i915/display/intel_display_types.h
> +++ b/drivers/gpu/drm/i915/display/intel_display_types.h
> @@ -1285,6 +1285,7 @@ struct intel_digital_port {
> char tc_port_name[8];
> enum tc_port_mode tc_mode;
> enum phy_fia tc_phy_fia;
> + u8 tc_phy_fia_idx;
>
> void (*write_infoframe)(struct intel_encoder *encoder,
> const struct intel_crtc_state *crtc_state,
> diff --git a/drivers/gpu/drm/i915/display/intel_tc.c b/drivers/gpu/drm/i915/display/intel_tc.c
> index 85743a43bee2..20fbb084830e 100644
> --- a/drivers/gpu/drm/i915/display/intel_tc.c
> +++ b/drivers/gpu/drm/i915/display/intel_tc.c
> @@ -45,10 +45,19 @@ static enum phy_fia tc_port_to_fia(struct drm_i915_private *i915,
> return tc_port / 2;
> }
>
> +static u8
> +tc_port_to_fia_idx(struct drm_i915_private *i915, enum tc_port tc_port)
> +{
> + if (!has_modular_fia(i915))
> + return tc_port;
> +
> + /* See tc_port_to_fia() comment */
> + return tc_port % 2;
> +}
> +
> u32 intel_tc_port_get_lane_mask(struct intel_digital_port *dig_port)
> {
> struct drm_i915_private *i915 = to_i915(dig_port->base.base.dev);
> - enum tc_port tc_port = intel_port_to_tc(i915, dig_port->base.port);
> struct intel_uncore *uncore = &i915->uncore;
> u32 lane_mask;
>
> @@ -57,8 +66,8 @@ u32 intel_tc_port_get_lane_mask(struct intel_digital_port *dig_port)
>
> WARN_ON(lane_mask == 0xffffffff);
>
> - return (lane_mask & DP_LANE_ASSIGNMENT_MASK(tc_port)) >>
> - DP_LANE_ASSIGNMENT_SHIFT(tc_port);
> + return (lane_mask & DP_LANE_ASSIGNMENT_MASK(dig_port->tc_phy_fia_idx)) >>
> + DP_LANE_ASSIGNMENT_SHIFT(dig_port->tc_phy_fia_idx);
> }
>
> int intel_tc_port_fia_max_lane_count(struct intel_digital_port *dig_port)
> @@ -95,7 +104,6 @@ void intel_tc_port_set_fia_lane_count(struct intel_digital_port *dig_port,
> int required_lanes)
> {
> struct drm_i915_private *i915 = to_i915(dig_port->base.base.dev);
> - enum tc_port tc_port = intel_port_to_tc(i915, dig_port->base.port);
> bool lane_reversal = dig_port->saved_port_bits & DDI_BUF_PORT_REVERSAL;
> struct intel_uncore *uncore = &i915->uncore;
> u32 val;
> @@ -104,19 +112,21 @@ void intel_tc_port_set_fia_lane_count(struct intel_digital_port *dig_port,
>
> val = intel_uncore_read(uncore,
> PORT_TX_DFLEXDPMLE1(dig_port->tc_phy_fia));
> - val &= ~DFLEXDPMLE1_DPMLETC_MASK(tc_port);
> + val &= ~DFLEXDPMLE1_DPMLETC_MASK(dig_port->tc_phy_fia_idx);
>
> switch (required_lanes) {
> case 1:
> - val |= lane_reversal ? DFLEXDPMLE1_DPMLETC_ML3(tc_port) :
> - DFLEXDPMLE1_DPMLETC_ML0(tc_port);
> + val |= lane_reversal ?
> + DFLEXDPMLE1_DPMLETC_ML3(dig_port->tc_phy_fia_idx) :
> + DFLEXDPMLE1_DPMLETC_ML0(dig_port->tc_phy_fia_idx);
> break;
> case 2:
> - val |= lane_reversal ? DFLEXDPMLE1_DPMLETC_ML3_2(tc_port) :
> - DFLEXDPMLE1_DPMLETC_ML1_0(tc_port);
> + val |= lane_reversal ?
> + DFLEXDPMLE1_DPMLETC_ML3_2(dig_port->tc_phy_fia_idx) :
> + DFLEXDPMLE1_DPMLETC_ML1_0(dig_port->tc_phy_fia_idx);
> break;
> case 4:
> - val |= DFLEXDPMLE1_DPMLETC_ML3_0(tc_port);
> + val |= DFLEXDPMLE1_DPMLETC_ML3_0(dig_port->tc_phy_fia_idx);
> break;
> default:
> MISSING_CASE(required_lanes);
> @@ -164,9 +174,9 @@ static u32 tc_port_live_status_mask(struct intel_digital_port *dig_port)
> return mask;
> }
>
> - if (val & TC_LIVE_STATE_TBT(tc_port))
> + if (val & TC_LIVE_STATE_TBT(dig_port->tc_phy_fia_idx))
> mask |= BIT(TC_PORT_TBT_ALT);
> - if (val & TC_LIVE_STATE_TC(tc_port))
> + if (val & TC_LIVE_STATE_TC(dig_port->tc_phy_fia_idx))
> mask |= BIT(TC_PORT_DP_ALT);
>
> if (intel_uncore_read(uncore, SDEISR) & SDE_TC_HOTPLUG_ICP(tc_port))
> @@ -182,7 +192,6 @@ static u32 tc_port_live_status_mask(struct intel_digital_port *dig_port)
> static bool icl_tc_phy_status_complete(struct intel_digital_port *dig_port)
> {
> struct drm_i915_private *i915 = to_i915(dig_port->base.base.dev);
> - enum tc_port tc_port = intel_port_to_tc(i915, dig_port->base.port);
> struct intel_uncore *uncore = &i915->uncore;
> u32 val;
>
> @@ -194,14 +203,13 @@ static bool icl_tc_phy_status_complete(struct intel_digital_port *dig_port)
> return false;
> }
>
> - return val & DP_PHY_MODE_STATUS_COMPLETED(tc_port);
> + return val & DP_PHY_MODE_STATUS_COMPLETED(dig_port->tc_phy_fia_idx);
> }
>
> static bool icl_tc_phy_set_safe_mode(struct intel_digital_port *dig_port,
> bool enable)
> {
> struct drm_i915_private *i915 = to_i915(dig_port->base.base.dev);
> - enum tc_port tc_port = intel_port_to_tc(i915, dig_port->base.port);
> struct intel_uncore *uncore = &i915->uncore;
> u32 val;
>
> @@ -215,9 +223,9 @@ static bool icl_tc_phy_set_safe_mode(struct intel_digital_port *dig_port,
> return false;
> }
>
> - val &= ~DP_PHY_MODE_STATUS_NOT_SAFE(tc_port);
> + val &= ~DP_PHY_MODE_STATUS_NOT_SAFE(dig_port->tc_phy_fia_idx);
> if (!enable)
> - val |= DP_PHY_MODE_STATUS_NOT_SAFE(tc_port);
> + val |= DP_PHY_MODE_STATUS_NOT_SAFE(dig_port->tc_phy_fia_idx);
>
> intel_uncore_write(uncore,
> PORT_TX_DFLEXDPCSSS(dig_port->tc_phy_fia), val);
> @@ -232,7 +240,6 @@ static bool icl_tc_phy_set_safe_mode(struct intel_digital_port *dig_port,
> static bool icl_tc_phy_is_in_safe_mode(struct intel_digital_port *dig_port)
> {
> struct drm_i915_private *i915 = to_i915(dig_port->base.base.dev);
> - enum tc_port tc_port = intel_port_to_tc(i915, dig_port->base.port);
> struct intel_uncore *uncore = &i915->uncore;
> u32 val;
>
> @@ -244,7 +251,7 @@ static bool icl_tc_phy_is_in_safe_mode(struct intel_digital_port *dig_port)
> return true;
> }
>
> - return !(val & DP_PHY_MODE_STATUS_NOT_SAFE(tc_port));
> + return !(val & DP_PHY_MODE_STATUS_NOT_SAFE(dig_port->tc_phy_fia_idx));
> }
>
> /*
> @@ -541,4 +548,5 @@ void intel_tc_port_init(struct intel_digital_port *dig_port, bool is_legacy)
> dig_port->tc_legacy_port = is_legacy;
> dig_port->tc_link_refcount = 0;
> dig_port->tc_phy_fia = tc_port_to_fia(i915, tc_port);
> + dig_port->tc_phy_fia_idx = tc_port_to_fia_idx(i915, tc_port);
I think we could actually embed here tc_port_to_fia() and
tc_port_to_fia_idx() under a single has_modular_fia().
> }
> diff --git a/drivers/gpu/drm/i915/display/intel_tc.h b/drivers/gpu/drm/i915/display/intel_tc.h
> index 783d75531435..944d84c8cce1 100644
> --- a/drivers/gpu/drm/i915/display/intel_tc.h
> +++ b/drivers/gpu/drm/i915/display/intel_tc.h
> @@ -10,6 +10,7 @@
> #include <linux/types.h>
>
> struct intel_digital_port;
> +struct drm_i915_private;
not needed anymore.
With that, Reviewed-by: Lucas De Marchi <lucas.demarchi at intel.com>
Lucas De Marchi
>
> bool intel_tc_port_connected(struct intel_digital_port *dig_port);
> u32 intel_tc_port_get_lane_mask(struct intel_digital_port *dig_port);
> diff --git a/drivers/gpu/drm/i915/i915_reg.h b/drivers/gpu/drm/i915/i915_reg.h
> index bf37ecebc82f..ee5626579263 100644
> --- a/drivers/gpu/drm/i915/i915_reg.h
> +++ b/drivers/gpu/drm/i915/i915_reg.h
> @@ -2166,13 +2166,13 @@ static inline bool i915_mmio_reg_valid(i915_reg_t reg)
> #define _MMIO_FIA(fia, off) _MMIO(_FIA(fia) + (off))
>
> /* ICL PHY DFLEX registers */
> -#define PORT_TX_DFLEXDPMLE1(fia) _MMIO_FIA((fia), 0x008C0)
> -#define DFLEXDPMLE1_DPMLETC_MASK(tc_port) (0xf << (4 * (tc_port)))
> -#define DFLEXDPMLE1_DPMLETC_ML0(tc_port) (1 << (4 * (tc_port)))
> -#define DFLEXDPMLE1_DPMLETC_ML1_0(tc_port) (3 << (4 * (tc_port)))
> -#define DFLEXDPMLE1_DPMLETC_ML3(tc_port) (8 << (4 * (tc_port)))
> -#define DFLEXDPMLE1_DPMLETC_ML3_2(tc_port) (12 << (4 * (tc_port)))
> -#define DFLEXDPMLE1_DPMLETC_ML3_0(tc_port) (15 << (4 * (tc_port)))
> +#define PORT_TX_DFLEXDPMLE1(fia) _MMIO_FIA((fia), 0x008C0)
> +#define DFLEXDPMLE1_DPMLETC_MASK(idx) (0xf << (4 * (idx)))
> +#define DFLEXDPMLE1_DPMLETC_ML0(idx) (1 << (4 * (idx)))
> +#define DFLEXDPMLE1_DPMLETC_ML1_0(idx) (3 << (4 * (idx)))
> +#define DFLEXDPMLE1_DPMLETC_ML3(idx) (8 << (4 * (idx)))
> +#define DFLEXDPMLE1_DPMLETC_ML3_2(idx) (12 << (4 * (idx)))
> +#define DFLEXDPMLE1_DPMLETC_ML3_0(idx) (15 << (4 * (idx)))
>
> /* BXT PHY Ref registers */
> #define _PORT_REF_DW3_A 0x16218C
> @@ -11671,16 +11671,16 @@ enum skl_power_gate {
>
> #define PORT_TX_DFLEXDPSP(fia) _MMIO_FIA((fia), 0x008A0)
> #define MODULAR_FIA_MASK (1 << 4)
> -#define TC_LIVE_STATE_TBT(tc_port) (1 << ((tc_port) * 8 + 6))
> -#define TC_LIVE_STATE_TC(tc_port) (1 << ((tc_port) * 8 + 5))
> -#define DP_LANE_ASSIGNMENT_SHIFT(tc_port) ((tc_port) * 8)
> -#define DP_LANE_ASSIGNMENT_MASK(tc_port) (0xf << ((tc_port) * 8))
> -#define DP_LANE_ASSIGNMENT(tc_port, x) ((x) << ((tc_port) * 8))
> +#define TC_LIVE_STATE_TBT(idx) (1 << ((idx) * 8 + 6))
> +#define TC_LIVE_STATE_TC(idx) (1 << ((idx) * 8 + 5))
> +#define DP_LANE_ASSIGNMENT_SHIFT(idx) ((idx) * 8)
> +#define DP_LANE_ASSIGNMENT_MASK(idx) (0xf << ((idx) * 8))
> +#define DP_LANE_ASSIGNMENT(idx, x) ((x) << ((idx) * 8))
>
> #define PORT_TX_DFLEXDPPMS(fia) _MMIO_FIA((fia), 0x00890)
> -#define DP_PHY_MODE_STATUS_COMPLETED(tc_port) (1 << (tc_port))
> +#define DP_PHY_MODE_STATUS_COMPLETED(idx) (1 << (idx))
>
> #define PORT_TX_DFLEXDPCSSS(fia) _MMIO_FIA((fia), 0x00894)
> -#define DP_PHY_MODE_STATUS_NOT_SAFE(tc_port) (1 << (tc_port))
> +#define DP_PHY_MODE_STATUS_NOT_SAFE(idx) (1 << (idx))
>
> #endif /* _I915_REG_H_ */
> --
> 2.23.0
>
> _______________________________________________
> Intel-gfx mailing list
> Intel-gfx at lists.freedesktop.org
> https://lists.freedesktop.org/mailman/listinfo/intel-gfx
--
Lucas De Marchi
More information about the Intel-gfx
mailing list