dwmac-intel.c 38 KB

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