1 // SPDX-License-Identifier: GPL-2.0
2 /* Copyright (c) 2020, Intel Corporation
5 #include <linux/clk-provider.h>
8 #include "dwmac-intel.h"
11 #include "stmmac_ptp.h"
13 #define INTEL_MGBE_ADHOC_ADDR 0x15
14 #define INTEL_MGBE_XPCS_ADDR 0x16
16 /* Selection for PTP Clock Freq belongs to PSE & PCH GbE */
17 #define PSE_PTP_CLK_FREQ_MASK (GMAC_GPO0 | GMAC_GPO3)
18 #define PSE_PTP_CLK_FREQ_19_2MHZ (GMAC_GPO0)
19 #define PSE_PTP_CLK_FREQ_200MHZ (GMAC_GPO0 | GMAC_GPO3)
20 #define PSE_PTP_CLK_FREQ_256MHZ (0)
21 #define PCH_PTP_CLK_FREQ_MASK (GMAC_GPO0)
22 #define PCH_PTP_CLK_FREQ_19_2MHZ (GMAC_GPO0)
23 #define PCH_PTP_CLK_FREQ_200MHZ (0)
25 struct intel_priv_data {
26 int mdio_adhoc_addr; /* mdio address for serdes & etc */
30 /* This struct is used to associate PCI Function of MAC controller on a board,
31 * discovered via DMI, with the address of PHY connected to the MAC. The
32 * negative value of the address means that MAC controller is not connected
35 struct stmmac_pci_func_data {
40 struct stmmac_pci_dmi_data {
41 const struct stmmac_pci_func_data *func;
45 struct stmmac_pci_info {
46 int (*setup)(struct pci_dev *pdev, struct plat_stmmacenet_data *plat);
49 static int stmmac_pci_find_phy_addr(struct pci_dev *pdev,
50 const struct dmi_system_id *dmi_list)
52 const struct stmmac_pci_func_data *func_data;
53 const struct stmmac_pci_dmi_data *dmi_data;
54 const struct dmi_system_id *dmi_id;
55 int func = PCI_FUNC(pdev->devfn);
58 dmi_id = dmi_first_match(dmi_list);
62 dmi_data = dmi_id->driver_data;
63 func_data = dmi_data->func;
65 for (n = 0; n < dmi_data->nfuncs; n++, func_data++)
66 if (func_data->func == func)
67 return func_data->phy_addr;
72 static int serdes_status_poll(struct stmmac_priv *priv, int phyaddr,
73 int phyreg, u32 mask, u32 val)
75 unsigned int retries = 10;
79 val_rd = mdiobus_read(priv->mii, phyaddr, phyreg);
80 if ((val_rd & mask) == (val & mask))
82 udelay(POLL_DELAY_US);
88 static int intel_serdes_powerup(struct net_device *ndev, void *priv_data)
90 struct intel_priv_data *intel_priv = priv_data;
91 struct stmmac_priv *priv = netdev_priv(ndev);
92 int serdes_phy_addr = 0;
95 if (!intel_priv->mdio_adhoc_addr)
98 serdes_phy_addr = intel_priv->mdio_adhoc_addr;
101 data = mdiobus_read(priv->mii, serdes_phy_addr, SERDES_GCR0);
102 data |= SERDES_PLL_CLK;
103 mdiobus_write(priv->mii, serdes_phy_addr, SERDES_GCR0, data);
105 /* check for clk_ack assertion */
106 data = serdes_status_poll(priv, serdes_phy_addr,
112 dev_err(priv->device, "Serdes PLL clk request timeout\n");
116 /* assert lane reset */
117 data = mdiobus_read(priv->mii, serdes_phy_addr, SERDES_GCR0);
119 mdiobus_write(priv->mii, serdes_phy_addr, SERDES_GCR0, data);
121 /* check for assert lane reset reflection */
122 data = serdes_status_poll(priv, serdes_phy_addr,
128 dev_err(priv->device, "Serdes assert lane reset timeout\n");
132 /* move power state to P0 */
133 data = mdiobus_read(priv->mii, serdes_phy_addr, SERDES_GCR0);
135 data &= ~SERDES_PWR_ST_MASK;
136 data |= SERDES_PWR_ST_P0 << SERDES_PWR_ST_SHIFT;
138 mdiobus_write(priv->mii, serdes_phy_addr, SERDES_GCR0, data);
140 /* Check for P0 state */
141 data = serdes_status_poll(priv, serdes_phy_addr,
144 SERDES_PWR_ST_P0 << SERDES_PWR_ST_SHIFT);
147 dev_err(priv->device, "Serdes power state P0 timeout.\n");
154 static void intel_serdes_powerdown(struct net_device *ndev, void *intel_data)
156 struct intel_priv_data *intel_priv = intel_data;
157 struct stmmac_priv *priv = netdev_priv(ndev);
158 int serdes_phy_addr = 0;
161 if (!intel_priv->mdio_adhoc_addr)
164 serdes_phy_addr = intel_priv->mdio_adhoc_addr;
166 /* move power state to P3 */
167 data = mdiobus_read(priv->mii, serdes_phy_addr, SERDES_GCR0);
169 data &= ~SERDES_PWR_ST_MASK;
170 data |= SERDES_PWR_ST_P3 << SERDES_PWR_ST_SHIFT;
172 mdiobus_write(priv->mii, serdes_phy_addr, SERDES_GCR0, data);
174 /* Check for P3 state */
175 data = serdes_status_poll(priv, serdes_phy_addr,
178 SERDES_PWR_ST_P3 << SERDES_PWR_ST_SHIFT);
181 dev_err(priv->device, "Serdes power state P3 timeout\n");
185 /* de-assert clk_req */
186 data = mdiobus_read(priv->mii, serdes_phy_addr, SERDES_GCR0);
187 data &= ~SERDES_PLL_CLK;
188 mdiobus_write(priv->mii, serdes_phy_addr, SERDES_GCR0, data);
190 /* check for clk_ack de-assert */
191 data = serdes_status_poll(priv, serdes_phy_addr,
194 (u32)~SERDES_PLL_CLK);
197 dev_err(priv->device, "Serdes PLL clk de-assert timeout\n");
201 /* de-assert lane reset */
202 data = mdiobus_read(priv->mii, serdes_phy_addr, SERDES_GCR0);
204 mdiobus_write(priv->mii, serdes_phy_addr, SERDES_GCR0, data);
206 /* check for de-assert lane reset reflection */
207 data = serdes_status_poll(priv, serdes_phy_addr,
213 dev_err(priv->device, "Serdes de-assert lane reset timeout\n");
218 /* Program PTP Clock Frequency for different variant of
219 * Intel mGBE that has slightly different GPO mapping
221 static void intel_mgbe_ptp_clk_freq_config(void *npriv)
223 struct stmmac_priv *priv = (struct stmmac_priv *)npriv;
224 struct intel_priv_data *intel_priv;
227 intel_priv = (struct intel_priv_data *)priv->plat->bsp_priv;
229 gpio_value = readl(priv->ioaddr + GMAC_GPIO_STATUS);
231 if (intel_priv->is_pse) {
232 /* For PSE GbE, use 200MHz */
233 gpio_value &= ~PSE_PTP_CLK_FREQ_MASK;
234 gpio_value |= PSE_PTP_CLK_FREQ_200MHZ;
236 /* For PCH GbE, use 200MHz */
237 gpio_value &= ~PCH_PTP_CLK_FREQ_MASK;
238 gpio_value |= PCH_PTP_CLK_FREQ_200MHZ;
241 writel(gpio_value, priv->ioaddr + GMAC_GPIO_STATUS);
244 static void get_arttime(struct mii_bus *mii, int intel_adhoc_addr,
249 ns = mdiobus_read(mii, intel_adhoc_addr, PMC_ART_VALUE3);
250 ns <<= GMAC4_ART_TIME_SHIFT;
251 ns |= mdiobus_read(mii, intel_adhoc_addr, PMC_ART_VALUE2);
252 ns <<= GMAC4_ART_TIME_SHIFT;
253 ns |= mdiobus_read(mii, intel_adhoc_addr, PMC_ART_VALUE1);
254 ns <<= GMAC4_ART_TIME_SHIFT;
255 ns |= mdiobus_read(mii, intel_adhoc_addr, PMC_ART_VALUE0);
260 static int intel_crosststamp(ktime_t *device,
261 struct system_counterval_t *system,
264 struct intel_priv_data *intel_priv;
266 struct stmmac_priv *priv = (struct stmmac_priv *)ctx;
267 void __iomem *ptpaddr = priv->ptpaddr;
268 void __iomem *ioaddr = priv->hw->pcsr;
279 if (!boot_cpu_has(X86_FEATURE_ART))
282 intel_priv = priv->plat->bsp_priv;
284 /* Enable Internal snapshot trigger */
285 acr_value = readl(ptpaddr + PTP_ACR);
286 acr_value &= ~PTP_ACR_MASK;
287 switch (priv->plat->int_snapshot_num) {
289 acr_value |= PTP_ACR_ATSEN0;
292 acr_value |= PTP_ACR_ATSEN1;
295 acr_value |= PTP_ACR_ATSEN2;
298 acr_value |= PTP_ACR_ATSEN3;
303 writel(acr_value, ptpaddr + PTP_ACR);
306 acr_value = readl(ptpaddr + PTP_ACR);
307 acr_value |= PTP_ACR_ATSFC;
308 writel(acr_value, ptpaddr + PTP_ACR);
310 /* Trigger Internal snapshot signal
311 * Create a rising edge by just toggle the GPO1 to low
314 gpio_value = readl(ioaddr + GMAC_GPIO_STATUS);
315 gpio_value &= ~GMAC_GPO1;
316 writel(gpio_value, ioaddr + GMAC_GPIO_STATUS);
317 gpio_value |= GMAC_GPO1;
318 writel(gpio_value, ioaddr + GMAC_GPIO_STATUS);
320 /* Poll for time sync operation done */
321 ret = readl_poll_timeout(priv->ioaddr + GMAC_INT_STATUS, v,
322 (v & GMAC_INT_TSIE), 100, 10000);
324 if (ret == -ETIMEDOUT) {
325 pr_err("%s: Wait for time sync operation timeout\n", __func__);
329 num_snapshot = (readl(ioaddr + GMAC_TIMESTAMP_STATUS) &
330 GMAC_TIMESTAMP_ATSNS_MASK) >>
331 GMAC_TIMESTAMP_ATSNS_SHIFT;
333 /* Repeat until the timestamps are from the FIFO last segment */
334 for (i = 0; i < num_snapshot; i++) {
335 spin_lock_irqsave(&priv->ptp_lock, flags);
336 stmmac_get_ptptime(priv, ptpaddr, &ptp_time);
337 *device = ns_to_ktime(ptp_time);
338 spin_unlock_irqrestore(&priv->ptp_lock, flags);
339 get_arttime(priv->mii, intel_priv->mdio_adhoc_addr, &art_time);
340 *system = convert_art_to_tsc(art_time);
346 static void common_default_data(struct plat_stmmacenet_data *plat)
348 plat->clk_csr = 2; /* clk_csr_i = 20-35MHz & MDC = clk_csr_i/16 */
350 plat->force_sf_dma_mode = 1;
352 plat->mdio_bus_data->needs_reset = true;
354 /* Set default value for multicast hash bins */
355 plat->multicast_filter_bins = HASH_TABLE_SIZE;
357 /* Set default value for unicast filter entries */
358 plat->unicast_filter_entries = 1;
360 /* Set the maxmtu to a default of JUMBO_LEN */
361 plat->maxmtu = JUMBO_LEN;
363 /* Set default number of RX and TX queues to use */
364 plat->tx_queues_to_use = 1;
365 plat->rx_queues_to_use = 1;
367 /* Disable Priority config by default */
368 plat->tx_queues_cfg[0].use_prio = false;
369 plat->rx_queues_cfg[0].use_prio = false;
371 /* Disable RX queues routing by default */
372 plat->rx_queues_cfg[0].pkt_route = 0x0;
375 static int intel_mgbe_common_data(struct pci_dev *pdev,
376 struct plat_stmmacenet_data *plat)
387 plat->force_sf_dma_mode = 0;
390 plat->rx_sched_algorithm = MTL_RX_ALGORITHM_SP;
392 for (i = 0; i < plat->rx_queues_to_use; i++) {
393 plat->rx_queues_cfg[i].mode_to_use = MTL_QUEUE_DCB;
394 plat->rx_queues_cfg[i].chan = i;
396 /* Disable Priority config by default */
397 plat->rx_queues_cfg[i].use_prio = false;
399 /* Disable RX queues routing by default */
400 plat->rx_queues_cfg[i].pkt_route = 0x0;
403 for (i = 0; i < plat->tx_queues_to_use; i++) {
404 plat->tx_queues_cfg[i].mode_to_use = MTL_QUEUE_DCB;
406 /* Disable Priority config by default */
407 plat->tx_queues_cfg[i].use_prio = false;
410 /* FIFO size is 4096 bytes for 1 tx/rx queue */
411 plat->tx_fifo_size = plat->tx_queues_to_use * 4096;
412 plat->rx_fifo_size = plat->rx_queues_to_use * 4096;
414 plat->tx_sched_algorithm = MTL_TX_ALGORITHM_WRR;
415 plat->tx_queues_cfg[0].weight = 0x09;
416 plat->tx_queues_cfg[1].weight = 0x0A;
417 plat->tx_queues_cfg[2].weight = 0x0B;
418 plat->tx_queues_cfg[3].weight = 0x0C;
419 plat->tx_queues_cfg[4].weight = 0x0D;
420 plat->tx_queues_cfg[5].weight = 0x0E;
421 plat->tx_queues_cfg[6].weight = 0x0F;
422 plat->tx_queues_cfg[7].weight = 0x10;
424 plat->dma_cfg->pbl = 32;
425 plat->dma_cfg->pblx8 = true;
426 plat->dma_cfg->fixed_burst = 0;
427 plat->dma_cfg->mixed_burst = 0;
428 plat->dma_cfg->aal = 0;
430 plat->axi = devm_kzalloc(&pdev->dev, sizeof(*plat->axi),
435 plat->axi->axi_lpi_en = 0;
436 plat->axi->axi_xit_frm = 0;
437 plat->axi->axi_wr_osr_lmt = 1;
438 plat->axi->axi_rd_osr_lmt = 1;
439 plat->axi->axi_blen[0] = 4;
440 plat->axi->axi_blen[1] = 8;
441 plat->axi->axi_blen[2] = 16;
443 plat->ptp_max_adj = plat->clk_ptp_rate;
444 plat->eee_usecs_rate = plat->clk_ptp_rate;
446 /* Set system clock */
447 sprintf(clk_name, "%s-%s", "stmmac", pci_name(pdev));
449 plat->stmmac_clk = clk_register_fixed_rate(&pdev->dev,
453 if (IS_ERR(plat->stmmac_clk)) {
454 dev_warn(&pdev->dev, "Fail to register stmmac-clk\n");
455 plat->stmmac_clk = NULL;
458 ret = clk_prepare_enable(plat->stmmac_clk);
460 clk_unregister_fixed_rate(plat->stmmac_clk);
464 plat->ptp_clk_freq_config = intel_mgbe_ptp_clk_freq_config;
466 /* Set default value for multicast hash bins */
467 plat->multicast_filter_bins = HASH_TABLE_SIZE;
469 /* Set default value for unicast filter entries */
470 plat->unicast_filter_entries = 1;
472 /* Set the maxmtu to a default of JUMBO_LEN */
473 plat->maxmtu = JUMBO_LEN;
475 plat->vlan_fail_q_en = true;
477 /* Use the last Rx queue */
478 plat->vlan_fail_q = plat->rx_queues_to_use - 1;
480 /* Intel mgbe SGMII interface uses pcs-xcps */
481 if (plat->phy_interface == PHY_INTERFACE_MODE_SGMII) {
482 plat->mdio_bus_data->has_xpcs = true;
483 plat->mdio_bus_data->xpcs_an_inband = true;
486 /* Ensure mdio bus scan skips intel serdes and pcs-xpcs */
487 plat->mdio_bus_data->phy_mask = 1 << INTEL_MGBE_ADHOC_ADDR;
488 plat->mdio_bus_data->phy_mask |= 1 << INTEL_MGBE_XPCS_ADDR;
490 plat->int_snapshot_num = AUX_SNAPSHOT1;
492 plat->has_crossts = true;
493 plat->crosststamp = intel_crosststamp;
498 static int ehl_common_data(struct pci_dev *pdev,
499 struct plat_stmmacenet_data *plat)
501 plat->rx_queues_to_use = 8;
502 plat->tx_queues_to_use = 8;
503 plat->clk_ptp_rate = 200000000;
505 return intel_mgbe_common_data(pdev, plat);
508 static int ehl_sgmii_data(struct pci_dev *pdev,
509 struct plat_stmmacenet_data *plat)
512 plat->phy_interface = PHY_INTERFACE_MODE_SGMII;
514 plat->serdes_powerup = intel_serdes_powerup;
515 plat->serdes_powerdown = intel_serdes_powerdown;
517 return ehl_common_data(pdev, plat);
520 static struct stmmac_pci_info ehl_sgmii1g_info = {
521 .setup = ehl_sgmii_data,
524 static int ehl_rgmii_data(struct pci_dev *pdev,
525 struct plat_stmmacenet_data *plat)
528 plat->phy_interface = PHY_INTERFACE_MODE_RGMII;
530 return ehl_common_data(pdev, plat);
533 static struct stmmac_pci_info ehl_rgmii1g_info = {
534 .setup = ehl_rgmii_data,
537 static int ehl_pse0_common_data(struct pci_dev *pdev,
538 struct plat_stmmacenet_data *plat)
540 struct intel_priv_data *intel_priv = plat->bsp_priv;
542 intel_priv->is_pse = true;
546 return ehl_common_data(pdev, plat);
549 static int ehl_pse0_rgmii1g_data(struct pci_dev *pdev,
550 struct plat_stmmacenet_data *plat)
552 plat->phy_interface = PHY_INTERFACE_MODE_RGMII_ID;
553 return ehl_pse0_common_data(pdev, plat);
556 static struct stmmac_pci_info ehl_pse0_rgmii1g_info = {
557 .setup = ehl_pse0_rgmii1g_data,
560 static int ehl_pse0_sgmii1g_data(struct pci_dev *pdev,
561 struct plat_stmmacenet_data *plat)
563 plat->phy_interface = PHY_INTERFACE_MODE_SGMII;
564 plat->serdes_powerup = intel_serdes_powerup;
565 plat->serdes_powerdown = intel_serdes_powerdown;
566 return ehl_pse0_common_data(pdev, plat);
569 static struct stmmac_pci_info ehl_pse0_sgmii1g_info = {
570 .setup = ehl_pse0_sgmii1g_data,
573 static int ehl_pse1_common_data(struct pci_dev *pdev,
574 struct plat_stmmacenet_data *plat)
576 struct intel_priv_data *intel_priv = plat->bsp_priv;
578 intel_priv->is_pse = true;
582 return ehl_common_data(pdev, plat);
585 static int ehl_pse1_rgmii1g_data(struct pci_dev *pdev,
586 struct plat_stmmacenet_data *plat)
588 plat->phy_interface = PHY_INTERFACE_MODE_RGMII_ID;
589 return ehl_pse1_common_data(pdev, plat);
592 static struct stmmac_pci_info ehl_pse1_rgmii1g_info = {
593 .setup = ehl_pse1_rgmii1g_data,
596 static int ehl_pse1_sgmii1g_data(struct pci_dev *pdev,
597 struct plat_stmmacenet_data *plat)
599 plat->phy_interface = PHY_INTERFACE_MODE_SGMII;
600 plat->serdes_powerup = intel_serdes_powerup;
601 plat->serdes_powerdown = intel_serdes_powerdown;
602 return ehl_pse1_common_data(pdev, plat);
605 static struct stmmac_pci_info ehl_pse1_sgmii1g_info = {
606 .setup = ehl_pse1_sgmii1g_data,
609 static int tgl_common_data(struct pci_dev *pdev,
610 struct plat_stmmacenet_data *plat)
612 plat->rx_queues_to_use = 6;
613 plat->tx_queues_to_use = 4;
614 plat->clk_ptp_rate = 200000000;
616 return intel_mgbe_common_data(pdev, plat);
619 static int tgl_sgmii_phy0_data(struct pci_dev *pdev,
620 struct plat_stmmacenet_data *plat)
623 plat->phy_interface = PHY_INTERFACE_MODE_SGMII;
624 plat->serdes_powerup = intel_serdes_powerup;
625 plat->serdes_powerdown = intel_serdes_powerdown;
626 return tgl_common_data(pdev, plat);
629 static struct stmmac_pci_info tgl_sgmii1g_phy0_info = {
630 .setup = tgl_sgmii_phy0_data,
633 static int tgl_sgmii_phy1_data(struct pci_dev *pdev,
634 struct plat_stmmacenet_data *plat)
637 plat->phy_interface = PHY_INTERFACE_MODE_SGMII;
638 plat->serdes_powerup = intel_serdes_powerup;
639 plat->serdes_powerdown = intel_serdes_powerdown;
640 return tgl_common_data(pdev, plat);
643 static struct stmmac_pci_info tgl_sgmii1g_phy1_info = {
644 .setup = tgl_sgmii_phy1_data,
647 static int adls_sgmii_phy0_data(struct pci_dev *pdev,
648 struct plat_stmmacenet_data *plat)
651 plat->phy_interface = PHY_INTERFACE_MODE_SGMII;
653 /* SerDes power up and power down are done in BIOS for ADL */
655 return tgl_common_data(pdev, plat);
658 static struct stmmac_pci_info adls_sgmii1g_phy0_info = {
659 .setup = adls_sgmii_phy0_data,
662 static int adls_sgmii_phy1_data(struct pci_dev *pdev,
663 struct plat_stmmacenet_data *plat)
666 plat->phy_interface = PHY_INTERFACE_MODE_SGMII;
668 /* SerDes power up and power down are done in BIOS for ADL */
670 return tgl_common_data(pdev, plat);
673 static struct stmmac_pci_info adls_sgmii1g_phy1_info = {
674 .setup = adls_sgmii_phy1_data,
676 static const struct stmmac_pci_func_data galileo_stmmac_func_data[] = {
683 static const struct stmmac_pci_dmi_data galileo_stmmac_dmi_data = {
684 .func = galileo_stmmac_func_data,
685 .nfuncs = ARRAY_SIZE(galileo_stmmac_func_data),
688 static const struct stmmac_pci_func_data iot2040_stmmac_func_data[] = {
699 static const struct stmmac_pci_dmi_data iot2040_stmmac_dmi_data = {
700 .func = iot2040_stmmac_func_data,
701 .nfuncs = ARRAY_SIZE(iot2040_stmmac_func_data),
704 static const struct dmi_system_id quark_pci_dmi[] = {
707 DMI_EXACT_MATCH(DMI_BOARD_NAME, "Galileo"),
709 .driver_data = (void *)&galileo_stmmac_dmi_data,
713 DMI_EXACT_MATCH(DMI_BOARD_NAME, "GalileoGen2"),
715 .driver_data = (void *)&galileo_stmmac_dmi_data,
717 /* There are 2 types of SIMATIC IOT2000: IOT2020 and IOT2040.
718 * The asset tag "6ES7647-0AA00-0YA2" is only for IOT2020 which
719 * has only one pci network device while other asset tags are
720 * for IOT2040 which has two.
724 DMI_EXACT_MATCH(DMI_BOARD_NAME, "SIMATIC IOT2000"),
725 DMI_EXACT_MATCH(DMI_BOARD_ASSET_TAG,
726 "6ES7647-0AA00-0YA2"),
728 .driver_data = (void *)&galileo_stmmac_dmi_data,
732 DMI_EXACT_MATCH(DMI_BOARD_NAME, "SIMATIC IOT2000"),
734 .driver_data = (void *)&iot2040_stmmac_dmi_data,
739 static int quark_default_data(struct pci_dev *pdev,
740 struct plat_stmmacenet_data *plat)
744 /* Set common default data first */
745 common_default_data(plat);
747 /* Refuse to load the driver and register net device if MAC controller
748 * does not connect to any PHY interface.
750 ret = stmmac_pci_find_phy_addr(pdev, quark_pci_dmi);
752 /* Return error to the caller on DMI enabled boards. */
753 if (dmi_get_system_info(DMI_BOARD_NAME))
756 /* Galileo boards with old firmware don't support DMI. We always
757 * use 1 here as PHY address, so at least the first found MAC
758 * controller would be probed.
763 plat->bus_id = pci_dev_id(pdev);
764 plat->phy_addr = ret;
765 plat->phy_interface = PHY_INTERFACE_MODE_RMII;
767 plat->dma_cfg->pbl = 16;
768 plat->dma_cfg->pblx8 = true;
769 plat->dma_cfg->fixed_burst = 1;
775 static const struct stmmac_pci_info quark_info = {
776 .setup = quark_default_data,
780 * intel_eth_pci_probe
782 * @pdev: pci device pointer
783 * @id: pointer to table of device id/id's.
785 * Description: This probing function gets called for all PCI devices which
786 * match the ID table and are not "owned" by other driver yet. This function
787 * gets passed a "struct pci_dev *" for each device whose entry in the ID table
788 * matches the device. The probe functions returns zero when the driver choose
789 * to take "ownership" of the device or an error code(-ve no) otherwise.
791 static int intel_eth_pci_probe(struct pci_dev *pdev,
792 const struct pci_device_id *id)
794 struct stmmac_pci_info *info = (struct stmmac_pci_info *)id->driver_data;
795 struct intel_priv_data *intel_priv;
796 struct plat_stmmacenet_data *plat;
797 struct stmmac_resources res;
800 intel_priv = devm_kzalloc(&pdev->dev, sizeof(*intel_priv), GFP_KERNEL);
804 plat = devm_kzalloc(&pdev->dev, sizeof(*plat), GFP_KERNEL);
808 plat->mdio_bus_data = devm_kzalloc(&pdev->dev,
809 sizeof(*plat->mdio_bus_data),
811 if (!plat->mdio_bus_data)
814 plat->dma_cfg = devm_kzalloc(&pdev->dev, sizeof(*plat->dma_cfg),
819 /* Enable pci device */
820 ret = pci_enable_device(pdev);
822 dev_err(&pdev->dev, "%s: ERROR: failed to enable device\n",
827 ret = pcim_iomap_regions(pdev, BIT(0), pci_name(pdev));
831 pci_set_master(pdev);
833 plat->bsp_priv = intel_priv;
834 intel_priv->mdio_adhoc_addr = INTEL_MGBE_ADHOC_ADDR;
836 ret = info->setup(pdev, plat);
840 ret = pci_alloc_irq_vectors(pdev, 1, 1, PCI_IRQ_ALL_TYPES);
844 memset(&res, 0, sizeof(res));
845 res.addr = pcim_iomap_table(pdev)[0];
846 res.wol_irq = pci_irq_vector(pdev, 0);
847 res.irq = pci_irq_vector(pdev, 0);
849 if (plat->eee_usecs_rate > 0) {
852 tx_lpi_usec = (plat->eee_usecs_rate / 1000000) - 1;
853 writel(tx_lpi_usec, res.addr + GMAC_1US_TIC_COUNTER);
856 ret = stmmac_dvr_probe(&pdev->dev, plat, &res);
858 pci_free_irq_vectors(pdev);
859 clk_disable_unprepare(plat->stmmac_clk);
860 clk_unregister_fixed_rate(plat->stmmac_clk);
867 * intel_eth_pci_remove
869 * @pdev: platform device pointer
870 * Description: this function calls the main to free the net resources
871 * and releases the PCI resources.
873 static void intel_eth_pci_remove(struct pci_dev *pdev)
875 struct net_device *ndev = dev_get_drvdata(&pdev->dev);
876 struct stmmac_priv *priv = netdev_priv(ndev);
878 stmmac_dvr_remove(&pdev->dev);
880 pci_free_irq_vectors(pdev);
882 clk_unregister_fixed_rate(priv->plat->stmmac_clk);
884 pcim_iounmap_regions(pdev, BIT(0));
886 pci_disable_device(pdev);
889 static int __maybe_unused intel_eth_pci_suspend(struct device *dev)
891 struct pci_dev *pdev = to_pci_dev(dev);
894 ret = stmmac_suspend(dev);
898 ret = pci_save_state(pdev);
902 pci_disable_device(pdev);
903 pci_wake_from_d3(pdev, true);
907 static int __maybe_unused intel_eth_pci_resume(struct device *dev)
909 struct pci_dev *pdev = to_pci_dev(dev);
912 pci_restore_state(pdev);
913 pci_set_power_state(pdev, PCI_D0);
915 ret = pci_enable_device(pdev);
919 pci_set_master(pdev);
921 return stmmac_resume(dev);
924 static SIMPLE_DEV_PM_OPS(intel_eth_pm_ops, intel_eth_pci_suspend,
925 intel_eth_pci_resume);
927 #define PCI_DEVICE_ID_INTEL_QUARK_ID 0x0937
928 #define PCI_DEVICE_ID_INTEL_EHL_RGMII1G_ID 0x4b30
929 #define PCI_DEVICE_ID_INTEL_EHL_SGMII1G_ID 0x4b31
930 #define PCI_DEVICE_ID_INTEL_EHL_SGMII2G5_ID 0x4b32
931 /* Intel(R) Programmable Services Engine (Intel(R) PSE) consist of 2 MAC
932 * which are named PSE0 and PSE1
934 #define PCI_DEVICE_ID_INTEL_EHL_PSE0_RGMII1G_ID 0x4ba0
935 #define PCI_DEVICE_ID_INTEL_EHL_PSE0_SGMII1G_ID 0x4ba1
936 #define PCI_DEVICE_ID_INTEL_EHL_PSE0_SGMII2G5_ID 0x4ba2
937 #define PCI_DEVICE_ID_INTEL_EHL_PSE1_RGMII1G_ID 0x4bb0
938 #define PCI_DEVICE_ID_INTEL_EHL_PSE1_SGMII1G_ID 0x4bb1
939 #define PCI_DEVICE_ID_INTEL_EHL_PSE1_SGMII2G5_ID 0x4bb2
940 #define PCI_DEVICE_ID_INTEL_TGLH_SGMII1G_0_ID 0x43ac
941 #define PCI_DEVICE_ID_INTEL_TGLH_SGMII1G_1_ID 0x43a2
942 #define PCI_DEVICE_ID_INTEL_TGL_SGMII1G_ID 0xa0ac
943 #define PCI_DEVICE_ID_INTEL_ADLS_SGMII1G_0_ID 0x7aac
944 #define PCI_DEVICE_ID_INTEL_ADLS_SGMII1G_1_ID 0x7aad
946 static const struct pci_device_id intel_eth_pci_id_table[] = {
947 { PCI_DEVICE_DATA(INTEL, QUARK_ID, &quark_info) },
948 { PCI_DEVICE_DATA(INTEL, EHL_RGMII1G_ID, &ehl_rgmii1g_info) },
949 { PCI_DEVICE_DATA(INTEL, EHL_SGMII1G_ID, &ehl_sgmii1g_info) },
950 { PCI_DEVICE_DATA(INTEL, EHL_SGMII2G5_ID, &ehl_sgmii1g_info) },
951 { PCI_DEVICE_DATA(INTEL, EHL_PSE0_RGMII1G_ID, &ehl_pse0_rgmii1g_info) },
952 { PCI_DEVICE_DATA(INTEL, EHL_PSE0_SGMII1G_ID, &ehl_pse0_sgmii1g_info) },
953 { PCI_DEVICE_DATA(INTEL, EHL_PSE0_SGMII2G5_ID, &ehl_pse0_sgmii1g_info) },
954 { PCI_DEVICE_DATA(INTEL, EHL_PSE1_RGMII1G_ID, &ehl_pse1_rgmii1g_info) },
955 { PCI_DEVICE_DATA(INTEL, EHL_PSE1_SGMII1G_ID, &ehl_pse1_sgmii1g_info) },
956 { PCI_DEVICE_DATA(INTEL, EHL_PSE1_SGMII2G5_ID, &ehl_pse1_sgmii1g_info) },
957 { PCI_DEVICE_DATA(INTEL, TGL_SGMII1G_ID, &tgl_sgmii1g_phy0_info) },
958 { PCI_DEVICE_DATA(INTEL, TGLH_SGMII1G_0_ID, &tgl_sgmii1g_phy0_info) },
959 { PCI_DEVICE_DATA(INTEL, TGLH_SGMII1G_1_ID, &tgl_sgmii1g_phy1_info) },
960 { PCI_DEVICE_DATA(INTEL, ADLS_SGMII1G_0_ID, &adls_sgmii1g_phy0_info) },
961 { PCI_DEVICE_DATA(INTEL, ADLS_SGMII1G_1_ID, &adls_sgmii1g_phy1_info) },
964 MODULE_DEVICE_TABLE(pci, intel_eth_pci_id_table);
966 static struct pci_driver intel_eth_pci_driver = {
967 .name = "intel-eth-pci",
968 .id_table = intel_eth_pci_id_table,
969 .probe = intel_eth_pci_probe,
970 .remove = intel_eth_pci_remove,
972 .pm = &intel_eth_pm_ops,
976 module_pci_driver(intel_eth_pci_driver);
978 MODULE_DESCRIPTION("INTEL 10/100/1000 Ethernet PCI driver");
979 MODULE_AUTHOR("Voon Weifeng <weifeng.voon@intel.com>");
980 MODULE_LICENSE("GPL v2");