pcie_mediatek.c 18 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745
  1. // SPDX-License-Identifier: GPL-2.0
  2. /*
  3. * MediaTek PCIe host controller driver.
  4. *
  5. * Copyright (c) 2017-2019 MediaTek Inc.
  6. * Author: Ryder Lee <ryder.lee@mediatek.com>
  7. * Honghui Zhang <honghui.zhang@mediatek.com>
  8. */
  9. #include <common.h>
  10. #include <clk.h>
  11. #include <dm.h>
  12. #include <generic-phy.h>
  13. #include <log.h>
  14. #include <malloc.h>
  15. #include <pci.h>
  16. #include <reset.h>
  17. #include <asm/io.h>
  18. #include <dm/devres.h>
  19. #include <linux/bitops.h>
  20. #include <linux/iopoll.h>
  21. #include <linux/list.h>
  22. #include "pci_internal.h"
  23. /* PCIe shared registers */
  24. #define PCIE_SYS_CFG 0x00
  25. #define PCIE_INT_ENABLE 0x0c
  26. #define PCIE_CFG_ADDR 0x20
  27. #define PCIE_CFG_DATA 0x24
  28. /* PCIe per port registers */
  29. #define PCIE_BAR0_SETUP 0x10
  30. #define PCIE_CLASS 0x34
  31. #define PCIE_LINK_STATUS 0x50
  32. #define PCIE_PORT_INT_EN(x) BIT(20 + (x))
  33. #define PCIE_PORT_PERST(x) BIT(1 + (x))
  34. #define PCIE_PORT_LINKUP BIT(0)
  35. #define PCIE_BAR_MAP_MAX GENMASK(31, 16)
  36. #define PCIE_BAR_ENABLE BIT(0)
  37. #define PCIE_REVISION_ID BIT(0)
  38. #define PCIE_CLASS_CODE (0x60400 << 8)
  39. /* MediaTek specific configuration registers */
  40. #define PCIE_FTS_NUM 0x70c
  41. #define PCIE_FTS_NUM_MASK GENMASK(15, 8)
  42. #define PCIE_FTS_NUM_L0(x) ((x) & 0xff << 8)
  43. #define PCIE_FC_CREDIT 0x73c
  44. #define PCIE_FC_CREDIT_MASK (GENMASK(31, 31) | GENMASK(28, 16))
  45. #define PCIE_FC_CREDIT_VAL(x) ((x) << 16)
  46. /* PCIe V2 share registers */
  47. #define PCIE_SYS_CFG_V2 0x0
  48. #define PCIE_CSR_LTSSM_EN(x) BIT(0 + (x) * 8)
  49. #define PCIE_CSR_ASPM_L1_EN(x) BIT(1 + (x) * 8)
  50. /* PCIe V2 per-port registers */
  51. #define PCIE_CONF_VEND_ID 0x100
  52. #define PCIE_CONF_DEVICE_ID 0x102
  53. #define PCIE_CONF_CLASS_ID 0x106
  54. #define PCIE_AHB_TRANS_BASE0_L 0x438
  55. #define PCIE_AHB_TRANS_BASE0_H 0x43c
  56. #define AHB2PCIE_SIZE(x) ((x) & GENMASK(4, 0))
  57. #define PCIE_AXI_WINDOW0 0x448
  58. #define WIN_ENABLE BIT(7)
  59. /*
  60. * Define PCIe to AHB window size as 2^33 to support max 8GB address space
  61. * translate, support least 4GB DRAM size access from EP DMA(physical DRAM
  62. * start from 0x40000000).
  63. */
  64. #define PCIE2AHB_SIZE 0x21
  65. /* PCIe V2 configuration transaction header */
  66. #define PCIE_CFG_HEADER0 0x460
  67. #define PCIE_CFG_HEADER1 0x464
  68. #define PCIE_CFG_HEADER2 0x468
  69. #define PCIE_CFG_WDATA 0x470
  70. #define PCIE_APP_TLP_REQ 0x488
  71. #define PCIE_CFG_RDATA 0x48c
  72. #define APP_CFG_REQ BIT(0)
  73. #define APP_CPL_STATUS GENMASK(7, 5)
  74. #define CFG_WRRD_TYPE_0 4
  75. #define CFG_WR_FMT 2
  76. #define CFG_RD_FMT 0
  77. #define CFG_DW0_LENGTH(length) ((length) & GENMASK(9, 0))
  78. #define CFG_DW0_TYPE(type) (((type) << 24) & GENMASK(28, 24))
  79. #define CFG_DW0_FMT(fmt) (((fmt) << 29) & GENMASK(31, 29))
  80. #define CFG_DW2_REGN(regn) ((regn) & GENMASK(11, 2))
  81. #define CFG_DW2_FUN(fun) (((fun) << 16) & GENMASK(18, 16))
  82. #define CFG_DW2_DEV(dev) (((dev) << 19) & GENMASK(23, 19))
  83. #define CFG_DW2_BUS(bus) (((bus) << 24) & GENMASK(31, 24))
  84. #define CFG_HEADER_DW0(type, fmt) \
  85. (CFG_DW0_LENGTH(1) | CFG_DW0_TYPE(type) | CFG_DW0_FMT(fmt))
  86. #define CFG_HEADER_DW1(where, size) \
  87. (GENMASK(((size) - 1), 0) << ((where) & 0x3))
  88. #define CFG_HEADER_DW2(regn, fun, dev, bus) \
  89. (CFG_DW2_REGN(regn) | CFG_DW2_FUN(fun) | \
  90. CFG_DW2_DEV(dev) | CFG_DW2_BUS(bus))
  91. #define PCIE_RST_CTRL 0x510
  92. #define PCIE_PHY_RSTB BIT(0)
  93. #define PCIE_PIPE_SRSTB BIT(1)
  94. #define PCIE_MAC_SRSTB BIT(2)
  95. #define PCIE_CRSTB BIT(3)
  96. #define PCIE_PERSTB BIT(8)
  97. #define PCIE_LINKDOWN_RST_EN GENMASK(15, 13)
  98. #define PCIE_LINK_STATUS_V2 0x804
  99. #define PCIE_PORT_LINKUP_V2 BIT(11)
  100. #define PCI_VENDOR_ID_MEDIATEK 0x14c3
  101. enum MTK_PCIE_GEN {PCIE_V1, PCIE_V2, PCIE_V3};
  102. struct mtk_pcie_port {
  103. void __iomem *base;
  104. struct list_head list;
  105. struct mtk_pcie *pcie;
  106. struct reset_ctl reset;
  107. struct clk sys_ck;
  108. struct clk ahb_ck;
  109. struct clk axi_ck;
  110. struct clk aux_ck;
  111. struct clk obff_ck;
  112. struct clk pipe_ck;
  113. struct phy phy;
  114. u32 slot;
  115. };
  116. struct mtk_pcie {
  117. void __iomem *base;
  118. void *priv;
  119. struct clk free_ck;
  120. struct list_head ports;
  121. };
  122. static int mtk_pcie_config_address(const struct udevice *udev, pci_dev_t bdf,
  123. uint offset, void **paddress)
  124. {
  125. struct mtk_pcie *pcie = dev_get_priv(udev);
  126. u32 val;
  127. val = PCI_CONF1_EXT_ADDRESS(PCI_BUS(bdf), PCI_DEV(bdf),
  128. PCI_FUNC(bdf), offset) & ~PCI_CONF1_ENABLE;
  129. writel(val, pcie->base + PCIE_CFG_ADDR);
  130. *paddress = pcie->base + PCIE_CFG_DATA + (offset & 3);
  131. return 0;
  132. }
  133. static int mtk_pcie_read_config(const struct udevice *bus, pci_dev_t bdf,
  134. uint offset, ulong *valuep,
  135. enum pci_size_t size)
  136. {
  137. return pci_generic_mmap_read_config(bus, mtk_pcie_config_address,
  138. bdf, offset, valuep, size);
  139. }
  140. static int mtk_pcie_write_config(struct udevice *bus, pci_dev_t bdf,
  141. uint offset, ulong value,
  142. enum pci_size_t size)
  143. {
  144. return pci_generic_mmap_write_config(bus, mtk_pcie_config_address,
  145. bdf, offset, value, size);
  146. }
  147. static const struct dm_pci_ops mtk_pcie_ops = {
  148. .read_config = mtk_pcie_read_config,
  149. .write_config = mtk_pcie_write_config,
  150. };
  151. static int mtk_pcie_check_cfg_cpld(struct mtk_pcie_port *port)
  152. {
  153. u32 val;
  154. int err;
  155. err = readl_poll_timeout(port->base + PCIE_APP_TLP_REQ, val,
  156. !(val & APP_CFG_REQ), 100 * 1000);
  157. if (err)
  158. return -1;
  159. if (readl(port->base + PCIE_APP_TLP_REQ) & APP_CPL_STATUS)
  160. return -1;
  161. return 0;
  162. }
  163. static int mtk_pcie_hw_rd_cfg(struct mtk_pcie_port *port, u32 bus, pci_dev_t devfn,
  164. int where, int size, ulong *val)
  165. {
  166. u32 tmp;
  167. writel(CFG_HEADER_DW0(CFG_WRRD_TYPE_0, CFG_RD_FMT),
  168. port->base + PCIE_CFG_HEADER0);
  169. writel(CFG_HEADER_DW1(where, size), port->base + PCIE_CFG_HEADER1);
  170. writel(CFG_HEADER_DW2(where, PCI_FUNC(devfn), PCI_DEV(devfn), bus),
  171. port->base + PCIE_CFG_HEADER2);
  172. /* Trigger h/w to transmit Cfgrd TLP */
  173. tmp = readl(port->base + PCIE_APP_TLP_REQ);
  174. tmp |= APP_CFG_REQ;
  175. writel(tmp, port->base + PCIE_APP_TLP_REQ);
  176. /* Check completion status */
  177. if (mtk_pcie_check_cfg_cpld(port))
  178. return -1;
  179. /* Read cpld payload of Cfgrd */
  180. *val = readl(port->base + PCIE_CFG_RDATA);
  181. if (size == 1)
  182. *val = (*val >> (8 * (where & 3))) & 0xff;
  183. else if (size == 2)
  184. *val = (*val >> (8 * (where & 3))) & 0xffff;
  185. return 0;
  186. }
  187. static int mtk_pcie_hw_wr_cfg(struct mtk_pcie_port *port, u32 bus, pci_dev_t devfn,
  188. int where, int size, u32 val)
  189. {
  190. /* Write PCIe configuration transaction header for Cfgwr */
  191. writel(CFG_HEADER_DW0(CFG_WRRD_TYPE_0, CFG_WR_FMT),
  192. port->base + PCIE_CFG_HEADER0);
  193. writel(CFG_HEADER_DW1(where, size), port->base + PCIE_CFG_HEADER1);
  194. writel(CFG_HEADER_DW2(where, PCI_FUNC(devfn), PCI_DEV(devfn), bus),
  195. port->base + PCIE_CFG_HEADER2);
  196. /* Write Cfgwr data */
  197. val = val << 8 * (where & 3);
  198. writel(val, port->base + PCIE_CFG_WDATA);
  199. /* Trigger h/w to transmit Cfgwr TLP */
  200. val = readl(port->base + PCIE_APP_TLP_REQ);
  201. val |= APP_CFG_REQ;
  202. writel(val, port->base + PCIE_APP_TLP_REQ);
  203. /* Check completion status */
  204. return mtk_pcie_check_cfg_cpld(port);
  205. }
  206. static struct mtk_pcie_port *mtk_pcie_find_port(const struct udevice *bus,
  207. pci_dev_t bdf)
  208. {
  209. struct mtk_pcie *pcie = dev_get_priv(bus);
  210. struct mtk_pcie_port *port;
  211. struct udevice *dev;
  212. struct pci_child_plat *pplat = NULL;
  213. int ret = 0;
  214. if (PCI_BUS(bdf) != 0) {
  215. ret = pci_get_bus(PCI_BUS(bdf), &dev);
  216. if (ret) {
  217. debug("No such device,ret = %d\n", ret);
  218. return NULL;
  219. }
  220. while (dev_seq(dev->parent) != 0)
  221. dev = dev->parent;
  222. pplat = dev_get_parent_plat(dev);
  223. }
  224. list_for_each_entry(port, &pcie->ports, list) {
  225. if ((PCI_BUS(bdf) == 0) && (PCI_DEV(bdf) == port->slot))
  226. return port;
  227. if (PCI_BUS(bdf) != 0 && PCI_DEV(bdf) == 0 &&
  228. PCI_DEV(pplat->devfn) == port->slot)
  229. return port;
  230. }
  231. return NULL;
  232. }
  233. static int mtk_pcie_config_read(const struct udevice *bus, pci_dev_t bdf,
  234. uint offset, ulong *valuep,
  235. enum pci_size_t size)
  236. {
  237. struct mtk_pcie_port *port;
  238. int ret;
  239. port = mtk_pcie_find_port(bus, bdf);
  240. if (!port) {
  241. *valuep = pci_get_ff(size);
  242. return 0;
  243. }
  244. ret = mtk_pcie_hw_rd_cfg(port, PCI_BUS(bdf), bdf, offset, (1 << size), valuep);
  245. if (ret)
  246. *valuep = pci_get_ff(size);
  247. return ret;
  248. }
  249. static int mtk_pcie_config_write(struct udevice *bus, pci_dev_t bdf,
  250. uint offset, ulong value,
  251. enum pci_size_t size)
  252. {
  253. struct mtk_pcie_port *port;
  254. port = mtk_pcie_find_port(bus, bdf);
  255. if (!port)
  256. return 0;
  257. /* Do not modify RC bar 0/1. */
  258. if (PCI_BUS(bdf) == 0 && (offset == 0x10 || offset == 0x14))
  259. return 0;
  260. return mtk_pcie_hw_wr_cfg(port, PCI_BUS(bdf), bdf, offset, (1 << size), value);
  261. }
  262. static const struct dm_pci_ops mtk_pcie_ops_v2 = {
  263. .read_config = mtk_pcie_config_read,
  264. .write_config = mtk_pcie_config_write,
  265. };
  266. static void mtk_pcie_port_free(struct mtk_pcie_port *port)
  267. {
  268. list_del(&port->list);
  269. free(port);
  270. }
  271. static int mtk_pcie_startup_port(struct mtk_pcie_port *port)
  272. {
  273. struct mtk_pcie *pcie = port->pcie;
  274. u32 val;
  275. int err;
  276. /* assert port PERST_N */
  277. setbits_le32(pcie->base + PCIE_SYS_CFG, PCIE_PORT_PERST(port->slot));
  278. /* de-assert port PERST_N */
  279. clrbits_le32(pcie->base + PCIE_SYS_CFG, PCIE_PORT_PERST(port->slot));
  280. /* 100ms timeout value should be enough for Gen1/2 training */
  281. err = readl_poll_timeout(port->base + PCIE_LINK_STATUS, val,
  282. !!(val & PCIE_PORT_LINKUP), 100000);
  283. if (err)
  284. return -ETIMEDOUT;
  285. /* disable interrupt */
  286. clrbits_le32(pcie->base + PCIE_INT_ENABLE,
  287. PCIE_PORT_INT_EN(port->slot));
  288. /* map to all DDR region. We need to set it before cfg operation. */
  289. writel(PCIE_BAR_MAP_MAX | PCIE_BAR_ENABLE,
  290. port->base + PCIE_BAR0_SETUP);
  291. /* configure class code and revision ID */
  292. writel(PCIE_CLASS_CODE | PCIE_REVISION_ID, port->base + PCIE_CLASS);
  293. /* configure FC credit */
  294. val = PCI_CONF1_EXT_ADDRESS(0, port->slot, 0, PCIE_FC_CREDIT) & ~PCI_CONF1_ENABLE;
  295. writel(val, pcie->base + PCIE_CFG_ADDR);
  296. clrsetbits_le32(pcie->base + PCIE_CFG_DATA, PCIE_FC_CREDIT_MASK,
  297. PCIE_FC_CREDIT_VAL(0x806c));
  298. /* configure RC FTS number to 250 when it leaves L0s */
  299. val = PCI_CONF1_EXT_ADDRESS(0, port->slot, 0, PCIE_FTS_NUM) & ~PCI_CONF1_ENABLE;
  300. writel(val, pcie->base + PCIE_CFG_ADDR);
  301. clrsetbits_le32(pcie->base + PCIE_CFG_DATA, PCIE_FTS_NUM_MASK,
  302. PCIE_FTS_NUM_L0(0x50));
  303. return 0;
  304. }
  305. static int mtk_pcie_startup_port_v2(struct mtk_pcie_port *port)
  306. {
  307. struct mtk_pcie *pcie = port->pcie;
  308. struct udevice *dev = pcie->priv;
  309. struct pci_region *pci_mem;
  310. u32 val;
  311. int err;
  312. /* MT7622/MT7629 platforms need to enable LTSSM and ASPM from PCIe subsys */
  313. if (pcie->base) {
  314. val = readl(pcie->base + PCIE_SYS_CFG_V2);
  315. val |= PCIE_CSR_LTSSM_EN(port->slot) |
  316. PCIE_CSR_ASPM_L1_EN(port->slot);
  317. writel(val, pcie->base + PCIE_SYS_CFG_V2);
  318. }
  319. /* Assert all reset signals */
  320. writel(0, port->base + PCIE_RST_CTRL);
  321. /*
  322. * Enable PCIe link down reset, if link status changed from link up to
  323. * link down, this will reset MAC control registers and configuration
  324. * space.
  325. */
  326. writel(PCIE_LINKDOWN_RST_EN, port->base + PCIE_RST_CTRL);
  327. udelay(500);
  328. /* De-assert PHY, PE, PIPE, MAC and configuration reset */
  329. val = readl(port->base + PCIE_RST_CTRL);
  330. val |= PCIE_PHY_RSTB | PCIE_PIPE_SRSTB | PCIE_MAC_SRSTB | PCIE_CRSTB;
  331. writel(val, port->base + PCIE_RST_CTRL);
  332. mdelay(100);
  333. val |= PCIE_PERSTB;
  334. writel(val, port->base + PCIE_RST_CTRL);
  335. /* Set up vendor ID and class code */
  336. val = PCI_VENDOR_ID_MEDIATEK;
  337. writew(val, port->base + PCIE_CONF_VEND_ID);
  338. val = PCI_CLASS_BRIDGE_PCI;
  339. writew(val, port->base + PCIE_CONF_CLASS_ID);
  340. /* 100ms timeout value should be enough for Gen1/2 training */
  341. err = readl_poll_timeout(port->base + PCIE_LINK_STATUS_V2, val,
  342. !!(val & PCIE_PORT_LINKUP_V2),
  343. 100 * 1000);
  344. if (err)
  345. return -ETIMEDOUT;
  346. pci_get_regions(dev, NULL, &pci_mem, NULL);
  347. /* Set AHB to PCIe translation windows */
  348. val = lower_32_bits(pci_mem->bus_start) |
  349. AHB2PCIE_SIZE(fls(pci_mem->size) - 1);
  350. writel(val, port->base + PCIE_AHB_TRANS_BASE0_L);
  351. val = upper_32_bits(pci_mem->bus_start);
  352. writel(val, port->base + PCIE_AHB_TRANS_BASE0_H);
  353. /* Set PCIe to AXI translation memory space.*/
  354. val = PCIE2AHB_SIZE | WIN_ENABLE;
  355. writel(val, port->base + PCIE_AXI_WINDOW0);
  356. return 0;
  357. }
  358. static void mtk_pcie_enable_port(struct mtk_pcie_port *port)
  359. {
  360. int err;
  361. err = clk_enable(&port->sys_ck);
  362. if (err)
  363. goto err_sys_clk;
  364. err = reset_assert(&port->reset);
  365. if (err)
  366. goto err_reset;
  367. err = reset_deassert(&port->reset);
  368. if (err)
  369. goto err_reset;
  370. err = generic_phy_init(&port->phy);
  371. if (err)
  372. goto err_phy_init;
  373. err = generic_phy_power_on(&port->phy);
  374. if (err)
  375. goto err_phy_on;
  376. if (!mtk_pcie_startup_port(port))
  377. return;
  378. pr_err("Port%d link down\n", port->slot);
  379. generic_phy_power_off(&port->phy);
  380. err_phy_on:
  381. generic_phy_exit(&port->phy);
  382. err_phy_init:
  383. err_reset:
  384. clk_disable(&port->sys_ck);
  385. err_sys_clk:
  386. mtk_pcie_port_free(port);
  387. }
  388. static void mtk_pcie_enable_port_v2(struct mtk_pcie_port *port)
  389. {
  390. int err = 0;
  391. err = clk_enable(&port->sys_ck);
  392. if (err) {
  393. debug("clk_enable(sys_ck) failed: %d\n", err);
  394. goto exit;
  395. }
  396. err = clk_enable(&port->ahb_ck);
  397. if (err) {
  398. debug("clk_enable(ahb_ck) failed: %d\n", err);
  399. goto exit;
  400. }
  401. err = clk_enable(&port->aux_ck);
  402. if (err) {
  403. debug("clk_enable(aux_ck) failed: %d\n", err);
  404. goto exit;
  405. }
  406. err = clk_enable(&port->axi_ck);
  407. if (err) {
  408. debug("clk_enable(axi_ck) failed: %d\n", err);
  409. goto exit;
  410. }
  411. err = clk_enable(&port->obff_ck);
  412. if (err) {
  413. debug("clk_enable(obff_ck) failed: %d\n", err);
  414. goto exit;
  415. }
  416. err = clk_enable(&port->pipe_ck);
  417. if (err) {
  418. debug("clk_enable(pipe_ck) failed: %d\n", err);
  419. goto exit;
  420. }
  421. err = mtk_pcie_startup_port_v2(port);
  422. if (!err)
  423. return;
  424. pr_err("Port%d link down\n", port->slot);
  425. exit:
  426. mtk_pcie_port_free(port);
  427. }
  428. static int mtk_pcie_parse_port(struct udevice *dev, u32 slot)
  429. {
  430. struct mtk_pcie *pcie = dev_get_priv(dev);
  431. struct mtk_pcie_port *port;
  432. char name[10];
  433. int err;
  434. port = devm_kzalloc(dev, sizeof(*port), GFP_KERNEL);
  435. if (!port)
  436. return -ENOMEM;
  437. snprintf(name, sizeof(name), "port%d", slot);
  438. port->base = dev_remap_addr_name(dev, name);
  439. if (!port->base)
  440. return -ENOENT;
  441. snprintf(name, sizeof(name), "sys_ck%d", slot);
  442. err = clk_get_by_name(dev, name, &port->sys_ck);
  443. if (err)
  444. return err;
  445. err = reset_get_by_index(dev, slot, &port->reset);
  446. if (err)
  447. return err;
  448. err = generic_phy_get_by_index(dev, slot, &port->phy);
  449. if (err)
  450. return err;
  451. port->slot = slot;
  452. port->pcie = pcie;
  453. INIT_LIST_HEAD(&port->list);
  454. list_add_tail(&port->list, &pcie->ports);
  455. return 0;
  456. }
  457. static int mtk_pcie_parse_port_v2(struct udevice *dev, u32 slot)
  458. {
  459. struct mtk_pcie *pcie = dev_get_priv(dev);
  460. struct mtk_pcie_port *port;
  461. char name[10];
  462. int err;
  463. port = devm_kzalloc(dev, sizeof(*port), GFP_KERNEL);
  464. if (!port)
  465. return -ENOMEM;
  466. snprintf(name, sizeof(name), "port%d", slot);
  467. port->base = dev_remap_addr_name(dev, name);
  468. if (!port->base) {
  469. debug("failed to map port%d base\n", slot);
  470. return -ENOENT;
  471. }
  472. snprintf(name, sizeof(name), "sys_ck%d", slot);
  473. err = clk_get_by_name(dev, name, &port->sys_ck);
  474. if (err) {
  475. debug("clk_get_by_name(sys_ck) failed: %d\n", err);
  476. return err;
  477. }
  478. snprintf(name, sizeof(name), "ahb_ck%d", slot);
  479. err = clk_get_by_name(dev, name, &port->ahb_ck);
  480. if (err) {
  481. debug("clk_get_by_name(ahb_ck) failed: %d\n", err);
  482. return err;
  483. }
  484. snprintf(name, sizeof(name), "aux_ck%d", slot);
  485. err = clk_get_by_name(dev, name, &port->aux_ck);
  486. if (err) {
  487. debug("clk_get_by_name(aux_ck) failed: %d\n", err);
  488. return err;
  489. }
  490. snprintf(name, sizeof(name), "axi_ck%d", slot);
  491. err = clk_get_by_name(dev, name, &port->axi_ck);
  492. if (err) {
  493. debug("clk_get_by_name(axi_ck) failed: %d\n", err);
  494. return err;
  495. }
  496. snprintf(name, sizeof(name), "obff_ck%d", slot);
  497. err = clk_get_by_name(dev, name, &port->obff_ck);
  498. if (err) {
  499. debug("clk_get_by_name(obff_ck) failed: %d\n", err);
  500. return err;
  501. }
  502. snprintf(name, sizeof(name), "pipe_ck%d", slot);
  503. err = clk_get_by_name(dev, name, &port->pipe_ck);
  504. if (err) {
  505. debug("clk_get_by_name(pipe_ck) failed: %d\n", err);
  506. return err;
  507. }
  508. port->slot = slot;
  509. port->pcie = pcie;
  510. INIT_LIST_HEAD(&port->list);
  511. list_add_tail(&port->list, &pcie->ports);
  512. return 0;
  513. }
  514. static int mtk_pcie_probe(struct udevice *dev)
  515. {
  516. struct mtk_pcie *pcie = dev_get_priv(dev);
  517. struct mtk_pcie_port *port, *tmp;
  518. ofnode subnode;
  519. int err;
  520. INIT_LIST_HEAD(&pcie->ports);
  521. pcie->base = dev_remap_addr_name(dev, "subsys");
  522. if (!pcie->base)
  523. return -ENOENT;
  524. err = clk_get_by_name(dev, "free_ck", &pcie->free_ck);
  525. if (err)
  526. return err;
  527. /* enable top level clock */
  528. err = clk_enable(&pcie->free_ck);
  529. if (err)
  530. return err;
  531. dev_for_each_subnode(subnode, dev) {
  532. struct fdt_pci_addr addr;
  533. u32 slot = 0;
  534. if (!ofnode_is_enabled(subnode))
  535. continue;
  536. err = ofnode_read_pci_addr(subnode, 0, "reg", &addr);
  537. if (err)
  538. return err;
  539. slot = PCI_DEV(addr.phys_hi);
  540. err = mtk_pcie_parse_port(dev, slot);
  541. if (err)
  542. return err;
  543. }
  544. /* enable each port, and then check link status */
  545. list_for_each_entry_safe(port, tmp, &pcie->ports, list)
  546. mtk_pcie_enable_port(port);
  547. return 0;
  548. }
  549. static int mtk_pcie_probe_v2(struct udevice *dev)
  550. {
  551. struct mtk_pcie *pcie = dev_get_priv(dev);
  552. struct mtk_pcie_port *port, *tmp;
  553. struct fdt_pci_addr addr;
  554. ofnode subnode;
  555. unsigned int slot;
  556. int err;
  557. INIT_LIST_HEAD(&pcie->ports);
  558. pcie->base = dev_remap_addr_name(dev, "subsys");
  559. if (!pcie->base)
  560. return -ENOENT;
  561. pcie->priv = dev;
  562. dev_for_each_subnode(subnode, dev) {
  563. if (!ofnode_is_enabled(subnode))
  564. continue;
  565. err = ofnode_read_pci_addr(subnode, 0, "reg", &addr);
  566. if (err)
  567. return err;
  568. slot = PCI_DEV(addr.phys_hi);
  569. err = mtk_pcie_parse_port_v2(dev, slot);
  570. if (err)
  571. return err;
  572. }
  573. /* enable each port, and then check link status */
  574. list_for_each_entry_safe(port, tmp, &pcie->ports, list)
  575. mtk_pcie_enable_port_v2(port);
  576. return 0;
  577. }
  578. static const struct udevice_id mtk_pcie_ids[] = {
  579. { .compatible = "mediatek,mt7623-pcie", PCIE_V1},
  580. { }
  581. };
  582. U_BOOT_DRIVER(pcie_mediatek_v1) = {
  583. .name = "pcie_mediatek_v1",
  584. .id = UCLASS_PCI,
  585. .of_match = mtk_pcie_ids,
  586. .ops = &mtk_pcie_ops,
  587. .probe = mtk_pcie_probe,
  588. .priv_auto = sizeof(struct mtk_pcie),
  589. };
  590. static const struct udevice_id mtk_pcie_ids_v2[] = {
  591. { .compatible = "mediatek,mt7622-pcie", PCIE_V2},
  592. { }
  593. };
  594. U_BOOT_DRIVER(pcie_mediatek_v2) = {
  595. .name = "pcie_mediatek_v2",
  596. .id = UCLASS_PCI,
  597. .of_match = mtk_pcie_ids_v2,
  598. .ops = &mtk_pcie_ops_v2,
  599. .probe = mtk_pcie_probe_v2,
  600. .priv_auto = sizeof(struct mtk_pcie),
  601. };