Commit 1bf658ee authored by Vladimir Oltean's avatar Vladimir Oltean Committed by David S. Miller

net: dsa: sja1105: allow the frame buffer size to be customized

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: default avatarVladimir Oltean <vladimir.oltean@nxp.com>
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent 38fbe91f
...@@ -90,6 +90,7 @@ struct sja1105_info { ...@@ -90,6 +90,7 @@ struct sja1105_info {
*/ */
int ptpegr_ts_bytes; int ptpegr_ts_bytes;
int num_cbs_shapers; int num_cbs_shapers;
int max_frame_mem;
const struct sja1105_dynamic_table_ops *dyn_ops; const struct sja1105_dynamic_table_ops *dyn_ops;
const struct sja1105_table_ops *static_ops; const struct sja1105_table_ops *static_ops;
const struct sja1105_regs *regs; const struct sja1105_regs *regs;
......
...@@ -469,12 +469,7 @@ static int sja1105_init_l2_forwarding(struct sja1105_private *priv) ...@@ -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) static int sja1105_init_l2_forwarding_params(struct sja1105_private *priv)
{ {
struct sja1105_l2_forwarding_params_entry default_l2fwd_params = { struct sja1105_l2_forwarding_params_entry *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_table *table; struct sja1105_table *table;
table = &priv->static_config.tables[BLK_IDX_L2_FORWARDING_PARAMS]; 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) ...@@ -492,8 +487,12 @@ static int sja1105_init_l2_forwarding_params(struct sja1105_private *priv)
table->entry_count = table->ops->max_entry_count; table->entry_count = table->ops->max_entry_count;
/* This table only has a single entry */ /* This table only has a single entry */
((struct sja1105_l2_forwarding_params_entry *)table->entries)[0] = l2fwd_params = table->entries;
default_l2fwd_params;
/* 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; return 0;
} }
...@@ -502,16 +501,14 @@ void sja1105_frame_memory_partitioning(struct sja1105_private *priv) ...@@ -502,16 +501,14 @@ void sja1105_frame_memory_partitioning(struct sja1105_private *priv)
{ {
struct sja1105_l2_forwarding_params_entry *l2_fwd_params; struct sja1105_l2_forwarding_params_entry *l2_fwd_params;
struct sja1105_vl_forwarding_params_entry *vl_fwd_params; struct sja1105_vl_forwarding_params_entry *vl_fwd_params;
int max_mem = priv->info->max_frame_mem;
struct sja1105_table *table; struct sja1105_table *table;
int max_mem;
/* VLAN retagging is implemented using a loopback port that consumes /* VLAN retagging is implemented using a loopback port that consumes
* frame buffers. That leaves less for us. * frame buffers. That leaves less for us.
*/ */
if (priv->vlan_state == SJA1105_VLAN_BEST_EFFORT) if (priv->vlan_state == SJA1105_VLAN_BEST_EFFORT)
max_mem = SJA1105_MAX_FRAME_MEMORY_RETAGGING; max_mem -= SJA1105_FRAME_MEMORY_RETAGGING_OVERHEAD;
else
max_mem = SJA1105_MAX_FRAME_MEMORY;
table = &priv->static_config.tables[BLK_IDX_L2_FORWARDING_PARAMS]; table = &priv->static_config.tables[BLK_IDX_L2_FORWARDING_PARAMS];
l2_fwd_params = table->entries; l2_fwd_params = table->entries;
......
...@@ -271,7 +271,8 @@ int static_config_buf_prepare_for_upload(struct sja1105_private *priv, ...@@ -271,7 +271,8 @@ int static_config_buf_prepare_for_upload(struct sja1105_private *priv,
char *final_header_ptr; char *final_header_ptr;
int crc_len; 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) { if (valid != SJA1105_CONFIG_OK) {
dev_err(&priv->spidev->dev, dev_err(&priv->spidev->dev,
sja1105_static_config_error_msg[valid]); sja1105_static_config_error_msg[valid]);
...@@ -474,6 +475,7 @@ const struct sja1105_info sja1105e_info = { ...@@ -474,6 +475,7 @@ const struct sja1105_info sja1105e_info = {
.can_limit_mcast_flood = false, .can_limit_mcast_flood = false,
.ptp_ts_bits = 24, .ptp_ts_bits = 24,
.ptpegr_ts_bytes = 4, .ptpegr_ts_bytes = 4,
.max_frame_mem = SJA1105_MAX_FRAME_MEMORY,
.num_cbs_shapers = SJA1105ET_MAX_CBS_COUNT, .num_cbs_shapers = SJA1105ET_MAX_CBS_COUNT,
.reset_cmd = sja1105et_reset_cmd, .reset_cmd = sja1105et_reset_cmd,
.fdb_add_cmd = sja1105et_fdb_add, .fdb_add_cmd = sja1105et_fdb_add,
...@@ -493,6 +495,7 @@ const struct sja1105_info sja1105t_info = { ...@@ -493,6 +495,7 @@ const struct sja1105_info sja1105t_info = {
.can_limit_mcast_flood = false, .can_limit_mcast_flood = false,
.ptp_ts_bits = 24, .ptp_ts_bits = 24,
.ptpegr_ts_bytes = 4, .ptpegr_ts_bytes = 4,
.max_frame_mem = SJA1105_MAX_FRAME_MEMORY,
.num_cbs_shapers = SJA1105ET_MAX_CBS_COUNT, .num_cbs_shapers = SJA1105ET_MAX_CBS_COUNT,
.reset_cmd = sja1105et_reset_cmd, .reset_cmd = sja1105et_reset_cmd,
.fdb_add_cmd = sja1105et_fdb_add, .fdb_add_cmd = sja1105et_fdb_add,
...@@ -512,6 +515,7 @@ const struct sja1105_info sja1105p_info = { ...@@ -512,6 +515,7 @@ const struct sja1105_info sja1105p_info = {
.can_limit_mcast_flood = true, .can_limit_mcast_flood = true,
.ptp_ts_bits = 32, .ptp_ts_bits = 32,
.ptpegr_ts_bytes = 8, .ptpegr_ts_bytes = 8,
.max_frame_mem = SJA1105_MAX_FRAME_MEMORY,
.num_cbs_shapers = SJA1105PQRS_MAX_CBS_COUNT, .num_cbs_shapers = SJA1105PQRS_MAX_CBS_COUNT,
.setup_rgmii_delay = sja1105pqrs_setup_rgmii_delay, .setup_rgmii_delay = sja1105pqrs_setup_rgmii_delay,
.reset_cmd = sja1105pqrs_reset_cmd, .reset_cmd = sja1105pqrs_reset_cmd,
...@@ -532,6 +536,7 @@ const struct sja1105_info sja1105q_info = { ...@@ -532,6 +536,7 @@ const struct sja1105_info sja1105q_info = {
.can_limit_mcast_flood = true, .can_limit_mcast_flood = true,
.ptp_ts_bits = 32, .ptp_ts_bits = 32,
.ptpegr_ts_bytes = 8, .ptpegr_ts_bytes = 8,
.max_frame_mem = SJA1105_MAX_FRAME_MEMORY,
.num_cbs_shapers = SJA1105PQRS_MAX_CBS_COUNT, .num_cbs_shapers = SJA1105PQRS_MAX_CBS_COUNT,
.setup_rgmii_delay = sja1105pqrs_setup_rgmii_delay, .setup_rgmii_delay = sja1105pqrs_setup_rgmii_delay,
.reset_cmd = sja1105pqrs_reset_cmd, .reset_cmd = sja1105pqrs_reset_cmd,
...@@ -552,6 +557,7 @@ const struct sja1105_info sja1105r_info = { ...@@ -552,6 +557,7 @@ const struct sja1105_info sja1105r_info = {
.can_limit_mcast_flood = true, .can_limit_mcast_flood = true,
.ptp_ts_bits = 32, .ptp_ts_bits = 32,
.ptpegr_ts_bytes = 8, .ptpegr_ts_bytes = 8,
.max_frame_mem = SJA1105_MAX_FRAME_MEMORY,
.num_cbs_shapers = SJA1105PQRS_MAX_CBS_COUNT, .num_cbs_shapers = SJA1105PQRS_MAX_CBS_COUNT,
.setup_rgmii_delay = sja1105pqrs_setup_rgmii_delay, .setup_rgmii_delay = sja1105pqrs_setup_rgmii_delay,
.reset_cmd = sja1105pqrs_reset_cmd, .reset_cmd = sja1105pqrs_reset_cmd,
...@@ -573,6 +579,7 @@ const struct sja1105_info sja1105s_info = { ...@@ -573,6 +579,7 @@ const struct sja1105_info sja1105s_info = {
.can_limit_mcast_flood = true, .can_limit_mcast_flood = true,
.ptp_ts_bits = 32, .ptp_ts_bits = 32,
.ptpegr_ts_bytes = 8, .ptpegr_ts_bytes = 8,
.max_frame_mem = SJA1105_MAX_FRAME_MEMORY,
.num_cbs_shapers = SJA1105PQRS_MAX_CBS_COUNT, .num_cbs_shapers = SJA1105PQRS_MAX_CBS_COUNT,
.setup_rgmii_delay = sja1105pqrs_setup_rgmii_delay, .setup_rgmii_delay = sja1105pqrs_setup_rgmii_delay,
.reset_cmd = sja1105pqrs_reset_cmd, .reset_cmd = sja1105pqrs_reset_cmd,
......
...@@ -657,11 +657,11 @@ const char *sja1105_static_config_error_msg[] = { ...@@ -657,11 +657,11 @@ const char *sja1105_static_config_error_msg[] = {
}; };
static sja1105_config_valid_t 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_l2_forwarding_params_entry *l2_fwd_params;
const struct sja1105_vl_forwarding_params_entry *vl_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; l2_fwd_params = tables[BLK_IDX_L2_FORWARDING_PARAMS].entries;
...@@ -675,9 +675,7 @@ static_config_check_memory_size(const struct sja1105_table *tables) ...@@ -675,9 +675,7 @@ static_config_check_memory_size(const struct sja1105_table *tables)
} }
if (tables[BLK_IDX_RETAGGING].entry_count) if (tables[BLK_IDX_RETAGGING].entry_count)
max_mem = SJA1105_MAX_FRAME_MEMORY_RETAGGING; max_mem -= SJA1105_FRAME_MEMORY_RETAGGING_OVERHEAD;
else
max_mem = SJA1105_MAX_FRAME_MEMORY;
if (mem > max_mem) if (mem > max_mem)
return SJA1105_OVERCOMMITTED_FRAME_MEMORY; return SJA1105_OVERCOMMITTED_FRAME_MEMORY;
...@@ -686,7 +684,8 @@ static_config_check_memory_size(const struct sja1105_table *tables) ...@@ -686,7 +684,8 @@ static_config_check_memory_size(const struct sja1105_table *tables)
} }
sja1105_config_valid_t 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; const struct sja1105_table *tables = config->tables;
#define IS_FULL(blk_idx) \ #define IS_FULL(blk_idx) \
...@@ -754,7 +753,7 @@ sja1105_static_config_check_valid(const struct sja1105_static_config *config) ...@@ -754,7 +753,7 @@ sja1105_static_config_check_valid(const struct sja1105_static_config *config)
if (!IS_FULL(BLK_IDX_XMII_PARAMS)) if (!IS_FULL(BLK_IDX_XMII_PARAMS))
return SJA1105_MISSING_XMII_TABLE; return SJA1105_MISSING_XMII_TABLE;
return static_config_check_memory_size(tables); return static_config_check_memory_size(tables, max_mem);
#undef IS_FULL #undef IS_FULL
} }
......
...@@ -115,7 +115,7 @@ enum sja1105_blk_idx { ...@@ -115,7 +115,7 @@ enum sja1105_blk_idx {
#define SJA1105PQRS_MAX_CBS_COUNT 16 #define SJA1105PQRS_MAX_CBS_COUNT 16
#define SJA1105_MAX_FRAME_MEMORY 929 #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 SJA1105_VL_FRAME_MEMORY 100
#define SJA1105E_DEVICE_ID 0x9C00000Cull #define SJA1105E_DEVICE_ID 0x9C00000Cull
...@@ -416,7 +416,8 @@ typedef enum { ...@@ -416,7 +416,8 @@ typedef enum {
extern const char *sja1105_static_config_error_msg[]; extern const char *sja1105_static_config_error_msg[];
sja1105_config_valid_t 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 void
sja1105_static_config_pack(void *buf, struct sja1105_static_config *config); sja1105_static_config_pack(void *buf, struct sja1105_static_config *config);
int sja1105_static_config_init(struct sja1105_static_config *config, int sja1105_static_config_init(struct sja1105_static_config *config,
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment