pci-meson.c 11 KB

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