hc
2024-02-20 102a0743326a03cd1a1202ceda21e175b7d3575c
kernel/drivers/pci/controller/pcie-rockchip-ep.c
....@@ -125,6 +125,7 @@
125125 static int rockchip_pcie_ep_write_header(struct pci_epc *epc, u8 fn,
126126 struct pci_epf_header *hdr)
127127 {
128
+ u32 reg;
128129 struct rockchip_pcie_ep *ep = epc_get_drvdata(epc);
129130 struct rockchip_pcie *rockchip = &ep->rockchip;
130131
....@@ -137,8 +138,9 @@
137138 PCIE_CORE_CONFIG_VENDOR);
138139 }
139140
140
- rockchip_pcie_write(rockchip, hdr->deviceid << 16,
141
- 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);
142144
143145 rockchip_pcie_write(rockchip,
144146 hdr->revid |
....@@ -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
....@@ -506,6 +485,7 @@
506485 .linkup_notifier = false,
507486 .msi_capable = true,
508487 .msix_capable = false,
488
+ .align = 256,
509489 };
510490
511491 static const struct pci_epc_features*
....@@ -631,6 +611,9 @@
631611
632612 ep->irq_pci_addr = ROCKCHIP_PCIE_EP_DUMMY_IRQ_ADDR;
633613
614
+ rockchip_pcie_write(rockchip, PCIE_CLIENT_CONF_ENABLE,
615
+ PCIE_CLIENT_CONFIG);
616
+
634617 return 0;
635618 err_epc_mem_exit:
636619 pci_epc_mem_exit(epc);