Johnny Hughes
2019-02-04 c1f36c28393a7bb126cbf436cd6a4077a5b5c313
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
From 448424ade0c3a7fd4d72c6acd6a2c40e44bdfcc2 Mon Sep 17 00:00:00 2001
From: Stefan Chulski <stefanc@marvell.com>
Date: Mon, 5 Mar 2018 15:16:50 +0100
Subject: [PATCH 30/46] net: mvpp2: use the same buffer pool for all ports
 
This patch configures the buffer manager long pool for all ports part of
the same CP. Long pool separation between ports is redundant since there
are no performance improvement when different pools are used.
 
Signed-off-by: Stefan Chulski <stefanc@marvell.com>
[Antoine: cosmetic cleanup, commit message]
Signed-off-by: Antoine Tenart <antoine.tenart@bootlin.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
 
(cherry picked from commit 01d049366529544f1df44139f5ca225d4c36ec31)
Signed-off-by: Marcin Wojtas <mw@semihalf.com>
---
 drivers/net/ethernet/marvell/mvpp2.c | 76 ++++++++++++++++++------------------
 1 file changed, 37 insertions(+), 39 deletions(-)
 
diff --git a/drivers/net/ethernet/marvell/mvpp2.c b/drivers/net/ethernet/marvell/mvpp2.c
index 9418f6ee..d6cce0f 100644
--- a/drivers/net/ethernet/marvell/mvpp2.c
+++ b/drivers/net/ethernet/marvell/mvpp2.c
@@ -808,23 +808,23 @@ enum mvpp2_prs_l3_cast {
 #define MVPP22_RSS_TABLE_ENTRIES    32
 
 /* BM constants */
-#define MVPP2_BM_POOLS_NUM        8
 #define MVPP2_BM_LONG_BUF_NUM        1024
 #define MVPP2_BM_SHORT_BUF_NUM        2048
 #define MVPP2_BM_POOL_SIZE_MAX        (16*1024 - MVPP2_BM_POOL_PTR_ALIGN/4)
 #define MVPP2_BM_POOL_PTR_ALIGN        128
-#define MVPP2_BM_SWF_LONG_POOL(port)    ((port > 2) ? 2 : port)
-#define MVPP2_BM_SWF_SHORT_POOL        3
 
 /* BM cookie (32 bits) definition */
 #define MVPP2_BM_COOKIE_POOL_OFFS    8
 #define MVPP2_BM_COOKIE_CPU_OFFS    24
 
+#define MVPP2_BM_SHORT_FRAME_SIZE        512
+#define MVPP2_BM_LONG_FRAME_SIZE        2048
 /* BM short pool packet size
  * These value assure that for SWF the total number
  * of bytes allocated for each buffer will be 512
  */
-#define MVPP2_BM_SHORT_PKT_SIZE        MVPP2_RX_MAX_PKT_SIZE(512)
+#define MVPP2_BM_SHORT_PKT_SIZE    MVPP2_RX_MAX_PKT_SIZE(MVPP2_BM_SHORT_FRAME_SIZE)
+#define MVPP2_BM_LONG_PKT_SIZE    MVPP2_RX_MAX_PKT_SIZE(MVPP2_BM_LONG_FRAME_SIZE)
 
 #define MVPP21_ADDR_SPACE_SZ        0
 #define MVPP22_ADDR_SPACE_SZ        SZ_64K
@@ -832,12 +832,17 @@ enum mvpp2_prs_l3_cast {
 #define MVPP2_MAX_THREADS        8
 #define MVPP2_MAX_QVECS            MVPP2_MAX_THREADS
 
-enum mvpp2_bm_type {
-    MVPP2_BM_FREE,
-    MVPP2_BM_SWF_LONG,
-    MVPP2_BM_SWF_SHORT
+enum mvpp2_bm_pool_log_num {
+    MVPP2_BM_SHORT,
+    MVPP2_BM_LONG,
+    MVPP2_BM_POOLS_NUM
 };
 
+static struct {
+    int pkt_size;
+    int buf_num;
+} mvpp2_pools[MVPP2_BM_POOLS_NUM];
+
 /* GMAC MIB Counters register definitions */
 #define MVPP21_MIB_COUNTERS_OFFSET        0x1000
 #define MVPP21_MIB_COUNTERS_PORT_SZ        0x400
@@ -1266,7 +1271,6 @@ struct mvpp2_cls_lookup_entry {
 struct mvpp2_bm_pool {
     /* Pool number in the range 0-7 */
     int id;
-    enum mvpp2_bm_type type;
 
     /* Buffer Pointers Pool External (BPPE) size */
     int size;
@@ -4195,7 +4199,6 @@ static int mvpp2_bm_pool_create(struct platform_device *pdev,
     val |= MVPP2_BM_START_MASK;
     mvpp2_write(priv, MVPP2_BM_POOL_CTRL_REG(bm_pool->id), val);
 
-    bm_pool->type = MVPP2_BM_FREE;
     bm_pool->size = size;
     bm_pool->pkt_size = 0;
     bm_pool->buf_num = 0;
@@ -4345,6 +4348,17 @@ static int mvpp2_bm_init(struct platform_device *pdev, struct mvpp2 *priv)
     return 0;
 }
 
+static void mvpp2_setup_bm_pool(void)
+{
+    /* Short pool */
+    mvpp2_pools[MVPP2_BM_SHORT].buf_num  = MVPP2_BM_SHORT_BUF_NUM;
+    mvpp2_pools[MVPP2_BM_SHORT].pkt_size = MVPP2_BM_SHORT_PKT_SIZE;
+
+    /* Long pool */
+    mvpp2_pools[MVPP2_BM_LONG].buf_num  = MVPP2_BM_LONG_BUF_NUM;
+    mvpp2_pools[MVPP2_BM_LONG].pkt_size = MVPP2_BM_LONG_PKT_SIZE;
+}
+
 /* Attach long pool to rxq */
 static void mvpp2_rxq_long_pool_set(struct mvpp2_port *port,
                     int lrxq, int long_pool)
@@ -4483,13 +4497,11 @@ static int mvpp2_bm_bufs_add(struct mvpp2_port *port,
     bm_pool->buf_num += i;
 
     netdev_dbg(port->dev,
-           "%s pool %d: pkt_size=%4d, buf_size=%4d, total_size=%4d\n",
-           bm_pool->type == MVPP2_BM_SWF_SHORT ? "short" : " long",
+           "pool %d: pkt_size=%4d, buf_size=%4d, total_size=%4d\n",
            bm_pool->id, bm_pool->pkt_size, buf_size, total_size);
 
     netdev_dbg(port->dev,
-           "%s pool %d: %d of %d buffers added\n",
-           bm_pool->type == MVPP2_BM_SWF_SHORT ? "short" : " long",
+           "pool %d: %d of %d buffers added\n",
            bm_pool->id, i, buf_num);
     return i;
 }
@@ -4498,25 +4510,20 @@ static int mvpp2_bm_bufs_add(struct mvpp2_port *port,
  * pool pointer on success
  */
 static struct mvpp2_bm_pool *
-mvpp2_bm_pool_use(struct mvpp2_port *port, int pool, enum mvpp2_bm_type type,
-          int pkt_size)
+mvpp2_bm_pool_use(struct mvpp2_port *port, unsigned pool, int pkt_size)
 {
     struct mvpp2_bm_pool *new_pool = &port->priv->bm_pools[pool];
     int num;
 
-    if (new_pool->type != MVPP2_BM_FREE && new_pool->type != type) {
-        netdev_err(port->dev, "mixing pool types is forbidden\n");
+    if (pool >= MVPP2_BM_POOLS_NUM) {
+        netdev_err(port->dev, "Invalid pool %d\n", pool);
         return NULL;
     }
 
-    if (new_pool->type == MVPP2_BM_FREE)
-        new_pool->type = type;
-
     /* Allocate buffers in case BM pool is used as long pool, but packet
      * size doesn't match MTU or BM pool hasn't being used yet
      */
-    if (((type == MVPP2_BM_SWF_LONG) && (pkt_size > new_pool->pkt_size)) ||
-        (new_pool->pkt_size == 0)) {
+    if (new_pool->pkt_size == 0) {
         int pkts_num;
 
         /* Set default buffer number or free all the buffers in case
@@ -4524,9 +4531,7 @@ mvpp2_bm_pool_use(struct mvpp2_port *port, int pool, enum mvpp2_bm_type type,
          */
         pkts_num = new_pool->buf_num;
         if (pkts_num == 0)
-            pkts_num = type == MVPP2_BM_SWF_LONG ?
-                   MVPP2_BM_LONG_BUF_NUM :
-                   MVPP2_BM_SHORT_BUF_NUM;
+            pkts_num = mvpp2_pools[pool].buf_num;
         else
             mvpp2_bm_bufs_free(port->dev->dev.parent,
                        port->priv, new_pool);
@@ -4558,9 +4563,8 @@ static int mvpp2_swf_bm_pool_init(struct mvpp2_port *port)
 
     if (!port->pool_long) {
         port->pool_long =
-               mvpp2_bm_pool_use(port, MVPP2_BM_SWF_LONG_POOL(port->id),
-                     MVPP2_BM_SWF_LONG,
-                     port->pkt_size);
+            mvpp2_bm_pool_use(port, MVPP2_BM_LONG,
+                      mvpp2_pools[MVPP2_BM_LONG].pkt_size);
         if (!port->pool_long)
             return -ENOMEM;
 
@@ -4572,9 +4576,8 @@ static int mvpp2_swf_bm_pool_init(struct mvpp2_port *port)
 
     if (!port->pool_short) {
         port->pool_short =
-            mvpp2_bm_pool_use(port, MVPP2_BM_SWF_SHORT_POOL,
-                      MVPP2_BM_SWF_SHORT,
-                      MVPP2_BM_SHORT_PKT_SIZE);
+            mvpp2_bm_pool_use(port, MVPP2_BM_SHORT,
+                      mvpp2_pools[MVPP2_BM_SHORT].pkt_size);
         if (!port->pool_short)
             return -ENOMEM;
 
@@ -4593,7 +4596,6 @@ static int mvpp2_bm_update_mtu(struct net_device *dev, int mtu)
     struct mvpp2_port *port = netdev_priv(dev);
     struct mvpp2_bm_pool *port_pool = port->pool_long;
     int num, pkts_num = port_pool->buf_num;
-    int pkt_size = MVPP2_RX_PKT_SIZE(mtu);
 
     /* Update BM pool with new buffer size */
     mvpp2_bm_bufs_free(dev->dev.parent, port->priv, port_pool);
@@ -4602,18 +4604,12 @@ static int mvpp2_bm_update_mtu(struct net_device *dev, int mtu)
         return -EIO;
     }
 
-    port_pool->pkt_size = pkt_size;
-    port_pool->frag_size = SKB_DATA_ALIGN(MVPP2_RX_BUF_SIZE(pkt_size)) +
-        MVPP2_SKB_SHINFO_SIZE;
     num = mvpp2_bm_bufs_add(port, port_pool, pkts_num);
     if (num != pkts_num) {
         WARN(1, "pool %d: %d of %d allocated\n",
              port_pool->id, num, pkts_num);
         return -EIO;
     }
-
-    mvpp2_bm_pool_bufsize_set(port->priv, port_pool,
-                  MVPP2_RX_BUF_SIZE(port_pool->pkt_size));
     dev->mtu = mtu;
     netdev_update_features(dev);
     return 0;
@@ -8630,6 +8626,8 @@ static int mvpp2_probe(struct platform_device *pdev)
             priv->sysctrl_base = NULL;
     }
 
+    mvpp2_setup_bm_pool();
+
     for (i = 0; i < MVPP2_MAX_THREADS; i++) {
         u32 addr_space_sz;
 
-- 
2.7.4