.. | .. |
---|
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); |
---|