forked from ~ljy/RK356X_SDK_RELEASE

hc
2024-05-10 9999e48639b3cecb08ffb37358bcba3b48161b29
kernel/drivers/net/ethernet/stmicro/stmmac/hwif.c
....@@ -23,6 +23,18 @@
2323 return reg & GENMASK(7, 0);
2424 }
2525
26
+static u32 stmmac_get_dev_id(struct stmmac_priv *priv, u32 id_reg)
27
+{
28
+ u32 reg = readl(priv->ioaddr + id_reg);
29
+
30
+ if (!reg) {
31
+ dev_info(priv->device, "Version ID not available\n");
32
+ return 0x0;
33
+ }
34
+
35
+ return (reg & GENMASK(15, 8)) >> 8;
36
+}
37
+
2638 #ifdef CONFIG_STMMAC_FULL
2739 static void stmmac_dwmac_mode_quirk(struct stmmac_priv *priv)
2840 {
....@@ -69,6 +81,12 @@
6981 stmmac_dwmac_mode_quirk(priv);
7082 return 0;
7183 }
84
+
85
+static int stmmac_dwxlgmac_quirks(struct stmmac_priv *priv)
86
+{
87
+ priv->hw->xlgmac = true;
88
+ return 0;
89
+}
7290 #endif
7391
7492 static const struct stmmac_hwif_entry {
....@@ -76,15 +94,15 @@
7694 bool gmac4;
7795 bool xgmac;
7896 u32 min_id;
97
+ u32 dev_id;
7998 const struct stmmac_regs_off regs;
8099 const void *desc;
81100 const void *dma;
82101 const void *mac;
83
-#ifdef CONFIG_STMMAC_PTP
84102 const void *hwtimestamp;
85
-#endif
86103 const void *mode;
87104 const void *tc;
105
+ const void *mmc;
88106 int (*setup)(struct stmmac_priv *priv);
89107 int (*quirks)(struct stmmac_priv *priv);
90108 } stmmac_hw[] = {
....@@ -102,11 +120,10 @@
102120 .desc = NULL,
103121 .dma = &dwmac100_dma_ops,
104122 .mac = &dwmac100_ops,
105
-#ifdef CONFIG_STMMAC_PTP
106123 .hwtimestamp = &stmmac_ptp,
107
-#endif
108124 .mode = NULL,
109125 .tc = NULL,
126
+ .mmc = &dwmac_mmc_ops,
110127 .setup = dwmac100_setup,
111128 .quirks = stmmac_dwmac1_quirks,
112129 }, {
....@@ -121,11 +138,10 @@
121138 .desc = NULL,
122139 .dma = &dwmac1000_dma_ops,
123140 .mac = &dwmac1000_ops,
124
-#ifdef CONFIG_STMMAC_PTP
125141 .hwtimestamp = &stmmac_ptp,
126
-#endif
127142 .mode = NULL,
128143 .tc = NULL,
144
+ .mmc = &dwmac_mmc_ops,
129145 .setup = dwmac1000_setup,
130146 .quirks = stmmac_dwmac1_quirks,
131147 }, {
....@@ -140,11 +156,10 @@
140156 .desc = &dwmac4_desc_ops,
141157 .dma = &dwmac4_dma_ops,
142158 .mac = &dwmac4_ops,
143
-#ifdef CONFIG_STMMAC_PTP
144159 .hwtimestamp = &stmmac_ptp,
145
-#endif
146160 .mode = NULL,
147
- .tc = NULL,
161
+ .tc = &dwmac510_tc_ops,
162
+ .mmc = &dwmac_mmc_ops,
148163 .setup = dwmac4_setup,
149164 .quirks = stmmac_dwmac4_quirks,
150165 }, {
....@@ -159,11 +174,10 @@
159174 .desc = &dwmac4_desc_ops,
160175 .dma = &dwmac4_dma_ops,
161176 .mac = &dwmac410_ops,
162
-#ifdef CONFIG_STMMAC_PTP
163177 .hwtimestamp = &stmmac_ptp,
164
-#endif
165178 .mode = &dwmac4_ring_mode_ops,
166
- .tc = NULL,
179
+ .tc = &dwmac510_tc_ops,
180
+ .mmc = &dwmac_mmc_ops,
167181 .setup = dwmac4_setup,
168182 .quirks = NULL,
169183 },
....@@ -180,11 +194,12 @@
180194 .desc = &dwmac4_desc_ops,
181195 .dma = &dwmac410_dma_ops,
182196 .mac = &dwmac410_ops,
183
-#ifdef CONFIG_STMMAC_PTP
184197 .hwtimestamp = &stmmac_ptp,
185
-#endif
186198 .mode = &dwmac4_ring_mode_ops,
187
- .tc = NULL,
199
+#ifdef CONFIG_STMMAC_FULL
200
+ .tc = &dwmac510_tc_ops,
201
+#endif
202
+ .mmc = &dwmac_mmc_ops,
188203 .setup = dwmac4_setup,
189204 .quirks = NULL,
190205 },
....@@ -201,11 +216,10 @@
201216 .desc = &dwmac4_desc_ops,
202217 .dma = &dwmac410_dma_ops,
203218 .mac = &dwmac510_ops,
204
-#ifdef CONFIG_STMMAC_PTP
205219 .hwtimestamp = &stmmac_ptp,
206
-#endif
207220 .mode = &dwmac4_ring_mode_ops,
208221 .tc = &dwmac510_tc_ops,
222
+ .mmc = &dwmac_mmc_ops,
209223 .setup = dwmac4_setup,
210224 .quirks = NULL,
211225 }, {
....@@ -213,20 +227,39 @@
213227 .gmac4 = false,
214228 .xgmac = true,
215229 .min_id = DWXGMAC_CORE_2_10,
230
+ .dev_id = DWXGMAC_ID,
216231 .regs = {
217232 .ptp_off = PTP_XGMAC_OFFSET,
218
- .mmc_off = 0,
233
+ .mmc_off = MMC_XGMAC_OFFSET,
219234 },
220235 .desc = &dwxgmac210_desc_ops,
221236 .dma = &dwxgmac210_dma_ops,
222237 .mac = &dwxgmac210_ops,
223
-#ifdef CONFIG_STMMAC_PTP
224238 .hwtimestamp = &stmmac_ptp,
225
-#endif
226239 .mode = NULL,
227
- .tc = NULL,
240
+ .tc = &dwmac510_tc_ops,
241
+ .mmc = &dwxgmac_mmc_ops,
228242 .setup = dwxgmac2_setup,
229243 .quirks = NULL,
244
+ }, {
245
+ .gmac = false,
246
+ .gmac4 = false,
247
+ .xgmac = true,
248
+ .min_id = DWXLGMAC_CORE_2_00,
249
+ .dev_id = DWXLGMAC_ID,
250
+ .regs = {
251
+ .ptp_off = PTP_XGMAC_OFFSET,
252
+ .mmc_off = MMC_XGMAC_OFFSET,
253
+ },
254
+ .desc = &dwxgmac210_desc_ops,
255
+ .dma = &dwxgmac210_dma_ops,
256
+ .mac = &dwxlgmac2_ops,
257
+ .hwtimestamp = &stmmac_ptp,
258
+ .mode = NULL,
259
+ .tc = &dwmac510_tc_ops,
260
+ .mmc = &dwxgmac_mmc_ops,
261
+ .setup = dwxlgmac2_setup,
262
+ .quirks = stmmac_dwxlgmac_quirks,
230263 },
231264 #endif
232265 };
....@@ -239,13 +272,15 @@
239272 const struct stmmac_hwif_entry *entry;
240273 struct mac_device_info *mac;
241274 bool needs_setup = true;
275
+ u32 id, dev_id = 0;
242276 int i, ret;
243
- u32 id;
244277
245278 if (needs_gmac) {
246279 id = stmmac_get_id(priv, GMAC_VERSION);
247280 } else if (needs_gmac4 || needs_xgmac) {
248281 id = stmmac_get_id(priv, GMAC4_VERSION);
282
+ if (needs_xgmac)
283
+ dev_id = stmmac_get_dev_id(priv, GMAC4_VERSION);
249284 } else {
250285 id = 0;
251286 }
....@@ -283,16 +318,17 @@
283318 /* Use synopsys_id var because some setups can override this */
284319 if (priv->synopsys_id < entry->min_id)
285320 continue;
321
+ if (needs_xgmac && (dev_id ^ entry->dev_id))
322
+ continue;
286323
287324 /* Only use generic HW helpers if needed */
288325 mac->desc = mac->desc ? : entry->desc;
289326 mac->dma = mac->dma ? : entry->dma;
290327 mac->mac = mac->mac ? : entry->mac;
291
-#ifdef CONFIG_STMMAC_PTP
292328 mac->ptp = mac->ptp ? : entry->hwtimestamp;
293
-#endif
294329 mac->mode = mac->mode ? : entry->mode;
295330 mac->tc = mac->tc ? : entry->tc;
331
+ mac->mmc = mac->mmc ? : entry->mmc;
296332
297333 priv->hw = mac;
298334 priv->ptpaddr = priv->ioaddr + entry->regs.ptp_off;