0001
0002
0003
0004
0005
0006
0007
0008
0009
0010
0011 #include <linux/configfs.h>
0012 #include <linux/delay.h>
0013 #include <linux/kernel.h>
0014 #include <linux/of.h>
0015 #include <linux/pci-epc.h>
0016 #include <linux/platform_device.h>
0017 #include <linux/pci-epf.h>
0018 #include <linux/sizes.h>
0019
0020 #include "pcie-rockchip.h"
0021
0022
0023
0024
0025
0026
0027
0028
0029
0030
0031
0032
0033
0034
0035
0036
0037
0038
0039
0040 struct rockchip_pcie_ep {
0041 struct rockchip_pcie rockchip;
0042 struct pci_epc *epc;
0043 u32 max_regions;
0044 unsigned long ob_region_map;
0045 phys_addr_t *ob_addr;
0046 phys_addr_t irq_phys_addr;
0047 void __iomem *irq_cpu_addr;
0048 u64 irq_pci_addr;
0049 u8 irq_pci_fn;
0050 u8 irq_pending;
0051 };
0052
0053 static void rockchip_pcie_clear_ep_ob_atu(struct rockchip_pcie *rockchip,
0054 u32 region)
0055 {
0056 rockchip_pcie_write(rockchip, 0,
0057 ROCKCHIP_PCIE_AT_OB_REGION_PCI_ADDR0(region));
0058 rockchip_pcie_write(rockchip, 0,
0059 ROCKCHIP_PCIE_AT_OB_REGION_PCI_ADDR1(region));
0060 rockchip_pcie_write(rockchip, 0,
0061 ROCKCHIP_PCIE_AT_OB_REGION_DESC0(region));
0062 rockchip_pcie_write(rockchip, 0,
0063 ROCKCHIP_PCIE_AT_OB_REGION_DESC1(region));
0064 rockchip_pcie_write(rockchip, 0,
0065 ROCKCHIP_PCIE_AT_OB_REGION_CPU_ADDR0(region));
0066 rockchip_pcie_write(rockchip, 0,
0067 ROCKCHIP_PCIE_AT_OB_REGION_CPU_ADDR1(region));
0068 }
0069
0070 static void rockchip_pcie_prog_ep_ob_atu(struct rockchip_pcie *rockchip, u8 fn,
0071 u32 r, u32 type, u64 cpu_addr,
0072 u64 pci_addr, size_t size)
0073 {
0074 u64 sz = 1ULL << fls64(size - 1);
0075 int num_pass_bits = ilog2(sz);
0076 u32 addr0, addr1, desc0, desc1;
0077 bool is_nor_msg = (type == AXI_WRAPPER_NOR_MSG);
0078
0079
0080 if (num_pass_bits < 8)
0081 num_pass_bits = 8;
0082
0083 cpu_addr -= rockchip->mem_res->start;
0084 addr0 = ((is_nor_msg ? 0x10 : (num_pass_bits - 1)) &
0085 PCIE_CORE_OB_REGION_ADDR0_NUM_BITS) |
0086 (lower_32_bits(cpu_addr) & PCIE_CORE_OB_REGION_ADDR0_LO_ADDR);
0087 addr1 = upper_32_bits(is_nor_msg ? cpu_addr : pci_addr);
0088 desc0 = ROCKCHIP_PCIE_AT_OB_REGION_DESC0_DEVFN(fn) | type;
0089 desc1 = 0;
0090
0091 if (is_nor_msg) {
0092 rockchip_pcie_write(rockchip, 0,
0093 ROCKCHIP_PCIE_AT_OB_REGION_PCI_ADDR0(r));
0094 rockchip_pcie_write(rockchip, 0,
0095 ROCKCHIP_PCIE_AT_OB_REGION_PCI_ADDR1(r));
0096 rockchip_pcie_write(rockchip, desc0,
0097 ROCKCHIP_PCIE_AT_OB_REGION_DESC0(r));
0098 rockchip_pcie_write(rockchip, desc1,
0099 ROCKCHIP_PCIE_AT_OB_REGION_DESC1(r));
0100 } else {
0101
0102 rockchip_pcie_write(rockchip, addr0,
0103 ROCKCHIP_PCIE_AT_OB_REGION_PCI_ADDR0(r));
0104 rockchip_pcie_write(rockchip, addr1,
0105 ROCKCHIP_PCIE_AT_OB_REGION_PCI_ADDR1(r));
0106 rockchip_pcie_write(rockchip, desc0,
0107 ROCKCHIP_PCIE_AT_OB_REGION_DESC0(r));
0108 rockchip_pcie_write(rockchip, desc1,
0109 ROCKCHIP_PCIE_AT_OB_REGION_DESC1(r));
0110
0111 addr0 =
0112 ((num_pass_bits - 1) & PCIE_CORE_OB_REGION_ADDR0_NUM_BITS) |
0113 (lower_32_bits(cpu_addr) &
0114 PCIE_CORE_OB_REGION_ADDR0_LO_ADDR);
0115 addr1 = upper_32_bits(cpu_addr);
0116 }
0117
0118
0119 rockchip_pcie_write(rockchip, addr0,
0120 ROCKCHIP_PCIE_AT_OB_REGION_CPU_ADDR0(r));
0121 rockchip_pcie_write(rockchip, addr1,
0122 ROCKCHIP_PCIE_AT_OB_REGION_CPU_ADDR1(r));
0123 }
0124
0125 static int rockchip_pcie_ep_write_header(struct pci_epc *epc, u8 fn, u8 vfn,
0126 struct pci_epf_header *hdr)
0127 {
0128 struct rockchip_pcie_ep *ep = epc_get_drvdata(epc);
0129 struct rockchip_pcie *rockchip = &ep->rockchip;
0130
0131
0132 if (fn == 0) {
0133 u32 vid_regs = (hdr->vendorid & GENMASK(15, 0)) |
0134 (hdr->subsys_vendor_id & GENMASK(31, 16)) << 16;
0135
0136 rockchip_pcie_write(rockchip, vid_regs,
0137 PCIE_CORE_CONFIG_VENDOR);
0138 }
0139
0140 rockchip_pcie_write(rockchip, hdr->deviceid << 16,
0141 ROCKCHIP_PCIE_EP_FUNC_BASE(fn) + PCI_VENDOR_ID);
0142
0143 rockchip_pcie_write(rockchip,
0144 hdr->revid |
0145 hdr->progif_code << 8 |
0146 hdr->subclass_code << 16 |
0147 hdr->baseclass_code << 24,
0148 ROCKCHIP_PCIE_EP_FUNC_BASE(fn) + PCI_REVISION_ID);
0149 rockchip_pcie_write(rockchip, hdr->cache_line_size,
0150 ROCKCHIP_PCIE_EP_FUNC_BASE(fn) +
0151 PCI_CACHE_LINE_SIZE);
0152 rockchip_pcie_write(rockchip, hdr->subsys_id << 16,
0153 ROCKCHIP_PCIE_EP_FUNC_BASE(fn) +
0154 PCI_SUBSYSTEM_VENDOR_ID);
0155 rockchip_pcie_write(rockchip, hdr->interrupt_pin << 8,
0156 ROCKCHIP_PCIE_EP_FUNC_BASE(fn) +
0157 PCI_INTERRUPT_LINE);
0158
0159 return 0;
0160 }
0161
0162 static int rockchip_pcie_ep_set_bar(struct pci_epc *epc, u8 fn, u8 vfn,
0163 struct pci_epf_bar *epf_bar)
0164 {
0165 struct rockchip_pcie_ep *ep = epc_get_drvdata(epc);
0166 struct rockchip_pcie *rockchip = &ep->rockchip;
0167 dma_addr_t bar_phys = epf_bar->phys_addr;
0168 enum pci_barno bar = epf_bar->barno;
0169 int flags = epf_bar->flags;
0170 u32 addr0, addr1, reg, cfg, b, aperture, ctrl;
0171 u64 sz;
0172
0173
0174 sz = max_t(size_t, epf_bar->size, MIN_EP_APERTURE);
0175
0176
0177
0178
0179
0180 sz = 1ULL << fls64(sz - 1);
0181 aperture = ilog2(sz) - 7;
0182
0183 if ((flags & PCI_BASE_ADDRESS_SPACE) == PCI_BASE_ADDRESS_SPACE_IO) {
0184 ctrl = ROCKCHIP_PCIE_CORE_BAR_CFG_CTRL_IO_32BITS;
0185 } else {
0186 bool is_prefetch = !!(flags & PCI_BASE_ADDRESS_MEM_PREFETCH);
0187 bool is_64bits = sz > SZ_2G;
0188
0189 if (is_64bits && (bar & 1))
0190 return -EINVAL;
0191
0192 if (is_64bits && is_prefetch)
0193 ctrl =
0194 ROCKCHIP_PCIE_CORE_BAR_CFG_CTRL_PREFETCH_MEM_64BITS;
0195 else if (is_prefetch)
0196 ctrl =
0197 ROCKCHIP_PCIE_CORE_BAR_CFG_CTRL_PREFETCH_MEM_32BITS;
0198 else if (is_64bits)
0199 ctrl = ROCKCHIP_PCIE_CORE_BAR_CFG_CTRL_MEM_64BITS;
0200 else
0201 ctrl = ROCKCHIP_PCIE_CORE_BAR_CFG_CTRL_MEM_32BITS;
0202 }
0203
0204 if (bar < BAR_4) {
0205 reg = ROCKCHIP_PCIE_CORE_EP_FUNC_BAR_CFG0(fn);
0206 b = bar;
0207 } else {
0208 reg = ROCKCHIP_PCIE_CORE_EP_FUNC_BAR_CFG1(fn);
0209 b = bar - BAR_4;
0210 }
0211
0212 addr0 = lower_32_bits(bar_phys);
0213 addr1 = upper_32_bits(bar_phys);
0214
0215 cfg = rockchip_pcie_read(rockchip, reg);
0216 cfg &= ~(ROCKCHIP_PCIE_CORE_EP_FUNC_BAR_CFG_BAR_APERTURE_MASK(b) |
0217 ROCKCHIP_PCIE_CORE_EP_FUNC_BAR_CFG_BAR_CTRL_MASK(b));
0218 cfg |= (ROCKCHIP_PCIE_CORE_EP_FUNC_BAR_CFG_BAR_APERTURE(b, aperture) |
0219 ROCKCHIP_PCIE_CORE_EP_FUNC_BAR_CFG_BAR_CTRL(b, ctrl));
0220
0221 rockchip_pcie_write(rockchip, cfg, reg);
0222 rockchip_pcie_write(rockchip, addr0,
0223 ROCKCHIP_PCIE_AT_IB_EP_FUNC_BAR_ADDR0(fn, bar));
0224 rockchip_pcie_write(rockchip, addr1,
0225 ROCKCHIP_PCIE_AT_IB_EP_FUNC_BAR_ADDR1(fn, bar));
0226
0227 return 0;
0228 }
0229
0230 static void rockchip_pcie_ep_clear_bar(struct pci_epc *epc, u8 fn, u8 vfn,
0231 struct pci_epf_bar *epf_bar)
0232 {
0233 struct rockchip_pcie_ep *ep = epc_get_drvdata(epc);
0234 struct rockchip_pcie *rockchip = &ep->rockchip;
0235 u32 reg, cfg, b, ctrl;
0236 enum pci_barno bar = epf_bar->barno;
0237
0238 if (bar < BAR_4) {
0239 reg = ROCKCHIP_PCIE_CORE_EP_FUNC_BAR_CFG0(fn);
0240 b = bar;
0241 } else {
0242 reg = ROCKCHIP_PCIE_CORE_EP_FUNC_BAR_CFG1(fn);
0243 b = bar - BAR_4;
0244 }
0245
0246 ctrl = ROCKCHIP_PCIE_CORE_BAR_CFG_CTRL_DISABLED;
0247 cfg = rockchip_pcie_read(rockchip, reg);
0248 cfg &= ~(ROCKCHIP_PCIE_CORE_EP_FUNC_BAR_CFG_BAR_APERTURE_MASK(b) |
0249 ROCKCHIP_PCIE_CORE_EP_FUNC_BAR_CFG_BAR_CTRL_MASK(b));
0250 cfg |= ROCKCHIP_PCIE_CORE_EP_FUNC_BAR_CFG_BAR_CTRL(b, ctrl);
0251
0252 rockchip_pcie_write(rockchip, cfg, reg);
0253 rockchip_pcie_write(rockchip, 0x0,
0254 ROCKCHIP_PCIE_AT_IB_EP_FUNC_BAR_ADDR0(fn, bar));
0255 rockchip_pcie_write(rockchip, 0x0,
0256 ROCKCHIP_PCIE_AT_IB_EP_FUNC_BAR_ADDR1(fn, bar));
0257 }
0258
0259 static int rockchip_pcie_ep_map_addr(struct pci_epc *epc, u8 fn, u8 vfn,
0260 phys_addr_t addr, u64 pci_addr,
0261 size_t size)
0262 {
0263 struct rockchip_pcie_ep *ep = epc_get_drvdata(epc);
0264 struct rockchip_pcie *pcie = &ep->rockchip;
0265 u32 r;
0266
0267 r = find_first_zero_bit(&ep->ob_region_map, BITS_PER_LONG);
0268
0269
0270
0271
0272 if (r >= ep->max_regions - 1) {
0273 dev_err(&epc->dev, "no free outbound region\n");
0274 return -EINVAL;
0275 }
0276
0277 rockchip_pcie_prog_ep_ob_atu(pcie, fn, r, AXI_WRAPPER_MEM_WRITE, addr,
0278 pci_addr, size);
0279
0280 set_bit(r, &ep->ob_region_map);
0281 ep->ob_addr[r] = addr;
0282
0283 return 0;
0284 }
0285
0286 static void rockchip_pcie_ep_unmap_addr(struct pci_epc *epc, u8 fn, u8 vfn,
0287 phys_addr_t addr)
0288 {
0289 struct rockchip_pcie_ep *ep = epc_get_drvdata(epc);
0290 struct rockchip_pcie *rockchip = &ep->rockchip;
0291 u32 r;
0292
0293 for (r = 0; r < ep->max_regions - 1; r++)
0294 if (ep->ob_addr[r] == addr)
0295 break;
0296
0297
0298
0299
0300
0301 if (r == ep->max_regions - 1)
0302 return;
0303
0304 rockchip_pcie_clear_ep_ob_atu(rockchip, r);
0305
0306 ep->ob_addr[r] = 0;
0307 clear_bit(r, &ep->ob_region_map);
0308 }
0309
0310 static int rockchip_pcie_ep_set_msi(struct pci_epc *epc, u8 fn, u8 vfn,
0311 u8 multi_msg_cap)
0312 {
0313 struct rockchip_pcie_ep *ep = epc_get_drvdata(epc);
0314 struct rockchip_pcie *rockchip = &ep->rockchip;
0315 u16 flags;
0316
0317 flags = rockchip_pcie_read(rockchip,
0318 ROCKCHIP_PCIE_EP_FUNC_BASE(fn) +
0319 ROCKCHIP_PCIE_EP_MSI_CTRL_REG);
0320 flags &= ~ROCKCHIP_PCIE_EP_MSI_CTRL_MMC_MASK;
0321 flags |=
0322 ((multi_msg_cap << 1) << ROCKCHIP_PCIE_EP_MSI_CTRL_MMC_OFFSET) |
0323 PCI_MSI_FLAGS_64BIT;
0324 flags &= ~ROCKCHIP_PCIE_EP_MSI_CTRL_MASK_MSI_CAP;
0325 rockchip_pcie_write(rockchip, flags,
0326 ROCKCHIP_PCIE_EP_FUNC_BASE(fn) +
0327 ROCKCHIP_PCIE_EP_MSI_CTRL_REG);
0328 return 0;
0329 }
0330
0331 static int rockchip_pcie_ep_get_msi(struct pci_epc *epc, u8 fn, u8 vfn)
0332 {
0333 struct rockchip_pcie_ep *ep = epc_get_drvdata(epc);
0334 struct rockchip_pcie *rockchip = &ep->rockchip;
0335 u16 flags;
0336
0337 flags = rockchip_pcie_read(rockchip,
0338 ROCKCHIP_PCIE_EP_FUNC_BASE(fn) +
0339 ROCKCHIP_PCIE_EP_MSI_CTRL_REG);
0340 if (!(flags & ROCKCHIP_PCIE_EP_MSI_CTRL_ME))
0341 return -EINVAL;
0342
0343 return ((flags & ROCKCHIP_PCIE_EP_MSI_CTRL_MME_MASK) >>
0344 ROCKCHIP_PCIE_EP_MSI_CTRL_MME_OFFSET);
0345 }
0346
0347 static void rockchip_pcie_ep_assert_intx(struct rockchip_pcie_ep *ep, u8 fn,
0348 u8 intx, bool is_asserted)
0349 {
0350 struct rockchip_pcie *rockchip = &ep->rockchip;
0351 u32 r = ep->max_regions - 1;
0352 u32 offset;
0353 u32 status;
0354 u8 msg_code;
0355
0356 if (unlikely(ep->irq_pci_addr != ROCKCHIP_PCIE_EP_PCI_LEGACY_IRQ_ADDR ||
0357 ep->irq_pci_fn != fn)) {
0358 rockchip_pcie_prog_ep_ob_atu(rockchip, fn, r,
0359 AXI_WRAPPER_NOR_MSG,
0360 ep->irq_phys_addr, 0, 0);
0361 ep->irq_pci_addr = ROCKCHIP_PCIE_EP_PCI_LEGACY_IRQ_ADDR;
0362 ep->irq_pci_fn = fn;
0363 }
0364
0365 intx &= 3;
0366 if (is_asserted) {
0367 ep->irq_pending |= BIT(intx);
0368 msg_code = ROCKCHIP_PCIE_MSG_CODE_ASSERT_INTA + intx;
0369 } else {
0370 ep->irq_pending &= ~BIT(intx);
0371 msg_code = ROCKCHIP_PCIE_MSG_CODE_DEASSERT_INTA + intx;
0372 }
0373
0374 status = rockchip_pcie_read(rockchip,
0375 ROCKCHIP_PCIE_EP_FUNC_BASE(fn) +
0376 ROCKCHIP_PCIE_EP_CMD_STATUS);
0377 status &= ROCKCHIP_PCIE_EP_CMD_STATUS_IS;
0378
0379 if ((status != 0) ^ (ep->irq_pending != 0)) {
0380 status ^= ROCKCHIP_PCIE_EP_CMD_STATUS_IS;
0381 rockchip_pcie_write(rockchip, status,
0382 ROCKCHIP_PCIE_EP_FUNC_BASE(fn) +
0383 ROCKCHIP_PCIE_EP_CMD_STATUS);
0384 }
0385
0386 offset =
0387 ROCKCHIP_PCIE_MSG_ROUTING(ROCKCHIP_PCIE_MSG_ROUTING_LOCAL_INTX) |
0388 ROCKCHIP_PCIE_MSG_CODE(msg_code) | ROCKCHIP_PCIE_MSG_NO_DATA;
0389 writel(0, ep->irq_cpu_addr + offset);
0390 }
0391
0392 static int rockchip_pcie_ep_send_legacy_irq(struct rockchip_pcie_ep *ep, u8 fn,
0393 u8 intx)
0394 {
0395 u16 cmd;
0396
0397 cmd = rockchip_pcie_read(&ep->rockchip,
0398 ROCKCHIP_PCIE_EP_FUNC_BASE(fn) +
0399 ROCKCHIP_PCIE_EP_CMD_STATUS);
0400
0401 if (cmd & PCI_COMMAND_INTX_DISABLE)
0402 return -EINVAL;
0403
0404
0405
0406
0407
0408
0409 rockchip_pcie_ep_assert_intx(ep, fn, intx, true);
0410 mdelay(1);
0411 rockchip_pcie_ep_assert_intx(ep, fn, intx, false);
0412 return 0;
0413 }
0414
0415 static int rockchip_pcie_ep_send_msi_irq(struct rockchip_pcie_ep *ep, u8 fn,
0416 u8 interrupt_num)
0417 {
0418 struct rockchip_pcie *rockchip = &ep->rockchip;
0419 u16 flags, mme, data, data_mask;
0420 u8 msi_count;
0421 u64 pci_addr, pci_addr_mask = 0xff;
0422
0423
0424 flags = rockchip_pcie_read(&ep->rockchip,
0425 ROCKCHIP_PCIE_EP_FUNC_BASE(fn) +
0426 ROCKCHIP_PCIE_EP_MSI_CTRL_REG);
0427 if (!(flags & ROCKCHIP_PCIE_EP_MSI_CTRL_ME))
0428 return -EINVAL;
0429
0430
0431 mme = ((flags & ROCKCHIP_PCIE_EP_MSI_CTRL_MME_MASK) >>
0432 ROCKCHIP_PCIE_EP_MSI_CTRL_MME_OFFSET);
0433 msi_count = 1 << mme;
0434 if (!interrupt_num || interrupt_num > msi_count)
0435 return -EINVAL;
0436
0437
0438 data_mask = msi_count - 1;
0439 data = rockchip_pcie_read(rockchip,
0440 ROCKCHIP_PCIE_EP_FUNC_BASE(fn) +
0441 ROCKCHIP_PCIE_EP_MSI_CTRL_REG +
0442 PCI_MSI_DATA_64);
0443 data = (data & ~data_mask) | ((interrupt_num - 1) & data_mask);
0444
0445
0446 pci_addr = rockchip_pcie_read(rockchip,
0447 ROCKCHIP_PCIE_EP_FUNC_BASE(fn) +
0448 ROCKCHIP_PCIE_EP_MSI_CTRL_REG +
0449 PCI_MSI_ADDRESS_HI);
0450 pci_addr <<= 32;
0451 pci_addr |= rockchip_pcie_read(rockchip,
0452 ROCKCHIP_PCIE_EP_FUNC_BASE(fn) +
0453 ROCKCHIP_PCIE_EP_MSI_CTRL_REG +
0454 PCI_MSI_ADDRESS_LO);
0455 pci_addr &= GENMASK_ULL(63, 2);
0456
0457
0458 if (unlikely(ep->irq_pci_addr != (pci_addr & ~pci_addr_mask) ||
0459 ep->irq_pci_fn != fn)) {
0460 rockchip_pcie_prog_ep_ob_atu(rockchip, fn, ep->max_regions - 1,
0461 AXI_WRAPPER_MEM_WRITE,
0462 ep->irq_phys_addr,
0463 pci_addr & ~pci_addr_mask,
0464 pci_addr_mask + 1);
0465 ep->irq_pci_addr = (pci_addr & ~pci_addr_mask);
0466 ep->irq_pci_fn = fn;
0467 }
0468
0469 writew(data, ep->irq_cpu_addr + (pci_addr & pci_addr_mask));
0470 return 0;
0471 }
0472
0473 static int rockchip_pcie_ep_raise_irq(struct pci_epc *epc, u8 fn, u8 vfn,
0474 enum pci_epc_irq_type type,
0475 u16 interrupt_num)
0476 {
0477 struct rockchip_pcie_ep *ep = epc_get_drvdata(epc);
0478
0479 switch (type) {
0480 case PCI_EPC_IRQ_LEGACY:
0481 return rockchip_pcie_ep_send_legacy_irq(ep, fn, 0);
0482 case PCI_EPC_IRQ_MSI:
0483 return rockchip_pcie_ep_send_msi_irq(ep, fn, interrupt_num);
0484 default:
0485 return -EINVAL;
0486 }
0487 }
0488
0489 static int rockchip_pcie_ep_start(struct pci_epc *epc)
0490 {
0491 struct rockchip_pcie_ep *ep = epc_get_drvdata(epc);
0492 struct rockchip_pcie *rockchip = &ep->rockchip;
0493 struct pci_epf *epf;
0494 u32 cfg;
0495
0496 cfg = BIT(0);
0497 list_for_each_entry(epf, &epc->pci_epf, list)
0498 cfg |= BIT(epf->func_no);
0499
0500 rockchip_pcie_write(rockchip, cfg, PCIE_CORE_PHY_FUNC_CFG);
0501
0502 return 0;
0503 }
0504
0505 static const struct pci_epc_features rockchip_pcie_epc_features = {
0506 .linkup_notifier = false,
0507 .msi_capable = true,
0508 .msix_capable = false,
0509 };
0510
0511 static const struct pci_epc_features*
0512 rockchip_pcie_ep_get_features(struct pci_epc *epc, u8 func_no, u8 vfunc_no)
0513 {
0514 return &rockchip_pcie_epc_features;
0515 }
0516
0517 static const struct pci_epc_ops rockchip_pcie_epc_ops = {
0518 .write_header = rockchip_pcie_ep_write_header,
0519 .set_bar = rockchip_pcie_ep_set_bar,
0520 .clear_bar = rockchip_pcie_ep_clear_bar,
0521 .map_addr = rockchip_pcie_ep_map_addr,
0522 .unmap_addr = rockchip_pcie_ep_unmap_addr,
0523 .set_msi = rockchip_pcie_ep_set_msi,
0524 .get_msi = rockchip_pcie_ep_get_msi,
0525 .raise_irq = rockchip_pcie_ep_raise_irq,
0526 .start = rockchip_pcie_ep_start,
0527 .get_features = rockchip_pcie_ep_get_features,
0528 };
0529
0530 static int rockchip_pcie_parse_ep_dt(struct rockchip_pcie *rockchip,
0531 struct rockchip_pcie_ep *ep)
0532 {
0533 struct device *dev = rockchip->dev;
0534 int err;
0535
0536 err = rockchip_pcie_parse_dt(rockchip);
0537 if (err)
0538 return err;
0539
0540 err = rockchip_pcie_get_phys(rockchip);
0541 if (err)
0542 return err;
0543
0544 err = of_property_read_u32(dev->of_node,
0545 "rockchip,max-outbound-regions",
0546 &ep->max_regions);
0547 if (err < 0 || ep->max_regions > MAX_REGION_LIMIT)
0548 ep->max_regions = MAX_REGION_LIMIT;
0549
0550 err = of_property_read_u8(dev->of_node, "max-functions",
0551 &ep->epc->max_functions);
0552 if (err < 0)
0553 ep->epc->max_functions = 1;
0554
0555 return 0;
0556 }
0557
0558 static const struct of_device_id rockchip_pcie_ep_of_match[] = {
0559 { .compatible = "rockchip,rk3399-pcie-ep"},
0560 {},
0561 };
0562
0563 static int rockchip_pcie_ep_probe(struct platform_device *pdev)
0564 {
0565 struct device *dev = &pdev->dev;
0566 struct rockchip_pcie_ep *ep;
0567 struct rockchip_pcie *rockchip;
0568 struct pci_epc *epc;
0569 size_t max_regions;
0570 int err;
0571
0572 ep = devm_kzalloc(dev, sizeof(*ep), GFP_KERNEL);
0573 if (!ep)
0574 return -ENOMEM;
0575
0576 rockchip = &ep->rockchip;
0577 rockchip->is_rc = false;
0578 rockchip->dev = dev;
0579
0580 epc = devm_pci_epc_create(dev, &rockchip_pcie_epc_ops);
0581 if (IS_ERR(epc)) {
0582 dev_err(dev, "failed to create epc device\n");
0583 return PTR_ERR(epc);
0584 }
0585
0586 ep->epc = epc;
0587 epc_set_drvdata(epc, ep);
0588
0589 err = rockchip_pcie_parse_ep_dt(rockchip, ep);
0590 if (err)
0591 return err;
0592
0593 err = rockchip_pcie_enable_clocks(rockchip);
0594 if (err)
0595 return err;
0596
0597 err = rockchip_pcie_init_port(rockchip);
0598 if (err)
0599 goto err_disable_clocks;
0600
0601
0602 rockchip_pcie_write(rockchip, PCIE_CLIENT_LINK_TRAIN_ENABLE,
0603 PCIE_CLIENT_CONFIG);
0604
0605 max_regions = ep->max_regions;
0606 ep->ob_addr = devm_kcalloc(dev, max_regions, sizeof(*ep->ob_addr),
0607 GFP_KERNEL);
0608
0609 if (!ep->ob_addr) {
0610 err = -ENOMEM;
0611 goto err_uninit_port;
0612 }
0613
0614
0615 rockchip_pcie_write(rockchip, BIT(0), PCIE_CORE_PHY_FUNC_CFG);
0616
0617 err = pci_epc_mem_init(epc, rockchip->mem_res->start,
0618 resource_size(rockchip->mem_res), PAGE_SIZE);
0619 if (err < 0) {
0620 dev_err(dev, "failed to initialize the memory space\n");
0621 goto err_uninit_port;
0622 }
0623
0624 ep->irq_cpu_addr = pci_epc_mem_alloc_addr(epc, &ep->irq_phys_addr,
0625 SZ_128K);
0626 if (!ep->irq_cpu_addr) {
0627 dev_err(dev, "failed to reserve memory space for MSI\n");
0628 err = -ENOMEM;
0629 goto err_epc_mem_exit;
0630 }
0631
0632 ep->irq_pci_addr = ROCKCHIP_PCIE_EP_DUMMY_IRQ_ADDR;
0633
0634 return 0;
0635 err_epc_mem_exit:
0636 pci_epc_mem_exit(epc);
0637 err_uninit_port:
0638 rockchip_pcie_deinit_phys(rockchip);
0639 err_disable_clocks:
0640 rockchip_pcie_disable_clocks(rockchip);
0641 return err;
0642 }
0643
0644 static struct platform_driver rockchip_pcie_ep_driver = {
0645 .driver = {
0646 .name = "rockchip-pcie-ep",
0647 .of_match_table = rockchip_pcie_ep_of_match,
0648 },
0649 .probe = rockchip_pcie_ep_probe,
0650 };
0651
0652 builtin_platform_driver(rockchip_pcie_ep_driver);