forked from ~ljy/RK356X_SDK_RELEASE

hc
2023-12-08 01573e231f18eb2d99162747186f59511f56b64d
kernel/drivers/pci/controller/pci-ftpci100.c
....@@ -34,12 +34,12 @@
3434 * Special configuration registers directly in the first few words
3535 * in I/O space.
3636 */
37
-#define PCI_IOSIZE 0x00
38
-#define PCI_PROT 0x04 /* AHB protection */
39
-#define PCI_CTRL 0x08 /* PCI control signal */
40
-#define PCI_SOFTRST 0x10 /* Soft reset counter and response error enable */
41
-#define PCI_CONFIG 0x28 /* PCI configuration command register */
42
-#define PCI_DATA 0x2C
37
+#define FTPCI_IOSIZE 0x00
38
+#define FTPCI_PROT 0x04 /* AHB protection */
39
+#define FTPCI_CTRL 0x08 /* PCI control signal */
40
+#define FTPCI_SOFTRST 0x10 /* Soft reset counter and response error enable */
41
+#define FTPCI_CONFIG 0x28 /* PCI configuration command register */
42
+#define FTPCI_DATA 0x2C
4343
4444 #define FARADAY_PCI_STATUS_CMD 0x04 /* Status and command */
4545 #define FARADAY_PCI_PMC 0x40 /* Power management control */
....@@ -195,9 +195,9 @@
195195 PCI_CONF_FUNCTION(PCI_FUNC(fn)) |
196196 PCI_CONF_WHERE(config) |
197197 PCI_CONF_ENABLE,
198
- p->base + PCI_CONFIG);
198
+ p->base + FTPCI_CONFIG);
199199
200
- *value = readl(p->base + PCI_DATA);
200
+ *value = readl(p->base + FTPCI_DATA);
201201
202202 if (size == 1)
203203 *value = (*value >> (8 * (config & 3))) & 0xFF;
....@@ -230,17 +230,17 @@
230230 PCI_CONF_FUNCTION(PCI_FUNC(fn)) |
231231 PCI_CONF_WHERE(config) |
232232 PCI_CONF_ENABLE,
233
- p->base + PCI_CONFIG);
233
+ p->base + FTPCI_CONFIG);
234234
235235 switch (size) {
236236 case 4:
237
- writel(value, p->base + PCI_DATA);
237
+ writel(value, p->base + FTPCI_DATA);
238238 break;
239239 case 2:
240
- writew(value, p->base + PCI_DATA + (config & 3));
240
+ writew(value, p->base + FTPCI_DATA + (config & 3));
241241 break;
242242 case 1:
243
- writeb(value, p->base + PCI_DATA + (config & 3));
243
+ writeb(value, p->base + FTPCI_DATA + (config & 3));
244244 break;
245245 default:
246246 ret = PCIBIOS_BAD_REGISTER_NUMBER;
....@@ -375,12 +375,11 @@
375375 return 0;
376376 }
377377
378
-static int faraday_pci_parse_map_dma_ranges(struct faraday_pci *p,
379
- struct device_node *np)
378
+static int faraday_pci_parse_map_dma_ranges(struct faraday_pci *p)
380379 {
381
- struct of_pci_range range;
382
- struct of_pci_range_parser parser;
383380 struct device *dev = p->dev;
381
+ struct pci_host_bridge *bridge = pci_host_bridge_from_priv(p);
382
+ struct resource_entry *entry;
384383 u32 confreg[3] = {
385384 FARADAY_PCI_MEM1_BASE_SIZE,
386385 FARADAY_PCI_MEM2_BASE_SIZE,
....@@ -389,19 +388,13 @@
389388 int i = 0;
390389 u32 val;
391390
392
- if (of_pci_dma_range_parser_init(&parser, np)) {
393
- dev_err(dev, "missing dma-ranges property\n");
394
- return -EINVAL;
395
- }
396
-
397
- /*
398
- * Get the dma-ranges from the device tree
399
- */
400
- for_each_of_pci_range(&parser, &range) {
401
- u64 end = range.pci_addr + range.size - 1;
391
+ resource_list_for_each_entry(entry, &bridge->dma_ranges) {
392
+ u64 pci_addr = entry->res->start - entry->offset;
393
+ u64 end = entry->res->end - entry->offset;
402394 int ret;
403395
404
- ret = faraday_res_to_memcfg(range.pci_addr, range.size, &val);
396
+ ret = faraday_res_to_memcfg(pci_addr,
397
+ resource_size(entry->res), &val);
405398 if (ret) {
406399 dev_err(dev,
407400 "DMA range %d: illegal MEM resource size\n", i);
....@@ -409,7 +402,7 @@
409402 }
410403
411404 dev_info(dev, "DMA MEM%d BASE: 0x%016llx -> 0x%016llx config %08x\n",
412
- i + 1, range.pci_addr, end, val);
405
+ i + 1, pci_addr, end, val);
413406 if (i <= 2) {
414407 faraday_raw_pci_write_config(p, 0, 0, confreg[i],
415408 4, val);
....@@ -429,11 +422,8 @@
429422 struct device *dev = &pdev->dev;
430423 const struct faraday_pci_variant *variant =
431424 of_device_get_match_data(dev);
432
- struct resource *regs;
433
- resource_size_t io_base;
434425 struct resource_entry *win;
435426 struct faraday_pci *p;
436
- struct resource *mem;
437427 struct resource *io;
438428 struct pci_host_bridge *host;
439429 struct clk *clk;
....@@ -441,18 +431,12 @@
441431 unsigned char cur_bus_speed = PCI_SPEED_33MHz;
442432 int ret;
443433 u32 val;
444
- LIST_HEAD(res);
445434
446435 host = devm_pci_alloc_host_bridge(dev, sizeof(*p));
447436 if (!host)
448437 return -ENOMEM;
449438
450
- host->dev.parent = dev;
451439 host->ops = &faraday_pci_ops;
452
- host->busnr = 0;
453
- host->msi = NULL;
454
- host->map_irq = of_irq_parse_and_map_pci;
455
- host->swizzle_irq = pci_common_swizzle;
456440 p = pci_host_bridge_priv(host);
457441 host->sysdata = p;
458442 p->dev = dev;
....@@ -475,58 +459,29 @@
475459 return ret;
476460 }
477461
478
- regs = platform_get_resource(pdev, IORESOURCE_MEM, 0);
479
- p->base = devm_ioremap_resource(dev, regs);
462
+ p->base = devm_platform_ioremap_resource(pdev, 0);
480463 if (IS_ERR(p->base))
481464 return PTR_ERR(p->base);
482465
483
- ret = devm_of_pci_get_host_bridge_resources(dev, 0, 0xff,
484
- &res, &io_base);
485
- if (ret)
486
- return ret;
487
-
488
- ret = devm_request_pci_bus_resources(dev, &res);
489
- if (ret)
490
- return ret;
491
-
492
- /* Get the I/O and memory ranges from DT */
493
- resource_list_for_each_entry(win, &res) {
494
- switch (resource_type(win->res)) {
495
- case IORESOURCE_IO:
496
- io = win->res;
497
- io->name = "Gemini PCI I/O";
498
- if (!faraday_res_to_memcfg(io->start - win->offset,
499
- resource_size(io), &val)) {
500
- /* setup I/O space size */
501
- writel(val, p->base + PCI_IOSIZE);
502
- } else {
503
- dev_err(dev, "illegal IO mem size\n");
504
- return -EINVAL;
505
- }
506
- ret = devm_pci_remap_iospace(dev, io, io_base);
507
- if (ret) {
508
- dev_warn(dev, "error %d: failed to map resource %pR\n",
509
- ret, io);
510
- continue;
511
- }
512
- break;
513
- case IORESOURCE_MEM:
514
- mem = win->res;
515
- mem->name = "Gemini PCI MEM";
516
- break;
517
- case IORESOURCE_BUS:
518
- break;
519
- default:
520
- break;
466
+ win = resource_list_first_type(&host->windows, IORESOURCE_IO);
467
+ if (win) {
468
+ io = win->res;
469
+ if (!faraday_res_to_memcfg(io->start - win->offset,
470
+ resource_size(io), &val)) {
471
+ /* setup I/O space size */
472
+ writel(val, p->base + FTPCI_IOSIZE);
473
+ } else {
474
+ dev_err(dev, "illegal IO mem size\n");
475
+ return -EINVAL;
521476 }
522477 }
523478
524479 /* Setup hostbridge */
525
- val = readl(p->base + PCI_CTRL);
480
+ val = readl(p->base + FTPCI_CTRL);
526481 val |= PCI_COMMAND_IO;
527482 val |= PCI_COMMAND_MEMORY;
528483 val |= PCI_COMMAND_MASTER;
529
- writel(val, p->base + PCI_CTRL);
484
+ writel(val, p->base + FTPCI_CTRL);
530485 /* Mask and clear all interrupts */
531486 faraday_raw_pci_write_config(p, 0, 0, FARADAY_PCI_CTRL2 + 2, 2, 0xF000);
532487 if (variant->cascaded_irq) {
....@@ -565,11 +520,10 @@
565520 cur_bus_speed = PCI_SPEED_66MHz;
566521 }
567522
568
- ret = faraday_pci_parse_map_dma_ranges(p, dev->of_node);
523
+ ret = faraday_pci_parse_map_dma_ranges(p);
569524 if (ret)
570525 return ret;
571526
572
- list_splice_init(&res, &host->windows);
573527 ret = pci_scan_root_bus_bridge(host);
574528 if (ret) {
575529 dev_err(dev, "failed to scan host: %d\n", ret);
....@@ -581,7 +535,6 @@
581535
582536 pci_bus_assign_resources(p->bus);
583537 pci_bus_add_devices(p->bus);
584
- pci_free_resource_list(&res);
585538
586539 return 0;
587540 }