[Intel-gfx] [PATCH 7/8] drm/i915/icl: Introduce new macros to get combophy registers
Rodrigo Vivi
rodrigo.vivi at intel.com
Fri Oct 12 22:25:37 UTC 2018
On Wed, Oct 03, 2018 at 12:52:02PM +0530, Mahesh Kumar wrote:
> From: Lucas De Marchi <lucas.demarchi at intel.com>
>
> combo-phy register instances are at same offset from base for each
> combo-phy port, i.e.
>
> Port A base offset: 0x16200
> Port B base offset: 0x6C000
>
> All the other addresses for both ports can be derived by calculating
> offset to these base addresses.
>
> PORT_CL_DW_OFFSET 0x0
> PORT_CL_DW<x> 0 + x * 4
>
> PORT_COMP_OFFSET 0x100
> PORT_COMP_DW<x> 0x100 + x * 4
>
> PORT_PCS_AUX_OFFSET 0x300
> PORT_PCS_GRP_OFFSET 0x600
> PORT_PCS_LN<y>_OFFSET 0x800 + y * 0x100
>
> PORT_TX_AUX_OFFSET 0x380
> PORT_TX_GRP_OFFSET 0x680
> PORT_TX_LN<y>_OFFSET 0x880 + y * 0x100
well, in the past I was in favor of trying to find
logic and simplify as much as possible the register offsets and bits.
However nowadays I'm more inclined to keep them explicit for some
reasons.
1. Another developer when adding some workaround later might
search the code for the reg offset, not finding and adding it again.
In this case the risk is minimal because it is only a risk of
duplicating the offset definition.
2. HW Architects when planing to remove some bits consult us
to see the impact and I always get myself searching for the offsets.
In this case the risk is higher because if we can't find the hidden
offset we might underestimate the impact on a future hw generation.
3. I'm checking to see if there are better ways to get
spec changes to notify us that we have to change something.
It would be harder to parse, but I know it is possible.
Well, maybe a tool for 3 could already answer the item above
in a automated and more reliable way... But while we don't have
such tool maybe it is better to keep explicit.
But I'm not blocking or anything like that. I'm just brainstorming
some points here from my view on this.
another detail below:
>
> And inside each PORT_TX_[AUX|GRP|LN] we add `dw * 4`.
>
> Based on original patch by Mahesh Kumar <mahesh1.kumar at intel.com>.
>
> Signed-off-by: Lucas De Marchi <lucas.demarchi at intel.com>
> Signed-off-by: Mahesh Kumar <mahesh1.kumar at intel.com>
> Cc: Rodrigo Vivi <rodrigo.vivi at intel.com>
> ---
> drivers/gpu/drm/i915/i915_reg.h | 154 ++++++++++++++--------------------------
> 1 file changed, 54 insertions(+), 100 deletions(-)
>
> diff --git a/drivers/gpu/drm/i915/i915_reg.h b/drivers/gpu/drm/i915/i915_reg.h
> index e3ac65f5aa81..eaf3e0d529d3 100644
> --- a/drivers/gpu/drm/i915/i915_reg.h
> +++ b/drivers/gpu/drm/i915/i915_reg.h
> @@ -1658,21 +1658,21 @@ enum i915_power_well_id {
> /*
> * CNL/ICL Port/COMBO-PHY Registers
> */
> +#define _ICL_COMBOPHY_A 0x162000
> +#define _ICL_COMBOPHY_B 0x6C000
> +#define _ICL_COMBOPHY(port) _PICK(port, _ICL_COMBOPHY_A, \
> + _ICL_COMBOPHY_B)
> +
> /* CNL/ICL Port CL_DW registers */
> -#define CNL_PORT_CL1CM_DW5 _MMIO(0x162014)
> +#define _ICL_PORT_CL_DW(port, dw) (_ICL_COMBOPHY(port) + \
> + 4 * (dw))
probably better if inverted DW(dw, port)
because reg definition is DW#dw_#port and I got
confused when reviewing items below...
>
> -#define _ICL_PORT_CL_DW5_A 0x162014
> -#define _ICL_PORT_CL_DW5_B 0x6C014
> -#define ICL_PORT_CL_DW5(port) _MMIO_PORT(port, _ICL_PORT_CL_DW5_A, \
> - _ICL_PORT_CL_DW5_B)
> +#define CNL_PORT_CL1CM_DW5 _MMIO(0x162014)
> +#define ICL_PORT_CL_DW5(port) _MMIO(_ICL_PORT_CL_DW(port, 5))
> #define CL_POWER_DOWN_ENABLE (1 << 4)
> #define SUS_CLOCK_CONFIG (3 << 0)
>
> -#define _CNL_PORT_CL_DW10_A 0x162028
> -#define _ICL_PORT_CL_DW10_B 0x6c028
> -#define ICL_PORT_CL_DW10(port) _MMIO_PORT(port, \
> - _CNL_PORT_CL_DW10_A, \
> - _ICL_PORT_CL_DW10_B)
> +#define ICL_PORT_CL_DW10(port) _MMIO(_ICL_PORT_CL_DW(port, 10))
> #define PG_SEQ_DELAY_OVERRIDE_MASK (3 << 25)
> #define PG_SEQ_DELAY_OVERRIDE_SHIFT 25
> #define PG_SEQ_DELAY_OVERRIDE_ENABLE (1 << 24)
> @@ -1688,31 +1688,23 @@ enum i915_power_well_id {
> #define PWR_DOWN_LN_MASK (0xf << 4)
> #define PWR_DOWN_LN_SHIFT 4
>
> -#define _ICL_PORT_CL_DW12_A 0x162030
> -#define _ICL_PORT_CL_DW12_B 0x6C030
> +#define ICL_PORT_CL_DW12(port) _MMIO(_ICL_PORT_CL_DW(port, 12))
> #define ICL_LANE_ENABLE_AUX (1 << 0)
> -#define ICL_PORT_CL_DW12(port) _MMIO_PORT((port), \
> - _ICL_PORT_CL_DW12_A, \
> - _ICL_PORT_CL_DW12_B)
>
> /* CNL/ICL Port COMP_DW registers */
> +#define _ICL_PORT_COMP 0x100
> +#define _ICL_PORT_COMP_DW(port, dw) (_ICL_COMBOPHY(port) + \
> + _ICL_PORT_COMP + 4 * (dw))
> +
> #define CNL_PORT_COMP_DW0 _MMIO(0x162100)
> -#define _ICL_PORT_COMP_DW0_A 0x162100
> -#define _ICL_PORT_COMP_DW0_B 0x6C100
> -#define ICL_PORT_COMP_DW0(port) _MMIO_PORT(port, _ICL_PORT_COMP_DW0_A, \
> - _ICL_PORT_COMP_DW0_B)
> +#define ICL_PORT_COMP_DW0(port) _MMIO(_ICL_PORT_COMP_DW(port, 0))
> #define COMP_INIT (1 << 31)
>
> #define CNL_PORT_COMP_DW1 _MMIO(0x162104)
> -#define _ICL_PORT_COMP_DW1_A 0x162104
> -#define _ICL_PORT_COMP_DW1_B 0x6C104
> -#define ICL_PORT_COMP_DW1(port) _MMIO_PORT(port, _ICL_PORT_COMP_DW1_A, \
> - _ICL_PORT_COMP_DW1_B)
> +#define ICL_PORT_COMP_DW1(port) _MMIO(_ICL_PORT_COMP_DW(port, 1))
> +
> #define CNL_PORT_COMP_DW3 _MMIO(0x16210c)
> -#define _ICL_PORT_COMP_DW3_A 0x16210C
> -#define _ICL_PORT_COMP_DW3_B 0x6C10C
> -#define ICL_PORT_COMP_DW3(port) _MMIO_PORT(port, _ICL_PORT_COMP_DW3_A, \
> - _ICL_PORT_COMP_DW3_B)
> +#define ICL_PORT_COMP_DW3(port) _MMIO(_ICL_PORT_COMP_DW(port, 3))
> #define PROCESS_INFO_DOT_0 (0 << 26)
> #define PROCESS_INFO_DOT_1 (1 << 26)
> #define PROCESS_INFO_DOT_4 (2 << 26)
> @@ -1725,17 +1717,10 @@ enum i915_power_well_id {
> #define VOLTAGE_INFO_SHIFT 24
>
> #define CNL_PORT_COMP_DW9 _MMIO(0x162124)
> -#define _ICL_PORT_COMP_DW9_A 0x162124
> -#define _ICL_PORT_COMP_DW9_B 0x6C124
> -#define ICL_PORT_COMP_DW9(port) _MMIO_PORT(port, _ICL_PORT_COMP_DW9_A, \
> - _ICL_PORT_COMP_DW9_B)
> +#define ICL_PORT_COMP_DW9(port) _MMIO(_ICL_PORT_COMP_DW((port), 9))
>
> #define CNL_PORT_COMP_DW10 _MMIO(0x162128)
> -#define _ICL_PORT_COMP_DW10_A 0x162128
> -#define _ICL_PORT_COMP_DW10_B 0x6C128
> -#define ICL_PORT_COMP_DW10(port) _MMIO_PORT(port, \
> - _ICL_PORT_COMP_DW10_A, \
> - _ICL_PORT_COMP_DW10_B)
> +#define ICL_PORT_COMP_DW10(port) _MMIO(_ICL_PORT_COMP_DW((port), 10))
>
> /* CNL/ICL Port PCS registers */
> #define _CNL_PORT_PCS_DW1_GRP_AE 0x162304
> @@ -1755,7 +1740,6 @@ enum i915_power_well_id {
> _CNL_PORT_PCS_DW1_GRP_D, \
> _CNL_PORT_PCS_DW1_GRP_AE, \
> _CNL_PORT_PCS_DW1_GRP_F))
> -
> #define CNL_PORT_PCS_DW1_LN0(port) _MMIO(_PICK(port, \
> _CNL_PORT_PCS_DW1_LN0_AE, \
> _CNL_PORT_PCS_DW1_LN0_B, \
> @@ -1764,21 +1748,18 @@ enum i915_power_well_id {
> _CNL_PORT_PCS_DW1_LN0_AE, \
> _CNL_PORT_PCS_DW1_LN0_F))
>
> -#define _ICL_PORT_PCS_DW1_GRP_A 0x162604
> -#define _ICL_PORT_PCS_DW1_GRP_B 0x6C604
> -#define _ICL_PORT_PCS_DW1_LN0_A 0x162804
> -#define _ICL_PORT_PCS_DW1_LN0_B 0x6C804
> -#define _ICL_PORT_PCS_DW1_AUX_A 0x162304
> -#define _ICL_PORT_PCS_DW1_AUX_B 0x6c304
> -#define ICL_PORT_PCS_DW1_GRP(port) _MMIO_PORT(port,\
> - _ICL_PORT_PCS_DW1_GRP_A, \
> - _ICL_PORT_PCS_DW1_GRP_B)
> -#define ICL_PORT_PCS_DW1_LN0(port) _MMIO_PORT(port, \
> - _ICL_PORT_PCS_DW1_LN0_A, \
> - _ICL_PORT_PCS_DW1_LN0_B)
> -#define ICL_PORT_PCS_DW1_AUX(port) _MMIO_PORT(port, \
> - _ICL_PORT_PCS_DW1_AUX_A, \
> - _ICL_PORT_PCS_DW1_AUX_B)
> +#define _ICL_PORT_PCS_AUX 0x300
> +#define _ICL_PORT_PCS_GRP 0x600
> +#define _ICL_PORT_PCS_LN(ln) (0x800 + (ln) * 0x100)
> +#define _ICL_PORT_PCS_DW_AUX(port, dw) (_ICL_COMBOPHY(port) + \
> + _ICL_PORT_PCS_AUX + 4 * (dw))
> +#define _ICL_PORT_PCS_DW_GRP(port, dw) (_ICL_COMBOPHY(port) + \
> + _ICL_PORT_PCS_GRP + 4 * (dw))
> +#define _ICL_PORT_PCS_DW_LN(port, dw, ln) (_ICL_COMBOPHY(port) + \
> + _ICL_PORT_PCS_LN(ln) + 4 * (dw))
> +#define ICL_PORT_PCS_DW1_AUX(port) _MMIO(_ICL_PORT_PCS_DW_AUX(port, 1))
> +#define ICL_PORT_PCS_DW1_GRP(port) _MMIO(_ICL_PORT_PCS_DW_GRP(port, 1))
> +#define ICL_PORT_PCS_DW1_LN0(port) _MMIO(_ICL_PORT_PCS_DW_LN(port, 1, 0))
> #define COMMON_KEEPER_EN (1 << 26)
>
> /* CNL/ICL Port TX registers */
> @@ -1809,23 +1790,22 @@ enum i915_power_well_id {
> _CNL_PORT_TX_F_LN0_OFFSET) + \
> 4 * (dw))
>
> +#define _ICL_PORT_TX_AUX 0x380
> +#define _ICL_PORT_TX_GRP 0x680
> +#define _ICL_PORT_TX_LN(ln) (0x880 + (ln) * 0x100)
> +
> +#define _ICL_PORT_TX_DW_AUX(port, dw) (_ICL_COMBOPHY(port) + \
> + _ICL_PORT_TX_AUX + 4 * (dw))
> +#define _ICL_PORT_TX_DW_GRP(port, dw) (_ICL_COMBOPHY(port) + \
> + _ICL_PORT_TX_GRP + 4 * (dw))
> +#define _ICL_PORT_TX_DW_LN(port, dw, ln) (_ICL_COMBOPHY(port) + \
> + _ICL_PORT_TX_LN(ln) + 4 * (dw))
> +
> #define CNL_PORT_TX_DW2_GRP(port) _MMIO(_CNL_PORT_TX_DW_GRP((port), 2))
> #define CNL_PORT_TX_DW2_LN0(port) _MMIO(_CNL_PORT_TX_DW_LN0((port), 2))
> -#define _ICL_PORT_TX_DW2_GRP_A 0x162688
> -#define _ICL_PORT_TX_DW2_GRP_B 0x6C688
> -#define _ICL_PORT_TX_DW2_LN0_A 0x162888
> -#define _ICL_PORT_TX_DW2_LN0_B 0x6C888
> -#define _ICL_PORT_TX_DW2_AUX_A 0x162388
> -#define _ICL_PORT_TX_DW2_AUX_B 0x6c388
> -#define ICL_PORT_TX_DW2_GRP(port) _MMIO_PORT(port, \
> - _ICL_PORT_TX_DW2_GRP_A, \
> - _ICL_PORT_TX_DW2_GRP_B)
> -#define ICL_PORT_TX_DW2_LN0(port) _MMIO_PORT(port, \
> - _ICL_PORT_TX_DW2_LN0_A, \
> - _ICL_PORT_TX_DW2_LN0_B)
> -#define ICL_PORT_TX_DW2_AUX(port) _MMIO_PORT(port, \
> - _ICL_PORT_TX_DW2_AUX_A, \
> - _ICL_PORT_TX_DW2_AUX_B)
> +#define ICL_PORT_TX_DW2_AUX(port) _MMIO(_ICL_PORT_TX_DW_AUX((port), 2))
> +#define ICL_PORT_TX_DW2_GRP(port) _MMIO(_ICL_PORT_TX_DW_GRP((port), 2))
> +#define ICL_PORT_TX_DW2_LN0(port) _MMIO(_ICL_PORT_TX_DW_LN((port), 2, 0))
> #define SWING_SEL_UPPER(x) (((x) >> 3) << 15)
> #define SWING_SEL_UPPER_MASK (1 << 15)
> #define SWING_SEL_LOWER(x) (((x) & 0x7) << 11)
> @@ -1842,24 +1822,10 @@ enum i915_power_well_id {
> #define CNL_PORT_TX_DW4_LN(port, ln) _MMIO(_CNL_PORT_TX_DW_LN0((port), 4) + \
> ((ln) * (_CNL_PORT_TX_DW4_LN1_AE - \
> _CNL_PORT_TX_DW4_LN0_AE)))
> -#define _ICL_PORT_TX_DW4_GRP_A 0x162690
> -#define _ICL_PORT_TX_DW4_GRP_B 0x6C690
> -#define _ICL_PORT_TX_DW4_LN0_A 0x162890
> -#define _ICL_PORT_TX_DW4_LN1_A 0x162990
> -#define _ICL_PORT_TX_DW4_LN0_B 0x6C890
> -#define _ICL_PORT_TX_DW4_AUX_A 0x162390
> -#define _ICL_PORT_TX_DW4_AUX_B 0x6c390
> -#define ICL_PORT_TX_DW4_GRP(port) _MMIO_PORT(port, \
> - _ICL_PORT_TX_DW4_GRP_A, \
> - _ICL_PORT_TX_DW4_GRP_B)
> -#define ICL_PORT_TX_DW4_LN(port, ln) _MMIO(_PORT(port, \
> - _ICL_PORT_TX_DW4_LN0_A, \
> - _ICL_PORT_TX_DW4_LN0_B) + \
> - ((ln) * (_ICL_PORT_TX_DW4_LN1_A - \
> - _ICL_PORT_TX_DW4_LN0_A)))
> -#define ICL_PORT_TX_DW4_AUX(port) _MMIO_PORT(port, \
> - _ICL_PORT_TX_DW4_AUX_A, \
> - _ICL_PORT_TX_DW4_AUX_B)
> +#define ICL_PORT_TX_DW4_AUX(port) _MMIO(_ICL_PORT_TX_DW_AUX((port), 4))
> +#define ICL_PORT_TX_DW4_GRP(port) _MMIO(_ICL_PORT_TX_DW_GRP((port), 4))
> +#define ICL_PORT_TX_DW4_LN0(port) _MMIO(_ICL_PORT_TX_DW_LN((port), 4, 0))
> +#define ICL_PORT_TX_DW4_LN(port, ln) _MMIO(_ICL_PORT_TX_DW_LN((port), 4, ln))
> #define LOADGEN_SELECT (1 << 31)
> #define POST_CURSOR_1(x) ((x) << 12)
> #define POST_CURSOR_1_MASK (0x3F << 12)
> @@ -1870,21 +1836,9 @@ enum i915_power_well_id {
>
> #define CNL_PORT_TX_DW5_GRP(port) _MMIO(_CNL_PORT_TX_DW_GRP((port), 5))
> #define CNL_PORT_TX_DW5_LN0(port) _MMIO(_CNL_PORT_TX_DW_LN0((port), 5))
> -#define _ICL_PORT_TX_DW5_GRP_A 0x162694
> -#define _ICL_PORT_TX_DW5_GRP_B 0x6C694
> -#define _ICL_PORT_TX_DW5_LN0_A 0x162894
> -#define _ICL_PORT_TX_DW5_LN0_B 0x6C894
> -#define _ICL_PORT_TX_DW5_AUX_A 0x162394
> -#define _ICL_PORT_TX_DW5_AUX_B 0x6c394
> -#define ICL_PORT_TX_DW5_GRP(port) _MMIO_PORT(port, \
> - _ICL_PORT_TX_DW5_GRP_A, \
> - _ICL_PORT_TX_DW5_GRP_B)
> -#define ICL_PORT_TX_DW5_LN0(port) _MMIO_PORT(port, \
> - _ICL_PORT_TX_DW5_LN0_A, \
> - _ICL_PORT_TX_DW5_LN0_B)
> -#define ICL_PORT_TX_DW5_AUX(port) _MMIO_PORT(port, \
> - _ICL_PORT_TX_DW5_AUX_A, \
> - _ICL_PORT_TX_DW5_AUX_B)
> +#define ICL_PORT_TX_DW5_AUX(port) _MMIO(_ICL_PORT_TX_DW_AUX((port), 5))
> +#define ICL_PORT_TX_DW5_GRP(port) _MMIO(_ICL_PORT_TX_DW_GRP((port), 5))
> +#define ICL_PORT_TX_DW5_LN0(port) _MMIO(_ICL_PORT_TX_DW_LN((port), 5, 0))
> #define TX_TRAINING_EN (1 << 31)
> #define TAP2_DISABLE (1 << 30)
> #define TAP3_DISABLE (1 << 29)
> --
> 2.16.2
>
> _______________________________________________
> Intel-gfx mailing list
> Intel-gfx at lists.freedesktop.org
> https://lists.freedesktop.org/mailman/listinfo/intel-gfx
More information about the Intel-gfx
mailing list