pcie-rockchip-host.c 28 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064
  1. // SPDX-License-Identifier: GPL-2.0+
  2. /*
  3. * Rockchip AXI PCIe host controller driver
  4. *
  5. * Copyright (c) 2016 Rockchip, Inc.
  6. *
  7. * Author: Shawn Lin <shawn.lin@rock-chips.com>
  8. * Wenrui Li <wenrui.li@rock-chips.com>
  9. *
  10. * Bits taken from Synopsys DesignWare Host controller driver and
  11. * ARM PCI Host generic driver.
  12. */
  13. #include <linux/bitfield.h>
  14. #include <linux/bitrev.h>
  15. #include <linux/clk.h>
  16. #include <linux/delay.h>
  17. #include <linux/gpio/consumer.h>
  18. #include <linux/init.h>
  19. #include <linux/interrupt.h>
  20. #include <linux/iopoll.h>
  21. #include <linux/irq.h>
  22. #include <linux/irqchip/chained_irq.h>
  23. #include <linux/irqdomain.h>
  24. #include <linux/kernel.h>
  25. #include <linux/mfd/syscon.h>
  26. #include <linux/module.h>
  27. #include <linux/of.h>
  28. #include <linux/of_pci.h>
  29. #include <linux/pci.h>
  30. #include <linux/pci_ids.h>
  31. #include <linux/phy/phy.h>
  32. #include <linux/platform_device.h>
  33. #include <linux/reset.h>
  34. #include <linux/regmap.h>
  35. #include "../pci.h"
  36. #include "pcie-rockchip.h"
  37. static void rockchip_pcie_enable_bw_int(struct rockchip_pcie *rockchip)
  38. {
  39. u32 status;
  40. status = rockchip_pcie_read(rockchip, PCIE_RC_CONFIG_CR + PCI_EXP_LNKCTL);
  41. status |= (PCI_EXP_LNKCTL_LBMIE | PCI_EXP_LNKCTL_LABIE);
  42. rockchip_pcie_write(rockchip, status, PCIE_RC_CONFIG_CR + PCI_EXP_LNKCTL);
  43. }
  44. static void rockchip_pcie_clr_bw_int(struct rockchip_pcie *rockchip)
  45. {
  46. u32 status;
  47. status = rockchip_pcie_read(rockchip, PCIE_RC_CONFIG_CR + PCI_EXP_LNKCTL);
  48. status |= (PCI_EXP_LNKSTA_LBMS | PCI_EXP_LNKSTA_LABS) << 16;
  49. rockchip_pcie_write(rockchip, status, PCIE_RC_CONFIG_CR + PCI_EXP_LNKCTL);
  50. }
  51. static void rockchip_pcie_update_txcredit_mui(struct rockchip_pcie *rockchip)
  52. {
  53. u32 val;
  54. /* Update Tx credit maximum update interval */
  55. val = rockchip_pcie_read(rockchip, PCIE_CORE_TXCREDIT_CFG1);
  56. val &= ~PCIE_CORE_TXCREDIT_CFG1_MUI_MASK;
  57. val |= PCIE_CORE_TXCREDIT_CFG1_MUI_ENCODE(24000); /* ns */
  58. rockchip_pcie_write(rockchip, val, PCIE_CORE_TXCREDIT_CFG1);
  59. }
  60. static int rockchip_pcie_valid_device(struct rockchip_pcie *rockchip,
  61. struct pci_bus *bus, int dev)
  62. {
  63. /*
  64. * Access only one slot on each root port.
  65. * Do not read more than one device on the bus directly attached
  66. * to RC's downstream side.
  67. */
  68. if (pci_is_root_bus(bus) || pci_is_root_bus(bus->parent))
  69. return dev == 0;
  70. return 1;
  71. }
  72. static u8 rockchip_pcie_lane_map(struct rockchip_pcie *rockchip)
  73. {
  74. u32 val;
  75. u8 map;
  76. if (rockchip->legacy_phy)
  77. return GENMASK(MAX_LANE_NUM - 1, 0);
  78. val = rockchip_pcie_read(rockchip, PCIE_CORE_LANE_MAP);
  79. map = val & PCIE_CORE_LANE_MAP_MASK;
  80. /* The link may be using a reverse-indexed mapping. */
  81. if (val & PCIE_CORE_LANE_MAP_REVERSE)
  82. map = bitrev8(map) >> 4;
  83. return map;
  84. }
  85. static int rockchip_pcie_rd_own_conf(struct rockchip_pcie *rockchip,
  86. int where, int size, u32 *val)
  87. {
  88. void __iomem *addr;
  89. addr = rockchip->apb_base + PCIE_RC_CONFIG_NORMAL_BASE + where;
  90. if (!IS_ALIGNED((uintptr_t)addr, size)) {
  91. *val = 0;
  92. return PCIBIOS_BAD_REGISTER_NUMBER;
  93. }
  94. if (size == 4) {
  95. *val = readl(addr);
  96. } else if (size == 2) {
  97. *val = readw(addr);
  98. } else if (size == 1) {
  99. *val = readb(addr);
  100. } else {
  101. *val = 0;
  102. return PCIBIOS_BAD_REGISTER_NUMBER;
  103. }
  104. return PCIBIOS_SUCCESSFUL;
  105. }
  106. static int rockchip_pcie_wr_own_conf(struct rockchip_pcie *rockchip,
  107. int where, int size, u32 val)
  108. {
  109. u32 mask, tmp, offset;
  110. void __iomem *addr;
  111. offset = where & ~0x3;
  112. addr = rockchip->apb_base + PCIE_RC_CONFIG_NORMAL_BASE + offset;
  113. if (size == 4) {
  114. writel(val, addr);
  115. return PCIBIOS_SUCCESSFUL;
  116. }
  117. mask = ~(((1 << (size * 8)) - 1) << ((where & 0x3) * 8));
  118. /*
  119. * N.B. This read/modify/write isn't safe in general because it can
  120. * corrupt RW1C bits in adjacent registers. But the hardware
  121. * doesn't support smaller writes.
  122. */
  123. tmp = readl(addr) & mask;
  124. tmp |= val << ((where & 0x3) * 8);
  125. writel(tmp, addr);
  126. return PCIBIOS_SUCCESSFUL;
  127. }
  128. static int rockchip_pcie_rd_other_conf(struct rockchip_pcie *rockchip,
  129. struct pci_bus *bus, u32 devfn,
  130. int where, int size, u32 *val)
  131. {
  132. void __iomem *addr;
  133. addr = rockchip->reg_base + PCIE_ECAM_OFFSET(bus->number, devfn, where);
  134. if (!IS_ALIGNED((uintptr_t)addr, size)) {
  135. *val = 0;
  136. return PCIBIOS_BAD_REGISTER_NUMBER;
  137. }
  138. if (pci_is_root_bus(bus->parent))
  139. rockchip_pcie_cfg_configuration_accesses(rockchip,
  140. AXI_WRAPPER_TYPE0_CFG);
  141. else
  142. rockchip_pcie_cfg_configuration_accesses(rockchip,
  143. AXI_WRAPPER_TYPE1_CFG);
  144. if (size == 4) {
  145. *val = readl(addr);
  146. } else if (size == 2) {
  147. *val = readw(addr);
  148. } else if (size == 1) {
  149. *val = readb(addr);
  150. } else {
  151. *val = 0;
  152. return PCIBIOS_BAD_REGISTER_NUMBER;
  153. }
  154. return PCIBIOS_SUCCESSFUL;
  155. }
  156. static int rockchip_pcie_wr_other_conf(struct rockchip_pcie *rockchip,
  157. struct pci_bus *bus, u32 devfn,
  158. int where, int size, u32 val)
  159. {
  160. void __iomem *addr;
  161. addr = rockchip->reg_base + PCIE_ECAM_OFFSET(bus->number, devfn, where);
  162. if (!IS_ALIGNED((uintptr_t)addr, size))
  163. return PCIBIOS_BAD_REGISTER_NUMBER;
  164. if (pci_is_root_bus(bus->parent))
  165. rockchip_pcie_cfg_configuration_accesses(rockchip,
  166. AXI_WRAPPER_TYPE0_CFG);
  167. else
  168. rockchip_pcie_cfg_configuration_accesses(rockchip,
  169. AXI_WRAPPER_TYPE1_CFG);
  170. if (size == 4)
  171. writel(val, addr);
  172. else if (size == 2)
  173. writew(val, addr);
  174. else if (size == 1)
  175. writeb(val, addr);
  176. else
  177. return PCIBIOS_BAD_REGISTER_NUMBER;
  178. return PCIBIOS_SUCCESSFUL;
  179. }
  180. static int rockchip_pcie_rd_conf(struct pci_bus *bus, u32 devfn, int where,
  181. int size, u32 *val)
  182. {
  183. struct rockchip_pcie *rockchip = bus->sysdata;
  184. if (!rockchip_pcie_valid_device(rockchip, bus, PCI_SLOT(devfn)))
  185. return PCIBIOS_DEVICE_NOT_FOUND;
  186. if (pci_is_root_bus(bus))
  187. return rockchip_pcie_rd_own_conf(rockchip, where, size, val);
  188. return rockchip_pcie_rd_other_conf(rockchip, bus, devfn, where, size,
  189. val);
  190. }
  191. static int rockchip_pcie_wr_conf(struct pci_bus *bus, u32 devfn,
  192. int where, int size, u32 val)
  193. {
  194. struct rockchip_pcie *rockchip = bus->sysdata;
  195. if (!rockchip_pcie_valid_device(rockchip, bus, PCI_SLOT(devfn)))
  196. return PCIBIOS_DEVICE_NOT_FOUND;
  197. if (pci_is_root_bus(bus))
  198. return rockchip_pcie_wr_own_conf(rockchip, where, size, val);
  199. return rockchip_pcie_wr_other_conf(rockchip, bus, devfn, where, size,
  200. val);
  201. }
  202. static struct pci_ops rockchip_pcie_ops = {
  203. .read = rockchip_pcie_rd_conf,
  204. .write = rockchip_pcie_wr_conf,
  205. };
  206. static void rockchip_pcie_set_power_limit(struct rockchip_pcie *rockchip)
  207. {
  208. int curr;
  209. u32 status, scale, power;
  210. if (IS_ERR(rockchip->vpcie3v3))
  211. return;
  212. /*
  213. * Set RC's captured slot power limit and scale if
  214. * vpcie3v3 available. The default values are both zero
  215. * which means the software should set these two according
  216. * to the actual power supply.
  217. */
  218. curr = regulator_get_current_limit(rockchip->vpcie3v3);
  219. if (curr <= 0)
  220. return;
  221. scale = 3; /* 0.001x */
  222. curr = curr / 1000; /* convert to mA */
  223. power = (curr * 3300) / 1000; /* milliwatt */
  224. while (power > FIELD_MAX(PCI_EXP_DEVCAP_PWR_VAL)) {
  225. if (!scale) {
  226. dev_warn(rockchip->dev, "invalid power supply\n");
  227. return;
  228. }
  229. scale--;
  230. power = power / 10;
  231. }
  232. status = rockchip_pcie_read(rockchip, PCIE_RC_CONFIG_CR + PCI_EXP_DEVCAP);
  233. status |= FIELD_PREP(PCI_EXP_DEVCAP_PWR_VAL, power);
  234. status |= FIELD_PREP(PCI_EXP_DEVCAP_PWR_SCL, scale);
  235. rockchip_pcie_write(rockchip, status, PCIE_RC_CONFIG_CR + PCI_EXP_DEVCAP);
  236. }
  237. /**
  238. * rockchip_pcie_host_init_port - Initialize hardware
  239. * @rockchip: PCIe port information
  240. */
  241. static int rockchip_pcie_host_init_port(struct rockchip_pcie *rockchip)
  242. {
  243. struct device *dev = rockchip->dev;
  244. int err, i = MAX_LANE_NUM;
  245. u32 status;
  246. gpiod_set_value_cansleep(rockchip->ep_gpio, 0);
  247. err = rockchip_pcie_init_port(rockchip);
  248. if (err)
  249. return err;
  250. /* Fix the transmitted FTS count desired to exit from L0s. */
  251. status = rockchip_pcie_read(rockchip, PCIE_CORE_CTRL_PLC1);
  252. status = (status & ~PCIE_CORE_CTRL_PLC1_FTS_MASK) |
  253. (PCIE_CORE_CTRL_PLC1_FTS_CNT << PCIE_CORE_CTRL_PLC1_FTS_SHIFT);
  254. rockchip_pcie_write(rockchip, status, PCIE_CORE_CTRL_PLC1);
  255. rockchip_pcie_set_power_limit(rockchip);
  256. /* Set RC's clock architecture as common clock */
  257. status = rockchip_pcie_read(rockchip, PCIE_RC_CONFIG_CR + PCI_EXP_LNKCTL);
  258. status |= PCI_EXP_LNKSTA_SLC << 16;
  259. rockchip_pcie_write(rockchip, status, PCIE_RC_CONFIG_CR + PCI_EXP_LNKCTL);
  260. /* Set RC's RCB to 128 */
  261. status = rockchip_pcie_read(rockchip, PCIE_RC_CONFIG_CR + PCI_EXP_LNKCTL);
  262. status |= PCI_EXP_LNKCTL_RCB;
  263. rockchip_pcie_write(rockchip, status, PCIE_RC_CONFIG_CR + PCI_EXP_LNKCTL);
  264. /* Enable Gen1 training */
  265. rockchip_pcie_write(rockchip, PCIE_CLIENT_LINK_TRAIN_ENABLE,
  266. PCIE_CLIENT_CONFIG);
  267. msleep(PCIE_T_PVPERL_MS);
  268. gpiod_set_value_cansleep(rockchip->ep_gpio, 1);
  269. msleep(PCIE_T_RRS_READY_MS);
  270. /* 500ms timeout value should be enough for Gen1/2 training */
  271. err = readl_poll_timeout(rockchip->apb_base + PCIE_CLIENT_BASIC_STATUS1,
  272. status, PCIE_LINK_UP(status), 20,
  273. 500 * USEC_PER_MSEC);
  274. if (err) {
  275. dev_err(dev, "PCIe link training gen1 timeout!\n");
  276. goto err_power_off_phy;
  277. }
  278. if (rockchip->link_gen == 2) {
  279. /*
  280. * Enable retrain for gen2. This should be configured only after
  281. * gen1 finished.
  282. */
  283. status = rockchip_pcie_read(rockchip, PCIE_RC_CONFIG_CR + PCI_EXP_LNKCTL2);
  284. status &= ~PCI_EXP_LNKCTL2_TLS;
  285. status |= PCI_EXP_LNKCTL2_TLS_5_0GT;
  286. rockchip_pcie_write(rockchip, status, PCIE_RC_CONFIG_CR + PCI_EXP_LNKCTL2);
  287. status = rockchip_pcie_read(rockchip, PCIE_RC_CONFIG_CR + PCI_EXP_LNKCTL);
  288. status |= PCI_EXP_LNKCTL_RL;
  289. rockchip_pcie_write(rockchip, status, PCIE_RC_CONFIG_CR + PCI_EXP_LNKCTL);
  290. err = readl_poll_timeout(rockchip->apb_base + PCIE_CORE_CTRL,
  291. status, PCIE_LINK_IS_GEN2(status), 20,
  292. 500 * USEC_PER_MSEC);
  293. if (err)
  294. dev_dbg(dev, "PCIe link training gen2 timeout, fall back to gen1!\n");
  295. }
  296. /* Check the final link width from negotiated lane counter from MGMT */
  297. status = rockchip_pcie_read(rockchip, PCIE_CORE_CTRL);
  298. status = 0x1 << ((status & PCIE_CORE_PL_CONF_LANE_MASK) >>
  299. PCIE_CORE_PL_CONF_LANE_SHIFT);
  300. dev_dbg(dev, "current link width is x%d\n", status);
  301. /* Power off unused lane(s) */
  302. rockchip->lanes_map = rockchip_pcie_lane_map(rockchip);
  303. for (i = 0; i < MAX_LANE_NUM; i++) {
  304. if (!(rockchip->lanes_map & BIT(i))) {
  305. dev_dbg(dev, "idling lane %d\n", i);
  306. phy_power_off(rockchip->phys[i]);
  307. }
  308. }
  309. rockchip_pcie_write(rockchip, PCI_VENDOR_ID_ROCKCHIP,
  310. PCIE_CORE_CONFIG_VENDOR);
  311. rockchip_pcie_write(rockchip,
  312. PCI_CLASS_BRIDGE_PCI_NORMAL << 8,
  313. PCIE_RC_CONFIG_RID_CCR);
  314. /* Clear THP cap's next cap pointer to remove L1 substate cap */
  315. status = rockchip_pcie_read(rockchip, PCIE_RC_CONFIG_THP_CAP);
  316. status &= ~PCIE_RC_CONFIG_THP_CAP_NEXT_MASK;
  317. rockchip_pcie_write(rockchip, status, PCIE_RC_CONFIG_THP_CAP);
  318. /* Clear L0s from RC's link cap */
  319. if (of_property_read_bool(dev->of_node, "aspm-no-l0s")) {
  320. status = rockchip_pcie_read(rockchip, PCIE_RC_CONFIG_CR + PCI_EXP_LNKCAP);
  321. status &= ~PCI_EXP_LNKCAP_ASPM_L0S;
  322. rockchip_pcie_write(rockchip, status, PCIE_RC_CONFIG_CR + PCI_EXP_LNKCAP);
  323. }
  324. status = rockchip_pcie_read(rockchip, PCIE_RC_CONFIG_CR + PCI_EXP_DEVCTL);
  325. status &= ~PCI_EXP_DEVCTL_PAYLOAD;
  326. status |= PCI_EXP_DEVCTL_PAYLOAD_256B;
  327. rockchip_pcie_write(rockchip, status, PCIE_RC_CONFIG_CR + PCI_EXP_DEVCTL);
  328. return 0;
  329. err_power_off_phy:
  330. while (i--)
  331. phy_power_off(rockchip->phys[i]);
  332. i = MAX_LANE_NUM;
  333. while (i--)
  334. phy_exit(rockchip->phys[i]);
  335. return err;
  336. }
  337. static irqreturn_t rockchip_pcie_subsys_irq_handler(int irq, void *arg)
  338. {
  339. struct rockchip_pcie *rockchip = arg;
  340. struct device *dev = rockchip->dev;
  341. u32 reg;
  342. u32 sub_reg;
  343. reg = rockchip_pcie_read(rockchip, PCIE_CLIENT_INT_STATUS);
  344. if (reg & PCIE_CLIENT_INT_LOCAL) {
  345. dev_dbg(dev, "local interrupt received\n");
  346. sub_reg = rockchip_pcie_read(rockchip, PCIE_CORE_INT_STATUS);
  347. if (sub_reg & PCIE_CORE_INT_PRFPE)
  348. dev_dbg(dev, "parity error detected while reading from the PNP receive FIFO RAM\n");
  349. if (sub_reg & PCIE_CORE_INT_CRFPE)
  350. dev_dbg(dev, "parity error detected while reading from the Completion Receive FIFO RAM\n");
  351. if (sub_reg & PCIE_CORE_INT_RRPE)
  352. dev_dbg(dev, "parity error detected while reading from replay buffer RAM\n");
  353. if (sub_reg & PCIE_CORE_INT_PRFO)
  354. dev_dbg(dev, "overflow occurred in the PNP receive FIFO\n");
  355. if (sub_reg & PCIE_CORE_INT_CRFO)
  356. dev_dbg(dev, "overflow occurred in the completion receive FIFO\n");
  357. if (sub_reg & PCIE_CORE_INT_RT)
  358. dev_dbg(dev, "replay timer timed out\n");
  359. if (sub_reg & PCIE_CORE_INT_RTR)
  360. dev_dbg(dev, "replay timer rolled over after 4 transmissions of the same TLP\n");
  361. if (sub_reg & PCIE_CORE_INT_PE)
  362. dev_dbg(dev, "phy error detected on receive side\n");
  363. if (sub_reg & PCIE_CORE_INT_MTR)
  364. dev_dbg(dev, "malformed TLP received from the link\n");
  365. if (sub_reg & PCIE_CORE_INT_UCR)
  366. dev_dbg(dev, "Unexpected Completion received from the link\n");
  367. if (sub_reg & PCIE_CORE_INT_FCE)
  368. dev_dbg(dev, "an error was observed in the flow control advertisements from the other side\n");
  369. if (sub_reg & PCIE_CORE_INT_CT)
  370. dev_dbg(dev, "a request timed out waiting for completion\n");
  371. if (sub_reg & PCIE_CORE_INT_UTC)
  372. dev_dbg(dev, "unmapped TC error\n");
  373. if (sub_reg & PCIE_CORE_INT_MMVC)
  374. dev_dbg(dev, "MSI mask register changes\n");
  375. rockchip_pcie_write(rockchip, sub_reg, PCIE_CORE_INT_STATUS);
  376. } else if (reg & PCIE_CLIENT_INT_PHY) {
  377. dev_dbg(dev, "phy link changes\n");
  378. rockchip_pcie_update_txcredit_mui(rockchip);
  379. rockchip_pcie_clr_bw_int(rockchip);
  380. }
  381. rockchip_pcie_write(rockchip, reg & PCIE_CLIENT_INT_LOCAL,
  382. PCIE_CLIENT_INT_STATUS);
  383. return IRQ_HANDLED;
  384. }
  385. static irqreturn_t rockchip_pcie_client_irq_handler(int irq, void *arg)
  386. {
  387. struct rockchip_pcie *rockchip = arg;
  388. struct device *dev = rockchip->dev;
  389. u32 reg;
  390. reg = rockchip_pcie_read(rockchip, PCIE_CLIENT_INT_STATUS);
  391. if (reg & PCIE_CLIENT_INT_LEGACY_DONE)
  392. dev_dbg(dev, "legacy done interrupt received\n");
  393. if (reg & PCIE_CLIENT_INT_MSG)
  394. dev_dbg(dev, "message done interrupt received\n");
  395. if (reg & PCIE_CLIENT_INT_HOT_RST)
  396. dev_dbg(dev, "hot reset interrupt received\n");
  397. if (reg & PCIE_CLIENT_INT_DPA)
  398. dev_dbg(dev, "dpa interrupt received\n");
  399. if (reg & PCIE_CLIENT_INT_FATAL_ERR)
  400. dev_dbg(dev, "fatal error interrupt received\n");
  401. if (reg & PCIE_CLIENT_INT_NFATAL_ERR)
  402. dev_dbg(dev, "no fatal error interrupt received\n");
  403. if (reg & PCIE_CLIENT_INT_CORR_ERR)
  404. dev_dbg(dev, "correctable error interrupt received\n");
  405. if (reg & PCIE_CLIENT_INT_PHY)
  406. dev_dbg(dev, "phy interrupt received\n");
  407. rockchip_pcie_write(rockchip, reg & (PCIE_CLIENT_INT_LEGACY_DONE |
  408. PCIE_CLIENT_INT_MSG | PCIE_CLIENT_INT_HOT_RST |
  409. PCIE_CLIENT_INT_DPA | PCIE_CLIENT_INT_FATAL_ERR |
  410. PCIE_CLIENT_INT_NFATAL_ERR |
  411. PCIE_CLIENT_INT_CORR_ERR |
  412. PCIE_CLIENT_INT_PHY),
  413. PCIE_CLIENT_INT_STATUS);
  414. return IRQ_HANDLED;
  415. }
  416. static void rockchip_pcie_intx_handler(struct irq_desc *desc)
  417. {
  418. struct irq_chip *chip = irq_desc_get_chip(desc);
  419. struct rockchip_pcie *rockchip = irq_desc_get_handler_data(desc);
  420. struct device *dev = rockchip->dev;
  421. u32 reg;
  422. u32 hwirq;
  423. int ret;
  424. chained_irq_enter(chip, desc);
  425. reg = rockchip_pcie_read(rockchip, PCIE_CLIENT_INT_STATUS);
  426. reg = (reg & PCIE_CLIENT_INTR_MASK) >> PCIE_CLIENT_INTR_SHIFT;
  427. while (reg) {
  428. hwirq = ffs(reg) - 1;
  429. reg &= ~BIT(hwirq);
  430. ret = generic_handle_domain_irq(rockchip->irq_domain, hwirq);
  431. if (ret)
  432. dev_err(dev, "unexpected IRQ, INT%d\n", hwirq);
  433. }
  434. chained_irq_exit(chip, desc);
  435. }
  436. static int rockchip_pcie_setup_irq(struct rockchip_pcie *rockchip)
  437. {
  438. int irq, err;
  439. struct device *dev = rockchip->dev;
  440. struct platform_device *pdev = to_platform_device(dev);
  441. irq = platform_get_irq_byname(pdev, "sys");
  442. if (irq < 0)
  443. return irq;
  444. err = devm_request_irq(dev, irq, rockchip_pcie_subsys_irq_handler,
  445. IRQF_SHARED, "pcie-sys", rockchip);
  446. if (err) {
  447. dev_err(dev, "failed to request PCIe subsystem IRQ\n");
  448. return err;
  449. }
  450. irq = platform_get_irq_byname(pdev, "legacy");
  451. if (irq < 0)
  452. return irq;
  453. irq_set_chained_handler_and_data(irq,
  454. rockchip_pcie_intx_handler,
  455. rockchip);
  456. irq = platform_get_irq_byname(pdev, "client");
  457. if (irq < 0)
  458. return irq;
  459. err = devm_request_irq(dev, irq, rockchip_pcie_client_irq_handler,
  460. IRQF_SHARED, "pcie-client", rockchip);
  461. if (err) {
  462. dev_err(dev, "failed to request PCIe client IRQ\n");
  463. return err;
  464. }
  465. return 0;
  466. }
  467. /**
  468. * rockchip_pcie_parse_host_dt - Parse Device Tree
  469. * @rockchip: PCIe port information
  470. *
  471. * Return: '0' on success and error value on failure
  472. */
  473. static int rockchip_pcie_parse_host_dt(struct rockchip_pcie *rockchip)
  474. {
  475. struct device *dev = rockchip->dev;
  476. int err;
  477. err = rockchip_pcie_parse_dt(rockchip);
  478. if (err)
  479. return err;
  480. rockchip->vpcie12v = devm_regulator_get_optional(dev, "vpcie12v");
  481. if (IS_ERR(rockchip->vpcie12v)) {
  482. if (PTR_ERR(rockchip->vpcie12v) != -ENODEV)
  483. return PTR_ERR(rockchip->vpcie12v);
  484. dev_info(dev, "no vpcie12v regulator found\n");
  485. }
  486. rockchip->vpcie3v3 = devm_regulator_get_optional(dev, "vpcie3v3");
  487. if (IS_ERR(rockchip->vpcie3v3)) {
  488. if (PTR_ERR(rockchip->vpcie3v3) != -ENODEV)
  489. return PTR_ERR(rockchip->vpcie3v3);
  490. dev_info(dev, "no vpcie3v3 regulator found\n");
  491. }
  492. rockchip->vpcie1v8 = devm_regulator_get(dev, "vpcie1v8");
  493. if (IS_ERR(rockchip->vpcie1v8))
  494. return PTR_ERR(rockchip->vpcie1v8);
  495. rockchip->vpcie0v9 = devm_regulator_get(dev, "vpcie0v9");
  496. if (IS_ERR(rockchip->vpcie0v9))
  497. return PTR_ERR(rockchip->vpcie0v9);
  498. return 0;
  499. }
  500. static int rockchip_pcie_set_vpcie(struct rockchip_pcie *rockchip)
  501. {
  502. struct device *dev = rockchip->dev;
  503. int err;
  504. if (!IS_ERR(rockchip->vpcie12v)) {
  505. err = regulator_enable(rockchip->vpcie12v);
  506. if (err) {
  507. dev_err(dev, "fail to enable vpcie12v regulator\n");
  508. goto err_out;
  509. }
  510. }
  511. if (!IS_ERR(rockchip->vpcie3v3)) {
  512. err = regulator_enable(rockchip->vpcie3v3);
  513. if (err) {
  514. dev_err(dev, "fail to enable vpcie3v3 regulator\n");
  515. goto err_disable_12v;
  516. }
  517. }
  518. err = regulator_enable(rockchip->vpcie1v8);
  519. if (err) {
  520. dev_err(dev, "fail to enable vpcie1v8 regulator\n");
  521. goto err_disable_3v3;
  522. }
  523. err = regulator_enable(rockchip->vpcie0v9);
  524. if (err) {
  525. dev_err(dev, "fail to enable vpcie0v9 regulator\n");
  526. goto err_disable_1v8;
  527. }
  528. return 0;
  529. err_disable_1v8:
  530. regulator_disable(rockchip->vpcie1v8);
  531. err_disable_3v3:
  532. if (!IS_ERR(rockchip->vpcie3v3))
  533. regulator_disable(rockchip->vpcie3v3);
  534. err_disable_12v:
  535. if (!IS_ERR(rockchip->vpcie12v))
  536. regulator_disable(rockchip->vpcie12v);
  537. err_out:
  538. return err;
  539. }
  540. static void rockchip_pcie_enable_interrupts(struct rockchip_pcie *rockchip)
  541. {
  542. rockchip_pcie_write(rockchip, (PCIE_CLIENT_INT_CLI << 16) &
  543. (~PCIE_CLIENT_INT_CLI), PCIE_CLIENT_INT_MASK);
  544. rockchip_pcie_write(rockchip, (u32)(~PCIE_CORE_INT),
  545. PCIE_CORE_INT_MASK);
  546. rockchip_pcie_enable_bw_int(rockchip);
  547. }
  548. static int rockchip_pcie_intx_map(struct irq_domain *domain, unsigned int irq,
  549. irq_hw_number_t hwirq)
  550. {
  551. irq_set_chip_and_handler(irq, &dummy_irq_chip, handle_simple_irq);
  552. irq_set_chip_data(irq, domain->host_data);
  553. return 0;
  554. }
  555. static const struct irq_domain_ops intx_domain_ops = {
  556. .map = rockchip_pcie_intx_map,
  557. };
  558. static int rockchip_pcie_init_irq_domain(struct rockchip_pcie *rockchip)
  559. {
  560. struct device *dev = rockchip->dev;
  561. struct device_node *intc = of_get_next_child(dev->of_node, NULL);
  562. if (!intc) {
  563. dev_err(dev, "missing child interrupt-controller node\n");
  564. return -EINVAL;
  565. }
  566. rockchip->irq_domain = irq_domain_add_linear(intc, PCI_NUM_INTX,
  567. &intx_domain_ops, rockchip);
  568. of_node_put(intc);
  569. if (!rockchip->irq_domain) {
  570. dev_err(dev, "failed to get a INTx IRQ domain\n");
  571. return -EINVAL;
  572. }
  573. return 0;
  574. }
  575. static int rockchip_pcie_prog_ob_atu(struct rockchip_pcie *rockchip,
  576. int region_no, int type, u8 num_pass_bits,
  577. u32 lower_addr, u32 upper_addr)
  578. {
  579. u32 ob_addr_0;
  580. u32 ob_addr_1;
  581. u32 ob_desc_0;
  582. u32 aw_offset;
  583. if (region_no >= MAX_AXI_WRAPPER_REGION_NUM)
  584. return -EINVAL;
  585. if (num_pass_bits + 1 < 8)
  586. return -EINVAL;
  587. if (num_pass_bits > 63)
  588. return -EINVAL;
  589. if (region_no == 0) {
  590. if (AXI_REGION_0_SIZE < (2ULL << num_pass_bits))
  591. return -EINVAL;
  592. }
  593. if (region_no != 0) {
  594. if (AXI_REGION_SIZE < (2ULL << num_pass_bits))
  595. return -EINVAL;
  596. }
  597. aw_offset = (region_no << OB_REG_SIZE_SHIFT);
  598. ob_addr_0 = num_pass_bits & PCIE_CORE_OB_REGION_ADDR0_NUM_BITS;
  599. ob_addr_0 |= lower_addr & PCIE_CORE_OB_REGION_ADDR0_LO_ADDR;
  600. ob_addr_1 = upper_addr;
  601. ob_desc_0 = (1 << 23 | type);
  602. rockchip_pcie_write(rockchip, ob_addr_0,
  603. PCIE_CORE_OB_REGION_ADDR0 + aw_offset);
  604. rockchip_pcie_write(rockchip, ob_addr_1,
  605. PCIE_CORE_OB_REGION_ADDR1 + aw_offset);
  606. rockchip_pcie_write(rockchip, ob_desc_0,
  607. PCIE_CORE_OB_REGION_DESC0 + aw_offset);
  608. rockchip_pcie_write(rockchip, 0,
  609. PCIE_CORE_OB_REGION_DESC1 + aw_offset);
  610. return 0;
  611. }
  612. static int rockchip_pcie_prog_ib_atu(struct rockchip_pcie *rockchip,
  613. int region_no, u8 num_pass_bits,
  614. u32 lower_addr, u32 upper_addr)
  615. {
  616. u32 ib_addr_0;
  617. u32 ib_addr_1;
  618. u32 aw_offset;
  619. if (region_no > MAX_AXI_IB_ROOTPORT_REGION_NUM)
  620. return -EINVAL;
  621. if (num_pass_bits + 1 < MIN_AXI_ADDR_BITS_PASSED)
  622. return -EINVAL;
  623. if (num_pass_bits > 63)
  624. return -EINVAL;
  625. aw_offset = (region_no << IB_ROOT_PORT_REG_SIZE_SHIFT);
  626. ib_addr_0 = num_pass_bits & PCIE_CORE_IB_REGION_ADDR0_NUM_BITS;
  627. ib_addr_0 |= (lower_addr << 8) & PCIE_CORE_IB_REGION_ADDR0_LO_ADDR;
  628. ib_addr_1 = upper_addr;
  629. rockchip_pcie_write(rockchip, ib_addr_0, PCIE_RP_IB_ADDR0 + aw_offset);
  630. rockchip_pcie_write(rockchip, ib_addr_1, PCIE_RP_IB_ADDR1 + aw_offset);
  631. return 0;
  632. }
  633. static int rockchip_pcie_cfg_atu(struct rockchip_pcie *rockchip)
  634. {
  635. struct device *dev = rockchip->dev;
  636. struct pci_host_bridge *bridge = pci_host_bridge_from_priv(rockchip);
  637. struct resource_entry *entry;
  638. u64 pci_addr, size;
  639. int offset;
  640. int err;
  641. int reg_no;
  642. rockchip_pcie_cfg_configuration_accesses(rockchip,
  643. AXI_WRAPPER_TYPE0_CFG);
  644. entry = resource_list_first_type(&bridge->windows, IORESOURCE_MEM);
  645. if (!entry)
  646. return -ENODEV;
  647. size = resource_size(entry->res);
  648. pci_addr = entry->res->start - entry->offset;
  649. rockchip->msg_bus_addr = pci_addr;
  650. for (reg_no = 0; reg_no < (size >> 20); reg_no++) {
  651. err = rockchip_pcie_prog_ob_atu(rockchip, reg_no + 1,
  652. AXI_WRAPPER_MEM_WRITE,
  653. 20 - 1,
  654. pci_addr + (reg_no << 20),
  655. 0);
  656. if (err) {
  657. dev_err(dev, "program RC mem outbound ATU failed\n");
  658. return err;
  659. }
  660. }
  661. err = rockchip_pcie_prog_ib_atu(rockchip, 2, 32 - 1, 0x0, 0);
  662. if (err) {
  663. dev_err(dev, "program RC mem inbound ATU failed\n");
  664. return err;
  665. }
  666. entry = resource_list_first_type(&bridge->windows, IORESOURCE_IO);
  667. if (!entry)
  668. return -ENODEV;
  669. /* store the register number offset to program RC io outbound ATU */
  670. offset = size >> 20;
  671. size = resource_size(entry->res);
  672. pci_addr = entry->res->start - entry->offset;
  673. for (reg_no = 0; reg_no < (size >> 20); reg_no++) {
  674. err = rockchip_pcie_prog_ob_atu(rockchip,
  675. reg_no + 1 + offset,
  676. AXI_WRAPPER_IO_WRITE,
  677. 20 - 1,
  678. pci_addr + (reg_no << 20),
  679. 0);
  680. if (err) {
  681. dev_err(dev, "program RC io outbound ATU failed\n");
  682. return err;
  683. }
  684. }
  685. /* assign message regions */
  686. rockchip_pcie_prog_ob_atu(rockchip, reg_no + 1 + offset,
  687. AXI_WRAPPER_NOR_MSG,
  688. 20 - 1, 0, 0);
  689. rockchip->msg_bus_addr += ((reg_no + offset) << 20);
  690. return err;
  691. }
  692. static int rockchip_pcie_wait_l2(struct rockchip_pcie *rockchip)
  693. {
  694. u32 value;
  695. int err;
  696. /* send PME_TURN_OFF message */
  697. writel(0x0, rockchip->msg_region + PCIE_RC_SEND_PME_OFF);
  698. /* read LTSSM and wait for falling into L2 link state */
  699. err = readl_poll_timeout(rockchip->apb_base + PCIE_CLIENT_DEBUG_OUT_0,
  700. value, PCIE_LINK_IS_L2(value), 20,
  701. jiffies_to_usecs(5 * HZ));
  702. if (err) {
  703. dev_err(rockchip->dev, "PCIe link enter L2 timeout!\n");
  704. return err;
  705. }
  706. return 0;
  707. }
  708. static int rockchip_pcie_suspend_noirq(struct device *dev)
  709. {
  710. struct rockchip_pcie *rockchip = dev_get_drvdata(dev);
  711. int ret;
  712. /* disable core and cli int since we don't need to ack PME_ACK */
  713. rockchip_pcie_write(rockchip, (PCIE_CLIENT_INT_CLI << 16) |
  714. PCIE_CLIENT_INT_CLI, PCIE_CLIENT_INT_MASK);
  715. rockchip_pcie_write(rockchip, (u32)PCIE_CORE_INT, PCIE_CORE_INT_MASK);
  716. ret = rockchip_pcie_wait_l2(rockchip);
  717. if (ret) {
  718. rockchip_pcie_enable_interrupts(rockchip);
  719. return ret;
  720. }
  721. rockchip_pcie_deinit_phys(rockchip);
  722. rockchip_pcie_disable_clocks(rockchip);
  723. regulator_disable(rockchip->vpcie0v9);
  724. return ret;
  725. }
  726. static int rockchip_pcie_resume_noirq(struct device *dev)
  727. {
  728. struct rockchip_pcie *rockchip = dev_get_drvdata(dev);
  729. int err;
  730. err = regulator_enable(rockchip->vpcie0v9);
  731. if (err) {
  732. dev_err(dev, "fail to enable vpcie0v9 regulator\n");
  733. return err;
  734. }
  735. err = rockchip_pcie_enable_clocks(rockchip);
  736. if (err)
  737. goto err_disable_0v9;
  738. err = rockchip_pcie_host_init_port(rockchip);
  739. if (err)
  740. goto err_pcie_resume;
  741. err = rockchip_pcie_cfg_atu(rockchip);
  742. if (err)
  743. goto err_err_deinit_port;
  744. /* Need this to enter L1 again */
  745. rockchip_pcie_update_txcredit_mui(rockchip);
  746. rockchip_pcie_enable_interrupts(rockchip);
  747. return 0;
  748. err_err_deinit_port:
  749. rockchip_pcie_deinit_phys(rockchip);
  750. err_pcie_resume:
  751. rockchip_pcie_disable_clocks(rockchip);
  752. err_disable_0v9:
  753. regulator_disable(rockchip->vpcie0v9);
  754. return err;
  755. }
  756. static int rockchip_pcie_probe(struct platform_device *pdev)
  757. {
  758. struct rockchip_pcie *rockchip;
  759. struct device *dev = &pdev->dev;
  760. struct pci_host_bridge *bridge;
  761. int err;
  762. if (!dev->of_node)
  763. return -ENODEV;
  764. bridge = devm_pci_alloc_host_bridge(dev, sizeof(*rockchip));
  765. if (!bridge)
  766. return -ENOMEM;
  767. rockchip = pci_host_bridge_priv(bridge);
  768. platform_set_drvdata(pdev, rockchip);
  769. rockchip->dev = dev;
  770. rockchip->is_rc = true;
  771. err = rockchip_pcie_parse_host_dt(rockchip);
  772. if (err)
  773. return err;
  774. err = rockchip_pcie_enable_clocks(rockchip);
  775. if (err)
  776. return err;
  777. err = rockchip_pcie_set_vpcie(rockchip);
  778. if (err) {
  779. dev_err(dev, "failed to set vpcie regulator\n");
  780. goto err_set_vpcie;
  781. }
  782. err = rockchip_pcie_host_init_port(rockchip);
  783. if (err)
  784. goto err_vpcie;
  785. err = rockchip_pcie_init_irq_domain(rockchip);
  786. if (err < 0)
  787. goto err_deinit_port;
  788. err = rockchip_pcie_cfg_atu(rockchip);
  789. if (err)
  790. goto err_remove_irq_domain;
  791. rockchip->msg_region = devm_ioremap(dev, rockchip->msg_bus_addr, SZ_1M);
  792. if (!rockchip->msg_region) {
  793. err = -ENOMEM;
  794. goto err_remove_irq_domain;
  795. }
  796. bridge->sysdata = rockchip;
  797. bridge->ops = &rockchip_pcie_ops;
  798. err = rockchip_pcie_setup_irq(rockchip);
  799. if (err)
  800. goto err_remove_irq_domain;
  801. rockchip_pcie_enable_interrupts(rockchip);
  802. err = pci_host_probe(bridge);
  803. if (err < 0)
  804. goto err_remove_irq_domain;
  805. return 0;
  806. err_remove_irq_domain:
  807. irq_domain_remove(rockchip->irq_domain);
  808. err_deinit_port:
  809. rockchip_pcie_deinit_phys(rockchip);
  810. err_vpcie:
  811. if (!IS_ERR(rockchip->vpcie12v))
  812. regulator_disable(rockchip->vpcie12v);
  813. if (!IS_ERR(rockchip->vpcie3v3))
  814. regulator_disable(rockchip->vpcie3v3);
  815. regulator_disable(rockchip->vpcie1v8);
  816. regulator_disable(rockchip->vpcie0v9);
  817. err_set_vpcie:
  818. rockchip_pcie_disable_clocks(rockchip);
  819. return err;
  820. }
  821. static void rockchip_pcie_remove(struct platform_device *pdev)
  822. {
  823. struct device *dev = &pdev->dev;
  824. struct rockchip_pcie *rockchip = dev_get_drvdata(dev);
  825. struct pci_host_bridge *bridge = pci_host_bridge_from_priv(rockchip);
  826. pci_stop_root_bus(bridge->bus);
  827. pci_remove_root_bus(bridge->bus);
  828. irq_domain_remove(rockchip->irq_domain);
  829. rockchip_pcie_deinit_phys(rockchip);
  830. rockchip_pcie_disable_clocks(rockchip);
  831. if (!IS_ERR(rockchip->vpcie12v))
  832. regulator_disable(rockchip->vpcie12v);
  833. if (!IS_ERR(rockchip->vpcie3v3))
  834. regulator_disable(rockchip->vpcie3v3);
  835. regulator_disable(rockchip->vpcie1v8);
  836. regulator_disable(rockchip->vpcie0v9);
  837. }
  838. static const struct dev_pm_ops rockchip_pcie_pm_ops = {
  839. NOIRQ_SYSTEM_SLEEP_PM_OPS(rockchip_pcie_suspend_noirq,
  840. rockchip_pcie_resume_noirq)
  841. };
  842. static const struct of_device_id rockchip_pcie_of_match[] = {
  843. { .compatible = "rockchip,rk3399-pcie", },
  844. {}
  845. };
  846. MODULE_DEVICE_TABLE(of, rockchip_pcie_of_match);
  847. static struct platform_driver rockchip_pcie_driver = {
  848. .driver = {
  849. .name = "rockchip-pcie",
  850. .of_match_table = rockchip_pcie_of_match,
  851. .pm = &rockchip_pcie_pm_ops,
  852. },
  853. .probe = rockchip_pcie_probe,
  854. .remove_new = rockchip_pcie_remove,
  855. };
  856. module_platform_driver(rockchip_pcie_driver);
  857. MODULE_AUTHOR("Rockchip Inc");
  858. MODULE_DESCRIPTION("Rockchip AXI PCIe driver");
  859. MODULE_LICENSE("GPL v2");