]> git.baikalelectronics.ru Git - kernel.git/commitdiff
net: dsa: sja1105: allow the frame buffer size to be customized
authorVladimir Oltean <vladimir.oltean@nxp.com>
Mon, 24 May 2021 13:14:21 +0000 (16:14 +0300)
committerDavid S. Miller <davem@davemloft.net>
Mon, 24 May 2021 20:59:04 +0000 (13:59 -0700)
The shared frame buffer of the SJA1110 is larger than that of SJA1105,
which is natural due to the fact that there are more ports.

Introduce yet another property in struct sja1105_info which encodes the
maximum number of 128 byte blocks that can be used for frame buffers.

Signed-off-by: Vladimir Oltean <vladimir.oltean@nxp.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
drivers/net/dsa/sja1105/sja1105.h
drivers/net/dsa/sja1105/sja1105_main.c
drivers/net/dsa/sja1105/sja1105_spi.c
drivers/net/dsa/sja1105/sja1105_static_config.c
drivers/net/dsa/sja1105/sja1105_static_config.h

index 47cad24e6af03a3c2c6de1c1a99f3baa3a0d6834..2ec03917feb34c99ca6e23847939ade518306ab9 100644 (file)
@@ -90,6 +90,7 @@ struct sja1105_info {
         */
        int ptpegr_ts_bytes;
        int num_cbs_shapers;
+       int max_frame_mem;
        const struct sja1105_dynamic_table_ops *dyn_ops;
        const struct sja1105_table_ops *static_ops;
        const struct sja1105_regs *regs;
index c391ab00e0032846aaee4b2e7758c2b05b9a1b5a..a105e174b3af34ed255184c961a74acb5f0d5f4f 100644 (file)
@@ -469,12 +469,7 @@ static int sja1105_init_l2_forwarding(struct sja1105_private *priv)
 
 static int sja1105_init_l2_forwarding_params(struct sja1105_private *priv)
 {
-       struct sja1105_l2_forwarding_params_entry default_l2fwd_params = {
-               /* Disallow dynamic reconfiguration of vlan_pmap */
-               .max_dynp = 0,
-               /* Use a single memory partition for all ingress queues */
-               .part_spc = { SJA1105_MAX_FRAME_MEMORY, 0, 0, 0, 0, 0, 0, 0 },
-       };
+       struct sja1105_l2_forwarding_params_entry *l2fwd_params;
        struct sja1105_table *table;
 
        table = &priv->static_config.tables[BLK_IDX_L2_FORWARDING_PARAMS];
@@ -492,8 +487,12 @@ static int sja1105_init_l2_forwarding_params(struct sja1105_private *priv)
        table->entry_count = table->ops->max_entry_count;
 
        /* This table only has a single entry */
-       ((struct sja1105_l2_forwarding_params_entry *)table->entries)[0] =
-                               default_l2fwd_params;
+       l2fwd_params = table->entries;
+
+       /* Disallow dynamic reconfiguration of vlan_pmap */
+       l2fwd_params->max_dynp = 0;
+       /* Use a single memory partition for all ingress queues */
+       l2fwd_params->part_spc[0] = priv->info->max_frame_mem;
 
        return 0;
 }
@@ -502,16 +501,14 @@ void sja1105_frame_memory_partitioning(struct sja1105_private *priv)
 {
        struct sja1105_l2_forwarding_params_entry *l2_fwd_params;
        struct sja1105_vl_forwarding_params_entry *vl_fwd_params;
+       int max_mem = priv->info->max_frame_mem;
        struct sja1105_table *table;
-       int max_mem;
 
        /* VLAN retagging is implemented using a loopback port that consumes
         * frame buffers. That leaves less for us.
         */
        if (priv->vlan_state == SJA1105_VLAN_BEST_EFFORT)
-               max_mem = SJA1105_MAX_FRAME_MEMORY_RETAGGING;
-       else
-               max_mem = SJA1105_MAX_FRAME_MEMORY;
+               max_mem -= SJA1105_FRAME_MEMORY_RETAGGING_OVERHEAD;
 
        table = &priv->static_config.tables[BLK_IDX_L2_FORWARDING_PARAMS];
        l2_fwd_params = table->entries;
index 79ba86096a4ba9508e01bc3da2f12b30195f341f..d0bc6cf90bfdce15699ecd61980cd2abf7d2fd70 100644 (file)
@@ -271,7 +271,8 @@ int static_config_buf_prepare_for_upload(struct sja1105_private *priv,
        char *final_header_ptr;
        int crc_len;
 
-       valid = sja1105_static_config_check_valid(config);
+       valid = sja1105_static_config_check_valid(config,
+                                                 priv->info->max_frame_mem);
        if (valid != SJA1105_CONFIG_OK) {
                dev_err(&priv->spidev->dev,
                        sja1105_static_config_error_msg[valid]);
@@ -474,6 +475,7 @@ const struct sja1105_info sja1105e_info = {
        .can_limit_mcast_flood  = false,
        .ptp_ts_bits            = 24,
        .ptpegr_ts_bytes        = 4,
+       .max_frame_mem          = SJA1105_MAX_FRAME_MEMORY,
        .num_cbs_shapers        = SJA1105ET_MAX_CBS_COUNT,
        .reset_cmd              = sja1105et_reset_cmd,
        .fdb_add_cmd            = sja1105et_fdb_add,
@@ -493,6 +495,7 @@ const struct sja1105_info sja1105t_info = {
        .can_limit_mcast_flood  = false,
        .ptp_ts_bits            = 24,
        .ptpegr_ts_bytes        = 4,
+       .max_frame_mem          = SJA1105_MAX_FRAME_MEMORY,
        .num_cbs_shapers        = SJA1105ET_MAX_CBS_COUNT,
        .reset_cmd              = sja1105et_reset_cmd,
        .fdb_add_cmd            = sja1105et_fdb_add,
@@ -512,6 +515,7 @@ const struct sja1105_info sja1105p_info = {
        .can_limit_mcast_flood  = true,
        .ptp_ts_bits            = 32,
        .ptpegr_ts_bytes        = 8,
+       .max_frame_mem          = SJA1105_MAX_FRAME_MEMORY,
        .num_cbs_shapers        = SJA1105PQRS_MAX_CBS_COUNT,
        .setup_rgmii_delay      = sja1105pqrs_setup_rgmii_delay,
        .reset_cmd              = sja1105pqrs_reset_cmd,
@@ -532,6 +536,7 @@ const struct sja1105_info sja1105q_info = {
        .can_limit_mcast_flood  = true,
        .ptp_ts_bits            = 32,
        .ptpegr_ts_bytes        = 8,
+       .max_frame_mem          = SJA1105_MAX_FRAME_MEMORY,
        .num_cbs_shapers        = SJA1105PQRS_MAX_CBS_COUNT,
        .setup_rgmii_delay      = sja1105pqrs_setup_rgmii_delay,
        .reset_cmd              = sja1105pqrs_reset_cmd,
@@ -552,6 +557,7 @@ const struct sja1105_info sja1105r_info = {
        .can_limit_mcast_flood  = true,
        .ptp_ts_bits            = 32,
        .ptpegr_ts_bytes        = 8,
+       .max_frame_mem          = SJA1105_MAX_FRAME_MEMORY,
        .num_cbs_shapers        = SJA1105PQRS_MAX_CBS_COUNT,
        .setup_rgmii_delay      = sja1105pqrs_setup_rgmii_delay,
        .reset_cmd              = sja1105pqrs_reset_cmd,
@@ -573,6 +579,7 @@ const struct sja1105_info sja1105s_info = {
        .can_limit_mcast_flood  = true,
        .ptp_ts_bits            = 32,
        .ptpegr_ts_bytes        = 8,
+       .max_frame_mem          = SJA1105_MAX_FRAME_MEMORY,
        .num_cbs_shapers        = SJA1105PQRS_MAX_CBS_COUNT,
        .setup_rgmii_delay      = sja1105pqrs_setup_rgmii_delay,
        .reset_cmd              = sja1105pqrs_reset_cmd,
index a8efb7fac3955307a82fe8170b9319c877d5cc93..33f91ecbe07b7e255d4310efe966bb1196e732cb 100644 (file)
@@ -657,11 +657,11 @@ const char *sja1105_static_config_error_msg[] = {
 };
 
 static sja1105_config_valid_t
-static_config_check_memory_size(const struct sja1105_table *tables)
+static_config_check_memory_size(const struct sja1105_table *tables, int max_mem)
 {
        const struct sja1105_l2_forwarding_params_entry *l2_fwd_params;
        const struct sja1105_vl_forwarding_params_entry *vl_fwd_params;
-       int i, max_mem, mem = 0;
+       int i, mem = 0;
 
        l2_fwd_params = tables[BLK_IDX_L2_FORWARDING_PARAMS].entries;
 
@@ -675,9 +675,7 @@ static_config_check_memory_size(const struct sja1105_table *tables)
        }
 
        if (tables[BLK_IDX_RETAGGING].entry_count)
-               max_mem = SJA1105_MAX_FRAME_MEMORY_RETAGGING;
-       else
-               max_mem = SJA1105_MAX_FRAME_MEMORY;
+               max_mem -= SJA1105_FRAME_MEMORY_RETAGGING_OVERHEAD;
 
        if (mem > max_mem)
                return SJA1105_OVERCOMMITTED_FRAME_MEMORY;
@@ -686,7 +684,8 @@ static_config_check_memory_size(const struct sja1105_table *tables)
 }
 
 sja1105_config_valid_t
-sja1105_static_config_check_valid(const struct sja1105_static_config *config)
+sja1105_static_config_check_valid(const struct sja1105_static_config *config,
+                                 int max_mem)
 {
        const struct sja1105_table *tables = config->tables;
 #define IS_FULL(blk_idx) \
@@ -754,7 +753,7 @@ sja1105_static_config_check_valid(const struct sja1105_static_config *config)
        if (!IS_FULL(BLK_IDX_XMII_PARAMS))
                return SJA1105_MISSING_XMII_TABLE;
 
-       return static_config_check_memory_size(tables);
+       return static_config_check_memory_size(tables, max_mem);
 #undef IS_FULL
 }
 
index 9bc783a2bbea467131744de4e1ae395fff37e00f..4ddb06bd8e92415a9f6d64e42ab1db4f5db571d5 100644 (file)
@@ -115,7 +115,7 @@ enum sja1105_blk_idx {
 #define SJA1105PQRS_MAX_CBS_COUNT                      16
 
 #define SJA1105_MAX_FRAME_MEMORY                       929
-#define SJA1105_MAX_FRAME_MEMORY_RETAGGING             910
+#define SJA1105_FRAME_MEMORY_RETAGGING_OVERHEAD                19
 #define SJA1105_VL_FRAME_MEMORY                                100
 
 #define SJA1105E_DEVICE_ID                             0x9C00000Cull
@@ -416,7 +416,8 @@ typedef enum {
 extern const char *sja1105_static_config_error_msg[];
 
 sja1105_config_valid_t
-sja1105_static_config_check_valid(const struct sja1105_static_config *config);
+sja1105_static_config_check_valid(const struct sja1105_static_config *config,
+                                 int max_mem);
 void
 sja1105_static_config_pack(void *buf, struct sja1105_static_config *config);
 int sja1105_static_config_init(struct sja1105_static_config *config,