| .. | .. |
|---|
| 125 | 125 | static int rockchip_pcie_ep_write_header(struct pci_epc *epc, u8 fn, |
|---|
| 126 | 126 | struct pci_epf_header *hdr) |
|---|
| 127 | 127 | { |
|---|
| 128 | + u32 reg; |
|---|
| 128 | 129 | struct rockchip_pcie_ep *ep = epc_get_drvdata(epc); |
|---|
| 129 | 130 | struct rockchip_pcie *rockchip = &ep->rockchip; |
|---|
| 130 | 131 | |
|---|
| .. | .. |
|---|
| 137 | 138 | PCIE_CORE_CONFIG_VENDOR); |
|---|
| 138 | 139 | } |
|---|
| 139 | 140 | |
|---|
| 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); |
|---|
| 142 | 144 | |
|---|
| 143 | 145 | rockchip_pcie_write(rockchip, |
|---|
| 144 | 146 | hdr->revid | |
|---|
| .. | .. |
|---|
| 312 | 314 | { |
|---|
| 313 | 315 | struct rockchip_pcie_ep *ep = epc_get_drvdata(epc); |
|---|
| 314 | 316 | struct rockchip_pcie *rockchip = &ep->rockchip; |
|---|
| 315 | | - u16 flags; |
|---|
| 317 | + u32 flags; |
|---|
| 316 | 318 | |
|---|
| 317 | 319 | flags = rockchip_pcie_read(rockchip, |
|---|
| 318 | 320 | ROCKCHIP_PCIE_EP_FUNC_BASE(fn) + |
|---|
| 319 | 321 | ROCKCHIP_PCIE_EP_MSI_CTRL_REG); |
|---|
| 320 | 322 | flags &= ~ROCKCHIP_PCIE_EP_MSI_CTRL_MMC_MASK; |
|---|
| 321 | 323 | 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); |
|---|
| 324 | 326 | flags &= ~ROCKCHIP_PCIE_EP_MSI_CTRL_MASK_MSI_CAP; |
|---|
| 325 | 327 | rockchip_pcie_write(rockchip, flags, |
|---|
| 326 | 328 | ROCKCHIP_PCIE_EP_FUNC_BASE(fn) + |
|---|
| .. | .. |
|---|
| 332 | 334 | { |
|---|
| 333 | 335 | struct rockchip_pcie_ep *ep = epc_get_drvdata(epc); |
|---|
| 334 | 336 | struct rockchip_pcie *rockchip = &ep->rockchip; |
|---|
| 335 | | - u16 flags; |
|---|
| 337 | + u32 flags; |
|---|
| 336 | 338 | |
|---|
| 337 | 339 | flags = rockchip_pcie_read(rockchip, |
|---|
| 338 | 340 | ROCKCHIP_PCIE_EP_FUNC_BASE(fn) + |
|---|
| .. | .. |
|---|
| 345 | 347 | } |
|---|
| 346 | 348 | |
|---|
| 347 | 349 | 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) |
|---|
| 349 | 351 | { |
|---|
| 350 | 352 | 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 | | - } |
|---|
| 364 | 353 | |
|---|
| 365 | 354 | intx &= 3; |
|---|
| 366 | | - if (is_asserted) { |
|---|
| 355 | + |
|---|
| 356 | + if (do_assert) { |
|---|
| 367 | 357 | 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); |
|---|
| 369 | 362 | } else { |
|---|
| 370 | 363 | 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); |
|---|
| 372 | 368 | } |
|---|
| 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); |
|---|
| 390 | 369 | } |
|---|
| 391 | 370 | |
|---|
| 392 | 371 | static int rockchip_pcie_ep_send_legacy_irq(struct rockchip_pcie_ep *ep, u8 fn, |
|---|
| .. | .. |
|---|
| 416 | 395 | u8 interrupt_num) |
|---|
| 417 | 396 | { |
|---|
| 418 | 397 | struct rockchip_pcie *rockchip = &ep->rockchip; |
|---|
| 419 | | - u16 flags, mme, data, data_mask; |
|---|
| 398 | + u32 flags, mme, data, data_mask; |
|---|
| 420 | 399 | u8 msi_count; |
|---|
| 421 | 400 | u64 pci_addr, pci_addr_mask = 0xff; |
|---|
| 422 | 401 | |
|---|
| .. | .. |
|---|
| 506 | 485 | .linkup_notifier = false, |
|---|
| 507 | 486 | .msi_capable = true, |
|---|
| 508 | 487 | .msix_capable = false, |
|---|
| 488 | + .align = 256, |
|---|
| 509 | 489 | }; |
|---|
| 510 | 490 | |
|---|
| 511 | 491 | static const struct pci_epc_features* |
|---|
| .. | .. |
|---|
| 631 | 611 | |
|---|
| 632 | 612 | ep->irq_pci_addr = ROCKCHIP_PCIE_EP_DUMMY_IRQ_ADDR; |
|---|
| 633 | 613 | |
|---|
| 614 | + rockchip_pcie_write(rockchip, PCIE_CLIENT_CONF_ENABLE, |
|---|
| 615 | + PCIE_CLIENT_CONFIG); |
|---|
| 616 | + |
|---|
| 634 | 617 | return 0; |
|---|
| 635 | 618 | err_epc_mem_exit: |
|---|
| 636 | 619 | pci_epc_mem_exit(epc); |
|---|