]> www.infradead.org Git - users/dwmw2/linux.git/commitdiff
net: ethernet: ti: cpsw_ale: use regfields for number of Entries and Policers
authorRoger Quadros <rogerq@kernel.org>
Tue, 10 Sep 2024 09:24:00 +0000 (12:24 +0300)
committerDavid S. Miller <davem@davemloft.net>
Fri, 13 Sep 2024 09:49:00 +0000 (10:49 +0100)
Use regfields for number of ALE Entries and Policers.

The variants that support Policers/Classifiers have the number
of policers encoded in the ALE_STATUS register.

Use that and show the number of Policers in the ALE info message.

Signed-off-by: Roger Quadros <rogerq@kernel.org>
Reviewed-by: Simon Horman <horms@kernel.org>
Signed-off-by: David S. Miller <davem@davemloft.net>
drivers/net/ethernet/ti/cpsw_ale.c
drivers/net/ethernet/ti/cpsw_ale.h

index 979f741a231dc21023694a66d1dd72dac6b2df70..9e45470b4eb94f000070428aa5078132945dfab0 100644 (file)
@@ -103,7 +103,7 @@ struct cpsw_ale_dev_id {
 #define ALE_UCAST_TOUCHED              3
 
 #define ALE_TABLE_SIZE_MULTIPLIER      1024
-#define ALE_STATUS_SIZE_MASK           0x1f
+#define ALE_POLICER_SIZE_MULTIPLIER    8
 
 static inline int cpsw_ale_get_field(u32 *ale_entry, u32 start, u32 bits)
 {
@@ -1303,6 +1303,9 @@ static const struct reg_field ale_fields_cpsw_nu[] = {
        /* CPSW_ALE_IDVER_REG */
        [MINOR_VER]     = REG_FIELD(ALE_IDVER, 0, 7),
        [MAJOR_VER]     = REG_FIELD(ALE_IDVER, 8, 10),
+       /* CPSW_ALE_STATUS_REG */
+       [ALE_ENTRIES]   = REG_FIELD(ALE_STATUS, 0, 7),
+       [ALE_POLICERS]  = REG_FIELD(ALE_STATUS, 8, 15),
 };
 
 static const struct cpsw_ale_dev_id cpsw_ale_id_match[] = {
@@ -1402,8 +1405,8 @@ static int cpsw_ale_regfield_init(struct cpsw_ale *ale)
 
 struct cpsw_ale *cpsw_ale_create(struct cpsw_ale_params *params)
 {
+       u32 ale_entries, rev_major, rev_minor, policers;
        const struct cpsw_ale_dev_id *ale_dev_id;
-       u32 ale_entries, rev_major, rev_minor;
        struct cpsw_ale *ale;
        int ret;
 
@@ -1447,9 +1450,7 @@ struct cpsw_ale *cpsw_ale_create(struct cpsw_ale_params *params)
 
        if (ale->features & CPSW_ALE_F_STATUS_REG &&
            !ale->params.ale_entries) {
-               ale_entries =
-                       readl_relaxed(ale->params.ale_regs + ALE_STATUS) &
-                       ALE_STATUS_SIZE_MASK;
+               regmap_field_read(ale->fields[ALE_ENTRIES], &ale_entries);
                /* ALE available on newer NetCP switches has introduced
                 * a register, ALE_STATUS, to indicate the size of ALE
                 * table which shows the size as a multiple of 1024 entries.
@@ -1463,8 +1464,20 @@ struct cpsw_ale *cpsw_ale_create(struct cpsw_ale_params *params)
                ale_entries *= ALE_TABLE_SIZE_MULTIPLIER;
                ale->params.ale_entries = ale_entries;
        }
+
+       if (ale->features & CPSW_ALE_F_STATUS_REG &&
+           !ale->params.num_policers) {
+               regmap_field_read(ale->fields[ALE_POLICERS], &policers);
+               if (!policers)
+                       return ERR_PTR(-EINVAL);
+
+               policers *= ALE_POLICER_SIZE_MULTIPLIER;
+               ale->params.num_policers = policers;
+       }
+
        dev_info(ale->params.dev,
-                "ALE Table size %ld\n", ale->params.ale_entries);
+                "ALE Table size %ld, Policers %ld\n", ale->params.ale_entries,
+                ale->params.num_policers);
 
        /* set default bits for existing h/w */
        ale->port_mask_bits = ale->params.ale_ports;
index 58d377dd7496d7bec93421aac89a8d1384d00937..e12bb2caf016247bcdfc10cf532fd600f22314ce 100644 (file)
@@ -15,6 +15,7 @@ struct cpsw_ale_params {
        void __iomem            *ale_regs;
        unsigned long           ale_ageout;     /* in secs */
        unsigned long           ale_entries;
+       unsigned long           num_policers;
        unsigned long           ale_ports;
        /* NU Switch has specific handling as number of bits in ALE entries
         * are different than other versions of ALE. Also there are specific
@@ -33,6 +34,8 @@ struct regmap;
 enum ale_fields {
        MINOR_VER,
        MAJOR_VER,
+       ALE_ENTRIES,
+       ALE_POLICERS,
        /* terminator */
        ALE_FIELDS_MAX,
 };