pcie-altera.c 27 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065
  1. // SPDX-License-Identifier: GPL-2.0
  2. /*
  3. * Copyright Altera Corporation (C) 2013-2015. All rights reserved
  4. *
  5. * Author: Ley Foon Tan <lftan@altera.com>
  6. * Description: Altera PCIe host controller driver
  7. */
  8. #include <linux/bitfield.h>
  9. #include <linux/delay.h>
  10. #include <linux/interrupt.h>
  11. #include <linux/irqchip/chained_irq.h>
  12. #include <linux/irqdomain.h>
  13. #include <linux/init.h>
  14. #include <linux/module.h>
  15. #include <linux/of.h>
  16. #include <linux/of_pci.h>
  17. #include <linux/pci.h>
  18. #include <linux/platform_device.h>
  19. #include <linux/slab.h>
  20. #include "../pci.h"
  21. #define RP_TX_REG0 0x2000
  22. #define RP_TX_REG1 0x2004
  23. #define RP_TX_CNTRL 0x2008
  24. #define RP_TX_EOP 0x2
  25. #define RP_TX_SOP 0x1
  26. #define RP_RXCPL_STATUS 0x2010
  27. #define RP_RXCPL_EOP 0x2
  28. #define RP_RXCPL_SOP 0x1
  29. #define RP_RXCPL_REG0 0x2014
  30. #define RP_RXCPL_REG1 0x2018
  31. #define P2A_INT_STATUS 0x3060
  32. #define P2A_INT_STS_ALL 0xf
  33. #define P2A_INT_ENABLE 0x3070
  34. #define P2A_INT_ENA_ALL 0xf
  35. #define RP_LTSSM 0x3c64
  36. #define RP_LTSSM_MASK 0x1f
  37. #define LTSSM_L0 0xf
  38. #define S10_RP_TX_CNTRL 0x2004
  39. #define S10_RP_RXCPL_REG 0x2008
  40. #define S10_RP_RXCPL_STATUS 0x200C
  41. #define S10_RP_CFG_ADDR(pcie, reg) \
  42. (((pcie)->hip_base) + (reg) + (1 << 20))
  43. #define S10_RP_SECONDARY(pcie) \
  44. readb(S10_RP_CFG_ADDR(pcie, PCI_SECONDARY_BUS))
  45. /* TLP configuration type 0 and 1 */
  46. #define TLP_FMTTYPE_CFGRD0 0x04 /* Configuration Read Type 0 */
  47. #define TLP_FMTTYPE_CFGWR0 0x44 /* Configuration Write Type 0 */
  48. #define TLP_FMTTYPE_CFGRD1 0x05 /* Configuration Read Type 1 */
  49. #define TLP_FMTTYPE_CFGWR1 0x45 /* Configuration Write Type 1 */
  50. #define TLP_PAYLOAD_SIZE 0x01
  51. #define TLP_READ_TAG 0x1d
  52. #define TLP_WRITE_TAG 0x10
  53. #define RP_DEVFN 0
  54. #define TLP_CFG_DW0(pcie, cfg) \
  55. (((cfg) << 24) | \
  56. TLP_PAYLOAD_SIZE)
  57. #define TLP_CFG_DW1(pcie, tag, be) \
  58. (((PCI_DEVID(pcie->root_bus_nr, RP_DEVFN)) << 16) | (tag << 8) | (be))
  59. #define TLP_CFG_DW2(bus, devfn, offset) \
  60. (((bus) << 24) | ((devfn) << 16) | (offset))
  61. #define TLP_COMP_STATUS(s) (((s) >> 13) & 7)
  62. #define TLP_BYTE_COUNT(s) (((s) >> 0) & 0xfff)
  63. #define TLP_HDR_SIZE 3
  64. #define TLP_LOOP 500
  65. #define LINK_UP_TIMEOUT HZ
  66. #define LINK_RETRAIN_TIMEOUT HZ
  67. #define DWORD_MASK 3
  68. #define S10_TLP_FMTTYPE_CFGRD0 0x05
  69. #define S10_TLP_FMTTYPE_CFGRD1 0x04
  70. #define S10_TLP_FMTTYPE_CFGWR0 0x45
  71. #define S10_TLP_FMTTYPE_CFGWR1 0x44
  72. #define AGLX_RP_CFG_ADDR(pcie, reg) (((pcie)->hip_base) + (reg))
  73. #define AGLX_RP_SECONDARY(pcie) \
  74. readb(AGLX_RP_CFG_ADDR(pcie, PCI_SECONDARY_BUS))
  75. #define AGLX_BDF_REG 0x00002004
  76. #define AGLX_ROOT_PORT_IRQ_STATUS 0x14c
  77. #define AGLX_ROOT_PORT_IRQ_ENABLE 0x150
  78. #define CFG_AER BIT(4)
  79. #define AGLX_CFG_TARGET GENMASK(13, 12)
  80. #define AGLX_CFG_TARGET_TYPE0 0
  81. #define AGLX_CFG_TARGET_TYPE1 1
  82. #define AGLX_CFG_TARGET_LOCAL_2000 2
  83. #define AGLX_CFG_TARGET_LOCAL_3000 3
  84. enum altera_pcie_version {
  85. ALTERA_PCIE_V1 = 0,
  86. ALTERA_PCIE_V2,
  87. ALTERA_PCIE_V3,
  88. };
  89. struct altera_pcie {
  90. struct platform_device *pdev;
  91. void __iomem *cra_base;
  92. void __iomem *hip_base;
  93. int irq;
  94. u8 root_bus_nr;
  95. struct irq_domain *irq_domain;
  96. struct resource bus_range;
  97. const struct altera_pcie_data *pcie_data;
  98. };
  99. struct altera_pcie_ops {
  100. int (*tlp_read_pkt)(struct altera_pcie *pcie, u32 *value);
  101. void (*tlp_write_pkt)(struct altera_pcie *pcie, u32 *headers,
  102. u32 data, bool align);
  103. bool (*get_link_status)(struct altera_pcie *pcie);
  104. int (*rp_read_cfg)(struct altera_pcie *pcie, int where,
  105. int size, u32 *value);
  106. int (*rp_write_cfg)(struct altera_pcie *pcie, u8 busno,
  107. int where, int size, u32 value);
  108. int (*ep_read_cfg)(struct altera_pcie *pcie, u8 busno,
  109. unsigned int devfn, int where, int size, u32 *value);
  110. int (*ep_write_cfg)(struct altera_pcie *pcie, u8 busno,
  111. unsigned int devfn, int where, int size, u32 value);
  112. void (*rp_isr)(struct irq_desc *desc);
  113. };
  114. struct altera_pcie_data {
  115. const struct altera_pcie_ops *ops;
  116. enum altera_pcie_version version;
  117. u32 cap_offset; /* PCIe capability structure register offset */
  118. u32 cfgrd0;
  119. u32 cfgrd1;
  120. u32 cfgwr0;
  121. u32 cfgwr1;
  122. u32 port_conf_offset;
  123. u32 port_irq_status_offset;
  124. u32 port_irq_enable_offset;
  125. };
  126. struct tlp_rp_regpair_t {
  127. u32 ctrl;
  128. u32 reg0;
  129. u32 reg1;
  130. };
  131. static inline void cra_writel(struct altera_pcie *pcie, const u32 value,
  132. const u32 reg)
  133. {
  134. writel_relaxed(value, pcie->cra_base + reg);
  135. }
  136. static inline u32 cra_readl(struct altera_pcie *pcie, const u32 reg)
  137. {
  138. return readl_relaxed(pcie->cra_base + reg);
  139. }
  140. static inline void cra_writew(struct altera_pcie *pcie, const u32 value,
  141. const u32 reg)
  142. {
  143. writew_relaxed(value, pcie->cra_base + reg);
  144. }
  145. static inline u32 cra_readw(struct altera_pcie *pcie, const u32 reg)
  146. {
  147. return readw_relaxed(pcie->cra_base + reg);
  148. }
  149. static inline void cra_writeb(struct altera_pcie *pcie, const u32 value,
  150. const u32 reg)
  151. {
  152. writeb_relaxed(value, pcie->cra_base + reg);
  153. }
  154. static inline u32 cra_readb(struct altera_pcie *pcie, const u32 reg)
  155. {
  156. return readb_relaxed(pcie->cra_base + reg);
  157. }
  158. static bool altera_pcie_link_up(struct altera_pcie *pcie)
  159. {
  160. return !!((cra_readl(pcie, RP_LTSSM) & RP_LTSSM_MASK) == LTSSM_L0);
  161. }
  162. static bool s10_altera_pcie_link_up(struct altera_pcie *pcie)
  163. {
  164. void __iomem *addr = S10_RP_CFG_ADDR(pcie,
  165. pcie->pcie_data->cap_offset +
  166. PCI_EXP_LNKSTA);
  167. return !!(readw(addr) & PCI_EXP_LNKSTA_DLLLA);
  168. }
  169. static bool aglx_altera_pcie_link_up(struct altera_pcie *pcie)
  170. {
  171. void __iomem *addr = AGLX_RP_CFG_ADDR(pcie,
  172. pcie->pcie_data->cap_offset +
  173. PCI_EXP_LNKSTA);
  174. return (readw_relaxed(addr) & PCI_EXP_LNKSTA_DLLLA);
  175. }
  176. /*
  177. * Altera PCIe port uses BAR0 of RC's configuration space as the translation
  178. * from PCI bus to native BUS. Entire DDR region is mapped into PCIe space
  179. * using these registers, so it can be reached by DMA from EP devices.
  180. * This BAR0 will also access to MSI vector when receiving MSI/MSI-X interrupt
  181. * from EP devices, eventually trigger interrupt to GIC. The BAR0 of bridge
  182. * should be hidden during enumeration to avoid the sizing and resource
  183. * allocation by PCIe core.
  184. */
  185. static bool altera_pcie_hide_rc_bar(struct pci_bus *bus, unsigned int devfn,
  186. int offset)
  187. {
  188. if (pci_is_root_bus(bus) && (devfn == 0) &&
  189. (offset == PCI_BASE_ADDRESS_0))
  190. return true;
  191. return false;
  192. }
  193. static void tlp_write_tx(struct altera_pcie *pcie,
  194. struct tlp_rp_regpair_t *tlp_rp_regdata)
  195. {
  196. cra_writel(pcie, tlp_rp_regdata->reg0, RP_TX_REG0);
  197. cra_writel(pcie, tlp_rp_regdata->reg1, RP_TX_REG1);
  198. cra_writel(pcie, tlp_rp_regdata->ctrl, RP_TX_CNTRL);
  199. }
  200. static void s10_tlp_write_tx(struct altera_pcie *pcie, u32 reg0, u32 ctrl)
  201. {
  202. cra_writel(pcie, reg0, RP_TX_REG0);
  203. cra_writel(pcie, ctrl, S10_RP_TX_CNTRL);
  204. }
  205. static bool altera_pcie_valid_device(struct altera_pcie *pcie,
  206. struct pci_bus *bus, int dev)
  207. {
  208. /* If there is no link, then there is no device */
  209. if (bus->number != pcie->root_bus_nr) {
  210. if (!pcie->pcie_data->ops->get_link_status(pcie))
  211. return false;
  212. }
  213. /* access only one slot on each root port */
  214. if (bus->number == pcie->root_bus_nr && dev > 0)
  215. return false;
  216. return true;
  217. }
  218. static int tlp_read_packet(struct altera_pcie *pcie, u32 *value)
  219. {
  220. int i;
  221. bool sop = false;
  222. u32 ctrl;
  223. u32 reg0, reg1;
  224. u32 comp_status = 1;
  225. /*
  226. * Minimum 2 loops to read TLP headers and 1 loop to read data
  227. * payload.
  228. */
  229. for (i = 0; i < TLP_LOOP; i++) {
  230. ctrl = cra_readl(pcie, RP_RXCPL_STATUS);
  231. if ((ctrl & RP_RXCPL_SOP) || (ctrl & RP_RXCPL_EOP) || sop) {
  232. reg0 = cra_readl(pcie, RP_RXCPL_REG0);
  233. reg1 = cra_readl(pcie, RP_RXCPL_REG1);
  234. if (ctrl & RP_RXCPL_SOP) {
  235. sop = true;
  236. comp_status = TLP_COMP_STATUS(reg1);
  237. }
  238. if (ctrl & RP_RXCPL_EOP) {
  239. if (comp_status)
  240. return PCIBIOS_DEVICE_NOT_FOUND;
  241. if (value)
  242. *value = reg0;
  243. return PCIBIOS_SUCCESSFUL;
  244. }
  245. }
  246. udelay(5);
  247. }
  248. return PCIBIOS_DEVICE_NOT_FOUND;
  249. }
  250. static int s10_tlp_read_packet(struct altera_pcie *pcie, u32 *value)
  251. {
  252. u32 ctrl;
  253. u32 comp_status;
  254. u32 dw[4];
  255. u32 count;
  256. struct device *dev = &pcie->pdev->dev;
  257. for (count = 0; count < TLP_LOOP; count++) {
  258. ctrl = cra_readl(pcie, S10_RP_RXCPL_STATUS);
  259. if (ctrl & RP_RXCPL_SOP) {
  260. /* Read first DW */
  261. dw[0] = cra_readl(pcie, S10_RP_RXCPL_REG);
  262. break;
  263. }
  264. udelay(5);
  265. }
  266. /* SOP detection failed, return error */
  267. if (count == TLP_LOOP)
  268. return PCIBIOS_DEVICE_NOT_FOUND;
  269. count = 1;
  270. /* Poll for EOP */
  271. while (count < ARRAY_SIZE(dw)) {
  272. ctrl = cra_readl(pcie, S10_RP_RXCPL_STATUS);
  273. dw[count++] = cra_readl(pcie, S10_RP_RXCPL_REG);
  274. if (ctrl & RP_RXCPL_EOP) {
  275. comp_status = TLP_COMP_STATUS(dw[1]);
  276. if (comp_status)
  277. return PCIBIOS_DEVICE_NOT_FOUND;
  278. if (value && TLP_BYTE_COUNT(dw[1]) == sizeof(u32) &&
  279. count == 4)
  280. *value = dw[3];
  281. return PCIBIOS_SUCCESSFUL;
  282. }
  283. }
  284. dev_warn(dev, "Malformed TLP packet\n");
  285. return PCIBIOS_DEVICE_NOT_FOUND;
  286. }
  287. static void tlp_write_packet(struct altera_pcie *pcie, u32 *headers,
  288. u32 data, bool align)
  289. {
  290. struct tlp_rp_regpair_t tlp_rp_regdata;
  291. tlp_rp_regdata.reg0 = headers[0];
  292. tlp_rp_regdata.reg1 = headers[1];
  293. tlp_rp_regdata.ctrl = RP_TX_SOP;
  294. tlp_write_tx(pcie, &tlp_rp_regdata);
  295. if (align) {
  296. tlp_rp_regdata.reg0 = headers[2];
  297. tlp_rp_regdata.reg1 = 0;
  298. tlp_rp_regdata.ctrl = 0;
  299. tlp_write_tx(pcie, &tlp_rp_regdata);
  300. tlp_rp_regdata.reg0 = data;
  301. tlp_rp_regdata.reg1 = 0;
  302. } else {
  303. tlp_rp_regdata.reg0 = headers[2];
  304. tlp_rp_regdata.reg1 = data;
  305. }
  306. tlp_rp_regdata.ctrl = RP_TX_EOP;
  307. tlp_write_tx(pcie, &tlp_rp_regdata);
  308. }
  309. static void s10_tlp_write_packet(struct altera_pcie *pcie, u32 *headers,
  310. u32 data, bool dummy)
  311. {
  312. s10_tlp_write_tx(pcie, headers[0], RP_TX_SOP);
  313. s10_tlp_write_tx(pcie, headers[1], 0);
  314. s10_tlp_write_tx(pcie, headers[2], 0);
  315. s10_tlp_write_tx(pcie, data, RP_TX_EOP);
  316. }
  317. static void get_tlp_header(struct altera_pcie *pcie, u8 bus, u32 devfn,
  318. int where, u8 byte_en, bool read, u32 *headers)
  319. {
  320. u8 cfg;
  321. u8 cfg0 = read ? pcie->pcie_data->cfgrd0 : pcie->pcie_data->cfgwr0;
  322. u8 cfg1 = read ? pcie->pcie_data->cfgrd1 : pcie->pcie_data->cfgwr1;
  323. u8 tag = read ? TLP_READ_TAG : TLP_WRITE_TAG;
  324. if (pcie->pcie_data->version == ALTERA_PCIE_V1)
  325. cfg = (bus == pcie->root_bus_nr) ? cfg0 : cfg1;
  326. else
  327. cfg = (bus > S10_RP_SECONDARY(pcie)) ? cfg0 : cfg1;
  328. headers[0] = TLP_CFG_DW0(pcie, cfg);
  329. headers[1] = TLP_CFG_DW1(pcie, tag, byte_en);
  330. headers[2] = TLP_CFG_DW2(bus, devfn, where);
  331. }
  332. static int tlp_cfg_dword_read(struct altera_pcie *pcie, u8 bus, u32 devfn,
  333. int where, u8 byte_en, u32 *value)
  334. {
  335. u32 headers[TLP_HDR_SIZE];
  336. get_tlp_header(pcie, bus, devfn, where, byte_en, true,
  337. headers);
  338. pcie->pcie_data->ops->tlp_write_pkt(pcie, headers, 0, false);
  339. return pcie->pcie_data->ops->tlp_read_pkt(pcie, value);
  340. }
  341. static int tlp_cfg_dword_write(struct altera_pcie *pcie, u8 bus, u32 devfn,
  342. int where, u8 byte_en, u32 value)
  343. {
  344. u32 headers[TLP_HDR_SIZE];
  345. int ret;
  346. get_tlp_header(pcie, bus, devfn, where, byte_en, false,
  347. headers);
  348. /* check alignment to Qword */
  349. if ((where & 0x7) == 0)
  350. pcie->pcie_data->ops->tlp_write_pkt(pcie, headers,
  351. value, true);
  352. else
  353. pcie->pcie_data->ops->tlp_write_pkt(pcie, headers,
  354. value, false);
  355. ret = pcie->pcie_data->ops->tlp_read_pkt(pcie, NULL);
  356. if (ret != PCIBIOS_SUCCESSFUL)
  357. return ret;
  358. /*
  359. * Monitor changes to PCI_PRIMARY_BUS register on root port
  360. * and update local copy of root bus number accordingly.
  361. */
  362. if ((bus == pcie->root_bus_nr) && (where == PCI_PRIMARY_BUS))
  363. pcie->root_bus_nr = (u8)(value);
  364. return PCIBIOS_SUCCESSFUL;
  365. }
  366. static int s10_rp_read_cfg(struct altera_pcie *pcie, int where,
  367. int size, u32 *value)
  368. {
  369. void __iomem *addr = S10_RP_CFG_ADDR(pcie, where);
  370. switch (size) {
  371. case 1:
  372. *value = readb(addr);
  373. break;
  374. case 2:
  375. *value = readw(addr);
  376. break;
  377. default:
  378. *value = readl(addr);
  379. break;
  380. }
  381. return PCIBIOS_SUCCESSFUL;
  382. }
  383. static int s10_rp_write_cfg(struct altera_pcie *pcie, u8 busno,
  384. int where, int size, u32 value)
  385. {
  386. void __iomem *addr = S10_RP_CFG_ADDR(pcie, where);
  387. switch (size) {
  388. case 1:
  389. writeb(value, addr);
  390. break;
  391. case 2:
  392. writew(value, addr);
  393. break;
  394. default:
  395. writel(value, addr);
  396. break;
  397. }
  398. /*
  399. * Monitor changes to PCI_PRIMARY_BUS register on root port
  400. * and update local copy of root bus number accordingly.
  401. */
  402. if (busno == pcie->root_bus_nr && where == PCI_PRIMARY_BUS)
  403. pcie->root_bus_nr = value & 0xff;
  404. return PCIBIOS_SUCCESSFUL;
  405. }
  406. static int aglx_rp_read_cfg(struct altera_pcie *pcie, int where,
  407. int size, u32 *value)
  408. {
  409. void __iomem *addr = AGLX_RP_CFG_ADDR(pcie, where);
  410. switch (size) {
  411. case 1:
  412. *value = readb_relaxed(addr);
  413. break;
  414. case 2:
  415. *value = readw_relaxed(addr);
  416. break;
  417. default:
  418. *value = readl_relaxed(addr);
  419. break;
  420. }
  421. /* Interrupt PIN not programmed in hardware, set to INTA. */
  422. if (where == PCI_INTERRUPT_PIN && size == 1 && !(*value))
  423. *value = 0x01;
  424. else if (where == PCI_INTERRUPT_LINE && !(*value & 0xff00))
  425. *value |= 0x0100;
  426. return PCIBIOS_SUCCESSFUL;
  427. }
  428. static int aglx_rp_write_cfg(struct altera_pcie *pcie, u8 busno,
  429. int where, int size, u32 value)
  430. {
  431. void __iomem *addr = AGLX_RP_CFG_ADDR(pcie, where);
  432. switch (size) {
  433. case 1:
  434. writeb_relaxed(value, addr);
  435. break;
  436. case 2:
  437. writew_relaxed(value, addr);
  438. break;
  439. default:
  440. writel_relaxed(value, addr);
  441. break;
  442. }
  443. /*
  444. * Monitor changes to PCI_PRIMARY_BUS register on Root Port
  445. * and update local copy of root bus number accordingly.
  446. */
  447. if (busno == pcie->root_bus_nr && where == PCI_PRIMARY_BUS)
  448. pcie->root_bus_nr = value & 0xff;
  449. return PCIBIOS_SUCCESSFUL;
  450. }
  451. static int aglx_ep_write_cfg(struct altera_pcie *pcie, u8 busno,
  452. unsigned int devfn, int where, int size, u32 value)
  453. {
  454. cra_writel(pcie, ((busno << 8) | devfn), AGLX_BDF_REG);
  455. if (busno > AGLX_RP_SECONDARY(pcie))
  456. where |= FIELD_PREP(AGLX_CFG_TARGET, AGLX_CFG_TARGET_TYPE1);
  457. switch (size) {
  458. case 1:
  459. cra_writeb(pcie, value, where);
  460. break;
  461. case 2:
  462. cra_writew(pcie, value, where);
  463. break;
  464. default:
  465. cra_writel(pcie, value, where);
  466. break;
  467. }
  468. return PCIBIOS_SUCCESSFUL;
  469. }
  470. static int aglx_ep_read_cfg(struct altera_pcie *pcie, u8 busno,
  471. unsigned int devfn, int where, int size, u32 *value)
  472. {
  473. cra_writel(pcie, ((busno << 8) | devfn), AGLX_BDF_REG);
  474. if (busno > AGLX_RP_SECONDARY(pcie))
  475. where |= FIELD_PREP(AGLX_CFG_TARGET, AGLX_CFG_TARGET_TYPE1);
  476. switch (size) {
  477. case 1:
  478. *value = cra_readb(pcie, where);
  479. break;
  480. case 2:
  481. *value = cra_readw(pcie, where);
  482. break;
  483. default:
  484. *value = cra_readl(pcie, where);
  485. break;
  486. }
  487. return PCIBIOS_SUCCESSFUL;
  488. }
  489. static int _altera_pcie_cfg_read(struct altera_pcie *pcie, u8 busno,
  490. unsigned int devfn, int where, int size,
  491. u32 *value)
  492. {
  493. int ret;
  494. u32 data;
  495. u8 byte_en;
  496. if (busno == pcie->root_bus_nr && pcie->pcie_data->ops->rp_read_cfg)
  497. return pcie->pcie_data->ops->rp_read_cfg(pcie, where,
  498. size, value);
  499. if (pcie->pcie_data->ops->ep_read_cfg)
  500. return pcie->pcie_data->ops->ep_read_cfg(pcie, busno, devfn,
  501. where, size, value);
  502. switch (size) {
  503. case 1:
  504. byte_en = 1 << (where & 3);
  505. break;
  506. case 2:
  507. byte_en = 3 << (where & 3);
  508. break;
  509. default:
  510. byte_en = 0xf;
  511. break;
  512. }
  513. ret = tlp_cfg_dword_read(pcie, busno, devfn,
  514. (where & ~DWORD_MASK), byte_en, &data);
  515. if (ret != PCIBIOS_SUCCESSFUL)
  516. return ret;
  517. switch (size) {
  518. case 1:
  519. *value = (data >> (8 * (where & 0x3))) & 0xff;
  520. break;
  521. case 2:
  522. *value = (data >> (8 * (where & 0x2))) & 0xffff;
  523. break;
  524. default:
  525. *value = data;
  526. break;
  527. }
  528. return PCIBIOS_SUCCESSFUL;
  529. }
  530. static int _altera_pcie_cfg_write(struct altera_pcie *pcie, u8 busno,
  531. unsigned int devfn, int where, int size,
  532. u32 value)
  533. {
  534. u32 data32;
  535. u32 shift = 8 * (where & 3);
  536. u8 byte_en;
  537. if (busno == pcie->root_bus_nr && pcie->pcie_data->ops->rp_write_cfg)
  538. return pcie->pcie_data->ops->rp_write_cfg(pcie, busno,
  539. where, size, value);
  540. if (pcie->pcie_data->ops->ep_write_cfg)
  541. return pcie->pcie_data->ops->ep_write_cfg(pcie, busno, devfn,
  542. where, size, value);
  543. switch (size) {
  544. case 1:
  545. data32 = (value & 0xff) << shift;
  546. byte_en = 1 << (where & 3);
  547. break;
  548. case 2:
  549. data32 = (value & 0xffff) << shift;
  550. byte_en = 3 << (where & 3);
  551. break;
  552. default:
  553. data32 = value;
  554. byte_en = 0xf;
  555. break;
  556. }
  557. return tlp_cfg_dword_write(pcie, busno, devfn, (where & ~DWORD_MASK),
  558. byte_en, data32);
  559. }
  560. static int altera_pcie_cfg_read(struct pci_bus *bus, unsigned int devfn,
  561. int where, int size, u32 *value)
  562. {
  563. struct altera_pcie *pcie = bus->sysdata;
  564. if (altera_pcie_hide_rc_bar(bus, devfn, where))
  565. return PCIBIOS_BAD_REGISTER_NUMBER;
  566. if (!altera_pcie_valid_device(pcie, bus, PCI_SLOT(devfn)))
  567. return PCIBIOS_DEVICE_NOT_FOUND;
  568. return _altera_pcie_cfg_read(pcie, bus->number, devfn, where, size,
  569. value);
  570. }
  571. static int altera_pcie_cfg_write(struct pci_bus *bus, unsigned int devfn,
  572. int where, int size, u32 value)
  573. {
  574. struct altera_pcie *pcie = bus->sysdata;
  575. if (altera_pcie_hide_rc_bar(bus, devfn, where))
  576. return PCIBIOS_BAD_REGISTER_NUMBER;
  577. if (!altera_pcie_valid_device(pcie, bus, PCI_SLOT(devfn)))
  578. return PCIBIOS_DEVICE_NOT_FOUND;
  579. return _altera_pcie_cfg_write(pcie, bus->number, devfn, where, size,
  580. value);
  581. }
  582. static struct pci_ops altera_pcie_ops = {
  583. .read = altera_pcie_cfg_read,
  584. .write = altera_pcie_cfg_write,
  585. };
  586. static int altera_read_cap_word(struct altera_pcie *pcie, u8 busno,
  587. unsigned int devfn, int offset, u16 *value)
  588. {
  589. u32 data;
  590. int ret;
  591. ret = _altera_pcie_cfg_read(pcie, busno, devfn,
  592. pcie->pcie_data->cap_offset + offset,
  593. sizeof(*value),
  594. &data);
  595. *value = data;
  596. return ret;
  597. }
  598. static int altera_write_cap_word(struct altera_pcie *pcie, u8 busno,
  599. unsigned int devfn, int offset, u16 value)
  600. {
  601. return _altera_pcie_cfg_write(pcie, busno, devfn,
  602. pcie->pcie_data->cap_offset + offset,
  603. sizeof(value),
  604. value);
  605. }
  606. static void altera_wait_link_retrain(struct altera_pcie *pcie)
  607. {
  608. struct device *dev = &pcie->pdev->dev;
  609. u16 reg16;
  610. unsigned long start_jiffies;
  611. /* Wait for link training end. */
  612. start_jiffies = jiffies;
  613. for (;;) {
  614. altera_read_cap_word(pcie, pcie->root_bus_nr, RP_DEVFN,
  615. PCI_EXP_LNKSTA, &reg16);
  616. if (!(reg16 & PCI_EXP_LNKSTA_LT))
  617. break;
  618. if (time_after(jiffies, start_jiffies + LINK_RETRAIN_TIMEOUT)) {
  619. dev_err(dev, "link retrain timeout\n");
  620. break;
  621. }
  622. udelay(100);
  623. }
  624. /* Wait for link is up */
  625. start_jiffies = jiffies;
  626. for (;;) {
  627. if (pcie->pcie_data->ops->get_link_status(pcie))
  628. break;
  629. if (time_after(jiffies, start_jiffies + LINK_UP_TIMEOUT)) {
  630. dev_err(dev, "link up timeout\n");
  631. break;
  632. }
  633. udelay(100);
  634. }
  635. }
  636. static void altera_pcie_retrain(struct altera_pcie *pcie)
  637. {
  638. u16 linkcap, linkstat, linkctl;
  639. if (!pcie->pcie_data->ops->get_link_status(pcie))
  640. return;
  641. /*
  642. * Set the retrain bit if the PCIe rootport support > 2.5GB/s, but
  643. * current speed is 2.5 GB/s.
  644. */
  645. altera_read_cap_word(pcie, pcie->root_bus_nr, RP_DEVFN, PCI_EXP_LNKCAP,
  646. &linkcap);
  647. if ((linkcap & PCI_EXP_LNKCAP_SLS) <= PCI_EXP_LNKCAP_SLS_2_5GB)
  648. return;
  649. altera_read_cap_word(pcie, pcie->root_bus_nr, RP_DEVFN, PCI_EXP_LNKSTA,
  650. &linkstat);
  651. if ((linkstat & PCI_EXP_LNKSTA_CLS) == PCI_EXP_LNKSTA_CLS_2_5GB) {
  652. altera_read_cap_word(pcie, pcie->root_bus_nr, RP_DEVFN,
  653. PCI_EXP_LNKCTL, &linkctl);
  654. linkctl |= PCI_EXP_LNKCTL_RL;
  655. altera_write_cap_word(pcie, pcie->root_bus_nr, RP_DEVFN,
  656. PCI_EXP_LNKCTL, linkctl);
  657. altera_wait_link_retrain(pcie);
  658. }
  659. }
  660. static int altera_pcie_intx_map(struct irq_domain *domain, unsigned int irq,
  661. irq_hw_number_t hwirq)
  662. {
  663. irq_set_chip_and_handler(irq, &dummy_irq_chip, handle_simple_irq);
  664. irq_set_chip_data(irq, domain->host_data);
  665. return 0;
  666. }
  667. static const struct irq_domain_ops intx_domain_ops = {
  668. .map = altera_pcie_intx_map,
  669. .xlate = pci_irqd_intx_xlate,
  670. };
  671. static void altera_pcie_isr(struct irq_desc *desc)
  672. {
  673. struct irq_chip *chip = irq_desc_get_chip(desc);
  674. struct altera_pcie *pcie;
  675. struct device *dev;
  676. unsigned long status;
  677. u32 bit;
  678. int ret;
  679. chained_irq_enter(chip, desc);
  680. pcie = irq_desc_get_handler_data(desc);
  681. dev = &pcie->pdev->dev;
  682. while ((status = cra_readl(pcie, P2A_INT_STATUS)
  683. & P2A_INT_STS_ALL) != 0) {
  684. for_each_set_bit(bit, &status, PCI_NUM_INTX) {
  685. /* clear interrupts */
  686. cra_writel(pcie, 1 << bit, P2A_INT_STATUS);
  687. ret = generic_handle_domain_irq(pcie->irq_domain, bit);
  688. if (ret)
  689. dev_err_ratelimited(dev, "unexpected IRQ, INT%d\n", bit);
  690. }
  691. }
  692. chained_irq_exit(chip, desc);
  693. }
  694. static void aglx_isr(struct irq_desc *desc)
  695. {
  696. struct irq_chip *chip = irq_desc_get_chip(desc);
  697. struct altera_pcie *pcie;
  698. struct device *dev;
  699. u32 status;
  700. int ret;
  701. chained_irq_enter(chip, desc);
  702. pcie = irq_desc_get_handler_data(desc);
  703. dev = &pcie->pdev->dev;
  704. status = readl(pcie->hip_base + pcie->pcie_data->port_conf_offset +
  705. pcie->pcie_data->port_irq_status_offset);
  706. if (status & CFG_AER) {
  707. writel(CFG_AER, (pcie->hip_base + pcie->pcie_data->port_conf_offset +
  708. pcie->pcie_data->port_irq_status_offset));
  709. ret = generic_handle_domain_irq(pcie->irq_domain, 0);
  710. if (ret)
  711. dev_err_ratelimited(dev, "unexpected IRQ %d\n", pcie->irq);
  712. }
  713. chained_irq_exit(chip, desc);
  714. }
  715. static int altera_pcie_init_irq_domain(struct altera_pcie *pcie)
  716. {
  717. struct device *dev = &pcie->pdev->dev;
  718. /* Setup INTx */
  719. pcie->irq_domain = irq_domain_create_linear(dev_fwnode(dev), PCI_NUM_INTX,
  720. &intx_domain_ops, pcie);
  721. if (!pcie->irq_domain) {
  722. dev_err(dev, "Failed to get a INTx IRQ domain\n");
  723. return -ENOMEM;
  724. }
  725. return 0;
  726. }
  727. static void altera_pcie_irq_teardown(struct altera_pcie *pcie)
  728. {
  729. irq_set_chained_handler_and_data(pcie->irq, NULL, NULL);
  730. irq_domain_remove(pcie->irq_domain);
  731. irq_dispose_mapping(pcie->irq);
  732. }
  733. static int altera_pcie_parse_dt(struct altera_pcie *pcie)
  734. {
  735. struct platform_device *pdev = pcie->pdev;
  736. pcie->cra_base = devm_platform_ioremap_resource_byname(pdev, "Cra");
  737. if (IS_ERR(pcie->cra_base))
  738. return PTR_ERR(pcie->cra_base);
  739. if (pcie->pcie_data->version == ALTERA_PCIE_V2 ||
  740. pcie->pcie_data->version == ALTERA_PCIE_V3) {
  741. pcie->hip_base = devm_platform_ioremap_resource_byname(pdev, "Hip");
  742. if (IS_ERR(pcie->hip_base))
  743. return PTR_ERR(pcie->hip_base);
  744. }
  745. /* setup IRQ */
  746. pcie->irq = platform_get_irq(pdev, 0);
  747. if (pcie->irq < 0)
  748. return pcie->irq;
  749. irq_set_chained_handler_and_data(pcie->irq, pcie->pcie_data->ops->rp_isr, pcie);
  750. return 0;
  751. }
  752. static void altera_pcie_host_init(struct altera_pcie *pcie)
  753. {
  754. altera_pcie_retrain(pcie);
  755. }
  756. static const struct altera_pcie_ops altera_pcie_ops_1_0 = {
  757. .tlp_read_pkt = tlp_read_packet,
  758. .tlp_write_pkt = tlp_write_packet,
  759. .get_link_status = altera_pcie_link_up,
  760. .rp_isr = altera_pcie_isr,
  761. };
  762. static const struct altera_pcie_ops altera_pcie_ops_2_0 = {
  763. .tlp_read_pkt = s10_tlp_read_packet,
  764. .tlp_write_pkt = s10_tlp_write_packet,
  765. .get_link_status = s10_altera_pcie_link_up,
  766. .rp_read_cfg = s10_rp_read_cfg,
  767. .rp_write_cfg = s10_rp_write_cfg,
  768. .rp_isr = altera_pcie_isr,
  769. };
  770. static const struct altera_pcie_ops altera_pcie_ops_3_0 = {
  771. .rp_read_cfg = aglx_rp_read_cfg,
  772. .rp_write_cfg = aglx_rp_write_cfg,
  773. .get_link_status = aglx_altera_pcie_link_up,
  774. .ep_read_cfg = aglx_ep_read_cfg,
  775. .ep_write_cfg = aglx_ep_write_cfg,
  776. .rp_isr = aglx_isr,
  777. };
  778. static const struct altera_pcie_data altera_pcie_1_0_data = {
  779. .ops = &altera_pcie_ops_1_0,
  780. .cap_offset = 0x80,
  781. .version = ALTERA_PCIE_V1,
  782. .cfgrd0 = TLP_FMTTYPE_CFGRD0,
  783. .cfgrd1 = TLP_FMTTYPE_CFGRD1,
  784. .cfgwr0 = TLP_FMTTYPE_CFGWR0,
  785. .cfgwr1 = TLP_FMTTYPE_CFGWR1,
  786. };
  787. static const struct altera_pcie_data altera_pcie_2_0_data = {
  788. .ops = &altera_pcie_ops_2_0,
  789. .version = ALTERA_PCIE_V2,
  790. .cap_offset = 0x70,
  791. .cfgrd0 = S10_TLP_FMTTYPE_CFGRD0,
  792. .cfgrd1 = S10_TLP_FMTTYPE_CFGRD1,
  793. .cfgwr0 = S10_TLP_FMTTYPE_CFGWR0,
  794. .cfgwr1 = S10_TLP_FMTTYPE_CFGWR1,
  795. };
  796. static const struct altera_pcie_data altera_pcie_3_0_f_tile_data = {
  797. .ops = &altera_pcie_ops_3_0,
  798. .version = ALTERA_PCIE_V3,
  799. .cap_offset = 0x70,
  800. .port_conf_offset = 0x14000,
  801. .port_irq_status_offset = AGLX_ROOT_PORT_IRQ_STATUS,
  802. .port_irq_enable_offset = AGLX_ROOT_PORT_IRQ_ENABLE,
  803. };
  804. static const struct altera_pcie_data altera_pcie_3_0_p_tile_data = {
  805. .ops = &altera_pcie_ops_3_0,
  806. .version = ALTERA_PCIE_V3,
  807. .cap_offset = 0x70,
  808. .port_conf_offset = 0x104000,
  809. .port_irq_status_offset = AGLX_ROOT_PORT_IRQ_STATUS,
  810. .port_irq_enable_offset = AGLX_ROOT_PORT_IRQ_ENABLE,
  811. };
  812. static const struct altera_pcie_data altera_pcie_3_0_r_tile_data = {
  813. .ops = &altera_pcie_ops_3_0,
  814. .version = ALTERA_PCIE_V3,
  815. .cap_offset = 0x70,
  816. .port_conf_offset = 0x1300,
  817. .port_irq_status_offset = 0x0,
  818. .port_irq_enable_offset = 0x4,
  819. };
  820. static const struct of_device_id altera_pcie_of_match[] = {
  821. {.compatible = "altr,pcie-root-port-1.0",
  822. .data = &altera_pcie_1_0_data },
  823. {.compatible = "altr,pcie-root-port-2.0",
  824. .data = &altera_pcie_2_0_data },
  825. {.compatible = "altr,pcie-root-port-3.0-f-tile",
  826. .data = &altera_pcie_3_0_f_tile_data },
  827. {.compatible = "altr,pcie-root-port-3.0-p-tile",
  828. .data = &altera_pcie_3_0_p_tile_data },
  829. {.compatible = "altr,pcie-root-port-3.0-r-tile",
  830. .data = &altera_pcie_3_0_r_tile_data },
  831. {},
  832. };
  833. static int altera_pcie_probe(struct platform_device *pdev)
  834. {
  835. struct device *dev = &pdev->dev;
  836. struct altera_pcie *pcie;
  837. struct pci_host_bridge *bridge;
  838. int ret;
  839. const struct altera_pcie_data *data;
  840. bridge = devm_pci_alloc_host_bridge(dev, sizeof(*pcie));
  841. if (!bridge)
  842. return -ENOMEM;
  843. pcie = pci_host_bridge_priv(bridge);
  844. pcie->pdev = pdev;
  845. platform_set_drvdata(pdev, pcie);
  846. data = of_device_get_match_data(&pdev->dev);
  847. if (!data)
  848. return -ENODEV;
  849. pcie->pcie_data = data;
  850. ret = altera_pcie_parse_dt(pcie);
  851. if (ret) {
  852. dev_err(dev, "Parsing DT failed\n");
  853. return ret;
  854. }
  855. ret = altera_pcie_init_irq_domain(pcie);
  856. if (ret) {
  857. dev_err(dev, "Failed creating IRQ Domain\n");
  858. return ret;
  859. }
  860. if (pcie->pcie_data->version == ALTERA_PCIE_V1 ||
  861. pcie->pcie_data->version == ALTERA_PCIE_V2) {
  862. /* clear all interrupts */
  863. cra_writel(pcie, P2A_INT_STS_ALL, P2A_INT_STATUS);
  864. /* enable all interrupts */
  865. cra_writel(pcie, P2A_INT_ENA_ALL, P2A_INT_ENABLE);
  866. altera_pcie_host_init(pcie);
  867. } else if (pcie->pcie_data->version == ALTERA_PCIE_V3) {
  868. writel(CFG_AER,
  869. pcie->hip_base + pcie->pcie_data->port_conf_offset +
  870. pcie->pcie_data->port_irq_enable_offset);
  871. }
  872. bridge->sysdata = pcie;
  873. bridge->busnr = pcie->root_bus_nr;
  874. bridge->ops = &altera_pcie_ops;
  875. return pci_host_probe(bridge);
  876. }
  877. static void altera_pcie_remove(struct platform_device *pdev)
  878. {
  879. struct altera_pcie *pcie = platform_get_drvdata(pdev);
  880. struct pci_host_bridge *bridge = pci_host_bridge_from_priv(pcie);
  881. pci_stop_root_bus(bridge->bus);
  882. pci_remove_root_bus(bridge->bus);
  883. altera_pcie_irq_teardown(pcie);
  884. }
  885. static struct platform_driver altera_pcie_driver = {
  886. .probe = altera_pcie_probe,
  887. .remove = altera_pcie_remove,
  888. .driver = {
  889. .name = "altera-pcie",
  890. .of_match_table = altera_pcie_of_match,
  891. },
  892. };
  893. MODULE_DEVICE_TABLE(of, altera_pcie_of_match);
  894. module_platform_driver(altera_pcie_driver);
  895. MODULE_DESCRIPTION("Altera PCIe host controller driver");
  896. MODULE_LICENSE("GPL v2");