0001
0002
0003
0004
0005
0006
0007
0008
0009
0010
0011
0012
0013
0014 #include <linux/init.h>
0015 #include <linux/interrupt.h>
0016 #include <linux/io.h>
0017 #include <linux/kernel.h>
0018 #include <linux/of_address.h>
0019 #include <linux/of_device.h>
0020 #include <linux/of_irq.h>
0021 #include <linux/of_pci.h>
0022 #include <linux/pci.h>
0023 #include <linux/platform_device.h>
0024 #include <linux/slab.h>
0025 #include <linux/irqdomain.h>
0026 #include <linux/irqchip/chained_irq.h>
0027 #include <linux/bitops.h>
0028 #include <linux/irq.h>
0029 #include <linux/clk.h>
0030
0031 #include "../pci.h"
0032
0033
0034
0035
0036
0037 #define FTPCI_IOSIZE 0x00
0038 #define FTPCI_PROT 0x04
0039 #define FTPCI_CTRL 0x08
0040 #define FTPCI_SOFTRST 0x10
0041 #define FTPCI_CONFIG 0x28
0042 #define FTPCI_DATA 0x2C
0043
0044 #define FARADAY_PCI_STATUS_CMD 0x04
0045 #define FARADAY_PCI_PMC 0x40
0046 #define FARADAY_PCI_PMCSR 0x44
0047 #define FARADAY_PCI_CTRL1 0x48
0048 #define FARADAY_PCI_CTRL2 0x4C
0049 #define FARADAY_PCI_MEM1_BASE_SIZE 0x50
0050 #define FARADAY_PCI_MEM2_BASE_SIZE 0x54
0051 #define FARADAY_PCI_MEM3_BASE_SIZE 0x58
0052
0053 #define PCI_STATUS_66MHZ_CAPABLE BIT(21)
0054
0055
0056 #define PCI_CTRL2_INTSTS_SHIFT 28
0057 #define PCI_CTRL2_INTMASK_CMDERR BIT(27)
0058 #define PCI_CTRL2_INTMASK_PARERR BIT(26)
0059
0060 #define PCI_CTRL2_INTMASK_SHIFT 22
0061 #define PCI_CTRL2_INTMASK_MABRT_RX BIT(21)
0062 #define PCI_CTRL2_INTMASK_TABRT_RX BIT(20)
0063 #define PCI_CTRL2_INTMASK_TABRT_TX BIT(19)
0064 #define PCI_CTRL2_INTMASK_RETRY4 BIT(18)
0065 #define PCI_CTRL2_INTMASK_SERR_RX BIT(17)
0066 #define PCI_CTRL2_INTMASK_PERR_RX BIT(16)
0067
0068 #define PCI_CTRL2_MSTPRI_REQ6 BIT(14)
0069 #define PCI_CTRL2_MSTPRI_REQ5 BIT(13)
0070 #define PCI_CTRL2_MSTPRI_REQ4 BIT(12)
0071 #define PCI_CTRL2_MSTPRI_REQ3 BIT(11)
0072 #define PCI_CTRL2_MSTPRI_REQ2 BIT(10)
0073 #define PCI_CTRL2_MSTPRI_REQ1 BIT(9)
0074 #define PCI_CTRL2_MSTPRI_REQ0 BIT(8)
0075
0076
0077
0078
0079
0080
0081
0082
0083 #define FARADAY_PCI_MEMBASE_MASK 0xfff00000
0084 #define FARADAY_PCI_MEMSIZE_1MB 0x0
0085 #define FARADAY_PCI_MEMSIZE_2MB 0x1
0086 #define FARADAY_PCI_MEMSIZE_4MB 0x2
0087 #define FARADAY_PCI_MEMSIZE_8MB 0x3
0088 #define FARADAY_PCI_MEMSIZE_16MB 0x4
0089 #define FARADAY_PCI_MEMSIZE_32MB 0x5
0090 #define FARADAY_PCI_MEMSIZE_64MB 0x6
0091 #define FARADAY_PCI_MEMSIZE_128MB 0x7
0092 #define FARADAY_PCI_MEMSIZE_256MB 0x8
0093 #define FARADAY_PCI_MEMSIZE_512MB 0x9
0094 #define FARADAY_PCI_MEMSIZE_1GB 0xa
0095 #define FARADAY_PCI_MEMSIZE_2GB 0xb
0096 #define FARADAY_PCI_MEMSIZE_SHIFT 16
0097
0098
0099
0100
0101
0102 #define FARADAY_PCI_DMA_MEM1_BASE 0x00000000
0103 #define FARADAY_PCI_DMA_MEM2_BASE 0x00000000
0104 #define FARADAY_PCI_DMA_MEM3_BASE 0x00000000
0105
0106
0107 #define PCI_CONF_ENABLE BIT(31)
0108 #define PCI_CONF_WHERE(r) ((r) & 0xFC)
0109 #define PCI_CONF_BUS(b) (((b) & 0xFF) << 16)
0110 #define PCI_CONF_DEVICE(d) (((d) & 0x1F) << 11)
0111 #define PCI_CONF_FUNCTION(f) (((f) & 0x07) << 8)
0112
0113
0114
0115
0116
0117
0118 struct faraday_pci_variant {
0119 bool cascaded_irq;
0120 };
0121
0122 struct faraday_pci {
0123 struct device *dev;
0124 void __iomem *base;
0125 struct irq_domain *irqdomain;
0126 struct pci_bus *bus;
0127 struct clk *bus_clk;
0128 };
0129
0130 static int faraday_res_to_memcfg(resource_size_t mem_base,
0131 resource_size_t mem_size, u32 *val)
0132 {
0133 u32 outval;
0134
0135 switch (mem_size) {
0136 case SZ_1M:
0137 outval = FARADAY_PCI_MEMSIZE_1MB;
0138 break;
0139 case SZ_2M:
0140 outval = FARADAY_PCI_MEMSIZE_2MB;
0141 break;
0142 case SZ_4M:
0143 outval = FARADAY_PCI_MEMSIZE_4MB;
0144 break;
0145 case SZ_8M:
0146 outval = FARADAY_PCI_MEMSIZE_8MB;
0147 break;
0148 case SZ_16M:
0149 outval = FARADAY_PCI_MEMSIZE_16MB;
0150 break;
0151 case SZ_32M:
0152 outval = FARADAY_PCI_MEMSIZE_32MB;
0153 break;
0154 case SZ_64M:
0155 outval = FARADAY_PCI_MEMSIZE_64MB;
0156 break;
0157 case SZ_128M:
0158 outval = FARADAY_PCI_MEMSIZE_128MB;
0159 break;
0160 case SZ_256M:
0161 outval = FARADAY_PCI_MEMSIZE_256MB;
0162 break;
0163 case SZ_512M:
0164 outval = FARADAY_PCI_MEMSIZE_512MB;
0165 break;
0166 case SZ_1G:
0167 outval = FARADAY_PCI_MEMSIZE_1GB;
0168 break;
0169 case SZ_2G:
0170 outval = FARADAY_PCI_MEMSIZE_2GB;
0171 break;
0172 default:
0173 return -EINVAL;
0174 }
0175 outval <<= FARADAY_PCI_MEMSIZE_SHIFT;
0176
0177
0178 if (mem_base & ~(FARADAY_PCI_MEMBASE_MASK))
0179 pr_warn("truncated PCI memory base\n");
0180
0181 outval |= (mem_base & FARADAY_PCI_MEMBASE_MASK);
0182 pr_debug("Translated pci base @%pap, size %pap to config %08x\n",
0183 &mem_base, &mem_size, outval);
0184
0185 *val = outval;
0186 return 0;
0187 }
0188
0189 static int faraday_raw_pci_read_config(struct faraday_pci *p, int bus_number,
0190 unsigned int fn, int config, int size,
0191 u32 *value)
0192 {
0193 writel(PCI_CONF_BUS(bus_number) |
0194 PCI_CONF_DEVICE(PCI_SLOT(fn)) |
0195 PCI_CONF_FUNCTION(PCI_FUNC(fn)) |
0196 PCI_CONF_WHERE(config) |
0197 PCI_CONF_ENABLE,
0198 p->base + FTPCI_CONFIG);
0199
0200 *value = readl(p->base + FTPCI_DATA);
0201
0202 if (size == 1)
0203 *value = (*value >> (8 * (config & 3))) & 0xFF;
0204 else if (size == 2)
0205 *value = (*value >> (8 * (config & 3))) & 0xFFFF;
0206
0207 return PCIBIOS_SUCCESSFUL;
0208 }
0209
0210 static int faraday_pci_read_config(struct pci_bus *bus, unsigned int fn,
0211 int config, int size, u32 *value)
0212 {
0213 struct faraday_pci *p = bus->sysdata;
0214
0215 dev_dbg(&bus->dev,
0216 "[read] slt: %.2d, fnc: %d, cnf: 0x%.2X, val (%d bytes): 0x%.8X\n",
0217 PCI_SLOT(fn), PCI_FUNC(fn), config, size, *value);
0218
0219 return faraday_raw_pci_read_config(p, bus->number, fn, config, size, value);
0220 }
0221
0222 static int faraday_raw_pci_write_config(struct faraday_pci *p, int bus_number,
0223 unsigned int fn, int config, int size,
0224 u32 value)
0225 {
0226 int ret = PCIBIOS_SUCCESSFUL;
0227
0228 writel(PCI_CONF_BUS(bus_number) |
0229 PCI_CONF_DEVICE(PCI_SLOT(fn)) |
0230 PCI_CONF_FUNCTION(PCI_FUNC(fn)) |
0231 PCI_CONF_WHERE(config) |
0232 PCI_CONF_ENABLE,
0233 p->base + FTPCI_CONFIG);
0234
0235 switch (size) {
0236 case 4:
0237 writel(value, p->base + FTPCI_DATA);
0238 break;
0239 case 2:
0240 writew(value, p->base + FTPCI_DATA + (config & 3));
0241 break;
0242 case 1:
0243 writeb(value, p->base + FTPCI_DATA + (config & 3));
0244 break;
0245 default:
0246 ret = PCIBIOS_BAD_REGISTER_NUMBER;
0247 }
0248
0249 return ret;
0250 }
0251
0252 static int faraday_pci_write_config(struct pci_bus *bus, unsigned int fn,
0253 int config, int size, u32 value)
0254 {
0255 struct faraday_pci *p = bus->sysdata;
0256
0257 dev_dbg(&bus->dev,
0258 "[write] slt: %.2d, fnc: %d, cnf: 0x%.2X, val (%d bytes): 0x%.8X\n",
0259 PCI_SLOT(fn), PCI_FUNC(fn), config, size, value);
0260
0261 return faraday_raw_pci_write_config(p, bus->number, fn, config, size,
0262 value);
0263 }
0264
0265 static struct pci_ops faraday_pci_ops = {
0266 .read = faraday_pci_read_config,
0267 .write = faraday_pci_write_config,
0268 };
0269
0270 static void faraday_pci_ack_irq(struct irq_data *d)
0271 {
0272 struct faraday_pci *p = irq_data_get_irq_chip_data(d);
0273 unsigned int reg;
0274
0275 faraday_raw_pci_read_config(p, 0, 0, FARADAY_PCI_CTRL2, 4, ®);
0276 reg &= ~(0xF << PCI_CTRL2_INTSTS_SHIFT);
0277 reg |= BIT(irqd_to_hwirq(d) + PCI_CTRL2_INTSTS_SHIFT);
0278 faraday_raw_pci_write_config(p, 0, 0, FARADAY_PCI_CTRL2, 4, reg);
0279 }
0280
0281 static void faraday_pci_mask_irq(struct irq_data *d)
0282 {
0283 struct faraday_pci *p = irq_data_get_irq_chip_data(d);
0284 unsigned int reg;
0285
0286 faraday_raw_pci_read_config(p, 0, 0, FARADAY_PCI_CTRL2, 4, ®);
0287 reg &= ~((0xF << PCI_CTRL2_INTSTS_SHIFT)
0288 | BIT(irqd_to_hwirq(d) + PCI_CTRL2_INTMASK_SHIFT));
0289 faraday_raw_pci_write_config(p, 0, 0, FARADAY_PCI_CTRL2, 4, reg);
0290 }
0291
0292 static void faraday_pci_unmask_irq(struct irq_data *d)
0293 {
0294 struct faraday_pci *p = irq_data_get_irq_chip_data(d);
0295 unsigned int reg;
0296
0297 faraday_raw_pci_read_config(p, 0, 0, FARADAY_PCI_CTRL2, 4, ®);
0298 reg &= ~(0xF << PCI_CTRL2_INTSTS_SHIFT);
0299 reg |= BIT(irqd_to_hwirq(d) + PCI_CTRL2_INTMASK_SHIFT);
0300 faraday_raw_pci_write_config(p, 0, 0, FARADAY_PCI_CTRL2, 4, reg);
0301 }
0302
0303 static void faraday_pci_irq_handler(struct irq_desc *desc)
0304 {
0305 struct faraday_pci *p = irq_desc_get_handler_data(desc);
0306 struct irq_chip *irqchip = irq_desc_get_chip(desc);
0307 unsigned int irq_stat, reg, i;
0308
0309 faraday_raw_pci_read_config(p, 0, 0, FARADAY_PCI_CTRL2, 4, ®);
0310 irq_stat = reg >> PCI_CTRL2_INTSTS_SHIFT;
0311
0312 chained_irq_enter(irqchip, desc);
0313
0314 for (i = 0; i < 4; i++) {
0315 if ((irq_stat & BIT(i)) == 0)
0316 continue;
0317 generic_handle_domain_irq(p->irqdomain, i);
0318 }
0319
0320 chained_irq_exit(irqchip, desc);
0321 }
0322
0323 static struct irq_chip faraday_pci_irq_chip = {
0324 .name = "PCI",
0325 .irq_ack = faraday_pci_ack_irq,
0326 .irq_mask = faraday_pci_mask_irq,
0327 .irq_unmask = faraday_pci_unmask_irq,
0328 };
0329
0330 static int faraday_pci_irq_map(struct irq_domain *domain, unsigned int irq,
0331 irq_hw_number_t hwirq)
0332 {
0333 irq_set_chip_and_handler(irq, &faraday_pci_irq_chip, handle_level_irq);
0334 irq_set_chip_data(irq, domain->host_data);
0335
0336 return 0;
0337 }
0338
0339 static const struct irq_domain_ops faraday_pci_irqdomain_ops = {
0340 .map = faraday_pci_irq_map,
0341 };
0342
0343 static int faraday_pci_setup_cascaded_irq(struct faraday_pci *p)
0344 {
0345 struct device_node *intc = of_get_next_child(p->dev->of_node, NULL);
0346 int irq;
0347 int i;
0348
0349 if (!intc) {
0350 dev_err(p->dev, "missing child interrupt-controller node\n");
0351 return -EINVAL;
0352 }
0353
0354
0355 irq = of_irq_get(intc, 0);
0356 if (irq <= 0) {
0357 dev_err(p->dev, "failed to get parent IRQ\n");
0358 of_node_put(intc);
0359 return irq ?: -EINVAL;
0360 }
0361
0362 p->irqdomain = irq_domain_add_linear(intc, PCI_NUM_INTX,
0363 &faraday_pci_irqdomain_ops, p);
0364 of_node_put(intc);
0365 if (!p->irqdomain) {
0366 dev_err(p->dev, "failed to create Gemini PCI IRQ domain\n");
0367 return -EINVAL;
0368 }
0369
0370 irq_set_chained_handler_and_data(irq, faraday_pci_irq_handler, p);
0371
0372 for (i = 0; i < 4; i++)
0373 irq_create_mapping(p->irqdomain, i);
0374
0375 return 0;
0376 }
0377
0378 static int faraday_pci_parse_map_dma_ranges(struct faraday_pci *p)
0379 {
0380 struct device *dev = p->dev;
0381 struct pci_host_bridge *bridge = pci_host_bridge_from_priv(p);
0382 struct resource_entry *entry;
0383 u32 confreg[3] = {
0384 FARADAY_PCI_MEM1_BASE_SIZE,
0385 FARADAY_PCI_MEM2_BASE_SIZE,
0386 FARADAY_PCI_MEM3_BASE_SIZE,
0387 };
0388 int i = 0;
0389 u32 val;
0390
0391 resource_list_for_each_entry(entry, &bridge->dma_ranges) {
0392 u64 pci_addr = entry->res->start - entry->offset;
0393 u64 end = entry->res->end - entry->offset;
0394 int ret;
0395
0396 ret = faraday_res_to_memcfg(pci_addr,
0397 resource_size(entry->res), &val);
0398 if (ret) {
0399 dev_err(dev,
0400 "DMA range %d: illegal MEM resource size\n", i);
0401 return -EINVAL;
0402 }
0403
0404 dev_info(dev, "DMA MEM%d BASE: 0x%016llx -> 0x%016llx config %08x\n",
0405 i + 1, pci_addr, end, val);
0406 if (i <= 2) {
0407 faraday_raw_pci_write_config(p, 0, 0, confreg[i],
0408 4, val);
0409 } else {
0410 dev_err(dev, "ignore extraneous dma-range %d\n", i);
0411 break;
0412 }
0413
0414 i++;
0415 }
0416
0417 return 0;
0418 }
0419
0420 static int faraday_pci_probe(struct platform_device *pdev)
0421 {
0422 struct device *dev = &pdev->dev;
0423 const struct faraday_pci_variant *variant =
0424 of_device_get_match_data(dev);
0425 struct resource_entry *win;
0426 struct faraday_pci *p;
0427 struct resource *io;
0428 struct pci_host_bridge *host;
0429 struct clk *clk;
0430 unsigned char max_bus_speed = PCI_SPEED_33MHz;
0431 unsigned char cur_bus_speed = PCI_SPEED_33MHz;
0432 int ret;
0433 u32 val;
0434
0435 host = devm_pci_alloc_host_bridge(dev, sizeof(*p));
0436 if (!host)
0437 return -ENOMEM;
0438
0439 host->ops = &faraday_pci_ops;
0440 p = pci_host_bridge_priv(host);
0441 host->sysdata = p;
0442 p->dev = dev;
0443
0444
0445 clk = devm_clk_get(dev, "PCLK");
0446 if (IS_ERR(clk))
0447 return PTR_ERR(clk);
0448 ret = clk_prepare_enable(clk);
0449 if (ret) {
0450 dev_err(dev, "could not prepare PCLK\n");
0451 return ret;
0452 }
0453 p->bus_clk = devm_clk_get(dev, "PCICLK");
0454 if (IS_ERR(p->bus_clk))
0455 return PTR_ERR(p->bus_clk);
0456 ret = clk_prepare_enable(p->bus_clk);
0457 if (ret) {
0458 dev_err(dev, "could not prepare PCICLK\n");
0459 return ret;
0460 }
0461
0462 p->base = devm_platform_ioremap_resource(pdev, 0);
0463 if (IS_ERR(p->base))
0464 return PTR_ERR(p->base);
0465
0466 win = resource_list_first_type(&host->windows, IORESOURCE_IO);
0467 if (win) {
0468 io = win->res;
0469 if (!faraday_res_to_memcfg(io->start - win->offset,
0470 resource_size(io), &val)) {
0471
0472 writel(val, p->base + FTPCI_IOSIZE);
0473 } else {
0474 dev_err(dev, "illegal IO mem size\n");
0475 return -EINVAL;
0476 }
0477 }
0478
0479
0480 val = readl(p->base + FTPCI_CTRL);
0481 val |= PCI_COMMAND_IO;
0482 val |= PCI_COMMAND_MEMORY;
0483 val |= PCI_COMMAND_MASTER;
0484 writel(val, p->base + FTPCI_CTRL);
0485
0486 faraday_raw_pci_write_config(p, 0, 0, FARADAY_PCI_CTRL2 + 2, 2, 0xF000);
0487 if (variant->cascaded_irq) {
0488 ret = faraday_pci_setup_cascaded_irq(p);
0489 if (ret) {
0490 dev_err(dev, "failed to setup cascaded IRQ\n");
0491 return ret;
0492 }
0493 }
0494
0495
0496 if (!IS_ERR(p->bus_clk)) {
0497 unsigned long rate;
0498 u32 val;
0499
0500 faraday_raw_pci_read_config(p, 0, 0,
0501 FARADAY_PCI_STATUS_CMD, 4, &val);
0502 rate = clk_get_rate(p->bus_clk);
0503
0504 if ((rate == 33000000) && (val & PCI_STATUS_66MHZ_CAPABLE)) {
0505 dev_info(dev, "33MHz bus is 66MHz capable\n");
0506 max_bus_speed = PCI_SPEED_66MHz;
0507 ret = clk_set_rate(p->bus_clk, 66000000);
0508 if (ret)
0509 dev_err(dev, "failed to set bus clock\n");
0510 } else {
0511 dev_info(dev, "33MHz only bus\n");
0512 max_bus_speed = PCI_SPEED_33MHz;
0513 }
0514
0515
0516 rate = clk_get_rate(p->bus_clk);
0517 if (rate == 33000000)
0518 cur_bus_speed = PCI_SPEED_33MHz;
0519 if (rate == 66000000)
0520 cur_bus_speed = PCI_SPEED_66MHz;
0521 }
0522
0523 ret = faraday_pci_parse_map_dma_ranges(p);
0524 if (ret)
0525 return ret;
0526
0527 ret = pci_scan_root_bus_bridge(host);
0528 if (ret) {
0529 dev_err(dev, "failed to scan host: %d\n", ret);
0530 return ret;
0531 }
0532 p->bus = host->bus;
0533 p->bus->max_bus_speed = max_bus_speed;
0534 p->bus->cur_bus_speed = cur_bus_speed;
0535
0536 pci_bus_assign_resources(p->bus);
0537 pci_bus_add_devices(p->bus);
0538
0539 return 0;
0540 }
0541
0542
0543
0544
0545
0546 static const struct faraday_pci_variant faraday_regular = {
0547 .cascaded_irq = true,
0548 };
0549
0550 static const struct faraday_pci_variant faraday_dual = {
0551 .cascaded_irq = false,
0552 };
0553
0554 static const struct of_device_id faraday_pci_of_match[] = {
0555 {
0556 .compatible = "faraday,ftpci100",
0557 .data = &faraday_regular,
0558 },
0559 {
0560 .compatible = "faraday,ftpci100-dual",
0561 .data = &faraday_dual,
0562 },
0563 {},
0564 };
0565
0566 static struct platform_driver faraday_pci_driver = {
0567 .driver = {
0568 .name = "ftpci100",
0569 .of_match_table = of_match_ptr(faraday_pci_of_match),
0570 .suppress_bind_attrs = true,
0571 },
0572 .probe = faraday_pci_probe,
0573 };
0574 builtin_platform_driver(faraday_pci_driver);