0001
0002
0003
0004
0005
0006
0007
0008 #include <linux/kernel.h>
0009 #include <linux/init.h>
0010 #include <linux/pci.h>
0011 #include <linux/interrupt.h>
0012 #include <linux/time.h>
0013 #include <linux/delay.h>
0014 #include <linux/platform_device.h>
0015 #include <linux/swiotlb.h>
0016
0017 #include <asm/time.h>
0018
0019 #include <asm/octeon/octeon.h>
0020 #include <asm/octeon/cvmx-npi-defs.h>
0021 #include <asm/octeon/cvmx-pci-defs.h>
0022 #include <asm/octeon/pci-octeon.h>
0023
0024 #define USE_OCTEON_INTERNAL_ARBITER
0025
0026
0027
0028
0029
0030
0031 #define OCTEON_PCI_IOSPACE_BASE 0x80011a0400000000ull
0032 #define OCTEON_PCI_IOSPACE_SIZE (1ull<<32)
0033
0034
0035 #define OCTEON_PCI_MEMSPACE_OFFSET (0x00011b0000000000ull)
0036
0037 u64 octeon_bar1_pci_phys;
0038
0039
0040
0041
0042 union octeon_pci_address {
0043 uint64_t u64;
0044 struct {
0045 uint64_t upper:2;
0046 uint64_t reserved:13;
0047 uint64_t io:1;
0048 uint64_t did:5;
0049 uint64_t subdid:3;
0050 uint64_t reserved2:4;
0051 uint64_t endian_swap:2;
0052 uint64_t reserved3:10;
0053 uint64_t bus:8;
0054 uint64_t dev:5;
0055 uint64_t func:3;
0056 uint64_t reg:8;
0057 } s;
0058 };
0059
0060 int (*octeon_pcibios_map_irq)(const struct pci_dev *dev, u8 slot, u8 pin);
0061 enum octeon_dma_bar_type octeon_dma_bar_type = OCTEON_DMA_BAR_TYPE_INVALID;
0062
0063
0064
0065
0066
0067
0068
0069
0070
0071
0072
0073
0074 int pcibios_map_irq(const struct pci_dev *dev, u8 slot, u8 pin)
0075 {
0076 if (octeon_pcibios_map_irq)
0077 return octeon_pcibios_map_irq(dev, slot, pin);
0078 else
0079 panic("octeon_pcibios_map_irq not set.");
0080 }
0081
0082
0083
0084
0085
0086 int pcibios_plat_dev_init(struct pci_dev *dev)
0087 {
0088 uint16_t config;
0089 uint32_t dconfig;
0090 int pos;
0091
0092
0093
0094
0095
0096
0097
0098 pci_write_config_byte(dev, PCI_CACHE_LINE_SIZE, 64 / 4);
0099
0100 pci_write_config_byte(dev, PCI_LATENCY_TIMER, 64);
0101
0102
0103
0104 pci_read_config_word(dev, PCI_COMMAND, &config);
0105 config |= PCI_COMMAND_PARITY | PCI_COMMAND_SERR;
0106 pci_write_config_word(dev, PCI_COMMAND, config);
0107
0108 if (dev->subordinate) {
0109
0110 pci_write_config_byte(dev, PCI_SEC_LATENCY_TIMER, 64);
0111
0112 pci_read_config_word(dev, PCI_BRIDGE_CONTROL, &config);
0113 config |= PCI_BRIDGE_CTL_PARITY | PCI_BRIDGE_CTL_SERR;
0114 pci_write_config_word(dev, PCI_BRIDGE_CONTROL, config);
0115 }
0116
0117
0118 config = PCI_EXP_DEVCTL_CERE;
0119 config |= PCI_EXP_DEVCTL_NFERE;
0120 config |= PCI_EXP_DEVCTL_FERE;
0121 config |= PCI_EXP_DEVCTL_URRE;
0122 pcie_capability_set_word(dev, PCI_EXP_DEVCTL, config);
0123
0124
0125 pos = pci_find_ext_capability(dev, PCI_EXT_CAP_ID_ERR);
0126 if (pos) {
0127
0128 pci_read_config_dword(dev, pos + PCI_ERR_UNCOR_STATUS,
0129 &dconfig);
0130 pci_write_config_dword(dev, pos + PCI_ERR_UNCOR_STATUS,
0131 dconfig);
0132
0133
0134 pci_write_config_dword(dev, pos + PCI_ERR_UNCOR_MASK, 0);
0135
0136
0137
0138
0139
0140
0141
0142 pci_read_config_dword(dev, pos + PCI_ERR_COR_STATUS, &dconfig);
0143 pci_write_config_dword(dev, pos + PCI_ERR_COR_STATUS, dconfig);
0144
0145
0146 pci_write_config_dword(dev, pos + PCI_ERR_COR_MASK, 0);
0147
0148 pci_read_config_dword(dev, pos + PCI_ERR_CAP, &dconfig);
0149
0150 if (config & PCI_ERR_CAP_ECRC_GENC)
0151 config |= PCI_ERR_CAP_ECRC_GENE;
0152
0153 if (config & PCI_ERR_CAP_ECRC_CHKC)
0154 config |= PCI_ERR_CAP_ECRC_CHKE;
0155 pci_write_config_dword(dev, pos + PCI_ERR_CAP, dconfig);
0156
0157
0158 pci_write_config_dword(dev, pos + PCI_ERR_ROOT_COMMAND,
0159 PCI_ERR_ROOT_CMD_COR_EN |
0160 PCI_ERR_ROOT_CMD_NONFATAL_EN |
0161 PCI_ERR_ROOT_CMD_FATAL_EN);
0162
0163 pci_read_config_dword(dev, pos + PCI_ERR_ROOT_STATUS, &dconfig);
0164 pci_write_config_dword(dev, pos + PCI_ERR_ROOT_STATUS, dconfig);
0165 }
0166
0167 return 0;
0168 }
0169
0170
0171
0172
0173
0174
0175
0176
0177
0178
0179 const char *octeon_get_pci_interrupts(void)
0180 {
0181
0182
0183
0184
0185
0186
0187
0188
0189
0190
0191
0192
0193
0194
0195
0196
0197
0198
0199
0200
0201
0202 if (of_machine_is_compatible("dlink,dsr-500n"))
0203 return "CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC";
0204 switch (octeon_bootinfo->board_type) {
0205 case CVMX_BOARD_TYPE_NAO38:
0206
0207 return "AAAAADABAAAAAAAAAAAAAAAAAAAAAAAA";
0208 case CVMX_BOARD_TYPE_EBH3100:
0209 case CVMX_BOARD_TYPE_CN3010_EVB_HS5:
0210 case CVMX_BOARD_TYPE_CN3005_EVB_HS5:
0211 return "AAABAAAAAAAAAAAAAAAAAAAAAAAAAAAA";
0212 case CVMX_BOARD_TYPE_BBGW_REF:
0213 return "AABCD";
0214 case CVMX_BOARD_TYPE_CUST_DSR1000N:
0215 return "CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC";
0216 case CVMX_BOARD_TYPE_THUNDER:
0217 case CVMX_BOARD_TYPE_EBH3000:
0218 default:
0219 return "";
0220 }
0221 }
0222
0223
0224
0225
0226
0227
0228
0229
0230
0231
0232
0233
0234 int __init octeon_pci_pcibios_map_irq(const struct pci_dev *dev,
0235 u8 slot, u8 pin)
0236 {
0237 int irq_num;
0238 const char *interrupts;
0239 int dev_num;
0240
0241
0242 interrupts = octeon_get_pci_interrupts();
0243
0244 dev_num = dev->devfn >> 3;
0245 if (dev_num < strlen(interrupts))
0246 irq_num = ((interrupts[dev_num] - 'A' + pin - 1) & 3) +
0247 OCTEON_IRQ_PCI_INT0;
0248 else
0249 irq_num = ((slot + pin - 3) & 3) + OCTEON_IRQ_PCI_INT0;
0250 return irq_num;
0251 }
0252
0253
0254
0255
0256
0257 static int octeon_read_config(struct pci_bus *bus, unsigned int devfn,
0258 int reg, int size, u32 *val)
0259 {
0260 union octeon_pci_address pci_addr;
0261
0262 pci_addr.u64 = 0;
0263 pci_addr.s.upper = 2;
0264 pci_addr.s.io = 1;
0265 pci_addr.s.did = 3;
0266 pci_addr.s.subdid = 1;
0267 pci_addr.s.endian_swap = 1;
0268 pci_addr.s.bus = bus->number;
0269 pci_addr.s.dev = devfn >> 3;
0270 pci_addr.s.func = devfn & 0x7;
0271 pci_addr.s.reg = reg;
0272
0273 switch (size) {
0274 case 4:
0275 *val = le32_to_cpu(cvmx_read64_uint32(pci_addr.u64));
0276 return PCIBIOS_SUCCESSFUL;
0277 case 2:
0278 *val = le16_to_cpu(cvmx_read64_uint16(pci_addr.u64));
0279 return PCIBIOS_SUCCESSFUL;
0280 case 1:
0281 *val = cvmx_read64_uint8(pci_addr.u64);
0282 return PCIBIOS_SUCCESSFUL;
0283 }
0284 return PCIBIOS_FUNC_NOT_SUPPORTED;
0285 }
0286
0287
0288
0289
0290
0291 static int octeon_write_config(struct pci_bus *bus, unsigned int devfn,
0292 int reg, int size, u32 val)
0293 {
0294 union octeon_pci_address pci_addr;
0295
0296 pci_addr.u64 = 0;
0297 pci_addr.s.upper = 2;
0298 pci_addr.s.io = 1;
0299 pci_addr.s.did = 3;
0300 pci_addr.s.subdid = 1;
0301 pci_addr.s.endian_swap = 1;
0302 pci_addr.s.bus = bus->number;
0303 pci_addr.s.dev = devfn >> 3;
0304 pci_addr.s.func = devfn & 0x7;
0305 pci_addr.s.reg = reg;
0306
0307 switch (size) {
0308 case 4:
0309 cvmx_write64_uint32(pci_addr.u64, cpu_to_le32(val));
0310 return PCIBIOS_SUCCESSFUL;
0311 case 2:
0312 cvmx_write64_uint16(pci_addr.u64, cpu_to_le16(val));
0313 return PCIBIOS_SUCCESSFUL;
0314 case 1:
0315 cvmx_write64_uint8(pci_addr.u64, val);
0316 return PCIBIOS_SUCCESSFUL;
0317 }
0318 return PCIBIOS_FUNC_NOT_SUPPORTED;
0319 }
0320
0321
0322 static struct pci_ops octeon_pci_ops = {
0323 .read = octeon_read_config,
0324 .write = octeon_write_config,
0325 };
0326
0327 static struct resource octeon_pci_mem_resource = {
0328 .start = 0,
0329 .end = 0,
0330 .name = "Octeon PCI MEM",
0331 .flags = IORESOURCE_MEM,
0332 };
0333
0334
0335
0336
0337
0338 static struct resource octeon_pci_io_resource = {
0339 .start = 0x4000,
0340 .end = OCTEON_PCI_IOSPACE_SIZE - 1,
0341 .name = "Octeon PCI IO",
0342 .flags = IORESOURCE_IO,
0343 };
0344
0345 static struct pci_controller octeon_pci_controller = {
0346 .pci_ops = &octeon_pci_ops,
0347 .mem_resource = &octeon_pci_mem_resource,
0348 .mem_offset = OCTEON_PCI_MEMSPACE_OFFSET,
0349 .io_resource = &octeon_pci_io_resource,
0350 .io_offset = 0,
0351 .io_map_base = OCTEON_PCI_IOSPACE_BASE,
0352 };
0353
0354
0355
0356
0357
0358 static void octeon_pci_initialize(void)
0359 {
0360 union cvmx_pci_cfg01 cfg01;
0361 union cvmx_npi_ctl_status ctl_status;
0362 union cvmx_pci_ctl_status_2 ctl_status_2;
0363 union cvmx_pci_cfg19 cfg19;
0364 union cvmx_pci_cfg16 cfg16;
0365 union cvmx_pci_cfg22 cfg22;
0366 union cvmx_pci_cfg56 cfg56;
0367
0368
0369 cvmx_write_csr(CVMX_CIU_SOFT_PRST, 0x1);
0370 cvmx_read_csr(CVMX_CIU_SOFT_PRST);
0371
0372 udelay(2000);
0373
0374 ctl_status.u64 = 0;
0375 ctl_status.s.max_word = 1;
0376 ctl_status.s.timer = 1;
0377 cvmx_write_csr(CVMX_NPI_CTL_STATUS, ctl_status.u64);
0378
0379
0380
0381 cvmx_write_csr(CVMX_CIU_SOFT_PRST, 0x4);
0382 cvmx_read_csr(CVMX_CIU_SOFT_PRST);
0383
0384 udelay(2000);
0385
0386 ctl_status_2.u32 = 0;
0387 ctl_status_2.s.tsr_hwm = 1;
0388
0389 ctl_status_2.s.bar2pres = 1;
0390 ctl_status_2.s.bar2_enb = 1;
0391 ctl_status_2.s.bar2_cax = 1;
0392 ctl_status_2.s.bar2_esx = 1;
0393 ctl_status_2.s.pmo_amod = 1;
0394 if (octeon_dma_bar_type == OCTEON_DMA_BAR_TYPE_BIG) {
0395
0396 ctl_status_2.s.bb1_hole = OCTEON_PCI_BAR1_HOLE_BITS;
0397 ctl_status_2.s.bb1_siz = 1;
0398 ctl_status_2.s.bb_ca = 1;
0399 ctl_status_2.s.bb_es = 1;
0400 ctl_status_2.s.bb1 = 1;
0401 ctl_status_2.s.bb0 = 1;
0402 }
0403
0404 octeon_npi_write32(CVMX_NPI_PCI_CTL_STATUS_2, ctl_status_2.u32);
0405 udelay(2000);
0406
0407 ctl_status_2.u32 = octeon_npi_read32(CVMX_NPI_PCI_CTL_STATUS_2);
0408 pr_notice("PCI Status: %s %s-bit\n",
0409 ctl_status_2.s.ap_pcix ? "PCI-X" : "PCI",
0410 ctl_status_2.s.ap_64ad ? "64" : "32");
0411
0412 if (OCTEON_IS_MODEL(OCTEON_CN58XX) || OCTEON_IS_MODEL(OCTEON_CN50XX)) {
0413 union cvmx_pci_cnt_reg cnt_reg_start;
0414 union cvmx_pci_cnt_reg cnt_reg_end;
0415 unsigned long cycles, pci_clock;
0416
0417 cnt_reg_start.u64 = cvmx_read_csr(CVMX_NPI_PCI_CNT_REG);
0418 cycles = read_c0_cvmcount();
0419 udelay(1000);
0420 cnt_reg_end.u64 = cvmx_read_csr(CVMX_NPI_PCI_CNT_REG);
0421 cycles = read_c0_cvmcount() - cycles;
0422 pci_clock = (cnt_reg_end.s.pcicnt - cnt_reg_start.s.pcicnt) /
0423 (cycles / (mips_hpt_frequency / 1000000));
0424 pr_notice("PCI Clock: %lu MHz\n", pci_clock);
0425 }
0426
0427
0428
0429
0430
0431
0432
0433
0434
0435 if (ctl_status_2.s.ap_pcix) {
0436 cfg19.u32 = 0;
0437
0438
0439
0440
0441
0442
0443
0444
0445
0446
0447
0448
0449 cfg19.s.tdomc = 4;
0450
0451
0452
0453
0454
0455
0456
0457
0458
0459
0460
0461 cfg19.s.mdrrmc = 2;
0462
0463
0464
0465
0466
0467
0468
0469
0470
0471
0472
0473 cfg19.s.mrbcm = 1;
0474 octeon_npi_write32(CVMX_NPI_PCI_CFG19, cfg19.u32);
0475 }
0476
0477
0478 cfg01.u32 = 0;
0479 cfg01.s.msae = 1;
0480 cfg01.s.me = 1;
0481 cfg01.s.pee = 1;
0482 cfg01.s.see = 1;
0483 cfg01.s.fbbe = 1;
0484
0485 octeon_npi_write32(CVMX_NPI_PCI_CFG01, cfg01.u32);
0486
0487 #ifdef USE_OCTEON_INTERNAL_ARBITER
0488
0489
0490
0491
0492
0493 {
0494 union cvmx_npi_pci_int_arb_cfg pci_int_arb_cfg;
0495
0496 pci_int_arb_cfg.u64 = 0;
0497 pci_int_arb_cfg.s.en = 1;
0498 cvmx_write_csr(CVMX_NPI_PCI_INT_ARB_CFG, pci_int_arb_cfg.u64);
0499 }
0500 #endif
0501
0502
0503
0504
0505
0506
0507 cfg16.u32 = 0;
0508 cfg16.s.mltd = 1;
0509 octeon_npi_write32(CVMX_NPI_PCI_CFG16, cfg16.u32);
0510
0511
0512
0513
0514
0515 cfg22.u32 = 0;
0516
0517 cfg22.s.mrv = 0xff;
0518
0519
0520
0521
0522 cfg22.s.flush = 1;
0523 octeon_npi_write32(CVMX_NPI_PCI_CFG22, cfg22.u32);
0524
0525
0526
0527
0528
0529
0530
0531
0532 cfg56.u32 = 0;
0533 cfg56.s.pxcid = 7;
0534 cfg56.s.ncp = 0xe8;
0535 cfg56.s.dpere = 1;
0536 cfg56.s.roe = 1;
0537 cfg56.s.mmbc = 1;
0538
0539 cfg56.s.most = 3;
0540
0541
0542 octeon_npi_write32(CVMX_NPI_PCI_CFG56, cfg56.u32);
0543
0544
0545
0546
0547
0548
0549
0550
0551
0552
0553 octeon_npi_write32(CVMX_NPI_PCI_READ_CMD_6, 0x21);
0554 octeon_npi_write32(CVMX_NPI_PCI_READ_CMD_C, 0x31);
0555 octeon_npi_write32(CVMX_NPI_PCI_READ_CMD_E, 0x31);
0556 }
0557
0558
0559
0560
0561
0562 static int __init octeon_pci_setup(void)
0563 {
0564 union cvmx_npi_mem_access_subidx mem_access;
0565 int index;
0566
0567
0568 if (octeon_has_feature(OCTEON_FEATURE_PCIE))
0569 return 0;
0570
0571 if (!octeon_is_pci_host()) {
0572 pr_notice("Not in host mode, PCI Controller not initialized\n");
0573 return 0;
0574 }
0575
0576
0577 octeon_pcibios_map_irq = octeon_pci_pcibios_map_irq;
0578
0579
0580 if (OCTEON_IS_MODEL(OCTEON_CN31XX) ||
0581 OCTEON_IS_MODEL(OCTEON_CN38XX_PASS2) ||
0582 OCTEON_IS_MODEL(OCTEON_CN38XX_PASS1))
0583 octeon_dma_bar_type = OCTEON_DMA_BAR_TYPE_SMALL;
0584 else
0585 octeon_dma_bar_type = OCTEON_DMA_BAR_TYPE_BIG;
0586
0587
0588 set_io_port_base(OCTEON_PCI_IOSPACE_BASE);
0589 ioport_resource.start = 0;
0590 ioport_resource.end = OCTEON_PCI_IOSPACE_SIZE - 1;
0591
0592 pr_notice("%s Octeon big bar support\n",
0593 (octeon_dma_bar_type ==
0594 OCTEON_DMA_BAR_TYPE_BIG) ? "Enabling" : "Disabling");
0595
0596 octeon_pci_initialize();
0597
0598 mem_access.u64 = 0;
0599 mem_access.s.esr = 1;
0600 mem_access.s.esw = 1;
0601 mem_access.s.nsr = 0;
0602 mem_access.s.nsw = 0;
0603 mem_access.s.ror = 0;
0604 mem_access.s.row = 0;
0605 mem_access.s.ba = 0;
0606 cvmx_write_csr(CVMX_NPI_MEM_ACCESS_SUBID3, mem_access.u64);
0607
0608
0609
0610
0611
0612
0613
0614 octeon_npi_write32(CVMX_NPI_PCI_CFG08,
0615 (u32)(OCTEON_BAR2_PCI_ADDRESS & 0xffffffffull));
0616 octeon_npi_write32(CVMX_NPI_PCI_CFG09,
0617 (u32)(OCTEON_BAR2_PCI_ADDRESS >> 32));
0618
0619 if (octeon_dma_bar_type == OCTEON_DMA_BAR_TYPE_BIG) {
0620
0621 octeon_npi_write32(CVMX_NPI_PCI_CFG04, 0);
0622 octeon_npi_write32(CVMX_NPI_PCI_CFG05, 0);
0623
0624
0625
0626
0627
0628 octeon_npi_write32(CVMX_NPI_PCI_CFG06, 2ul << 30);
0629 octeon_npi_write32(CVMX_NPI_PCI_CFG07, 0);
0630
0631
0632 octeon_bar1_pci_phys = 0x80000000ull;
0633 for (index = 0; index < 32; index++) {
0634 union cvmx_pci_bar1_indexx bar1_index;
0635
0636 bar1_index.u32 = 0;
0637
0638 bar1_index.s.addr_idx =
0639 (octeon_bar1_pci_phys >> 22) + index;
0640
0641 bar1_index.s.ca = 1;
0642
0643 bar1_index.s.end_swp = 1;
0644
0645 bar1_index.s.addr_v = 1;
0646 octeon_npi_write32(CVMX_NPI_PCI_BAR1_INDEXX(index),
0647 bar1_index.u32);
0648 }
0649
0650
0651 octeon_pci_mem_resource.start =
0652 OCTEON_PCI_MEMSPACE_OFFSET + (4ul << 30) -
0653 (OCTEON_PCI_BAR1_HOLE_SIZE << 20);
0654 octeon_pci_mem_resource.end =
0655 octeon_pci_mem_resource.start + (1ul << 30);
0656 } else {
0657
0658 octeon_npi_write32(CVMX_NPI_PCI_CFG04, 128ul << 20);
0659 octeon_npi_write32(CVMX_NPI_PCI_CFG05, 0);
0660
0661
0662 octeon_npi_write32(CVMX_NPI_PCI_CFG06, 0);
0663 octeon_npi_write32(CVMX_NPI_PCI_CFG07, 0);
0664
0665
0666 octeon_bar1_pci_phys =
0667 io_tlb_default_mem.start & ~((1ull << 22) - 1);
0668
0669 for (index = 0; index < 32; index++) {
0670 union cvmx_pci_bar1_indexx bar1_index;
0671
0672 bar1_index.u32 = 0;
0673
0674 bar1_index.s.addr_idx =
0675 (octeon_bar1_pci_phys >> 22) + index;
0676
0677 bar1_index.s.ca = 1;
0678
0679 bar1_index.s.end_swp = 1;
0680
0681 bar1_index.s.addr_v = 1;
0682 octeon_npi_write32(CVMX_NPI_PCI_BAR1_INDEXX(index),
0683 bar1_index.u32);
0684 }
0685
0686
0687 octeon_pci_mem_resource.start =
0688 OCTEON_PCI_MEMSPACE_OFFSET + (128ul << 20) +
0689 (4ul << 10);
0690 octeon_pci_mem_resource.end =
0691 octeon_pci_mem_resource.start + (1ul << 30);
0692 }
0693
0694 register_pci_controller(&octeon_pci_controller);
0695
0696
0697
0698
0699
0700 cvmx_write_csr(CVMX_NPI_PCI_INT_SUM2, -1);
0701
0702 if (IS_ERR(platform_device_register_simple("octeon_pci_edac",
0703 -1, NULL, 0)))
0704 pr_err("Registration of co_pci_edac failed!\n");
0705
0706 octeon_pci_dma_init();
0707
0708 return 0;
0709 }
0710
0711 arch_initcall(octeon_pci_setup);