hc
2024-01-03 2f7c68cb55ecb7331f2381deb497c27155f32faf
kernel/drivers/pci/controller/pcie-rockchip-ep.c
....@@ -22,6 +22,7 @@
2222 /**
2323 * struct rockchip_pcie_ep - private data for PCIe endpoint controller driver
2424 * @rockchip: Rockchip PCIe controller
25
+ * @epc: PCI EPC device
2526 * @max_regions: maximum number of regions supported by hardware
2627 * @ob_region_map: bitmask of mapped outbound regions
2728 * @ob_addr: base addresses in the AXI bus where the outbound regions start
....@@ -124,6 +125,7 @@
124125 static int rockchip_pcie_ep_write_header(struct pci_epc *epc, u8 fn,
125126 struct pci_epf_header *hdr)
126127 {
128
+ u32 reg;
127129 struct rockchip_pcie_ep *ep = epc_get_drvdata(epc);
128130 struct rockchip_pcie *rockchip = &ep->rockchip;
129131
....@@ -136,8 +138,9 @@
136138 PCIE_CORE_CONFIG_VENDOR);
137139 }
138140
139
- rockchip_pcie_write(rockchip, hdr->deviceid << 16,
140
- ROCKCHIP_PCIE_EP_FUNC_BASE(fn) + PCI_VENDOR_ID);
141
+ reg = rockchip_pcie_read(rockchip, PCIE_EP_CONFIG_DID_VID);
142
+ reg = (reg & 0xFFFF) | (hdr->deviceid << 16);
143
+ rockchip_pcie_write(rockchip, reg, PCIE_EP_CONFIG_DID_VID);
141144
142145 rockchip_pcie_write(rockchip,
143146 hdr->revid |
....@@ -263,8 +266,7 @@
263266 struct rockchip_pcie *pcie = &ep->rockchip;
264267 u32 r;
265268
266
- r = find_first_zero_bit(&ep->ob_region_map,
267
- sizeof(ep->ob_region_map) * BITS_PER_LONG);
269
+ r = find_first_zero_bit(&ep->ob_region_map, BITS_PER_LONG);
268270 /*
269271 * Region 0 is reserved for configuration space and shouldn't
270272 * be used elsewhere per TRM, so leave it out.
....@@ -312,15 +314,15 @@
312314 {
313315 struct rockchip_pcie_ep *ep = epc_get_drvdata(epc);
314316 struct rockchip_pcie *rockchip = &ep->rockchip;
315
- u16 flags;
317
+ u32 flags;
316318
317319 flags = rockchip_pcie_read(rockchip,
318320 ROCKCHIP_PCIE_EP_FUNC_BASE(fn) +
319321 ROCKCHIP_PCIE_EP_MSI_CTRL_REG);
320322 flags &= ~ROCKCHIP_PCIE_EP_MSI_CTRL_MMC_MASK;
321323 flags |=
322
- ((multi_msg_cap << 1) << ROCKCHIP_PCIE_EP_MSI_CTRL_MMC_OFFSET) |
323
- PCI_MSI_FLAGS_64BIT;
324
+ (multi_msg_cap << ROCKCHIP_PCIE_EP_MSI_CTRL_MMC_OFFSET) |
325
+ (PCI_MSI_FLAGS_64BIT << ROCKCHIP_PCIE_EP_MSI_FLAGS_OFFSET);
324326 flags &= ~ROCKCHIP_PCIE_EP_MSI_CTRL_MASK_MSI_CAP;
325327 rockchip_pcie_write(rockchip, flags,
326328 ROCKCHIP_PCIE_EP_FUNC_BASE(fn) +
....@@ -332,7 +334,7 @@
332334 {
333335 struct rockchip_pcie_ep *ep = epc_get_drvdata(epc);
334336 struct rockchip_pcie *rockchip = &ep->rockchip;
335
- u16 flags;
337
+ u32 flags;
336338
337339 flags = rockchip_pcie_read(rockchip,
338340 ROCKCHIP_PCIE_EP_FUNC_BASE(fn) +
....@@ -345,48 +347,25 @@
345347 }
346348
347349 static void rockchip_pcie_ep_assert_intx(struct rockchip_pcie_ep *ep, u8 fn,
348
- u8 intx, bool is_asserted)
350
+ u8 intx, bool do_assert)
349351 {
350352 struct rockchip_pcie *rockchip = &ep->rockchip;
351
- u32 r = ep->max_regions - 1;
352
- u32 offset;
353
- u32 status;
354
- u8 msg_code;
355
-
356
- if (unlikely(ep->irq_pci_addr != ROCKCHIP_PCIE_EP_PCI_LEGACY_IRQ_ADDR ||
357
- ep->irq_pci_fn != fn)) {
358
- rockchip_pcie_prog_ep_ob_atu(rockchip, fn, r,
359
- AXI_WRAPPER_NOR_MSG,
360
- ep->irq_phys_addr, 0, 0);
361
- ep->irq_pci_addr = ROCKCHIP_PCIE_EP_PCI_LEGACY_IRQ_ADDR;
362
- ep->irq_pci_fn = fn;
363
- }
364353
365354 intx &= 3;
366
- if (is_asserted) {
355
+
356
+ if (do_assert) {
367357 ep->irq_pending |= BIT(intx);
368
- msg_code = ROCKCHIP_PCIE_MSG_CODE_ASSERT_INTA + intx;
358
+ rockchip_pcie_write(rockchip,
359
+ PCIE_CLIENT_INT_IN_ASSERT |
360
+ PCIE_CLIENT_INT_PEND_ST_PEND,
361
+ PCIE_CLIENT_LEGACY_INT_CTRL);
369362 } else {
370363 ep->irq_pending &= ~BIT(intx);
371
- msg_code = ROCKCHIP_PCIE_MSG_CODE_DEASSERT_INTA + intx;
364
+ rockchip_pcie_write(rockchip,
365
+ PCIE_CLIENT_INT_IN_DEASSERT |
366
+ PCIE_CLIENT_INT_PEND_ST_NORMAL,
367
+ PCIE_CLIENT_LEGACY_INT_CTRL);
372368 }
373
-
374
- status = rockchip_pcie_read(rockchip,
375
- ROCKCHIP_PCIE_EP_FUNC_BASE(fn) +
376
- ROCKCHIP_PCIE_EP_CMD_STATUS);
377
- status &= ROCKCHIP_PCIE_EP_CMD_STATUS_IS;
378
-
379
- if ((status != 0) ^ (ep->irq_pending != 0)) {
380
- status ^= ROCKCHIP_PCIE_EP_CMD_STATUS_IS;
381
- rockchip_pcie_write(rockchip, status,
382
- ROCKCHIP_PCIE_EP_FUNC_BASE(fn) +
383
- ROCKCHIP_PCIE_EP_CMD_STATUS);
384
- }
385
-
386
- offset =
387
- ROCKCHIP_PCIE_MSG_ROUTING(ROCKCHIP_PCIE_MSG_ROUTING_LOCAL_INTX) |
388
- ROCKCHIP_PCIE_MSG_CODE(msg_code) | ROCKCHIP_PCIE_MSG_NO_DATA;
389
- writel(0, ep->irq_cpu_addr + offset);
390369 }
391370
392371 static int rockchip_pcie_ep_send_legacy_irq(struct rockchip_pcie_ep *ep, u8 fn,
....@@ -416,7 +395,7 @@
416395 u8 interrupt_num)
417396 {
418397 struct rockchip_pcie *rockchip = &ep->rockchip;
419
- u16 flags, mme, data, data_mask;
398
+ u32 flags, mme, data, data_mask;
420399 u8 msi_count;
421400 u64 pci_addr, pci_addr_mask = 0xff;
422401
....@@ -499,10 +478,20 @@
499478
500479 rockchip_pcie_write(rockchip, cfg, PCIE_CORE_PHY_FUNC_CFG);
501480
502
- list_for_each_entry(epf, &epc->pci_epf, list)
503
- pci_epf_linkup(epf);
504
-
505481 return 0;
482
+}
483
+
484
+static const struct pci_epc_features rockchip_pcie_epc_features = {
485
+ .linkup_notifier = false,
486
+ .msi_capable = true,
487
+ .msix_capable = false,
488
+ .align = 256,
489
+};
490
+
491
+static const struct pci_epc_features*
492
+rockchip_pcie_ep_get_features(struct pci_epc *epc, u8 func_no)
493
+{
494
+ return &rockchip_pcie_epc_features;
506495 }
507496
508497 static const struct pci_epc_ops rockchip_pcie_epc_ops = {
....@@ -515,6 +504,7 @@
515504 .get_msi = rockchip_pcie_ep_get_msi,
516505 .raise_irq = rockchip_pcie_ep_raise_irq,
517506 .start = rockchip_pcie_ep_start,
507
+ .get_features = rockchip_pcie_ep_get_features,
518508 };
519509
520510 static int rockchip_pcie_parse_ep_dt(struct rockchip_pcie *rockchip,
....@@ -605,7 +595,7 @@
605595 rockchip_pcie_write(rockchip, BIT(0), PCIE_CORE_PHY_FUNC_CFG);
606596
607597 err = pci_epc_mem_init(epc, rockchip->mem_res->start,
608
- resource_size(rockchip->mem_res));
598
+ resource_size(rockchip->mem_res), PAGE_SIZE);
609599 if (err < 0) {
610600 dev_err(dev, "failed to initialize the memory space\n");
611601 goto err_uninit_port;
....@@ -621,6 +611,9 @@
621611
622612 ep->irq_pci_addr = ROCKCHIP_PCIE_EP_DUMMY_IRQ_ADDR;
623613
614
+ rockchip_pcie_write(rockchip, PCIE_CLIENT_CONF_ENABLE,
615
+ PCIE_CLIENT_CONFIG);
616
+
624617 return 0;
625618 err_epc_mem_exit:
626619 pci_epc_mem_exit(epc);