forked from Minki/linux
net: mscc: ocelot: add definitions for VCAP ES0 keys, actions and target
As a preparation step for the offloading to ES0, let's create the infrastructure for talking with this hardware block. Signed-off-by: Vladimir Oltean <vladimir.oltean@nxp.com> Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
parent
a61e365d7c
commit
e3aea296d8
@ -134,12 +134,13 @@
|
|||||||
<0x1280000 0x100>,
|
<0x1280000 0x100>,
|
||||||
<0x1800000 0x80000>,
|
<0x1800000 0x80000>,
|
||||||
<0x1880000 0x10000>,
|
<0x1880000 0x10000>,
|
||||||
|
<0x1040000 0x10000>,
|
||||||
<0x1050000 0x10000>,
|
<0x1050000 0x10000>,
|
||||||
<0x1060000 0x10000>;
|
<0x1060000 0x10000>;
|
||||||
reg-names = "sys", "rew", "qs", "ptp", "port0", "port1",
|
reg-names = "sys", "rew", "qs", "ptp", "port0", "port1",
|
||||||
"port2", "port3", "port4", "port5", "port6",
|
"port2", "port3", "port4", "port5", "port6",
|
||||||
"port7", "port8", "port9", "port10", "qsys",
|
"port7", "port8", "port9", "port10", "qsys",
|
||||||
"ana", "s1", "s2";
|
"ana", "s0", "s1", "s2";
|
||||||
interrupts = <18 21 22>;
|
interrupts = <18 21 22>;
|
||||||
interrupt-names = "ptp_rdy", "xtr", "inj";
|
interrupt-names = "ptp_rdy", "xtr", "inj";
|
||||||
|
|
||||||
|
@ -361,6 +361,7 @@ static const u32 *vsc9959_regmap[TARGET_MAX] = {
|
|||||||
[QSYS] = vsc9959_qsys_regmap,
|
[QSYS] = vsc9959_qsys_regmap,
|
||||||
[REW] = vsc9959_rew_regmap,
|
[REW] = vsc9959_rew_regmap,
|
||||||
[SYS] = vsc9959_sys_regmap,
|
[SYS] = vsc9959_sys_regmap,
|
||||||
|
[S0] = vsc9959_vcap_regmap,
|
||||||
[S1] = vsc9959_vcap_regmap,
|
[S1] = vsc9959_vcap_regmap,
|
||||||
[S2] = vsc9959_vcap_regmap,
|
[S2] = vsc9959_vcap_regmap,
|
||||||
[PTP] = vsc9959_ptp_regmap,
|
[PTP] = vsc9959_ptp_regmap,
|
||||||
@ -395,6 +396,11 @@ static const struct resource vsc9959_target_io_res[TARGET_MAX] = {
|
|||||||
.end = 0x001ffff,
|
.end = 0x001ffff,
|
||||||
.name = "sys",
|
.name = "sys",
|
||||||
},
|
},
|
||||||
|
[S0] = {
|
||||||
|
.start = 0x0040000,
|
||||||
|
.end = 0x00403ff,
|
||||||
|
.name = "s0",
|
||||||
|
},
|
||||||
[S1] = {
|
[S1] = {
|
||||||
.start = 0x0050000,
|
.start = 0x0050000,
|
||||||
.end = 0x00503ff,
|
.end = 0x00503ff,
|
||||||
@ -604,6 +610,38 @@ static const struct ocelot_stat_layout vsc9959_stats_layout[] = {
|
|||||||
{ .offset = 0x111, .name = "drop_green_prio_7", },
|
{ .offset = 0x111, .name = "drop_green_prio_7", },
|
||||||
};
|
};
|
||||||
|
|
||||||
|
static const struct vcap_field vsc9959_vcap_es0_keys[] = {
|
||||||
|
[VCAP_ES0_EGR_PORT] = { 0, 3},
|
||||||
|
[VCAP_ES0_IGR_PORT] = { 3, 3},
|
||||||
|
[VCAP_ES0_RSV] = { 6, 2},
|
||||||
|
[VCAP_ES0_L2_MC] = { 8, 1},
|
||||||
|
[VCAP_ES0_L2_BC] = { 9, 1},
|
||||||
|
[VCAP_ES0_VID] = { 10, 12},
|
||||||
|
[VCAP_ES0_DP] = { 22, 1},
|
||||||
|
[VCAP_ES0_PCP] = { 23, 3},
|
||||||
|
};
|
||||||
|
|
||||||
|
static const struct vcap_field vsc9959_vcap_es0_actions[] = {
|
||||||
|
[VCAP_ES0_ACT_PUSH_OUTER_TAG] = { 0, 2},
|
||||||
|
[VCAP_ES0_ACT_PUSH_INNER_TAG] = { 2, 1},
|
||||||
|
[VCAP_ES0_ACT_TAG_A_TPID_SEL] = { 3, 2},
|
||||||
|
[VCAP_ES0_ACT_TAG_A_VID_SEL] = { 5, 1},
|
||||||
|
[VCAP_ES0_ACT_TAG_A_PCP_SEL] = { 6, 2},
|
||||||
|
[VCAP_ES0_ACT_TAG_A_DEI_SEL] = { 8, 2},
|
||||||
|
[VCAP_ES0_ACT_TAG_B_TPID_SEL] = { 10, 2},
|
||||||
|
[VCAP_ES0_ACT_TAG_B_VID_SEL] = { 12, 1},
|
||||||
|
[VCAP_ES0_ACT_TAG_B_PCP_SEL] = { 13, 2},
|
||||||
|
[VCAP_ES0_ACT_TAG_B_DEI_SEL] = { 15, 2},
|
||||||
|
[VCAP_ES0_ACT_VID_A_VAL] = { 17, 12},
|
||||||
|
[VCAP_ES0_ACT_PCP_A_VAL] = { 29, 3},
|
||||||
|
[VCAP_ES0_ACT_DEI_A_VAL] = { 32, 1},
|
||||||
|
[VCAP_ES0_ACT_VID_B_VAL] = { 33, 12},
|
||||||
|
[VCAP_ES0_ACT_PCP_B_VAL] = { 45, 3},
|
||||||
|
[VCAP_ES0_ACT_DEI_B_VAL] = { 48, 1},
|
||||||
|
[VCAP_ES0_ACT_RSV] = { 49, 23},
|
||||||
|
[VCAP_ES0_ACT_HIT_STICKY] = { 72, 1},
|
||||||
|
};
|
||||||
|
|
||||||
static const struct vcap_field vsc9959_vcap_is1_keys[] = {
|
static const struct vcap_field vsc9959_vcap_is1_keys[] = {
|
||||||
[VCAP_IS1_HK_TYPE] = { 0, 1},
|
[VCAP_IS1_HK_TYPE] = { 0, 1},
|
||||||
[VCAP_IS1_HK_LOOKUP] = { 1, 2},
|
[VCAP_IS1_HK_LOOKUP] = { 1, 2},
|
||||||
@ -777,6 +815,18 @@ static struct vcap_field vsc9959_vcap_is2_actions[] = {
|
|||||||
};
|
};
|
||||||
|
|
||||||
static const struct vcap_props vsc9959_vcap_props[] = {
|
static const struct vcap_props vsc9959_vcap_props[] = {
|
||||||
|
[VCAP_ES0] = {
|
||||||
|
.action_type_width = 0,
|
||||||
|
.action_table = {
|
||||||
|
[ES0_ACTION_TYPE_NORMAL] = {
|
||||||
|
.width = 72, /* HIT_STICKY not included */
|
||||||
|
.count = 1,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
.target = S0,
|
||||||
|
.keys = vsc9959_vcap_es0_keys,
|
||||||
|
.actions = vsc9959_vcap_es0_actions,
|
||||||
|
},
|
||||||
[VCAP_IS1] = {
|
[VCAP_IS1] = {
|
||||||
.action_type_width = 0,
|
.action_type_width = 0,
|
||||||
.action_table = {
|
.action_table = {
|
||||||
|
@ -354,6 +354,7 @@ static const u32 *vsc9953_regmap[TARGET_MAX] = {
|
|||||||
[QSYS] = vsc9953_qsys_regmap,
|
[QSYS] = vsc9953_qsys_regmap,
|
||||||
[REW] = vsc9953_rew_regmap,
|
[REW] = vsc9953_rew_regmap,
|
||||||
[SYS] = vsc9953_sys_regmap,
|
[SYS] = vsc9953_sys_regmap,
|
||||||
|
[S0] = vsc9953_vcap_regmap,
|
||||||
[S1] = vsc9953_vcap_regmap,
|
[S1] = vsc9953_vcap_regmap,
|
||||||
[S2] = vsc9953_vcap_regmap,
|
[S2] = vsc9953_vcap_regmap,
|
||||||
[GCB] = vsc9953_gcb_regmap,
|
[GCB] = vsc9953_gcb_regmap,
|
||||||
@ -387,6 +388,11 @@ static const struct resource vsc9953_target_io_res[TARGET_MAX] = {
|
|||||||
.end = 0x001ffff,
|
.end = 0x001ffff,
|
||||||
.name = "sys",
|
.name = "sys",
|
||||||
},
|
},
|
||||||
|
[S0] = {
|
||||||
|
.start = 0x0040000,
|
||||||
|
.end = 0x00403ff,
|
||||||
|
.name = "s0",
|
||||||
|
},
|
||||||
[S1] = {
|
[S1] = {
|
||||||
.start = 0x0050000,
|
.start = 0x0050000,
|
||||||
.end = 0x00503ff,
|
.end = 0x00503ff,
|
||||||
@ -607,6 +613,38 @@ static const struct ocelot_stat_layout vsc9953_stats_layout[] = {
|
|||||||
{ .offset = 0x91, .name = "drop_green_prio_7", },
|
{ .offset = 0x91, .name = "drop_green_prio_7", },
|
||||||
};
|
};
|
||||||
|
|
||||||
|
static const struct vcap_field vsc9953_vcap_es0_keys[] = {
|
||||||
|
[VCAP_ES0_EGR_PORT] = { 0, 4},
|
||||||
|
[VCAP_ES0_IGR_PORT] = { 4, 4},
|
||||||
|
[VCAP_ES0_RSV] = { 8, 2},
|
||||||
|
[VCAP_ES0_L2_MC] = { 10, 1},
|
||||||
|
[VCAP_ES0_L2_BC] = { 11, 1},
|
||||||
|
[VCAP_ES0_VID] = { 12, 12},
|
||||||
|
[VCAP_ES0_DP] = { 24, 1},
|
||||||
|
[VCAP_ES0_PCP] = { 25, 3},
|
||||||
|
};
|
||||||
|
|
||||||
|
static const struct vcap_field vsc9953_vcap_es0_actions[] = {
|
||||||
|
[VCAP_ES0_ACT_PUSH_OUTER_TAG] = { 0, 2},
|
||||||
|
[VCAP_ES0_ACT_PUSH_INNER_TAG] = { 2, 1},
|
||||||
|
[VCAP_ES0_ACT_TAG_A_TPID_SEL] = { 3, 2},
|
||||||
|
[VCAP_ES0_ACT_TAG_A_VID_SEL] = { 5, 1},
|
||||||
|
[VCAP_ES0_ACT_TAG_A_PCP_SEL] = { 6, 2},
|
||||||
|
[VCAP_ES0_ACT_TAG_A_DEI_SEL] = { 8, 2},
|
||||||
|
[VCAP_ES0_ACT_TAG_B_TPID_SEL] = { 10, 2},
|
||||||
|
[VCAP_ES0_ACT_TAG_B_VID_SEL] = { 12, 1},
|
||||||
|
[VCAP_ES0_ACT_TAG_B_PCP_SEL] = { 13, 2},
|
||||||
|
[VCAP_ES0_ACT_TAG_B_DEI_SEL] = { 15, 2},
|
||||||
|
[VCAP_ES0_ACT_VID_A_VAL] = { 17, 12},
|
||||||
|
[VCAP_ES0_ACT_PCP_A_VAL] = { 29, 3},
|
||||||
|
[VCAP_ES0_ACT_DEI_A_VAL] = { 32, 1},
|
||||||
|
[VCAP_ES0_ACT_VID_B_VAL] = { 33, 12},
|
||||||
|
[VCAP_ES0_ACT_PCP_B_VAL] = { 45, 3},
|
||||||
|
[VCAP_ES0_ACT_DEI_B_VAL] = { 48, 1},
|
||||||
|
[VCAP_ES0_ACT_RSV] = { 49, 24},
|
||||||
|
[VCAP_ES0_ACT_HIT_STICKY] = { 73, 1},
|
||||||
|
};
|
||||||
|
|
||||||
static const struct vcap_field vsc9953_vcap_is1_keys[] = {
|
static const struct vcap_field vsc9953_vcap_is1_keys[] = {
|
||||||
[VCAP_IS1_HK_TYPE] = { 0, 1},
|
[VCAP_IS1_HK_TYPE] = { 0, 1},
|
||||||
[VCAP_IS1_HK_LOOKUP] = { 1, 2},
|
[VCAP_IS1_HK_LOOKUP] = { 1, 2},
|
||||||
@ -767,6 +805,18 @@ static struct vcap_field vsc9953_vcap_is2_actions[] = {
|
|||||||
};
|
};
|
||||||
|
|
||||||
static const struct vcap_props vsc9953_vcap_props[] = {
|
static const struct vcap_props vsc9953_vcap_props[] = {
|
||||||
|
[VCAP_ES0] = {
|
||||||
|
.action_type_width = 0,
|
||||||
|
.action_table = {
|
||||||
|
[ES0_ACTION_TYPE_NORMAL] = {
|
||||||
|
.width = 73, /* HIT_STICKY not included */
|
||||||
|
.count = 1,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
.target = S0,
|
||||||
|
.keys = vsc9953_vcap_es0_keys,
|
||||||
|
.actions = vsc9953_vcap_es0_actions,
|
||||||
|
},
|
||||||
[VCAP_IS1] = {
|
[VCAP_IS1] = {
|
||||||
.action_type_width = 0,
|
.action_type_width = 0,
|
||||||
.action_table = {
|
.action_table = {
|
||||||
|
@ -758,6 +758,38 @@ static const struct ocelot_ops ocelot_ops = {
|
|||||||
.wm_enc = ocelot_wm_enc,
|
.wm_enc = ocelot_wm_enc,
|
||||||
};
|
};
|
||||||
|
|
||||||
|
static const struct vcap_field vsc7514_vcap_es0_keys[] = {
|
||||||
|
[VCAP_ES0_EGR_PORT] = { 0, 4},
|
||||||
|
[VCAP_ES0_IGR_PORT] = { 4, 4},
|
||||||
|
[VCAP_ES0_RSV] = { 8, 2},
|
||||||
|
[VCAP_ES0_L2_MC] = { 10, 1},
|
||||||
|
[VCAP_ES0_L2_BC] = { 11, 1},
|
||||||
|
[VCAP_ES0_VID] = { 12, 12},
|
||||||
|
[VCAP_ES0_DP] = { 24, 1},
|
||||||
|
[VCAP_ES0_PCP] = { 25, 3},
|
||||||
|
};
|
||||||
|
|
||||||
|
static const struct vcap_field vsc7514_vcap_es0_actions[] = {
|
||||||
|
[VCAP_ES0_ACT_PUSH_OUTER_TAG] = { 0, 2},
|
||||||
|
[VCAP_ES0_ACT_PUSH_INNER_TAG] = { 2, 1},
|
||||||
|
[VCAP_ES0_ACT_TAG_A_TPID_SEL] = { 3, 2},
|
||||||
|
[VCAP_ES0_ACT_TAG_A_VID_SEL] = { 5, 1},
|
||||||
|
[VCAP_ES0_ACT_TAG_A_PCP_SEL] = { 6, 2},
|
||||||
|
[VCAP_ES0_ACT_TAG_A_DEI_SEL] = { 8, 2},
|
||||||
|
[VCAP_ES0_ACT_TAG_B_TPID_SEL] = { 10, 2},
|
||||||
|
[VCAP_ES0_ACT_TAG_B_VID_SEL] = { 12, 1},
|
||||||
|
[VCAP_ES0_ACT_TAG_B_PCP_SEL] = { 13, 2},
|
||||||
|
[VCAP_ES0_ACT_TAG_B_DEI_SEL] = { 15, 2},
|
||||||
|
[VCAP_ES0_ACT_VID_A_VAL] = { 17, 12},
|
||||||
|
[VCAP_ES0_ACT_PCP_A_VAL] = { 29, 3},
|
||||||
|
[VCAP_ES0_ACT_DEI_A_VAL] = { 32, 1},
|
||||||
|
[VCAP_ES0_ACT_VID_B_VAL] = { 33, 12},
|
||||||
|
[VCAP_ES0_ACT_PCP_B_VAL] = { 45, 3},
|
||||||
|
[VCAP_ES0_ACT_DEI_B_VAL] = { 48, 1},
|
||||||
|
[VCAP_ES0_ACT_RSV] = { 49, 24},
|
||||||
|
[VCAP_ES0_ACT_HIT_STICKY] = { 73, 1},
|
||||||
|
};
|
||||||
|
|
||||||
static const struct vcap_field vsc7514_vcap_is1_keys[] = {
|
static const struct vcap_field vsc7514_vcap_is1_keys[] = {
|
||||||
[VCAP_IS1_HK_TYPE] = { 0, 1},
|
[VCAP_IS1_HK_TYPE] = { 0, 1},
|
||||||
[VCAP_IS1_HK_LOOKUP] = { 1, 2},
|
[VCAP_IS1_HK_LOOKUP] = { 1, 2},
|
||||||
@ -932,6 +964,18 @@ static const struct vcap_field vsc7514_vcap_is2_actions[] = {
|
|||||||
};
|
};
|
||||||
|
|
||||||
static const struct vcap_props vsc7514_vcap_props[] = {
|
static const struct vcap_props vsc7514_vcap_props[] = {
|
||||||
|
[VCAP_ES0] = {
|
||||||
|
.action_type_width = 0,
|
||||||
|
.action_table = {
|
||||||
|
[ES0_ACTION_TYPE_NORMAL] = {
|
||||||
|
.width = 73, /* HIT_STICKY not included */
|
||||||
|
.count = 1,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
.target = S0,
|
||||||
|
.keys = vsc7514_vcap_es0_keys,
|
||||||
|
.actions = vsc7514_vcap_es0_actions,
|
||||||
|
},
|
||||||
[VCAP_IS1] = {
|
[VCAP_IS1] = {
|
||||||
.action_type_width = 0,
|
.action_type_width = 0,
|
||||||
.action_table = {
|
.action_table = {
|
||||||
@ -1129,6 +1173,7 @@ static int mscc_ocelot_probe(struct platform_device *pdev)
|
|||||||
{ QSYS, "qsys" },
|
{ QSYS, "qsys" },
|
||||||
{ ANA, "ana" },
|
{ ANA, "ana" },
|
||||||
{ QS, "qs" },
|
{ QS, "qs" },
|
||||||
|
{ S0, "s0" },
|
||||||
{ S1, "s1" },
|
{ S1, "s1" },
|
||||||
{ S2, "s2" },
|
{ S2, "s2" },
|
||||||
{ PTP, "ptp", 1 },
|
{ PTP, "ptp", 1 },
|
||||||
|
@ -123,6 +123,7 @@ enum ocelot_target {
|
|||||||
QSYS,
|
QSYS,
|
||||||
REW,
|
REW,
|
||||||
SYS,
|
SYS,
|
||||||
|
S0,
|
||||||
S1,
|
S1,
|
||||||
S2,
|
S2,
|
||||||
HSIO,
|
HSIO,
|
||||||
|
@ -14,9 +14,9 @@
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
enum {
|
enum {
|
||||||
|
VCAP_ES0,
|
||||||
VCAP_IS1,
|
VCAP_IS1,
|
||||||
VCAP_IS2,
|
VCAP_IS2,
|
||||||
/* VCAP_ES0, */
|
|
||||||
};
|
};
|
||||||
|
|
||||||
struct vcap_props {
|
struct vcap_props {
|
||||||
@ -355,4 +355,46 @@ enum vcap_is1_action_field {
|
|||||||
VCAP_IS1_ACT_HIT_STICKY,
|
VCAP_IS1_ACT_HIT_STICKY,
|
||||||
};
|
};
|
||||||
|
|
||||||
|
/* =================================================================
|
||||||
|
* VCAP ES0
|
||||||
|
* =================================================================
|
||||||
|
*/
|
||||||
|
|
||||||
|
enum {
|
||||||
|
ES0_ACTION_TYPE_NORMAL,
|
||||||
|
ES0_ACTION_TYPE_MAX,
|
||||||
|
};
|
||||||
|
|
||||||
|
enum vcap_es0_key_field {
|
||||||
|
VCAP_ES0_EGR_PORT,
|
||||||
|
VCAP_ES0_IGR_PORT,
|
||||||
|
VCAP_ES0_RSV,
|
||||||
|
VCAP_ES0_L2_MC,
|
||||||
|
VCAP_ES0_L2_BC,
|
||||||
|
VCAP_ES0_VID,
|
||||||
|
VCAP_ES0_DP,
|
||||||
|
VCAP_ES0_PCP,
|
||||||
|
};
|
||||||
|
|
||||||
|
enum vcap_es0_action_field {
|
||||||
|
VCAP_ES0_ACT_PUSH_OUTER_TAG,
|
||||||
|
VCAP_ES0_ACT_PUSH_INNER_TAG,
|
||||||
|
VCAP_ES0_ACT_TAG_A_TPID_SEL,
|
||||||
|
VCAP_ES0_ACT_TAG_A_VID_SEL,
|
||||||
|
VCAP_ES0_ACT_TAG_A_PCP_SEL,
|
||||||
|
VCAP_ES0_ACT_TAG_A_DEI_SEL,
|
||||||
|
VCAP_ES0_ACT_TAG_B_TPID_SEL,
|
||||||
|
VCAP_ES0_ACT_TAG_B_VID_SEL,
|
||||||
|
VCAP_ES0_ACT_TAG_B_PCP_SEL,
|
||||||
|
VCAP_ES0_ACT_TAG_B_DEI_SEL,
|
||||||
|
VCAP_ES0_ACT_VID_A_VAL,
|
||||||
|
VCAP_ES0_ACT_PCP_A_VAL,
|
||||||
|
VCAP_ES0_ACT_DEI_A_VAL,
|
||||||
|
VCAP_ES0_ACT_VID_B_VAL,
|
||||||
|
VCAP_ES0_ACT_PCP_B_VAL,
|
||||||
|
VCAP_ES0_ACT_DEI_B_VAL,
|
||||||
|
VCAP_ES0_ACT_RSV,
|
||||||
|
VCAP_ES0_ACT_HIT_STICKY,
|
||||||
|
};
|
||||||
|
|
||||||
#endif /* _OCELOT_VCAP_H_ */
|
#endif /* _OCELOT_VCAP_H_ */
|
||||||
|
Loading…
Reference in New Issue
Block a user