forked from ~ljy/RK356X_SDK_RELEASE

hc
2024-05-10 9999e48639b3cecb08ffb37358bcba3b48161b29
kernel/drivers/net/ethernet/stmicro/stmmac/hwif.c
....@@ -23,6 +23,19 @@
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
+
38
+#ifdef CONFIG_STMMAC_FULL
2639 static void stmmac_dwmac_mode_quirk(struct stmmac_priv *priv)
2740 {
2841 struct mac_device_info *mac = priv->hw;
....@@ -69,11 +82,19 @@
6982 return 0;
7083 }
7184
85
+static int stmmac_dwxlgmac_quirks(struct stmmac_priv *priv)
86
+{
87
+ priv->hw->xlgmac = true;
88
+ return 0;
89
+}
90
+#endif
91
+
7292 static const struct stmmac_hwif_entry {
7393 bool gmac;
7494 bool gmac4;
7595 bool xgmac;
7696 u32 min_id;
97
+ u32 dev_id;
7798 const struct stmmac_regs_off regs;
7899 const void *desc;
79100 const void *dma;
....@@ -81,10 +102,12 @@
81102 const void *hwtimestamp;
82103 const void *mode;
83104 const void *tc;
105
+ const void *mmc;
84106 int (*setup)(struct stmmac_priv *priv);
85107 int (*quirks)(struct stmmac_priv *priv);
86108 } stmmac_hw[] = {
87109 /* NOTE: New HW versions shall go to the end of this table */
110
+#ifdef CONFIG_STMMAC_FULL
88111 {
89112 .gmac = false,
90113 .gmac4 = false,
....@@ -100,6 +123,7 @@
100123 .hwtimestamp = &stmmac_ptp,
101124 .mode = NULL,
102125 .tc = NULL,
126
+ .mmc = &dwmac_mmc_ops,
103127 .setup = dwmac100_setup,
104128 .quirks = stmmac_dwmac1_quirks,
105129 }, {
....@@ -117,6 +141,7 @@
117141 .hwtimestamp = &stmmac_ptp,
118142 .mode = NULL,
119143 .tc = NULL,
144
+ .mmc = &dwmac_mmc_ops,
120145 .setup = dwmac1000_setup,
121146 .quirks = stmmac_dwmac1_quirks,
122147 }, {
....@@ -133,7 +158,8 @@
133158 .mac = &dwmac4_ops,
134159 .hwtimestamp = &stmmac_ptp,
135160 .mode = NULL,
136
- .tc = NULL,
161
+ .tc = &dwmac510_tc_ops,
162
+ .mmc = &dwmac_mmc_ops,
137163 .setup = dwmac4_setup,
138164 .quirks = stmmac_dwmac4_quirks,
139165 }, {
....@@ -150,10 +176,13 @@
150176 .mac = &dwmac410_ops,
151177 .hwtimestamp = &stmmac_ptp,
152178 .mode = &dwmac4_ring_mode_ops,
153
- .tc = NULL,
179
+ .tc = &dwmac510_tc_ops,
180
+ .mmc = &dwmac_mmc_ops,
154181 .setup = dwmac4_setup,
155182 .quirks = NULL,
156
- }, {
183
+ },
184
+#endif /* CONFIG_STMMAC_FULL */
185
+ {
157186 .gmac = false,
158187 .gmac4 = true,
159188 .xgmac = false,
....@@ -167,10 +196,15 @@
167196 .mac = &dwmac410_ops,
168197 .hwtimestamp = &stmmac_ptp,
169198 .mode = &dwmac4_ring_mode_ops,
170
- .tc = NULL,
199
+#ifdef CONFIG_STMMAC_FULL
200
+ .tc = &dwmac510_tc_ops,
201
+#endif
202
+ .mmc = &dwmac_mmc_ops,
171203 .setup = dwmac4_setup,
172204 .quirks = NULL,
173
- }, {
205
+ },
206
+#ifdef CONFIG_STMMAC_FULL
207
+ {
174208 .gmac = false,
175209 .gmac4 = true,
176210 .xgmac = false,
....@@ -185,6 +219,7 @@
185219 .hwtimestamp = &stmmac_ptp,
186220 .mode = &dwmac4_ring_mode_ops,
187221 .tc = &dwmac510_tc_ops,
222
+ .mmc = &dwmac_mmc_ops,
188223 .setup = dwmac4_setup,
189224 .quirks = NULL,
190225 }, {
....@@ -192,19 +227,41 @@
192227 .gmac4 = false,
193228 .xgmac = true,
194229 .min_id = DWXGMAC_CORE_2_10,
230
+ .dev_id = DWXGMAC_ID,
195231 .regs = {
196232 .ptp_off = PTP_XGMAC_OFFSET,
197
- .mmc_off = 0,
233
+ .mmc_off = MMC_XGMAC_OFFSET,
198234 },
199235 .desc = &dwxgmac210_desc_ops,
200236 .dma = &dwxgmac210_dma_ops,
201237 .mac = &dwxgmac210_ops,
202238 .hwtimestamp = &stmmac_ptp,
203239 .mode = NULL,
204
- .tc = NULL,
240
+ .tc = &dwmac510_tc_ops,
241
+ .mmc = &dwxgmac_mmc_ops,
205242 .setup = dwxgmac2_setup,
206243 .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,
207263 },
264
+#endif
208265 };
209266
210267 int stmmac_hwif_init(struct stmmac_priv *priv)
....@@ -215,13 +272,15 @@
215272 const struct stmmac_hwif_entry *entry;
216273 struct mac_device_info *mac;
217274 bool needs_setup = true;
275
+ u32 id, dev_id = 0;
218276 int i, ret;
219
- u32 id;
220277
221278 if (needs_gmac) {
222279 id = stmmac_get_id(priv, GMAC_VERSION);
223280 } else if (needs_gmac4 || needs_xgmac) {
224281 id = stmmac_get_id(priv, GMAC4_VERSION);
282
+ if (needs_xgmac)
283
+ dev_id = stmmac_get_dev_id(priv, GMAC4_VERSION);
225284 } else {
226285 id = 0;
227286 }
....@@ -259,6 +318,8 @@
259318 /* Use synopsys_id var because some setups can override this */
260319 if (priv->synopsys_id < entry->min_id)
261320 continue;
321
+ if (needs_xgmac && (dev_id ^ entry->dev_id))
322
+ continue;
262323
263324 /* Only use generic HW helpers if needed */
264325 mac->desc = mac->desc ? : entry->desc;
....@@ -267,6 +328,7 @@
267328 mac->ptp = mac->ptp ? : entry->hwtimestamp;
268329 mac->mode = mac->mode ? : entry->mode;
269330 mac->tc = mac->tc ? : entry->tc;
331
+ mac->mmc = mac->mmc ? : entry->mmc;
270332
271333 priv->hw = mac;
272334 priv->ptpaddr = priv->ioaddr + entry->regs.ptp_off;