Hi All,
As existing, as newly introduced CPSW ALE versions have differences in
supported features and ALE table formats. Especially it's actual for the
recent AM65x/J721E/J7200 and future AM64x SoCs, which supports more
features like: auto-aging, classifiers, Link aggregation, additional HW
filtering, etc.
The existing ALE configuration interface is not practical in terms of
adding new features and requires consumers to program a lot static
parameters. And any attempt to add new features will case endless adding
and maintaining different combination of flags and options. Because CPSW
ALE configuration is static and fixed for SoC (or set of SoC), It is
reasonable to add support for static ALE configurations inside ALE module.
This series introduces static ALE configuration table for different ALE
variants and provides option for consumers to select required ALE
configuration by providing ALE const char *dev_id identifier (Patch 2).
And all existing driver have been switched to use new approach (Patches 3-6).
After this ALE HW auto-ageing feature can be enabled for AM65x CPSW ALE
variant (Patch 7).
Finally, Patches 8-9 introduces tables to describe the ALE VLAN entries
fields as the ALE VLAN entries are too much differ between different TI
CPSW ALE versions. So, handling them using flags, defines and get/set
functions are became over-complicated.
Patch 1 - is preparation patch
Changes in v3:
- fixed comment for Patch 2
Changes in v2:
- fixed sparse warnings
v2: https://lore.kernel.org/patchwork/cover/1301684/
v1: https://lore.kernel.org/patchwork/cover/1301048/
Grygorii Strashko (9):
net: ethernet: ti: ale: add cpsw_ale_get_num_entries api
net: ethernet: ti: ale: add static configuration
net: ethernet: ti: cpsw: use dev_id for ale configuration
net: netcp: ethss: use dev_id for ale configuration
net: ethernet: ti: am65-cpsw: use dev_id for ale configuration
net: ethernet: ti: ale: make usage of ale dev_id mandatory
net: ethernet: ti: am65-cpsw: enable hw auto ageing
net: ethernet: ti: ale: switch to use tables for vlan entry
description
net: ethernet: ti: ale: add support for multi port k3 cpsw versions
drivers/net/ethernet/ti/am65-cpsw-ethtool.c | 10 +-
drivers/net/ethernet/ti/am65-cpsw-nuss.c | 16 +-
drivers/net/ethernet/ti/am65-cpsw-nuss.h | 1 +
drivers/net/ethernet/ti/cpsw.c | 6 -
drivers/net/ethernet/ti/cpsw_ale.c | 421 ++++++++++++++++----
drivers/net/ethernet/ti/cpsw_ale.h | 7 +
drivers/net/ethernet/ti/cpsw_ethtool.c | 3 +-
drivers/net/ethernet/ti/cpsw_new.c | 1 -
drivers/net/ethernet/ti/cpsw_priv.c | 2 +-
drivers/net/ethernet/ti/cpsw_priv.h | 2 -
drivers/net/ethernet/ti/netcp_ethss.c | 18 +-
11 files changed, 388 insertions(+), 99 deletions(-)
--
2.17.1
As existing, as newly introduced CPSW ALE versions have differences in
supported features and ALE table formats. Especially it's actual for the
recent AM65x/J721E/J7200 SoC and feature AM64x, which supports features
like: auto-aging, classifiers, Link aggregation, additional hw filtering,
etc.
Existing ALE configuration interface is not practical in terms of adding
new features and requires consumers to program a lot static parameters. Any
attempt to add new options will case endless adding and maintaining
different combination of flags and options.
Hence CPSW ALE configuration is static and fixed for SoC (or set of SoC) It
is reasonable to add support for static ALE configurations inside ALE
module. This patch adds static ALE configuration table for different ALE
versions and provides option for consumers to select required ALE
configuration by providing ALE const char *dev_id identifier.
This feature is not enabled by default until existing CPSW drivers will be
modified by follow up patches.
Signed-off-by: Grygorii Strashko <[email protected]>
---
drivers/net/ethernet/ti/cpsw_ale.c | 82 ++++++++++++++++++++++++++++++
drivers/net/ethernet/ti/cpsw_ale.h | 1 +
2 files changed, 83 insertions(+)
diff --git a/drivers/net/ethernet/ti/cpsw_ale.c b/drivers/net/ethernet/ti/cpsw_ale.c
index a94aef3f54a5..e70c9697ef47 100644
--- a/drivers/net/ethernet/ti/cpsw_ale.c
+++ b/drivers/net/ethernet/ti/cpsw_ale.c
@@ -46,6 +46,29 @@
#define AM65_CPSW_ALE_THREAD_DEF_REG 0x134
+enum {
+ CPSW_ALE_F_STATUS_REG = BIT(0), /* Status register present */
+ CPSW_ALE_F_HW_AUTOAGING = BIT(1), /* HW auto aging */
+
+ CPSW_ALE_F_COUNT
+};
+
+/**
+ * struct ale_dev_id - The ALE version/SoC specific configuration
+ * @dev_id: ALE version/SoC id
+ * @features: features supported by ALE
+ * @tbl_entries: number of ALE entries
+ * @major_ver_mask: mask of ALE Major Version Value in ALE_IDVER reg.
+ * @nu_switch_ale: NU Switch ALE
+ */
+struct cpsw_ale_dev_id {
+ const char *dev_id;
+ u32 features;
+ u32 tbl_entries;
+ u32 major_ver_mask;
+ bool nu_switch_ale;
+};
+
#define ALE_TABLE_WRITE BIT(31)
#define ALE_TYPE_FREE 0
@@ -979,11 +1002,70 @@ void cpsw_ale_stop(struct cpsw_ale *ale)
cpsw_ale_control_set(ale, 0, ALE_ENABLE, 0);
}
+static const struct cpsw_ale_dev_id cpsw_ale_id_match[] = {
+ {
+ /* am3/4/5, dra7. dm814x, 66ak2hk-gbe */
+ .dev_id = "cpsw",
+ .tbl_entries = 1024,
+ .major_ver_mask = 0xff,
+ },
+ {
+ /* 66ak2h_xgbe */
+ .dev_id = "66ak2h-xgbe",
+ .tbl_entries = 2048,
+ .major_ver_mask = 0xff,
+ },
+ {
+ .dev_id = "66ak2el",
+ .features = CPSW_ALE_F_STATUS_REG,
+ .major_ver_mask = 0x7,
+ .nu_switch_ale = true,
+ },
+ {
+ .dev_id = "66ak2g",
+ .features = CPSW_ALE_F_STATUS_REG,
+ .tbl_entries = 64,
+ .major_ver_mask = 0x7,
+ .nu_switch_ale = true,
+ },
+ {
+ .dev_id = "am65x-cpsw2g",
+ .features = CPSW_ALE_F_STATUS_REG | CPSW_ALE_F_HW_AUTOAGING,
+ .tbl_entries = 64,
+ .major_ver_mask = 0x7,
+ .nu_switch_ale = true,
+ },
+ { },
+};
+
+static const struct
+cpsw_ale_dev_id *cpsw_ale_match_id(const struct cpsw_ale_dev_id *id,
+ const char *dev_id)
+{
+ if (!dev_id)
+ return NULL;
+
+ while (id->dev_id) {
+ if (strcmp(dev_id, id->dev_id) == 0)
+ return id;
+ id++;
+ }
+ return NULL;
+}
+
struct cpsw_ale *cpsw_ale_create(struct cpsw_ale_params *params)
{
+ const struct cpsw_ale_dev_id *ale_dev_id;
struct cpsw_ale *ale;
u32 rev, ale_entries;
+ ale_dev_id = cpsw_ale_match_id(cpsw_ale_id_match, params->dev_id);
+ if (ale_dev_id) {
+ params->ale_entries = ale_dev_id->tbl_entries;
+ params->major_ver_mask = ale_dev_id->major_ver_mask;
+ params->nu_switch_ale = ale_dev_id->nu_switch_ale;
+ }
+
ale = devm_kzalloc(params->dev, sizeof(*ale), GFP_KERNEL);
if (!ale)
return ERR_PTR(-ENOMEM);
diff --git a/drivers/net/ethernet/ti/cpsw_ale.h b/drivers/net/ethernet/ti/cpsw_ale.h
index 735692f066bf..53ad4246617e 100644
--- a/drivers/net/ethernet/ti/cpsw_ale.h
+++ b/drivers/net/ethernet/ti/cpsw_ale.h
@@ -24,6 +24,7 @@ struct cpsw_ale_params {
* pass it from caller.
*/
u32 major_ver_mask;
+ const char *dev_id;
};
struct cpsw_ale {
--
2.17.1
From: Grygorii Strashko <[email protected]>
Date: Thu, 10 Sep 2020 23:27:58 +0300
> As existing, as newly introduced CPSW ALE versions have differences in
> supported features and ALE table formats. Especially it's actual for the
> recent AM65x/J721E/J7200 and future AM64x SoCs, which supports more
> features like: auto-aging, classifiers, Link aggregation, additional HW
> filtering, etc.
>
> The existing ALE configuration interface is not practical in terms of
> adding new features and requires consumers to program a lot static
> parameters. And any attempt to add new features will case endless adding
> and maintaining different combination of flags and options. Because CPSW
> ALE configuration is static and fixed for SoC (or set of SoC), It is
> reasonable to add support for static ALE configurations inside ALE module.
>
> This series introduces static ALE configuration table for different ALE
> variants and provides option for consumers to select required ALE
> configuration by providing ALE const char *dev_id identifier (Patch 2).
> And all existing driver have been switched to use new approach (Patches 3-6).
>
> After this ALE HW auto-ageing feature can be enabled for AM65x CPSW ALE
> variant (Patch 7).
>
> Finally, Patches 8-9 introduces tables to describe the ALE VLAN entries
> fields as the ALE VLAN entries are too much differ between different TI
> CPSW ALE versions. So, handling them using flags, defines and get/set
> functions are became over-complicated.
...
Series applied, thank you.