pcie-plda-host.c 17 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651
  1. // SPDX-License-Identifier: GPL-2.0
  2. /*
  3. * PLDA PCIe XpressRich host controller driver
  4. *
  5. * Copyright (C) 2023 Microchip Co. Ltd
  6. * StarFive Co. Ltd
  7. *
  8. * Author: Daire McNamara <daire.mcnamara@microchip.com>
  9. */
  10. #include <linux/align.h>
  11. #include <linux/bitfield.h>
  12. #include <linux/irqchip/chained_irq.h>
  13. #include <linux/irqchip/irq-msi-lib.h>
  14. #include <linux/irqdomain.h>
  15. #include <linux/msi.h>
  16. #include <linux/pci_regs.h>
  17. #include <linux/pci-ecam.h>
  18. #include <linux/wordpart.h>
  19. #include "pcie-plda.h"
  20. void __iomem *plda_pcie_map_bus(struct pci_bus *bus, unsigned int devfn,
  21. int where)
  22. {
  23. struct plda_pcie_rp *pcie = bus->sysdata;
  24. return pcie->config_base + PCIE_ECAM_OFFSET(bus->number, devfn, where);
  25. }
  26. EXPORT_SYMBOL_GPL(plda_pcie_map_bus);
  27. static void plda_handle_msi(struct irq_desc *desc)
  28. {
  29. struct plda_pcie_rp *port = irq_desc_get_handler_data(desc);
  30. struct irq_chip *chip = irq_desc_get_chip(desc);
  31. struct device *dev = port->dev;
  32. struct plda_msi *msi = &port->msi;
  33. void __iomem *bridge_base_addr = port->bridge_addr;
  34. unsigned long status;
  35. u32 bit;
  36. int ret;
  37. chained_irq_enter(chip, desc);
  38. status = readl_relaxed(bridge_base_addr + ISTATUS_LOCAL);
  39. if (status & PM_MSI_INT_MSI_MASK) {
  40. writel_relaxed(status & PM_MSI_INT_MSI_MASK,
  41. bridge_base_addr + ISTATUS_LOCAL);
  42. status = readl_relaxed(bridge_base_addr + ISTATUS_MSI);
  43. for_each_set_bit(bit, &status, msi->num_vectors) {
  44. ret = generic_handle_domain_irq(msi->dev_domain, bit);
  45. if (ret)
  46. dev_err_ratelimited(dev, "bad MSI IRQ %d\n",
  47. bit);
  48. }
  49. }
  50. chained_irq_exit(chip, desc);
  51. }
  52. static void plda_msi_bottom_irq_ack(struct irq_data *data)
  53. {
  54. struct plda_pcie_rp *port = irq_data_get_irq_chip_data(data);
  55. void __iomem *bridge_base_addr = port->bridge_addr;
  56. u32 bitpos = data->hwirq;
  57. writel_relaxed(BIT(bitpos), bridge_base_addr + ISTATUS_MSI);
  58. }
  59. static void plda_compose_msi_msg(struct irq_data *data, struct msi_msg *msg)
  60. {
  61. struct plda_pcie_rp *port = irq_data_get_irq_chip_data(data);
  62. phys_addr_t addr = port->msi.vector_phy;
  63. msg->address_lo = lower_32_bits(addr);
  64. msg->address_hi = upper_32_bits(addr);
  65. msg->data = data->hwirq;
  66. dev_dbg(port->dev, "msi#%x address_hi %#x address_lo %#x\n",
  67. (int)data->hwirq, msg->address_hi, msg->address_lo);
  68. }
  69. static struct irq_chip plda_msi_bottom_irq_chip = {
  70. .name = "PLDA MSI",
  71. .irq_ack = plda_msi_bottom_irq_ack,
  72. .irq_compose_msi_msg = plda_compose_msi_msg,
  73. };
  74. static int plda_irq_msi_domain_alloc(struct irq_domain *domain,
  75. unsigned int virq,
  76. unsigned int nr_irqs,
  77. void *args)
  78. {
  79. struct plda_pcie_rp *port = domain->host_data;
  80. struct plda_msi *msi = &port->msi;
  81. unsigned long bit;
  82. mutex_lock(&msi->lock);
  83. bit = find_first_zero_bit(msi->used, msi->num_vectors);
  84. if (bit >= msi->num_vectors) {
  85. mutex_unlock(&msi->lock);
  86. return -ENOSPC;
  87. }
  88. set_bit(bit, msi->used);
  89. irq_domain_set_info(domain, virq, bit, &plda_msi_bottom_irq_chip,
  90. domain->host_data, handle_edge_irq, NULL, NULL);
  91. mutex_unlock(&msi->lock);
  92. return 0;
  93. }
  94. static void plda_irq_msi_domain_free(struct irq_domain *domain,
  95. unsigned int virq,
  96. unsigned int nr_irqs)
  97. {
  98. struct irq_data *d = irq_domain_get_irq_data(domain, virq);
  99. struct plda_pcie_rp *port = irq_data_get_irq_chip_data(d);
  100. struct plda_msi *msi = &port->msi;
  101. mutex_lock(&msi->lock);
  102. if (test_bit(d->hwirq, msi->used))
  103. __clear_bit(d->hwirq, msi->used);
  104. else
  105. dev_err(port->dev, "trying to free unused MSI%lu\n", d->hwirq);
  106. mutex_unlock(&msi->lock);
  107. }
  108. static const struct irq_domain_ops msi_domain_ops = {
  109. .alloc = plda_irq_msi_domain_alloc,
  110. .free = plda_irq_msi_domain_free,
  111. };
  112. #define PLDA_MSI_FLAGS_REQUIRED (MSI_FLAG_USE_DEF_DOM_OPS | \
  113. MSI_FLAG_USE_DEF_CHIP_OPS | \
  114. MSI_FLAG_NO_AFFINITY)
  115. #define PLDA_MSI_FLAGS_SUPPORTED (MSI_GENERIC_FLAGS_MASK | \
  116. MSI_FLAG_PCI_MSIX)
  117. static const struct msi_parent_ops plda_msi_parent_ops = {
  118. .required_flags = PLDA_MSI_FLAGS_REQUIRED,
  119. .supported_flags = PLDA_MSI_FLAGS_SUPPORTED,
  120. .chip_flags = MSI_CHIP_FLAG_SET_ACK,
  121. .bus_select_token = DOMAIN_BUS_PCI_MSI,
  122. .prefix = "PLDA-",
  123. .init_dev_msi_info = msi_lib_init_dev_msi_info,
  124. };
  125. static int plda_allocate_msi_domains(struct plda_pcie_rp *port)
  126. {
  127. struct device *dev = port->dev;
  128. struct plda_msi *msi = &port->msi;
  129. mutex_init(&port->msi.lock);
  130. struct irq_domain_info info = {
  131. .fwnode = dev_fwnode(dev),
  132. .ops = &msi_domain_ops,
  133. .host_data = port,
  134. .size = msi->num_vectors,
  135. };
  136. msi->dev_domain = msi_create_parent_irq_domain(&info, &plda_msi_parent_ops);
  137. if (!msi->dev_domain) {
  138. dev_err(dev, "failed to create IRQ domain\n");
  139. return -ENOMEM;
  140. }
  141. return 0;
  142. }
  143. static void plda_handle_intx(struct irq_desc *desc)
  144. {
  145. struct plda_pcie_rp *port = irq_desc_get_handler_data(desc);
  146. struct irq_chip *chip = irq_desc_get_chip(desc);
  147. struct device *dev = port->dev;
  148. void __iomem *bridge_base_addr = port->bridge_addr;
  149. unsigned long status;
  150. u32 bit;
  151. int ret;
  152. chained_irq_enter(chip, desc);
  153. status = readl_relaxed(bridge_base_addr + ISTATUS_LOCAL);
  154. if (status & PM_MSI_INT_INTX_MASK) {
  155. status &= PM_MSI_INT_INTX_MASK;
  156. status >>= PM_MSI_INT_INTX_SHIFT;
  157. for_each_set_bit(bit, &status, PCI_NUM_INTX) {
  158. ret = generic_handle_domain_irq(port->intx_domain, bit);
  159. if (ret)
  160. dev_err_ratelimited(dev, "bad INTx IRQ %d\n",
  161. bit);
  162. }
  163. }
  164. chained_irq_exit(chip, desc);
  165. }
  166. static void plda_ack_intx_irq(struct irq_data *data)
  167. {
  168. struct plda_pcie_rp *port = irq_data_get_irq_chip_data(data);
  169. void __iomem *bridge_base_addr = port->bridge_addr;
  170. u32 mask = BIT(data->hwirq + PM_MSI_INT_INTX_SHIFT);
  171. writel_relaxed(mask, bridge_base_addr + ISTATUS_LOCAL);
  172. }
  173. static void plda_mask_intx_irq(struct irq_data *data)
  174. {
  175. struct plda_pcie_rp *port = irq_data_get_irq_chip_data(data);
  176. void __iomem *bridge_base_addr = port->bridge_addr;
  177. unsigned long flags;
  178. u32 mask = BIT(data->hwirq + PM_MSI_INT_INTX_SHIFT);
  179. u32 val;
  180. raw_spin_lock_irqsave(&port->lock, flags);
  181. val = readl_relaxed(bridge_base_addr + IMASK_LOCAL);
  182. val &= ~mask;
  183. writel_relaxed(val, bridge_base_addr + IMASK_LOCAL);
  184. raw_spin_unlock_irqrestore(&port->lock, flags);
  185. }
  186. static void plda_unmask_intx_irq(struct irq_data *data)
  187. {
  188. struct plda_pcie_rp *port = irq_data_get_irq_chip_data(data);
  189. void __iomem *bridge_base_addr = port->bridge_addr;
  190. unsigned long flags;
  191. u32 mask = BIT(data->hwirq + PM_MSI_INT_INTX_SHIFT);
  192. u32 val;
  193. raw_spin_lock_irqsave(&port->lock, flags);
  194. val = readl_relaxed(bridge_base_addr + IMASK_LOCAL);
  195. val |= mask;
  196. writel_relaxed(val, bridge_base_addr + IMASK_LOCAL);
  197. raw_spin_unlock_irqrestore(&port->lock, flags);
  198. }
  199. static struct irq_chip plda_intx_irq_chip = {
  200. .name = "PLDA PCIe INTx",
  201. .irq_ack = plda_ack_intx_irq,
  202. .irq_mask = plda_mask_intx_irq,
  203. .irq_unmask = plda_unmask_intx_irq,
  204. };
  205. static int plda_pcie_intx_map(struct irq_domain *domain, unsigned int irq,
  206. irq_hw_number_t hwirq)
  207. {
  208. irq_set_chip_and_handler(irq, &plda_intx_irq_chip, handle_level_irq);
  209. irq_set_chip_data(irq, domain->host_data);
  210. return 0;
  211. }
  212. static const struct irq_domain_ops intx_domain_ops = {
  213. .map = plda_pcie_intx_map,
  214. };
  215. static u32 plda_get_events(struct plda_pcie_rp *port)
  216. {
  217. u32 events, val, origin;
  218. origin = readl_relaxed(port->bridge_addr + ISTATUS_LOCAL);
  219. /* MSI event and sys events */
  220. val = (origin & SYS_AND_MSI_MASK) >> PM_MSI_INT_MSI_SHIFT;
  221. events = val << (PM_MSI_INT_MSI_SHIFT - PCI_NUM_INTX + 1);
  222. /* INTx events */
  223. if (origin & PM_MSI_INT_INTX_MASK)
  224. events |= BIT(PM_MSI_INT_INTX_SHIFT);
  225. /* remains are same with register */
  226. events |= origin & GENMASK(P_ATR_EVT_DOORBELL_SHIFT, 0);
  227. return events;
  228. }
  229. static irqreturn_t plda_event_handler(int irq, void *dev_id)
  230. {
  231. return IRQ_HANDLED;
  232. }
  233. static void plda_handle_event(struct irq_desc *desc)
  234. {
  235. struct plda_pcie_rp *port = irq_desc_get_handler_data(desc);
  236. unsigned long events;
  237. u32 bit;
  238. struct irq_chip *chip = irq_desc_get_chip(desc);
  239. chained_irq_enter(chip, desc);
  240. events = port->event_ops->get_events(port);
  241. events &= port->events_bitmap;
  242. for_each_set_bit(bit, &events, port->num_events)
  243. generic_handle_domain_irq(port->event_domain, bit);
  244. chained_irq_exit(chip, desc);
  245. }
  246. static u32 plda_hwirq_to_mask(int hwirq)
  247. {
  248. u32 mask;
  249. /* hwirq 23 - 0 are the same with register */
  250. if (hwirq < EVENT_PM_MSI_INT_INTX)
  251. mask = BIT(hwirq);
  252. else if (hwirq == EVENT_PM_MSI_INT_INTX)
  253. mask = PM_MSI_INT_INTX_MASK;
  254. else
  255. mask = BIT(hwirq + PCI_NUM_INTX - 1);
  256. return mask;
  257. }
  258. static void plda_ack_event_irq(struct irq_data *data)
  259. {
  260. struct plda_pcie_rp *port = irq_data_get_irq_chip_data(data);
  261. writel_relaxed(plda_hwirq_to_mask(data->hwirq),
  262. port->bridge_addr + ISTATUS_LOCAL);
  263. }
  264. static void plda_mask_event_irq(struct irq_data *data)
  265. {
  266. struct plda_pcie_rp *port = irq_data_get_irq_chip_data(data);
  267. u32 mask, val;
  268. mask = plda_hwirq_to_mask(data->hwirq);
  269. raw_spin_lock(&port->lock);
  270. val = readl_relaxed(port->bridge_addr + IMASK_LOCAL);
  271. val &= ~mask;
  272. writel_relaxed(val, port->bridge_addr + IMASK_LOCAL);
  273. raw_spin_unlock(&port->lock);
  274. }
  275. static void plda_unmask_event_irq(struct irq_data *data)
  276. {
  277. struct plda_pcie_rp *port = irq_data_get_irq_chip_data(data);
  278. u32 mask, val;
  279. mask = plda_hwirq_to_mask(data->hwirq);
  280. raw_spin_lock(&port->lock);
  281. val = readl_relaxed(port->bridge_addr + IMASK_LOCAL);
  282. val |= mask;
  283. writel_relaxed(val, port->bridge_addr + IMASK_LOCAL);
  284. raw_spin_unlock(&port->lock);
  285. }
  286. static struct irq_chip plda_event_irq_chip = {
  287. .name = "PLDA PCIe EVENT",
  288. .irq_ack = plda_ack_event_irq,
  289. .irq_mask = plda_mask_event_irq,
  290. .irq_unmask = plda_unmask_event_irq,
  291. };
  292. static const struct plda_event_ops plda_event_ops = {
  293. .get_events = plda_get_events,
  294. };
  295. static int plda_pcie_event_map(struct irq_domain *domain, unsigned int irq,
  296. irq_hw_number_t hwirq)
  297. {
  298. struct plda_pcie_rp *port = (void *)domain->host_data;
  299. irq_set_chip_and_handler(irq, port->event_irq_chip, handle_level_irq);
  300. irq_set_chip_data(irq, domain->host_data);
  301. return 0;
  302. }
  303. static const struct irq_domain_ops plda_event_domain_ops = {
  304. .map = plda_pcie_event_map,
  305. };
  306. static int plda_pcie_init_irq_domains(struct plda_pcie_rp *port)
  307. {
  308. struct device *dev = port->dev;
  309. struct device_node *node = dev->of_node;
  310. struct device_node *pcie_intc_node;
  311. /* Setup INTx */
  312. pcie_intc_node = of_get_next_child(node, NULL);
  313. if (!pcie_intc_node) {
  314. dev_err(dev, "failed to find PCIe Intc node\n");
  315. return -EINVAL;
  316. }
  317. port->event_domain = irq_domain_create_linear(of_fwnode_handle(pcie_intc_node),
  318. port->num_events, &plda_event_domain_ops,
  319. port);
  320. if (!port->event_domain) {
  321. dev_err(dev, "failed to get event domain\n");
  322. of_node_put(pcie_intc_node);
  323. return -ENOMEM;
  324. }
  325. irq_domain_update_bus_token(port->event_domain, DOMAIN_BUS_NEXUS);
  326. port->intx_domain = irq_domain_create_linear(of_fwnode_handle(pcie_intc_node), PCI_NUM_INTX,
  327. &intx_domain_ops, port);
  328. if (!port->intx_domain) {
  329. dev_err(dev, "failed to get an INTx IRQ domain\n");
  330. of_node_put(pcie_intc_node);
  331. return -ENOMEM;
  332. }
  333. irq_domain_update_bus_token(port->intx_domain, DOMAIN_BUS_WIRED);
  334. of_node_put(pcie_intc_node);
  335. raw_spin_lock_init(&port->lock);
  336. return plda_allocate_msi_domains(port);
  337. }
  338. int plda_init_interrupts(struct platform_device *pdev,
  339. struct plda_pcie_rp *port,
  340. const struct plda_event *event)
  341. {
  342. struct device *dev = &pdev->dev;
  343. int event_irq, ret;
  344. u32 i;
  345. if (!port->event_ops)
  346. port->event_ops = &plda_event_ops;
  347. if (!port->event_irq_chip)
  348. port->event_irq_chip = &plda_event_irq_chip;
  349. ret = plda_pcie_init_irq_domains(port);
  350. if (ret) {
  351. dev_err(dev, "failed creating IRQ domains\n");
  352. return ret;
  353. }
  354. port->irq = platform_get_irq(pdev, 0);
  355. if (port->irq < 0)
  356. return -ENODEV;
  357. for_each_set_bit(i, &port->events_bitmap, port->num_events) {
  358. event_irq = irq_create_mapping(port->event_domain, i);
  359. if (!event_irq) {
  360. dev_err(dev, "failed to map hwirq %d\n", i);
  361. return -ENXIO;
  362. }
  363. if (event->request_event_irq)
  364. ret = event->request_event_irq(port, event_irq, i);
  365. else
  366. ret = devm_request_irq(dev, event_irq,
  367. plda_event_handler,
  368. 0, NULL, port);
  369. if (ret) {
  370. dev_err(dev, "failed to request IRQ %d\n", event_irq);
  371. return ret;
  372. }
  373. }
  374. port->intx_irq = irq_create_mapping(port->event_domain,
  375. event->intx_event);
  376. if (!port->intx_irq) {
  377. dev_err(dev, "failed to map INTx interrupt\n");
  378. return -ENXIO;
  379. }
  380. /* Plug the INTx chained handler */
  381. irq_set_chained_handler_and_data(port->intx_irq, plda_handle_intx, port);
  382. port->msi_irq = irq_create_mapping(port->event_domain,
  383. event->msi_event);
  384. if (!port->msi_irq)
  385. return -ENXIO;
  386. /* Plug the MSI chained handler */
  387. irq_set_chained_handler_and_data(port->msi_irq, plda_handle_msi, port);
  388. /* Plug the main event chained handler */
  389. irq_set_chained_handler_and_data(port->irq, plda_handle_event, port);
  390. return 0;
  391. }
  392. EXPORT_SYMBOL_GPL(plda_init_interrupts);
  393. void plda_pcie_setup_window(void __iomem *bridge_base_addr, u32 index,
  394. phys_addr_t axi_addr, phys_addr_t pci_addr,
  395. size_t size)
  396. {
  397. u32 atr_sz = ilog2(size) - 1;
  398. u32 val;
  399. if (index == 0)
  400. val = PCIE_CONFIG_INTERFACE;
  401. else
  402. val = PCIE_TX_RX_INTERFACE;
  403. writel(val, bridge_base_addr + (index * ATR_ENTRY_SIZE) +
  404. ATR0_AXI4_SLV0_TRSL_PARAM);
  405. val = ALIGN_DOWN(lower_32_bits(axi_addr), SZ_4K);
  406. val |= FIELD_PREP(ATR_SIZE_MASK, atr_sz);
  407. val |= ATR_IMPL_ENABLE;
  408. writel(val, bridge_base_addr + (index * ATR_ENTRY_SIZE) +
  409. ATR0_AXI4_SLV0_SRCADDR_PARAM);
  410. val = upper_32_bits(axi_addr);
  411. writel(val, bridge_base_addr + (index * ATR_ENTRY_SIZE) +
  412. ATR0_AXI4_SLV0_SRC_ADDR);
  413. val = lower_32_bits(pci_addr);
  414. writel(val, bridge_base_addr + (index * ATR_ENTRY_SIZE) +
  415. ATR0_AXI4_SLV0_TRSL_ADDR_LSB);
  416. val = upper_32_bits(pci_addr);
  417. writel(val, bridge_base_addr + (index * ATR_ENTRY_SIZE) +
  418. ATR0_AXI4_SLV0_TRSL_ADDR_UDW);
  419. }
  420. EXPORT_SYMBOL_GPL(plda_pcie_setup_window);
  421. void plda_pcie_setup_inbound_address_translation(struct plda_pcie_rp *port)
  422. {
  423. void __iomem *bridge_base_addr = port->bridge_addr;
  424. u32 val;
  425. val = readl(bridge_base_addr + ATR0_PCIE_WIN0_SRCADDR_PARAM);
  426. val |= (ATR0_PCIE_ATR_SIZE << ATR0_PCIE_ATR_SIZE_SHIFT);
  427. writel(val, bridge_base_addr + ATR0_PCIE_WIN0_SRCADDR_PARAM);
  428. writel(0, bridge_base_addr + ATR0_PCIE_WIN0_SRC_ADDR);
  429. }
  430. EXPORT_SYMBOL_GPL(plda_pcie_setup_inbound_address_translation);
  431. int plda_pcie_setup_iomems(struct pci_host_bridge *bridge,
  432. struct plda_pcie_rp *port)
  433. {
  434. void __iomem *bridge_base_addr = port->bridge_addr;
  435. struct resource_entry *entry;
  436. u64 pci_addr;
  437. u32 index = 1;
  438. resource_list_for_each_entry(entry, &bridge->windows) {
  439. if (resource_type(entry->res) == IORESOURCE_MEM) {
  440. pci_addr = entry->res->start - entry->offset;
  441. plda_pcie_setup_window(bridge_base_addr, index,
  442. entry->res->start, pci_addr,
  443. resource_size(entry->res));
  444. index++;
  445. }
  446. }
  447. return 0;
  448. }
  449. EXPORT_SYMBOL_GPL(plda_pcie_setup_iomems);
  450. static void plda_pcie_irq_domain_deinit(struct plda_pcie_rp *pcie)
  451. {
  452. irq_set_chained_handler_and_data(pcie->irq, NULL, NULL);
  453. irq_set_chained_handler_and_data(pcie->msi_irq, NULL, NULL);
  454. irq_set_chained_handler_and_data(pcie->intx_irq, NULL, NULL);
  455. irq_domain_remove(pcie->msi.dev_domain);
  456. irq_domain_remove(pcie->intx_domain);
  457. irq_domain_remove(pcie->event_domain);
  458. }
  459. int plda_pcie_host_init(struct plda_pcie_rp *port, struct pci_ops *ops,
  460. const struct plda_event *plda_event)
  461. {
  462. struct device *dev = port->dev;
  463. struct pci_host_bridge *bridge;
  464. struct platform_device *pdev = to_platform_device(dev);
  465. struct resource *cfg_res;
  466. int ret;
  467. pdev = to_platform_device(dev);
  468. port->bridge_addr =
  469. devm_platform_ioremap_resource_byname(pdev, "apb");
  470. if (IS_ERR(port->bridge_addr))
  471. return dev_err_probe(dev, PTR_ERR(port->bridge_addr),
  472. "failed to map reg memory\n");
  473. cfg_res = platform_get_resource_byname(pdev, IORESOURCE_MEM, "cfg");
  474. if (!cfg_res)
  475. return dev_err_probe(dev, -ENODEV,
  476. "failed to get config memory\n");
  477. port->config_base = devm_ioremap_resource(dev, cfg_res);
  478. if (IS_ERR(port->config_base))
  479. return dev_err_probe(dev, PTR_ERR(port->config_base),
  480. "failed to map config memory\n");
  481. bridge = devm_pci_alloc_host_bridge(dev, 0);
  482. if (!bridge)
  483. return -ENOMEM;
  484. if (port->host_ops && port->host_ops->host_init) {
  485. ret = port->host_ops->host_init(port);
  486. if (ret)
  487. return ret;
  488. }
  489. port->bridge = bridge;
  490. plda_pcie_setup_window(port->bridge_addr, 0, cfg_res->start, 0,
  491. resource_size(cfg_res));
  492. plda_pcie_setup_iomems(bridge, port);
  493. plda_set_default_msi(&port->msi);
  494. ret = plda_init_interrupts(pdev, port, plda_event);
  495. if (ret)
  496. goto err_host;
  497. /* Set default bus ops */
  498. bridge->ops = ops;
  499. bridge->sysdata = port;
  500. ret = pci_host_probe(bridge);
  501. if (ret < 0) {
  502. dev_err_probe(dev, ret, "failed to probe pci host\n");
  503. goto err_probe;
  504. }
  505. return ret;
  506. err_probe:
  507. plda_pcie_irq_domain_deinit(port);
  508. err_host:
  509. if (port->host_ops && port->host_ops->host_deinit)
  510. port->host_ops->host_deinit(port);
  511. return ret;
  512. }
  513. EXPORT_SYMBOL_GPL(plda_pcie_host_init);
  514. void plda_pcie_host_deinit(struct plda_pcie_rp *port)
  515. {
  516. pci_stop_root_bus(port->bridge->bus);
  517. pci_remove_root_bus(port->bridge->bus);
  518. plda_pcie_irq_domain_deinit(port);
  519. if (port->host_ops && port->host_ops->host_deinit)
  520. port->host_ops->host_deinit(port);
  521. }
  522. EXPORT_SYMBOL_GPL(plda_pcie_host_deinit);