pci-meson.c 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492
  1. // SPDX-License-Identifier: GPL-2.0
  2. /*
  3. * PCIe host controller driver for Amlogic MESON SoCs
  4. *
  5. * Copyright (c) 2018 Amlogic, inc.
  6. * Author: Yue Wang <[email protected]>
  7. */
  8. #include <linux/clk.h>
  9. #include <linux/delay.h>
  10. #include <linux/gpio/consumer.h>
  11. #include <linux/of_device.h>
  12. #include <linux/of_gpio.h>
  13. #include <linux/pci.h>
  14. #include <linux/platform_device.h>
  15. #include <linux/reset.h>
  16. #include <linux/resource.h>
  17. #include <linux/types.h>
  18. #include <linux/phy/phy.h>
  19. #include <linux/module.h>
  20. #include "pcie-designware.h"
  21. #define to_meson_pcie(x) dev_get_drvdata((x)->dev)
  22. #define PCIE_CAP_MAX_PAYLOAD_SIZE(x) ((x) << 5)
  23. #define PCIE_CAP_MAX_READ_REQ_SIZE(x) ((x) << 12)
  24. /* PCIe specific config registers */
  25. #define PCIE_CFG0 0x0
  26. #define APP_LTSSM_ENABLE BIT(7)
  27. #define PCIE_CFG_STATUS12 0x30
  28. #define IS_SMLH_LINK_UP(x) ((x) & (1 << 6))
  29. #define IS_RDLH_LINK_UP(x) ((x) & (1 << 16))
  30. #define IS_LTSSM_UP(x) ((((x) >> 10) & 0x1f) == 0x11)
  31. #define PCIE_CFG_STATUS17 0x44
  32. #define PM_CURRENT_STATE(x) (((x) >> 7) & 0x1)
  33. #define WAIT_LINKUP_TIMEOUT 4000
  34. #define PORT_CLK_RATE 100000000UL
  35. #define MAX_PAYLOAD_SIZE 256
  36. #define MAX_READ_REQ_SIZE 256
  37. #define PCIE_RESET_DELAY 500
  38. #define PCIE_SHARED_RESET 1
  39. #define PCIE_NORMAL_RESET 0
  40. enum pcie_data_rate {
  41. PCIE_GEN1,
  42. PCIE_GEN2,
  43. PCIE_GEN3,
  44. PCIE_GEN4
  45. };
  46. struct meson_pcie_clk_res {
  47. struct clk *clk;
  48. struct clk *port_clk;
  49. struct clk *general_clk;
  50. };
  51. struct meson_pcie_rc_reset {
  52. struct reset_control *port;
  53. struct reset_control *apb;
  54. };
  55. struct meson_pcie {
  56. struct dw_pcie pci;
  57. void __iomem *cfg_base;
  58. struct meson_pcie_clk_res clk_res;
  59. struct meson_pcie_rc_reset mrst;
  60. struct gpio_desc *reset_gpio;
  61. struct phy *phy;
  62. };
  63. static struct reset_control *meson_pcie_get_reset(struct meson_pcie *mp,
  64. const char *id,
  65. u32 reset_type)
  66. {
  67. struct device *dev = mp->pci.dev;
  68. struct reset_control *reset;
  69. if (reset_type == PCIE_SHARED_RESET)
  70. reset = devm_reset_control_get_shared(dev, id);
  71. else
  72. reset = devm_reset_control_get(dev, id);
  73. return reset;
  74. }
  75. static int meson_pcie_get_resets(struct meson_pcie *mp)
  76. {
  77. struct meson_pcie_rc_reset *mrst = &mp->mrst;
  78. mrst->port = meson_pcie_get_reset(mp, "port", PCIE_NORMAL_RESET);
  79. if (IS_ERR(mrst->port))
  80. return PTR_ERR(mrst->port);
  81. reset_control_deassert(mrst->port);
  82. mrst->apb = meson_pcie_get_reset(mp, "apb", PCIE_SHARED_RESET);
  83. if (IS_ERR(mrst->apb))
  84. return PTR_ERR(mrst->apb);
  85. reset_control_deassert(mrst->apb);
  86. return 0;
  87. }
  88. static int meson_pcie_get_mems(struct platform_device *pdev,
  89. struct meson_pcie *mp)
  90. {
  91. struct dw_pcie *pci = &mp->pci;
  92. pci->dbi_base = devm_platform_ioremap_resource_byname(pdev, "elbi");
  93. if (IS_ERR(pci->dbi_base))
  94. return PTR_ERR(pci->dbi_base);
  95. mp->cfg_base = devm_platform_ioremap_resource_byname(pdev, "cfg");
  96. if (IS_ERR(mp->cfg_base))
  97. return PTR_ERR(mp->cfg_base);
  98. return 0;
  99. }
  100. static int meson_pcie_power_on(struct meson_pcie *mp)
  101. {
  102. int ret = 0;
  103. ret = phy_init(mp->phy);
  104. if (ret)
  105. return ret;
  106. ret = phy_power_on(mp->phy);
  107. if (ret) {
  108. phy_exit(mp->phy);
  109. return ret;
  110. }
  111. return 0;
  112. }
  113. static void meson_pcie_power_off(struct meson_pcie *mp)
  114. {
  115. phy_power_off(mp->phy);
  116. phy_exit(mp->phy);
  117. }
  118. static int meson_pcie_reset(struct meson_pcie *mp)
  119. {
  120. struct meson_pcie_rc_reset *mrst = &mp->mrst;
  121. int ret = 0;
  122. ret = phy_reset(mp->phy);
  123. if (ret)
  124. return ret;
  125. reset_control_assert(mrst->port);
  126. reset_control_assert(mrst->apb);
  127. udelay(PCIE_RESET_DELAY);
  128. reset_control_deassert(mrst->port);
  129. reset_control_deassert(mrst->apb);
  130. udelay(PCIE_RESET_DELAY);
  131. return 0;
  132. }
  133. static inline struct clk *meson_pcie_probe_clock(struct device *dev,
  134. const char *id, u64 rate)
  135. {
  136. struct clk *clk;
  137. int ret;
  138. clk = devm_clk_get(dev, id);
  139. if (IS_ERR(clk))
  140. return clk;
  141. if (rate) {
  142. ret = clk_set_rate(clk, rate);
  143. if (ret) {
  144. dev_err(dev, "set clk rate failed, ret = %d\n", ret);
  145. return ERR_PTR(ret);
  146. }
  147. }
  148. ret = clk_prepare_enable(clk);
  149. if (ret) {
  150. dev_err(dev, "couldn't enable clk\n");
  151. return ERR_PTR(ret);
  152. }
  153. devm_add_action_or_reset(dev,
  154. (void (*) (void *))clk_disable_unprepare,
  155. clk);
  156. return clk;
  157. }
  158. static int meson_pcie_probe_clocks(struct meson_pcie *mp)
  159. {
  160. struct device *dev = mp->pci.dev;
  161. struct meson_pcie_clk_res *res = &mp->clk_res;
  162. res->port_clk = meson_pcie_probe_clock(dev, "port", PORT_CLK_RATE);
  163. if (IS_ERR(res->port_clk))
  164. return PTR_ERR(res->port_clk);
  165. res->general_clk = meson_pcie_probe_clock(dev, "general", 0);
  166. if (IS_ERR(res->general_clk))
  167. return PTR_ERR(res->general_clk);
  168. res->clk = meson_pcie_probe_clock(dev, "pclk", 0);
  169. if (IS_ERR(res->clk))
  170. return PTR_ERR(res->clk);
  171. return 0;
  172. }
  173. static inline u32 meson_cfg_readl(struct meson_pcie *mp, u32 reg)
  174. {
  175. return readl(mp->cfg_base + reg);
  176. }
  177. static inline void meson_cfg_writel(struct meson_pcie *mp, u32 val, u32 reg)
  178. {
  179. writel(val, mp->cfg_base + reg);
  180. }
  181. static void meson_pcie_assert_reset(struct meson_pcie *mp)
  182. {
  183. gpiod_set_value_cansleep(mp->reset_gpio, 1);
  184. udelay(500);
  185. gpiod_set_value_cansleep(mp->reset_gpio, 0);
  186. }
  187. static void meson_pcie_ltssm_enable(struct meson_pcie *mp)
  188. {
  189. u32 val;
  190. val = meson_cfg_readl(mp, PCIE_CFG0);
  191. val |= APP_LTSSM_ENABLE;
  192. meson_cfg_writel(mp, val, PCIE_CFG0);
  193. }
  194. static int meson_size_to_payload(struct meson_pcie *mp, int size)
  195. {
  196. struct device *dev = mp->pci.dev;
  197. /*
  198. * dwc supports 2^(val+7) payload size, which val is 0~5 default to 1.
  199. * So if input size is not 2^order alignment or less than 2^7 or bigger
  200. * than 2^12, just set to default size 2^(1+7).
  201. */
  202. if (!is_power_of_2(size) || size < 128 || size > 4096) {
  203. dev_warn(dev, "payload size %d, set to default 256\n", size);
  204. return 1;
  205. }
  206. return fls(size) - 8;
  207. }
  208. static void meson_set_max_payload(struct meson_pcie *mp, int size)
  209. {
  210. struct dw_pcie *pci = &mp->pci;
  211. u32 val;
  212. u16 offset = dw_pcie_find_capability(pci, PCI_CAP_ID_EXP);
  213. int max_payload_size = meson_size_to_payload(mp, size);
  214. val = dw_pcie_readl_dbi(pci, offset + PCI_EXP_DEVCTL);
  215. val &= ~PCI_EXP_DEVCTL_PAYLOAD;
  216. dw_pcie_writel_dbi(pci, offset + PCI_EXP_DEVCTL, val);
  217. val = dw_pcie_readl_dbi(pci, offset + PCI_EXP_DEVCTL);
  218. val |= PCIE_CAP_MAX_PAYLOAD_SIZE(max_payload_size);
  219. dw_pcie_writel_dbi(pci, offset + PCI_EXP_DEVCTL, val);
  220. }
  221. static void meson_set_max_rd_req_size(struct meson_pcie *mp, int size)
  222. {
  223. struct dw_pcie *pci = &mp->pci;
  224. u32 val;
  225. u16 offset = dw_pcie_find_capability(pci, PCI_CAP_ID_EXP);
  226. int max_rd_req_size = meson_size_to_payload(mp, size);
  227. val = dw_pcie_readl_dbi(pci, offset + PCI_EXP_DEVCTL);
  228. val &= ~PCI_EXP_DEVCTL_READRQ;
  229. dw_pcie_writel_dbi(pci, offset + PCI_EXP_DEVCTL, val);
  230. val = dw_pcie_readl_dbi(pci, offset + PCI_EXP_DEVCTL);
  231. val |= PCIE_CAP_MAX_READ_REQ_SIZE(max_rd_req_size);
  232. dw_pcie_writel_dbi(pci, offset + PCI_EXP_DEVCTL, val);
  233. }
  234. static int meson_pcie_start_link(struct dw_pcie *pci)
  235. {
  236. struct meson_pcie *mp = to_meson_pcie(pci);
  237. meson_pcie_ltssm_enable(mp);
  238. meson_pcie_assert_reset(mp);
  239. return 0;
  240. }
  241. static int meson_pcie_rd_own_conf(struct pci_bus *bus, u32 devfn,
  242. int where, int size, u32 *val)
  243. {
  244. int ret;
  245. ret = pci_generic_config_read(bus, devfn, where, size, val);
  246. if (ret != PCIBIOS_SUCCESSFUL)
  247. return ret;
  248. /*
  249. * There is a bug in the MESON AXG PCIe controller whereby software
  250. * cannot program the PCI_CLASS_DEVICE register, so we must fabricate
  251. * the return value in the config accessors.
  252. */
  253. if ((where & ~3) == PCI_CLASS_REVISION) {
  254. if (size <= 2)
  255. *val = (*val & ((1 << (size * 8)) - 1)) << (8 * (where & 3));
  256. *val &= ~0xffffff00;
  257. *val |= PCI_CLASS_BRIDGE_PCI_NORMAL << 8;
  258. if (size <= 2)
  259. *val = (*val >> (8 * (where & 3))) & ((1 << (size * 8)) - 1);
  260. }
  261. return PCIBIOS_SUCCESSFUL;
  262. }
  263. static struct pci_ops meson_pci_ops = {
  264. .map_bus = dw_pcie_own_conf_map_bus,
  265. .read = meson_pcie_rd_own_conf,
  266. .write = pci_generic_config_write,
  267. };
  268. static int meson_pcie_link_up(struct dw_pcie *pci)
  269. {
  270. struct meson_pcie *mp = to_meson_pcie(pci);
  271. struct device *dev = pci->dev;
  272. u32 speed_okay = 0;
  273. u32 cnt = 0;
  274. u32 state12, state17, smlh_up, ltssm_up, rdlh_up;
  275. do {
  276. state12 = meson_cfg_readl(mp, PCIE_CFG_STATUS12);
  277. state17 = meson_cfg_readl(mp, PCIE_CFG_STATUS17);
  278. smlh_up = IS_SMLH_LINK_UP(state12);
  279. rdlh_up = IS_RDLH_LINK_UP(state12);
  280. ltssm_up = IS_LTSSM_UP(state12);
  281. if (PM_CURRENT_STATE(state17) < PCIE_GEN3)
  282. speed_okay = 1;
  283. if (smlh_up)
  284. dev_dbg(dev, "smlh_link_up is on\n");
  285. if (rdlh_up)
  286. dev_dbg(dev, "rdlh_link_up is on\n");
  287. if (ltssm_up)
  288. dev_dbg(dev, "ltssm_up is on\n");
  289. if (speed_okay)
  290. dev_dbg(dev, "speed_okay\n");
  291. if (smlh_up && rdlh_up && ltssm_up && speed_okay)
  292. return 1;
  293. cnt++;
  294. udelay(10);
  295. } while (cnt < WAIT_LINKUP_TIMEOUT);
  296. dev_err(dev, "error: wait linkup timeout\n");
  297. return 0;
  298. }
  299. static int meson_pcie_host_init(struct dw_pcie_rp *pp)
  300. {
  301. struct dw_pcie *pci = to_dw_pcie_from_pp(pp);
  302. struct meson_pcie *mp = to_meson_pcie(pci);
  303. pp->bridge->ops = &meson_pci_ops;
  304. meson_set_max_payload(mp, MAX_PAYLOAD_SIZE);
  305. meson_set_max_rd_req_size(mp, MAX_READ_REQ_SIZE);
  306. return 0;
  307. }
  308. static const struct dw_pcie_host_ops meson_pcie_host_ops = {
  309. .host_init = meson_pcie_host_init,
  310. };
  311. static const struct dw_pcie_ops dw_pcie_ops = {
  312. .link_up = meson_pcie_link_up,
  313. .start_link = meson_pcie_start_link,
  314. };
  315. static int meson_pcie_probe(struct platform_device *pdev)
  316. {
  317. struct device *dev = &pdev->dev;
  318. struct dw_pcie *pci;
  319. struct meson_pcie *mp;
  320. int ret;
  321. mp = devm_kzalloc(dev, sizeof(*mp), GFP_KERNEL);
  322. if (!mp)
  323. return -ENOMEM;
  324. pci = &mp->pci;
  325. pci->dev = dev;
  326. pci->ops = &dw_pcie_ops;
  327. pci->pp.ops = &meson_pcie_host_ops;
  328. pci->num_lanes = 1;
  329. mp->phy = devm_phy_get(dev, "pcie");
  330. if (IS_ERR(mp->phy)) {
  331. dev_err(dev, "get phy failed, %ld\n", PTR_ERR(mp->phy));
  332. return PTR_ERR(mp->phy);
  333. }
  334. mp->reset_gpio = devm_gpiod_get(dev, "reset", GPIOD_OUT_LOW);
  335. if (IS_ERR(mp->reset_gpio)) {
  336. dev_err(dev, "get reset gpio failed\n");
  337. return PTR_ERR(mp->reset_gpio);
  338. }
  339. ret = meson_pcie_get_resets(mp);
  340. if (ret) {
  341. dev_err(dev, "get reset resource failed, %d\n", ret);
  342. return ret;
  343. }
  344. ret = meson_pcie_get_mems(pdev, mp);
  345. if (ret) {
  346. dev_err(dev, "get memory resource failed, %d\n", ret);
  347. return ret;
  348. }
  349. ret = meson_pcie_power_on(mp);
  350. if (ret) {
  351. dev_err(dev, "phy power on failed, %d\n", ret);
  352. return ret;
  353. }
  354. ret = meson_pcie_reset(mp);
  355. if (ret) {
  356. dev_err(dev, "reset failed, %d\n", ret);
  357. goto err_phy;
  358. }
  359. ret = meson_pcie_probe_clocks(mp);
  360. if (ret) {
  361. dev_err(dev, "init clock resources failed, %d\n", ret);
  362. goto err_phy;
  363. }
  364. platform_set_drvdata(pdev, mp);
  365. ret = dw_pcie_host_init(&pci->pp);
  366. if (ret < 0) {
  367. dev_err(dev, "Add PCIe port failed, %d\n", ret);
  368. goto err_phy;
  369. }
  370. return 0;
  371. err_phy:
  372. meson_pcie_power_off(mp);
  373. return ret;
  374. }
  375. static const struct of_device_id meson_pcie_of_match[] = {
  376. {
  377. .compatible = "amlogic,axg-pcie",
  378. },
  379. {
  380. .compatible = "amlogic,g12a-pcie",
  381. },
  382. {},
  383. };
  384. MODULE_DEVICE_TABLE(of, meson_pcie_of_match);
  385. static struct platform_driver meson_pcie_driver = {
  386. .probe = meson_pcie_probe,
  387. .driver = {
  388. .name = "meson-pcie",
  389. .of_match_table = meson_pcie_of_match,
  390. },
  391. };
  392. module_platform_driver(meson_pcie_driver);
  393. MODULE_AUTHOR("Yue Wang <[email protected]>");
  394. MODULE_DESCRIPTION("Amlogic PCIe Controller driver");
  395. MODULE_LICENSE("GPL v2");