dwmac-intel.c 33 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246
  1. // SPDX-License-Identifier: GPL-2.0
  2. /* Copyright (c) 2020, Intel Corporation
  3. */
  4. #include <linux/clk-provider.h>
  5. #include <linux/pci.h>
  6. #include <linux/dmi.h>
  7. #include "dwmac-intel.h"
  8. #include "dwmac4.h"
  9. #include "stmmac.h"
  10. #include "stmmac_ptp.h"
  11. struct intel_priv_data {
  12. int mdio_adhoc_addr; /* mdio address for serdes & etc */
  13. unsigned long crossts_adj;
  14. bool is_pse;
  15. };
  16. /* This struct is used to associate PCI Function of MAC controller on a board,
  17. * discovered via DMI, with the address of PHY connected to the MAC. The
  18. * negative value of the address means that MAC controller is not connected
  19. * with PHY.
  20. */
  21. struct stmmac_pci_func_data {
  22. unsigned int func;
  23. int phy_addr;
  24. };
  25. struct stmmac_pci_dmi_data {
  26. const struct stmmac_pci_func_data *func;
  27. size_t nfuncs;
  28. };
  29. struct stmmac_pci_info {
  30. int (*setup)(struct pci_dev *pdev, struct plat_stmmacenet_data *plat);
  31. };
  32. static int stmmac_pci_find_phy_addr(struct pci_dev *pdev,
  33. const struct dmi_system_id *dmi_list)
  34. {
  35. const struct stmmac_pci_func_data *func_data;
  36. const struct stmmac_pci_dmi_data *dmi_data;
  37. const struct dmi_system_id *dmi_id;
  38. int func = PCI_FUNC(pdev->devfn);
  39. size_t n;
  40. dmi_id = dmi_first_match(dmi_list);
  41. if (!dmi_id)
  42. return -ENODEV;
  43. dmi_data = dmi_id->driver_data;
  44. func_data = dmi_data->func;
  45. for (n = 0; n < dmi_data->nfuncs; n++, func_data++)
  46. if (func_data->func == func)
  47. return func_data->phy_addr;
  48. return -ENODEV;
  49. }
  50. static int serdes_status_poll(struct stmmac_priv *priv, int phyaddr,
  51. int phyreg, u32 mask, u32 val)
  52. {
  53. unsigned int retries = 10;
  54. int val_rd;
  55. do {
  56. val_rd = mdiobus_read(priv->mii, phyaddr, phyreg);
  57. if ((val_rd & mask) == (val & mask))
  58. return 0;
  59. udelay(POLL_DELAY_US);
  60. } while (--retries);
  61. return -ETIMEDOUT;
  62. }
  63. static int intel_serdes_powerup(struct net_device *ndev, void *priv_data)
  64. {
  65. struct intel_priv_data *intel_priv = priv_data;
  66. struct stmmac_priv *priv = netdev_priv(ndev);
  67. int serdes_phy_addr = 0;
  68. u32 data = 0;
  69. if (!intel_priv->mdio_adhoc_addr)
  70. return 0;
  71. serdes_phy_addr = intel_priv->mdio_adhoc_addr;
  72. /* Set the serdes rate and the PCLK rate */
  73. data = mdiobus_read(priv->mii, serdes_phy_addr,
  74. SERDES_GCR0);
  75. data &= ~SERDES_RATE_MASK;
  76. data &= ~SERDES_PCLK_MASK;
  77. if (priv->plat->max_speed == 2500)
  78. data |= SERDES_RATE_PCIE_GEN2 << SERDES_RATE_PCIE_SHIFT |
  79. SERDES_PCLK_37p5MHZ << SERDES_PCLK_SHIFT;
  80. else
  81. data |= SERDES_RATE_PCIE_GEN1 << SERDES_RATE_PCIE_SHIFT |
  82. SERDES_PCLK_70MHZ << SERDES_PCLK_SHIFT;
  83. mdiobus_write(priv->mii, serdes_phy_addr, SERDES_GCR0, data);
  84. /* assert clk_req */
  85. data = mdiobus_read(priv->mii, serdes_phy_addr, SERDES_GCR0);
  86. data |= SERDES_PLL_CLK;
  87. mdiobus_write(priv->mii, serdes_phy_addr, SERDES_GCR0, data);
  88. /* check for clk_ack assertion */
  89. data = serdes_status_poll(priv, serdes_phy_addr,
  90. SERDES_GSR0,
  91. SERDES_PLL_CLK,
  92. SERDES_PLL_CLK);
  93. if (data) {
  94. dev_err(priv->device, "Serdes PLL clk request timeout\n");
  95. return data;
  96. }
  97. /* assert lane reset */
  98. data = mdiobus_read(priv->mii, serdes_phy_addr, SERDES_GCR0);
  99. data |= SERDES_RST;
  100. mdiobus_write(priv->mii, serdes_phy_addr, SERDES_GCR0, data);
  101. /* check for assert lane reset reflection */
  102. data = serdes_status_poll(priv, serdes_phy_addr,
  103. SERDES_GSR0,
  104. SERDES_RST,
  105. SERDES_RST);
  106. if (data) {
  107. dev_err(priv->device, "Serdes assert lane reset timeout\n");
  108. return data;
  109. }
  110. /* move power state to P0 */
  111. data = mdiobus_read(priv->mii, serdes_phy_addr, SERDES_GCR0);
  112. data &= ~SERDES_PWR_ST_MASK;
  113. data |= SERDES_PWR_ST_P0 << SERDES_PWR_ST_SHIFT;
  114. mdiobus_write(priv->mii, serdes_phy_addr, SERDES_GCR0, data);
  115. /* Check for P0 state */
  116. data = serdes_status_poll(priv, serdes_phy_addr,
  117. SERDES_GSR0,
  118. SERDES_PWR_ST_MASK,
  119. SERDES_PWR_ST_P0 << SERDES_PWR_ST_SHIFT);
  120. if (data) {
  121. dev_err(priv->device, "Serdes power state P0 timeout.\n");
  122. return data;
  123. }
  124. /* PSE only - ungate SGMII PHY Rx Clock */
  125. if (intel_priv->is_pse)
  126. mdiobus_modify(priv->mii, serdes_phy_addr, SERDES_GCR0,
  127. 0, SERDES_PHY_RX_CLK);
  128. return 0;
  129. }
  130. static void intel_serdes_powerdown(struct net_device *ndev, void *intel_data)
  131. {
  132. struct intel_priv_data *intel_priv = intel_data;
  133. struct stmmac_priv *priv = netdev_priv(ndev);
  134. int serdes_phy_addr = 0;
  135. u32 data = 0;
  136. if (!intel_priv->mdio_adhoc_addr)
  137. return;
  138. serdes_phy_addr = intel_priv->mdio_adhoc_addr;
  139. /* PSE only - gate SGMII PHY Rx Clock */
  140. if (intel_priv->is_pse)
  141. mdiobus_modify(priv->mii, serdes_phy_addr, SERDES_GCR0,
  142. SERDES_PHY_RX_CLK, 0);
  143. /* move power state to P3 */
  144. data = mdiobus_read(priv->mii, serdes_phy_addr, SERDES_GCR0);
  145. data &= ~SERDES_PWR_ST_MASK;
  146. data |= SERDES_PWR_ST_P3 << SERDES_PWR_ST_SHIFT;
  147. mdiobus_write(priv->mii, serdes_phy_addr, SERDES_GCR0, data);
  148. /* Check for P3 state */
  149. data = serdes_status_poll(priv, serdes_phy_addr,
  150. SERDES_GSR0,
  151. SERDES_PWR_ST_MASK,
  152. SERDES_PWR_ST_P3 << SERDES_PWR_ST_SHIFT);
  153. if (data) {
  154. dev_err(priv->device, "Serdes power state P3 timeout\n");
  155. return;
  156. }
  157. /* de-assert clk_req */
  158. data = mdiobus_read(priv->mii, serdes_phy_addr, SERDES_GCR0);
  159. data &= ~SERDES_PLL_CLK;
  160. mdiobus_write(priv->mii, serdes_phy_addr, SERDES_GCR0, data);
  161. /* check for clk_ack de-assert */
  162. data = serdes_status_poll(priv, serdes_phy_addr,
  163. SERDES_GSR0,
  164. SERDES_PLL_CLK,
  165. (u32)~SERDES_PLL_CLK);
  166. if (data) {
  167. dev_err(priv->device, "Serdes PLL clk de-assert timeout\n");
  168. return;
  169. }
  170. /* de-assert lane reset */
  171. data = mdiobus_read(priv->mii, serdes_phy_addr, SERDES_GCR0);
  172. data &= ~SERDES_RST;
  173. mdiobus_write(priv->mii, serdes_phy_addr, SERDES_GCR0, data);
  174. /* check for de-assert lane reset reflection */
  175. data = serdes_status_poll(priv, serdes_phy_addr,
  176. SERDES_GSR0,
  177. SERDES_RST,
  178. (u32)~SERDES_RST);
  179. if (data) {
  180. dev_err(priv->device, "Serdes de-assert lane reset timeout\n");
  181. return;
  182. }
  183. }
  184. static void intel_speed_mode_2500(struct net_device *ndev, void *intel_data)
  185. {
  186. struct intel_priv_data *intel_priv = intel_data;
  187. struct stmmac_priv *priv = netdev_priv(ndev);
  188. int serdes_phy_addr = 0;
  189. u32 data = 0;
  190. serdes_phy_addr = intel_priv->mdio_adhoc_addr;
  191. /* Determine the link speed mode: 2.5Gbps/1Gbps */
  192. data = mdiobus_read(priv->mii, serdes_phy_addr,
  193. SERDES_GCR);
  194. if (((data & SERDES_LINK_MODE_MASK) >> SERDES_LINK_MODE_SHIFT) ==
  195. SERDES_LINK_MODE_2G5) {
  196. dev_info(priv->device, "Link Speed Mode: 2.5Gbps\n");
  197. priv->plat->max_speed = 2500;
  198. priv->plat->phy_interface = PHY_INTERFACE_MODE_2500BASEX;
  199. priv->plat->mdio_bus_data->default_an_inband = false;
  200. } else {
  201. priv->plat->max_speed = 1000;
  202. }
  203. }
  204. /* Program PTP Clock Frequency for different variant of
  205. * Intel mGBE that has slightly different GPO mapping
  206. */
  207. static void intel_mgbe_ptp_clk_freq_config(struct stmmac_priv *priv)
  208. {
  209. struct intel_priv_data *intel_priv;
  210. u32 gpio_value;
  211. intel_priv = (struct intel_priv_data *)priv->plat->bsp_priv;
  212. gpio_value = readl(priv->ioaddr + GMAC_GPIO_STATUS);
  213. if (intel_priv->is_pse) {
  214. /* For PSE GbE, use 200MHz */
  215. gpio_value &= ~PSE_PTP_CLK_FREQ_MASK;
  216. gpio_value |= PSE_PTP_CLK_FREQ_200MHZ;
  217. } else {
  218. /* For PCH GbE, use 200MHz */
  219. gpio_value &= ~PCH_PTP_CLK_FREQ_MASK;
  220. gpio_value |= PCH_PTP_CLK_FREQ_200MHZ;
  221. }
  222. writel(gpio_value, priv->ioaddr + GMAC_GPIO_STATUS);
  223. }
  224. static void get_arttime(struct mii_bus *mii, int intel_adhoc_addr,
  225. u64 *art_time)
  226. {
  227. u64 ns;
  228. ns = mdiobus_read(mii, intel_adhoc_addr, PMC_ART_VALUE3);
  229. ns <<= GMAC4_ART_TIME_SHIFT;
  230. ns |= mdiobus_read(mii, intel_adhoc_addr, PMC_ART_VALUE2);
  231. ns <<= GMAC4_ART_TIME_SHIFT;
  232. ns |= mdiobus_read(mii, intel_adhoc_addr, PMC_ART_VALUE1);
  233. ns <<= GMAC4_ART_TIME_SHIFT;
  234. ns |= mdiobus_read(mii, intel_adhoc_addr, PMC_ART_VALUE0);
  235. *art_time = ns;
  236. }
  237. static int stmmac_cross_ts_isr(struct stmmac_priv *priv)
  238. {
  239. return (readl(priv->ioaddr + GMAC_INT_STATUS) & GMAC_INT_TSIE);
  240. }
  241. static int intel_crosststamp(ktime_t *device,
  242. struct system_counterval_t *system,
  243. void *ctx)
  244. {
  245. struct intel_priv_data *intel_priv;
  246. struct stmmac_priv *priv = (struct stmmac_priv *)ctx;
  247. void __iomem *ptpaddr = priv->ptpaddr;
  248. void __iomem *ioaddr = priv->hw->pcsr;
  249. unsigned long flags;
  250. u64 art_time = 0;
  251. u64 ptp_time = 0;
  252. u32 num_snapshot;
  253. u32 gpio_value;
  254. u32 acr_value;
  255. int i;
  256. if (!boot_cpu_has(X86_FEATURE_ART))
  257. return -EOPNOTSUPP;
  258. intel_priv = priv->plat->bsp_priv;
  259. /* Both internal crosstimestamping and external triggered event
  260. * timestamping cannot be run concurrently.
  261. */
  262. if (priv->plat->flags & STMMAC_FLAG_EXT_SNAPSHOT_EN)
  263. return -EBUSY;
  264. priv->plat->flags |= STMMAC_FLAG_INT_SNAPSHOT_EN;
  265. mutex_lock(&priv->aux_ts_lock);
  266. /* Enable Internal snapshot trigger */
  267. acr_value = readl(ptpaddr + PTP_ACR);
  268. acr_value &= ~PTP_ACR_MASK;
  269. switch (priv->plat->int_snapshot_num) {
  270. case AUX_SNAPSHOT0:
  271. acr_value |= PTP_ACR_ATSEN0;
  272. break;
  273. case AUX_SNAPSHOT1:
  274. acr_value |= PTP_ACR_ATSEN1;
  275. break;
  276. case AUX_SNAPSHOT2:
  277. acr_value |= PTP_ACR_ATSEN2;
  278. break;
  279. case AUX_SNAPSHOT3:
  280. acr_value |= PTP_ACR_ATSEN3;
  281. break;
  282. default:
  283. mutex_unlock(&priv->aux_ts_lock);
  284. priv->plat->flags &= ~STMMAC_FLAG_INT_SNAPSHOT_EN;
  285. return -EINVAL;
  286. }
  287. writel(acr_value, ptpaddr + PTP_ACR);
  288. /* Clear FIFO */
  289. acr_value = readl(ptpaddr + PTP_ACR);
  290. acr_value |= PTP_ACR_ATSFC;
  291. writel(acr_value, ptpaddr + PTP_ACR);
  292. /* Release the mutex */
  293. mutex_unlock(&priv->aux_ts_lock);
  294. /* Trigger Internal snapshot signal
  295. * Create a rising edge by just toggle the GPO1 to low
  296. * and back to high.
  297. */
  298. gpio_value = readl(ioaddr + GMAC_GPIO_STATUS);
  299. gpio_value &= ~GMAC_GPO1;
  300. writel(gpio_value, ioaddr + GMAC_GPIO_STATUS);
  301. gpio_value |= GMAC_GPO1;
  302. writel(gpio_value, ioaddr + GMAC_GPIO_STATUS);
  303. /* Time sync done Indication - Interrupt method */
  304. if (!wait_event_interruptible_timeout(priv->tstamp_busy_wait,
  305. stmmac_cross_ts_isr(priv),
  306. HZ / 100)) {
  307. priv->plat->flags &= ~STMMAC_FLAG_INT_SNAPSHOT_EN;
  308. return -ETIMEDOUT;
  309. }
  310. *system = (struct system_counterval_t) {
  311. .cycles = 0,
  312. .cs_id = CSID_X86_ART,
  313. .use_nsecs = false,
  314. };
  315. num_snapshot = (readl(ioaddr + GMAC_TIMESTAMP_STATUS) &
  316. GMAC_TIMESTAMP_ATSNS_MASK) >>
  317. GMAC_TIMESTAMP_ATSNS_SHIFT;
  318. /* Repeat until the timestamps are from the FIFO last segment */
  319. for (i = 0; i < num_snapshot; i++) {
  320. read_lock_irqsave(&priv->ptp_lock, flags);
  321. stmmac_get_ptptime(priv, ptpaddr, &ptp_time);
  322. *device = ns_to_ktime(ptp_time);
  323. read_unlock_irqrestore(&priv->ptp_lock, flags);
  324. get_arttime(priv->mii, intel_priv->mdio_adhoc_addr, &art_time);
  325. system->cycles = art_time;
  326. }
  327. system->cycles *= intel_priv->crossts_adj;
  328. priv->plat->flags &= ~STMMAC_FLAG_INT_SNAPSHOT_EN;
  329. return 0;
  330. }
  331. static void intel_mgbe_pse_crossts_adj(struct intel_priv_data *intel_priv,
  332. int base)
  333. {
  334. if (boot_cpu_has(X86_FEATURE_ART)) {
  335. unsigned int art_freq;
  336. /* On systems that support ART, ART frequency can be obtained
  337. * from ECX register of CPUID leaf (0x15).
  338. */
  339. art_freq = cpuid_ecx(ART_CPUID_LEAF);
  340. do_div(art_freq, base);
  341. intel_priv->crossts_adj = art_freq;
  342. }
  343. }
  344. static void common_default_data(struct plat_stmmacenet_data *plat)
  345. {
  346. plat->clk_csr = 2; /* clk_csr_i = 20-35MHz & MDC = clk_csr_i/16 */
  347. plat->has_gmac = 1;
  348. plat->force_sf_dma_mode = 1;
  349. plat->mdio_bus_data->needs_reset = true;
  350. /* Set default value for multicast hash bins */
  351. plat->multicast_filter_bins = HASH_TABLE_SIZE;
  352. /* Set default value for unicast filter entries */
  353. plat->unicast_filter_entries = 1;
  354. /* Set the maxmtu to a default of JUMBO_LEN */
  355. plat->maxmtu = JUMBO_LEN;
  356. /* Set default number of RX and TX queues to use */
  357. plat->tx_queues_to_use = 1;
  358. plat->rx_queues_to_use = 1;
  359. /* Disable Priority config by default */
  360. plat->tx_queues_cfg[0].use_prio = false;
  361. plat->rx_queues_cfg[0].use_prio = false;
  362. /* Disable RX queues routing by default */
  363. plat->rx_queues_cfg[0].pkt_route = 0x0;
  364. }
  365. static struct phylink_pcs *intel_mgbe_select_pcs(struct stmmac_priv *priv,
  366. phy_interface_t interface)
  367. {
  368. /* plat->mdio_bus_data->has_xpcs has been set true, so there
  369. * should always be an XPCS. The original code would always
  370. * return this if present.
  371. */
  372. return &priv->hw->xpcs->pcs;
  373. }
  374. static int intel_mgbe_common_data(struct pci_dev *pdev,
  375. struct plat_stmmacenet_data *plat)
  376. {
  377. struct fwnode_handle *fwnode;
  378. char clk_name[20];
  379. int ret;
  380. int i;
  381. plat->pdev = pdev;
  382. plat->phy_addr = -1;
  383. plat->clk_csr = 5;
  384. plat->has_gmac = 0;
  385. plat->has_gmac4 = 1;
  386. plat->force_sf_dma_mode = 0;
  387. plat->flags |= (STMMAC_FLAG_TSO_EN | STMMAC_FLAG_SPH_DISABLE);
  388. /* Multiplying factor to the clk_eee_i clock time
  389. * period to make it closer to 100 ns. This value
  390. * should be programmed such that the clk_eee_time_period *
  391. * (MULT_FACT_100NS + 1) should be within 80 ns to 120 ns
  392. * clk_eee frequency is 19.2Mhz
  393. * clk_eee_time_period is 52ns
  394. * 52ns * (1 + 1) = 104ns
  395. * MULT_FACT_100NS = 1
  396. */
  397. plat->mult_fact_100ns = 1;
  398. plat->rx_sched_algorithm = MTL_RX_ALGORITHM_SP;
  399. for (i = 0; i < plat->rx_queues_to_use; i++) {
  400. plat->rx_queues_cfg[i].mode_to_use = MTL_QUEUE_DCB;
  401. plat->rx_queues_cfg[i].chan = i;
  402. /* Disable Priority config by default */
  403. plat->rx_queues_cfg[i].use_prio = false;
  404. /* Disable RX queues routing by default */
  405. plat->rx_queues_cfg[i].pkt_route = 0x0;
  406. }
  407. for (i = 0; i < plat->tx_queues_to_use; i++) {
  408. plat->tx_queues_cfg[i].mode_to_use = MTL_QUEUE_DCB;
  409. /* Disable Priority config by default */
  410. plat->tx_queues_cfg[i].use_prio = false;
  411. /* Default TX Q0 to use TSO and rest TXQ for TBS */
  412. if (i > 0)
  413. plat->tx_queues_cfg[i].tbs_en = 1;
  414. }
  415. /* FIFO size is 4096 bytes for 1 tx/rx queue */
  416. plat->tx_fifo_size = plat->tx_queues_to_use * 4096;
  417. plat->rx_fifo_size = plat->rx_queues_to_use * 4096;
  418. plat->tx_sched_algorithm = MTL_TX_ALGORITHM_WRR;
  419. plat->tx_queues_cfg[0].weight = 0x09;
  420. plat->tx_queues_cfg[1].weight = 0x0A;
  421. plat->tx_queues_cfg[2].weight = 0x0B;
  422. plat->tx_queues_cfg[3].weight = 0x0C;
  423. plat->tx_queues_cfg[4].weight = 0x0D;
  424. plat->tx_queues_cfg[5].weight = 0x0E;
  425. plat->tx_queues_cfg[6].weight = 0x0F;
  426. plat->tx_queues_cfg[7].weight = 0x10;
  427. plat->dma_cfg->pbl = 32;
  428. plat->dma_cfg->pblx8 = true;
  429. plat->dma_cfg->fixed_burst = 0;
  430. plat->dma_cfg->mixed_burst = 0;
  431. plat->dma_cfg->aal = 0;
  432. plat->dma_cfg->dche = true;
  433. plat->axi = devm_kzalloc(&pdev->dev, sizeof(*plat->axi),
  434. GFP_KERNEL);
  435. if (!plat->axi)
  436. return -ENOMEM;
  437. plat->axi->axi_lpi_en = 0;
  438. plat->axi->axi_xit_frm = 0;
  439. plat->axi->axi_wr_osr_lmt = 1;
  440. plat->axi->axi_rd_osr_lmt = 1;
  441. plat->axi->axi_blen[0] = 4;
  442. plat->axi->axi_blen[1] = 8;
  443. plat->axi->axi_blen[2] = 16;
  444. plat->ptp_max_adj = plat->clk_ptp_rate;
  445. plat->eee_usecs_rate = plat->clk_ptp_rate;
  446. /* Set system clock */
  447. sprintf(clk_name, "%s-%s", "stmmac", pci_name(pdev));
  448. plat->stmmac_clk = clk_register_fixed_rate(&pdev->dev,
  449. clk_name, NULL, 0,
  450. plat->clk_ptp_rate);
  451. if (IS_ERR(plat->stmmac_clk)) {
  452. dev_warn(&pdev->dev, "Fail to register stmmac-clk\n");
  453. plat->stmmac_clk = NULL;
  454. }
  455. ret = clk_prepare_enable(plat->stmmac_clk);
  456. if (ret) {
  457. clk_unregister_fixed_rate(plat->stmmac_clk);
  458. return ret;
  459. }
  460. plat->ptp_clk_freq_config = intel_mgbe_ptp_clk_freq_config;
  461. /* Set default value for multicast hash bins */
  462. plat->multicast_filter_bins = HASH_TABLE_SIZE;
  463. /* Set default value for unicast filter entries */
  464. plat->unicast_filter_entries = 1;
  465. /* Set the maxmtu to a default of JUMBO_LEN */
  466. plat->maxmtu = JUMBO_LEN;
  467. plat->flags |= STMMAC_FLAG_VLAN_FAIL_Q_EN;
  468. /* Use the last Rx queue */
  469. plat->vlan_fail_q = plat->rx_queues_to_use - 1;
  470. /* For fixed-link setup, we allow phy-mode setting */
  471. fwnode = dev_fwnode(&pdev->dev);
  472. if (fwnode) {
  473. int phy_mode;
  474. /* "phy-mode" setting is optional. If it is set,
  475. * we allow either sgmii or 1000base-x for now.
  476. */
  477. phy_mode = fwnode_get_phy_mode(fwnode);
  478. if (phy_mode >= 0) {
  479. if (phy_mode == PHY_INTERFACE_MODE_SGMII ||
  480. phy_mode == PHY_INTERFACE_MODE_1000BASEX)
  481. plat->phy_interface = phy_mode;
  482. else
  483. dev_warn(&pdev->dev, "Invalid phy-mode\n");
  484. }
  485. }
  486. /* Intel mgbe SGMII interface uses pcs-xcps */
  487. if (plat->phy_interface == PHY_INTERFACE_MODE_SGMII ||
  488. plat->phy_interface == PHY_INTERFACE_MODE_1000BASEX) {
  489. plat->mdio_bus_data->pcs_mask = BIT(INTEL_MGBE_XPCS_ADDR);
  490. plat->mdio_bus_data->default_an_inband = true;
  491. plat->select_pcs = intel_mgbe_select_pcs;
  492. }
  493. /* Ensure mdio bus scan skips intel serdes and pcs-xpcs */
  494. plat->mdio_bus_data->phy_mask = 1 << INTEL_MGBE_ADHOC_ADDR;
  495. plat->mdio_bus_data->phy_mask |= 1 << INTEL_MGBE_XPCS_ADDR;
  496. plat->int_snapshot_num = AUX_SNAPSHOT1;
  497. plat->crosststamp = intel_crosststamp;
  498. plat->flags &= ~STMMAC_FLAG_INT_SNAPSHOT_EN;
  499. /* Setup MSI vector offset specific to Intel mGbE controller */
  500. plat->msi_mac_vec = 29;
  501. plat->msi_lpi_vec = 28;
  502. plat->msi_sfty_ce_vec = 27;
  503. plat->msi_sfty_ue_vec = 26;
  504. plat->msi_rx_base_vec = 0;
  505. plat->msi_tx_base_vec = 1;
  506. return 0;
  507. }
  508. static int ehl_common_data(struct pci_dev *pdev,
  509. struct plat_stmmacenet_data *plat)
  510. {
  511. plat->rx_queues_to_use = 8;
  512. plat->tx_queues_to_use = 8;
  513. plat->flags |= STMMAC_FLAG_USE_PHY_WOL;
  514. plat->flags |= STMMAC_FLAG_HWTSTAMP_CORRECT_LATENCY;
  515. plat->safety_feat_cfg->tsoee = 1;
  516. plat->safety_feat_cfg->mrxpee = 1;
  517. plat->safety_feat_cfg->mestee = 1;
  518. plat->safety_feat_cfg->mrxee = 1;
  519. plat->safety_feat_cfg->mtxee = 1;
  520. plat->safety_feat_cfg->epsi = 0;
  521. plat->safety_feat_cfg->edpp = 0;
  522. plat->safety_feat_cfg->prtyen = 0;
  523. plat->safety_feat_cfg->tmouten = 0;
  524. return intel_mgbe_common_data(pdev, plat);
  525. }
  526. static int ehl_sgmii_data(struct pci_dev *pdev,
  527. struct plat_stmmacenet_data *plat)
  528. {
  529. plat->bus_id = 1;
  530. plat->phy_interface = PHY_INTERFACE_MODE_SGMII;
  531. plat->speed_mode_2500 = intel_speed_mode_2500;
  532. plat->serdes_powerup = intel_serdes_powerup;
  533. plat->serdes_powerdown = intel_serdes_powerdown;
  534. plat->clk_ptp_rate = 204800000;
  535. return ehl_common_data(pdev, plat);
  536. }
  537. static struct stmmac_pci_info ehl_sgmii1g_info = {
  538. .setup = ehl_sgmii_data,
  539. };
  540. static int ehl_rgmii_data(struct pci_dev *pdev,
  541. struct plat_stmmacenet_data *plat)
  542. {
  543. plat->bus_id = 1;
  544. plat->phy_interface = PHY_INTERFACE_MODE_RGMII;
  545. plat->clk_ptp_rate = 204800000;
  546. return ehl_common_data(pdev, plat);
  547. }
  548. static struct stmmac_pci_info ehl_rgmii1g_info = {
  549. .setup = ehl_rgmii_data,
  550. };
  551. static int ehl_pse0_common_data(struct pci_dev *pdev,
  552. struct plat_stmmacenet_data *plat)
  553. {
  554. struct intel_priv_data *intel_priv = plat->bsp_priv;
  555. intel_priv->is_pse = true;
  556. plat->bus_id = 2;
  557. plat->host_dma_width = 32;
  558. plat->clk_ptp_rate = 200000000;
  559. intel_mgbe_pse_crossts_adj(intel_priv, EHL_PSE_ART_MHZ);
  560. return ehl_common_data(pdev, plat);
  561. }
  562. static int ehl_pse0_rgmii1g_data(struct pci_dev *pdev,
  563. struct plat_stmmacenet_data *plat)
  564. {
  565. plat->phy_interface = PHY_INTERFACE_MODE_RGMII_ID;
  566. return ehl_pse0_common_data(pdev, plat);
  567. }
  568. static struct stmmac_pci_info ehl_pse0_rgmii1g_info = {
  569. .setup = ehl_pse0_rgmii1g_data,
  570. };
  571. static int ehl_pse0_sgmii1g_data(struct pci_dev *pdev,
  572. struct plat_stmmacenet_data *plat)
  573. {
  574. plat->phy_interface = PHY_INTERFACE_MODE_SGMII;
  575. plat->speed_mode_2500 = intel_speed_mode_2500;
  576. plat->serdes_powerup = intel_serdes_powerup;
  577. plat->serdes_powerdown = intel_serdes_powerdown;
  578. return ehl_pse0_common_data(pdev, plat);
  579. }
  580. static struct stmmac_pci_info ehl_pse0_sgmii1g_info = {
  581. .setup = ehl_pse0_sgmii1g_data,
  582. };
  583. static int ehl_pse1_common_data(struct pci_dev *pdev,
  584. struct plat_stmmacenet_data *plat)
  585. {
  586. struct intel_priv_data *intel_priv = plat->bsp_priv;
  587. intel_priv->is_pse = true;
  588. plat->bus_id = 3;
  589. plat->host_dma_width = 32;
  590. plat->clk_ptp_rate = 200000000;
  591. intel_mgbe_pse_crossts_adj(intel_priv, EHL_PSE_ART_MHZ);
  592. return ehl_common_data(pdev, plat);
  593. }
  594. static int ehl_pse1_rgmii1g_data(struct pci_dev *pdev,
  595. struct plat_stmmacenet_data *plat)
  596. {
  597. plat->phy_interface = PHY_INTERFACE_MODE_RGMII_ID;
  598. return ehl_pse1_common_data(pdev, plat);
  599. }
  600. static struct stmmac_pci_info ehl_pse1_rgmii1g_info = {
  601. .setup = ehl_pse1_rgmii1g_data,
  602. };
  603. static int ehl_pse1_sgmii1g_data(struct pci_dev *pdev,
  604. struct plat_stmmacenet_data *plat)
  605. {
  606. plat->phy_interface = PHY_INTERFACE_MODE_SGMII;
  607. plat->speed_mode_2500 = intel_speed_mode_2500;
  608. plat->serdes_powerup = intel_serdes_powerup;
  609. plat->serdes_powerdown = intel_serdes_powerdown;
  610. return ehl_pse1_common_data(pdev, plat);
  611. }
  612. static struct stmmac_pci_info ehl_pse1_sgmii1g_info = {
  613. .setup = ehl_pse1_sgmii1g_data,
  614. };
  615. static int tgl_common_data(struct pci_dev *pdev,
  616. struct plat_stmmacenet_data *plat)
  617. {
  618. plat->rx_queues_to_use = 6;
  619. plat->tx_queues_to_use = 4;
  620. plat->clk_ptp_rate = 204800000;
  621. plat->speed_mode_2500 = intel_speed_mode_2500;
  622. plat->safety_feat_cfg->tsoee = 1;
  623. plat->safety_feat_cfg->mrxpee = 0;
  624. plat->safety_feat_cfg->mestee = 1;
  625. plat->safety_feat_cfg->mrxee = 1;
  626. plat->safety_feat_cfg->mtxee = 1;
  627. plat->safety_feat_cfg->epsi = 0;
  628. plat->safety_feat_cfg->edpp = 0;
  629. plat->safety_feat_cfg->prtyen = 0;
  630. plat->safety_feat_cfg->tmouten = 0;
  631. return intel_mgbe_common_data(pdev, plat);
  632. }
  633. static int tgl_sgmii_phy0_data(struct pci_dev *pdev,
  634. struct plat_stmmacenet_data *plat)
  635. {
  636. plat->bus_id = 1;
  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);
  641. }
  642. static struct stmmac_pci_info tgl_sgmii1g_phy0_info = {
  643. .setup = tgl_sgmii_phy0_data,
  644. };
  645. static int tgl_sgmii_phy1_data(struct pci_dev *pdev,
  646. struct plat_stmmacenet_data *plat)
  647. {
  648. plat->bus_id = 2;
  649. plat->phy_interface = PHY_INTERFACE_MODE_SGMII;
  650. plat->serdes_powerup = intel_serdes_powerup;
  651. plat->serdes_powerdown = intel_serdes_powerdown;
  652. return tgl_common_data(pdev, plat);
  653. }
  654. static struct stmmac_pci_info tgl_sgmii1g_phy1_info = {
  655. .setup = tgl_sgmii_phy1_data,
  656. };
  657. static int adls_sgmii_phy0_data(struct pci_dev *pdev,
  658. struct plat_stmmacenet_data *plat)
  659. {
  660. plat->bus_id = 1;
  661. plat->phy_interface = PHY_INTERFACE_MODE_SGMII;
  662. /* SerDes power up and power down are done in BIOS for ADL */
  663. return tgl_common_data(pdev, plat);
  664. }
  665. static struct stmmac_pci_info adls_sgmii1g_phy0_info = {
  666. .setup = adls_sgmii_phy0_data,
  667. };
  668. static int adls_sgmii_phy1_data(struct pci_dev *pdev,
  669. struct plat_stmmacenet_data *plat)
  670. {
  671. plat->bus_id = 2;
  672. plat->phy_interface = PHY_INTERFACE_MODE_SGMII;
  673. /* SerDes power up and power down are done in BIOS for ADL */
  674. return tgl_common_data(pdev, plat);
  675. }
  676. static struct stmmac_pci_info adls_sgmii1g_phy1_info = {
  677. .setup = adls_sgmii_phy1_data,
  678. };
  679. static const struct stmmac_pci_func_data galileo_stmmac_func_data[] = {
  680. {
  681. .func = 6,
  682. .phy_addr = 1,
  683. },
  684. };
  685. static const struct stmmac_pci_dmi_data galileo_stmmac_dmi_data = {
  686. .func = galileo_stmmac_func_data,
  687. .nfuncs = ARRAY_SIZE(galileo_stmmac_func_data),
  688. };
  689. static const struct stmmac_pci_func_data iot2040_stmmac_func_data[] = {
  690. {
  691. .func = 6,
  692. .phy_addr = 1,
  693. },
  694. {
  695. .func = 7,
  696. .phy_addr = 1,
  697. },
  698. };
  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),
  702. };
  703. static const struct dmi_system_id quark_pci_dmi[] = {
  704. {
  705. .matches = {
  706. DMI_EXACT_MATCH(DMI_BOARD_NAME, "Galileo"),
  707. },
  708. .driver_data = (void *)&galileo_stmmac_dmi_data,
  709. },
  710. {
  711. .matches = {
  712. DMI_EXACT_MATCH(DMI_BOARD_NAME, "GalileoGen2"),
  713. },
  714. .driver_data = (void *)&galileo_stmmac_dmi_data,
  715. },
  716. /* There are 2 types of SIMATIC IOT2000: IOT2020 and IOT2040.
  717. * The asset tag "6ES7647-0AA00-0YA2" is only for IOT2020 which
  718. * has only one pci network device while other asset tags are
  719. * for IOT2040 which has two.
  720. */
  721. {
  722. .matches = {
  723. DMI_EXACT_MATCH(DMI_BOARD_NAME, "SIMATIC IOT2000"),
  724. DMI_EXACT_MATCH(DMI_BOARD_ASSET_TAG,
  725. "6ES7647-0AA00-0YA2"),
  726. },
  727. .driver_data = (void *)&galileo_stmmac_dmi_data,
  728. },
  729. {
  730. .matches = {
  731. DMI_EXACT_MATCH(DMI_BOARD_NAME, "SIMATIC IOT2000"),
  732. },
  733. .driver_data = (void *)&iot2040_stmmac_dmi_data,
  734. },
  735. {}
  736. };
  737. static int quark_default_data(struct pci_dev *pdev,
  738. struct plat_stmmacenet_data *plat)
  739. {
  740. int ret;
  741. /* Set common default data first */
  742. common_default_data(plat);
  743. /* Refuse to load the driver and register net device if MAC controller
  744. * does not connect to any PHY interface.
  745. */
  746. ret = stmmac_pci_find_phy_addr(pdev, quark_pci_dmi);
  747. if (ret < 0) {
  748. /* Return error to the caller on DMI enabled boards. */
  749. if (dmi_get_system_info(DMI_BOARD_NAME))
  750. return ret;
  751. /* Galileo boards with old firmware don't support DMI. We always
  752. * use 1 here as PHY address, so at least the first found MAC
  753. * controller would be probed.
  754. */
  755. ret = 1;
  756. }
  757. plat->bus_id = pci_dev_id(pdev);
  758. plat->phy_addr = ret;
  759. plat->phy_interface = PHY_INTERFACE_MODE_RMII;
  760. plat->dma_cfg->pbl = 16;
  761. plat->dma_cfg->pblx8 = true;
  762. plat->dma_cfg->fixed_burst = 1;
  763. /* AXI (TODO) */
  764. return 0;
  765. }
  766. static const struct stmmac_pci_info quark_info = {
  767. .setup = quark_default_data,
  768. };
  769. static int stmmac_config_single_msi(struct pci_dev *pdev,
  770. struct plat_stmmacenet_data *plat,
  771. struct stmmac_resources *res)
  772. {
  773. int ret;
  774. ret = pci_alloc_irq_vectors(pdev, 1, 1, PCI_IRQ_ALL_TYPES);
  775. if (ret < 0) {
  776. dev_info(&pdev->dev, "%s: Single IRQ enablement failed\n",
  777. __func__);
  778. return ret;
  779. }
  780. res->irq = pci_irq_vector(pdev, 0);
  781. res->wol_irq = res->irq;
  782. plat->flags &= ~STMMAC_FLAG_MULTI_MSI_EN;
  783. dev_info(&pdev->dev, "%s: Single IRQ enablement successful\n",
  784. __func__);
  785. return 0;
  786. }
  787. static int stmmac_config_multi_msi(struct pci_dev *pdev,
  788. struct plat_stmmacenet_data *plat,
  789. struct stmmac_resources *res)
  790. {
  791. int ret;
  792. int i;
  793. if (plat->msi_rx_base_vec >= STMMAC_MSI_VEC_MAX ||
  794. plat->msi_tx_base_vec >= STMMAC_MSI_VEC_MAX) {
  795. dev_info(&pdev->dev, "%s: Invalid RX & TX vector defined\n",
  796. __func__);
  797. return -1;
  798. }
  799. ret = pci_alloc_irq_vectors(pdev, 2, STMMAC_MSI_VEC_MAX,
  800. PCI_IRQ_MSI | PCI_IRQ_MSIX);
  801. if (ret < 0) {
  802. dev_info(&pdev->dev, "%s: multi MSI enablement failed\n",
  803. __func__);
  804. return ret;
  805. }
  806. /* For RX MSI */
  807. for (i = 0; i < plat->rx_queues_to_use; i++) {
  808. res->rx_irq[i] = pci_irq_vector(pdev,
  809. plat->msi_rx_base_vec + i * 2);
  810. }
  811. /* For TX MSI */
  812. for (i = 0; i < plat->tx_queues_to_use; i++) {
  813. res->tx_irq[i] = pci_irq_vector(pdev,
  814. plat->msi_tx_base_vec + i * 2);
  815. }
  816. if (plat->msi_mac_vec < STMMAC_MSI_VEC_MAX)
  817. res->irq = pci_irq_vector(pdev, plat->msi_mac_vec);
  818. if (plat->msi_wol_vec < STMMAC_MSI_VEC_MAX)
  819. res->wol_irq = pci_irq_vector(pdev, plat->msi_wol_vec);
  820. if (plat->msi_lpi_vec < STMMAC_MSI_VEC_MAX)
  821. res->lpi_irq = pci_irq_vector(pdev, plat->msi_lpi_vec);
  822. if (plat->msi_sfty_ce_vec < STMMAC_MSI_VEC_MAX)
  823. res->sfty_ce_irq = pci_irq_vector(pdev, plat->msi_sfty_ce_vec);
  824. if (plat->msi_sfty_ue_vec < STMMAC_MSI_VEC_MAX)
  825. res->sfty_ue_irq = pci_irq_vector(pdev, plat->msi_sfty_ue_vec);
  826. plat->flags |= STMMAC_FLAG_MULTI_MSI_EN;
  827. dev_info(&pdev->dev, "%s: multi MSI enablement successful\n", __func__);
  828. return 0;
  829. }
  830. /**
  831. * intel_eth_pci_probe
  832. *
  833. * @pdev: pci device pointer
  834. * @id: pointer to table of device id/id's.
  835. *
  836. * Description: This probing function gets called for all PCI devices which
  837. * match the ID table and are not "owned" by other driver yet. This function
  838. * gets passed a "struct pci_dev *" for each device whose entry in the ID table
  839. * matches the device. The probe functions returns zero when the driver choose
  840. * to take "ownership" of the device or an error code(-ve no) otherwise.
  841. */
  842. static int intel_eth_pci_probe(struct pci_dev *pdev,
  843. const struct pci_device_id *id)
  844. {
  845. struct stmmac_pci_info *info = (struct stmmac_pci_info *)id->driver_data;
  846. struct intel_priv_data *intel_priv;
  847. struct plat_stmmacenet_data *plat;
  848. struct stmmac_resources res;
  849. int ret;
  850. intel_priv = devm_kzalloc(&pdev->dev, sizeof(*intel_priv), GFP_KERNEL);
  851. if (!intel_priv)
  852. return -ENOMEM;
  853. plat = devm_kzalloc(&pdev->dev, sizeof(*plat), GFP_KERNEL);
  854. if (!plat)
  855. return -ENOMEM;
  856. plat->mdio_bus_data = devm_kzalloc(&pdev->dev,
  857. sizeof(*plat->mdio_bus_data),
  858. GFP_KERNEL);
  859. if (!plat->mdio_bus_data)
  860. return -ENOMEM;
  861. plat->dma_cfg = devm_kzalloc(&pdev->dev, sizeof(*plat->dma_cfg),
  862. GFP_KERNEL);
  863. if (!plat->dma_cfg)
  864. return -ENOMEM;
  865. plat->safety_feat_cfg = devm_kzalloc(&pdev->dev,
  866. sizeof(*plat->safety_feat_cfg),
  867. GFP_KERNEL);
  868. if (!plat->safety_feat_cfg)
  869. return -ENOMEM;
  870. /* Enable pci device */
  871. ret = pcim_enable_device(pdev);
  872. if (ret) {
  873. dev_err(&pdev->dev, "%s: ERROR: failed to enable device\n",
  874. __func__);
  875. return ret;
  876. }
  877. ret = pcim_iomap_regions(pdev, BIT(0), pci_name(pdev));
  878. if (ret)
  879. return ret;
  880. pci_set_master(pdev);
  881. plat->bsp_priv = intel_priv;
  882. intel_priv->mdio_adhoc_addr = INTEL_MGBE_ADHOC_ADDR;
  883. intel_priv->crossts_adj = 1;
  884. /* Initialize all MSI vectors to invalid so that it can be set
  885. * according to platform data settings below.
  886. * Note: MSI vector takes value from 0 upto 31 (STMMAC_MSI_VEC_MAX)
  887. */
  888. plat->msi_mac_vec = STMMAC_MSI_VEC_MAX;
  889. plat->msi_wol_vec = STMMAC_MSI_VEC_MAX;
  890. plat->msi_lpi_vec = STMMAC_MSI_VEC_MAX;
  891. plat->msi_sfty_ce_vec = STMMAC_MSI_VEC_MAX;
  892. plat->msi_sfty_ue_vec = STMMAC_MSI_VEC_MAX;
  893. plat->msi_rx_base_vec = STMMAC_MSI_VEC_MAX;
  894. plat->msi_tx_base_vec = STMMAC_MSI_VEC_MAX;
  895. ret = info->setup(pdev, plat);
  896. if (ret)
  897. return ret;
  898. memset(&res, 0, sizeof(res));
  899. res.addr = pcim_iomap_table(pdev)[0];
  900. if (plat->eee_usecs_rate > 0) {
  901. u32 tx_lpi_usec;
  902. tx_lpi_usec = (plat->eee_usecs_rate / 1000000) - 1;
  903. writel(tx_lpi_usec, res.addr + GMAC_1US_TIC_COUNTER);
  904. }
  905. ret = stmmac_config_multi_msi(pdev, plat, &res);
  906. if (ret) {
  907. ret = stmmac_config_single_msi(pdev, plat, &res);
  908. if (ret) {
  909. dev_err(&pdev->dev, "%s: ERROR: failed to enable IRQ\n",
  910. __func__);
  911. goto err_alloc_irq;
  912. }
  913. }
  914. ret = stmmac_dvr_probe(&pdev->dev, plat, &res);
  915. if (ret) {
  916. goto err_alloc_irq;
  917. }
  918. return 0;
  919. err_alloc_irq:
  920. clk_disable_unprepare(plat->stmmac_clk);
  921. clk_unregister_fixed_rate(plat->stmmac_clk);
  922. return ret;
  923. }
  924. /**
  925. * intel_eth_pci_remove
  926. *
  927. * @pdev: pci device pointer
  928. * Description: this function calls the main to free the net resources
  929. * and releases the PCI resources.
  930. */
  931. static void intel_eth_pci_remove(struct pci_dev *pdev)
  932. {
  933. struct net_device *ndev = dev_get_drvdata(&pdev->dev);
  934. struct stmmac_priv *priv = netdev_priv(ndev);
  935. stmmac_dvr_remove(&pdev->dev);
  936. clk_disable_unprepare(priv->plat->stmmac_clk);
  937. clk_unregister_fixed_rate(priv->plat->stmmac_clk);
  938. }
  939. static int __maybe_unused intel_eth_pci_suspend(struct device *dev)
  940. {
  941. struct pci_dev *pdev = to_pci_dev(dev);
  942. int ret;
  943. ret = stmmac_suspend(dev);
  944. if (ret)
  945. return ret;
  946. ret = pci_save_state(pdev);
  947. if (ret)
  948. return ret;
  949. pci_wake_from_d3(pdev, true);
  950. pci_set_power_state(pdev, PCI_D3hot);
  951. return 0;
  952. }
  953. static int __maybe_unused intel_eth_pci_resume(struct device *dev)
  954. {
  955. struct pci_dev *pdev = to_pci_dev(dev);
  956. int ret;
  957. pci_restore_state(pdev);
  958. pci_set_power_state(pdev, PCI_D0);
  959. ret = pcim_enable_device(pdev);
  960. if (ret)
  961. return ret;
  962. pci_set_master(pdev);
  963. return stmmac_resume(dev);
  964. }
  965. static SIMPLE_DEV_PM_OPS(intel_eth_pm_ops, intel_eth_pci_suspend,
  966. intel_eth_pci_resume);
  967. #define PCI_DEVICE_ID_INTEL_QUARK 0x0937
  968. #define PCI_DEVICE_ID_INTEL_EHL_RGMII1G 0x4b30
  969. #define PCI_DEVICE_ID_INTEL_EHL_SGMII1G 0x4b31
  970. #define PCI_DEVICE_ID_INTEL_EHL_SGMII2G5 0x4b32
  971. /* Intel(R) Programmable Services Engine (Intel(R) PSE) consist of 2 MAC
  972. * which are named PSE0 and PSE1
  973. */
  974. #define PCI_DEVICE_ID_INTEL_EHL_PSE0_RGMII1G 0x4ba0
  975. #define PCI_DEVICE_ID_INTEL_EHL_PSE0_SGMII1G 0x4ba1
  976. #define PCI_DEVICE_ID_INTEL_EHL_PSE0_SGMII2G5 0x4ba2
  977. #define PCI_DEVICE_ID_INTEL_EHL_PSE1_RGMII1G 0x4bb0
  978. #define PCI_DEVICE_ID_INTEL_EHL_PSE1_SGMII1G 0x4bb1
  979. #define PCI_DEVICE_ID_INTEL_EHL_PSE1_SGMII2G5 0x4bb2
  980. #define PCI_DEVICE_ID_INTEL_TGLH_SGMII1G_0 0x43ac
  981. #define PCI_DEVICE_ID_INTEL_TGLH_SGMII1G_1 0x43a2
  982. #define PCI_DEVICE_ID_INTEL_TGL_SGMII1G 0xa0ac
  983. #define PCI_DEVICE_ID_INTEL_ADLS_SGMII1G_0 0x7aac
  984. #define PCI_DEVICE_ID_INTEL_ADLS_SGMII1G_1 0x7aad
  985. #define PCI_DEVICE_ID_INTEL_ADLN_SGMII1G 0x54ac
  986. #define PCI_DEVICE_ID_INTEL_RPLP_SGMII1G 0x51ac
  987. static const struct pci_device_id intel_eth_pci_id_table[] = {
  988. { PCI_DEVICE_DATA(INTEL, QUARK, &quark_info) },
  989. { PCI_DEVICE_DATA(INTEL, EHL_RGMII1G, &ehl_rgmii1g_info) },
  990. { PCI_DEVICE_DATA(INTEL, EHL_SGMII1G, &ehl_sgmii1g_info) },
  991. { PCI_DEVICE_DATA(INTEL, EHL_SGMII2G5, &ehl_sgmii1g_info) },
  992. { PCI_DEVICE_DATA(INTEL, EHL_PSE0_RGMII1G, &ehl_pse0_rgmii1g_info) },
  993. { PCI_DEVICE_DATA(INTEL, EHL_PSE0_SGMII1G, &ehl_pse0_sgmii1g_info) },
  994. { PCI_DEVICE_DATA(INTEL, EHL_PSE0_SGMII2G5, &ehl_pse0_sgmii1g_info) },
  995. { PCI_DEVICE_DATA(INTEL, EHL_PSE1_RGMII1G, &ehl_pse1_rgmii1g_info) },
  996. { PCI_DEVICE_DATA(INTEL, EHL_PSE1_SGMII1G, &ehl_pse1_sgmii1g_info) },
  997. { PCI_DEVICE_DATA(INTEL, EHL_PSE1_SGMII2G5, &ehl_pse1_sgmii1g_info) },
  998. { PCI_DEVICE_DATA(INTEL, TGL_SGMII1G, &tgl_sgmii1g_phy0_info) },
  999. { PCI_DEVICE_DATA(INTEL, TGLH_SGMII1G_0, &tgl_sgmii1g_phy0_info) },
  1000. { PCI_DEVICE_DATA(INTEL, TGLH_SGMII1G_1, &tgl_sgmii1g_phy1_info) },
  1001. { PCI_DEVICE_DATA(INTEL, ADLS_SGMII1G_0, &adls_sgmii1g_phy0_info) },
  1002. { PCI_DEVICE_DATA(INTEL, ADLS_SGMII1G_1, &adls_sgmii1g_phy1_info) },
  1003. { PCI_DEVICE_DATA(INTEL, ADLN_SGMII1G, &tgl_sgmii1g_phy0_info) },
  1004. { PCI_DEVICE_DATA(INTEL, RPLP_SGMII1G, &tgl_sgmii1g_phy0_info) },
  1005. {}
  1006. };
  1007. MODULE_DEVICE_TABLE(pci, intel_eth_pci_id_table);
  1008. static struct pci_driver intel_eth_pci_driver = {
  1009. .name = "intel-eth-pci",
  1010. .id_table = intel_eth_pci_id_table,
  1011. .probe = intel_eth_pci_probe,
  1012. .remove = intel_eth_pci_remove,
  1013. .driver = {
  1014. .pm = &intel_eth_pm_ops,
  1015. },
  1016. };
  1017. module_pci_driver(intel_eth_pci_driver);
  1018. MODULE_DESCRIPTION("INTEL 10/100/1000 Ethernet PCI driver");
  1019. MODULE_AUTHOR("Voon Weifeng <weifeng.voon@intel.com>");
  1020. MODULE_LICENSE("GPL v2");