Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux
1
fork

Configure Feed

Select the types of activity you want to include in your feed.

NTB: epf: Allow arbitrary BAR mapping

The NTB epf host driver assumes the BAR number associated with a memory
window is just incremented from the BAR number associated with MW1. This
seems to have been enough so far but this is not really how the endpoint
side work and the two could easily become mis-aligned.

ntb_epf_mw_to_bar() even assumes that the BAR number is the memory window
index + 2, which means the function only returns a proper result if BAR_2
is associated with MW1.

Instead, fully describe and allow arbitrary NTB BAR mapping.

Signed-off-by: Jerome Brunet <jbrunet@baylibre.com>
Signed-off-by: Jon Mason <jdmason@kudzu.us>

authored by

Jerome Brunet and committed by
Jon Mason
5ad86586 3db835dd

+53 -50
+53 -50
drivers/ntb/hw/epf/ntb_hw_epf.c
··· 49 49 #define NTB_EPF_COMMAND_TIMEOUT 1000 /* 1 Sec */ 50 50 51 51 enum pci_barno { 52 + NO_BAR = -1, 52 53 BAR_0, 53 54 BAR_1, 54 55 BAR_2, ··· 58 57 BAR_5, 59 58 }; 60 59 60 + enum epf_ntb_bar { 61 + BAR_CONFIG, 62 + BAR_PEER_SPAD, 63 + BAR_DB, 64 + BAR_MW1, 65 + BAR_MW2, 66 + BAR_MW3, 67 + BAR_MW4, 68 + NTB_BAR_NUM, 69 + }; 70 + 71 + #define NTB_EPF_MAX_MW_COUNT (NTB_BAR_NUM - BAR_MW1) 72 + 61 73 struct ntb_epf_dev { 62 74 struct ntb_dev ntb; 63 75 struct device *dev; 64 76 /* Mutex to protect providing commands to NTB EPF */ 65 77 struct mutex cmd_lock; 66 78 67 - enum pci_barno ctrl_reg_bar; 68 - enum pci_barno peer_spad_reg_bar; 69 - enum pci_barno db_reg_bar; 70 - enum pci_barno mw_bar; 79 + const enum pci_barno *barno_map; 71 80 72 81 unsigned int mw_count; 73 82 unsigned int spad_count; ··· 95 84 }; 96 85 97 86 #define ntb_ndev(__ntb) container_of(__ntb, struct ntb_epf_dev, ntb) 98 - 99 - struct ntb_epf_data { 100 - /* BAR that contains both control region and self spad region */ 101 - enum pci_barno ctrl_reg_bar; 102 - /* BAR that contains peer spad region */ 103 - enum pci_barno peer_spad_reg_bar; 104 - /* BAR that contains Doorbell region and Memory window '1' */ 105 - enum pci_barno db_reg_bar; 106 - /* BAR that contains memory windows*/ 107 - enum pci_barno mw_bar; 108 - }; 109 87 110 88 static int ntb_epf_send_command(struct ntb_epf_dev *ndev, u32 command, 111 89 u32 argument) ··· 144 144 return -EINVAL; 145 145 } 146 146 147 - return idx + 2; 147 + return ndev->barno_map[BAR_MW1 + idx]; 148 148 } 149 149 150 150 static int ntb_epf_mw_count(struct ntb_dev *ntb, int pidx) ··· 413 413 return -EINVAL; 414 414 } 415 415 416 - bar = idx + ndev->mw_bar; 416 + bar = ntb_epf_mw_to_bar(ndev, idx); 417 + if (bar < 0) 418 + return bar; 417 419 418 420 mw_size = pci_resource_len(ntb->pdev, bar); 419 421 ··· 457 455 if (idx == 0) 458 456 offset = readl(ndev->ctrl_reg + NTB_EPF_MW1_OFFSET); 459 457 460 - bar = idx + ndev->mw_bar; 458 + bar = ntb_epf_mw_to_bar(ndev, idx); 459 + if (bar < 0) 460 + return bar; 461 461 462 462 if (base) 463 463 *base = pci_resource_start(ndev->ntb.pdev, bar) + offset; ··· 564 560 ndev->mw_count = readl(ndev->ctrl_reg + NTB_EPF_MW_COUNT); 565 561 ndev->spad_count = readl(ndev->ctrl_reg + NTB_EPF_SPAD_COUNT); 566 562 563 + if (ndev->mw_count > NTB_EPF_MAX_MW_COUNT) { 564 + dev_err(dev, "Unsupported MW count: %u\n", ndev->mw_count); 565 + return -EINVAL; 566 + } 567 + 567 568 return 0; 568 569 } 569 570 ··· 605 596 dev_warn(&pdev->dev, "Cannot DMA highmem\n"); 606 597 } 607 598 608 - ndev->ctrl_reg = pci_iomap(pdev, ndev->ctrl_reg_bar, 0); 599 + ndev->ctrl_reg = pci_iomap(pdev, ndev->barno_map[BAR_CONFIG], 0); 609 600 if (!ndev->ctrl_reg) { 610 601 ret = -EIO; 611 602 goto err_pci_regions; 612 603 } 613 604 614 - if (ndev->peer_spad_reg_bar) { 615 - ndev->peer_spad_reg = pci_iomap(pdev, ndev->peer_spad_reg_bar, 0); 605 + if (ndev->barno_map[BAR_PEER_SPAD] != ndev->barno_map[BAR_CONFIG]) { 606 + ndev->peer_spad_reg = pci_iomap(pdev, 607 + ndev->barno_map[BAR_PEER_SPAD], 0); 616 608 if (!ndev->peer_spad_reg) { 617 609 ret = -EIO; 618 610 goto err_pci_regions; ··· 624 614 ndev->peer_spad_reg = ndev->ctrl_reg + spad_off + spad_sz; 625 615 } 626 616 627 - ndev->db_reg = pci_iomap(pdev, ndev->db_reg_bar, 0); 617 + ndev->db_reg = pci_iomap(pdev, ndev->barno_map[BAR_DB], 0); 628 618 if (!ndev->db_reg) { 629 619 ret = -EIO; 630 620 goto err_pci_regions; ··· 669 659 static int ntb_epf_pci_probe(struct pci_dev *pdev, 670 660 const struct pci_device_id *id) 671 661 { 672 - enum pci_barno peer_spad_reg_bar = BAR_1; 673 - enum pci_barno ctrl_reg_bar = BAR_0; 674 - enum pci_barno db_reg_bar = BAR_2; 675 - enum pci_barno mw_bar = BAR_2; 676 662 struct device *dev = &pdev->dev; 677 - struct ntb_epf_data *data; 678 663 struct ntb_epf_dev *ndev; 679 664 int ret; 680 665 ··· 680 675 if (!ndev) 681 676 return -ENOMEM; 682 677 683 - data = (struct ntb_epf_data *)id->driver_data; 684 - if (data) { 685 - peer_spad_reg_bar = data->peer_spad_reg_bar; 686 - ctrl_reg_bar = data->ctrl_reg_bar; 687 - db_reg_bar = data->db_reg_bar; 688 - mw_bar = data->mw_bar; 689 - } 678 + ndev->barno_map = (const enum pci_barno *)id->driver_data; 679 + if (!ndev->barno_map) 680 + return -EINVAL; 690 681 691 - ndev->peer_spad_reg_bar = peer_spad_reg_bar; 692 - ndev->ctrl_reg_bar = ctrl_reg_bar; 693 - ndev->db_reg_bar = db_reg_bar; 694 - ndev->mw_bar = mw_bar; 695 682 ndev->dev = dev; 696 683 697 684 ntb_epf_init_struct(ndev, pdev); ··· 727 730 ntb_epf_deinit_pci(ndev); 728 731 } 729 732 730 - static const struct ntb_epf_data j721e_data = { 731 - .ctrl_reg_bar = BAR_0, 732 - .peer_spad_reg_bar = BAR_1, 733 - .db_reg_bar = BAR_2, 734 - .mw_bar = BAR_2, 733 + static const enum pci_barno j721e_map[NTB_BAR_NUM] = { 734 + [BAR_CONFIG] = BAR_0, 735 + [BAR_PEER_SPAD] = BAR_1, 736 + [BAR_DB] = BAR_2, 737 + [BAR_MW1] = BAR_2, 738 + [BAR_MW2] = BAR_3, 739 + [BAR_MW3] = BAR_4, 740 + [BAR_MW4] = BAR_5 735 741 }; 736 742 737 - static const struct ntb_epf_data mx8_data = { 738 - .ctrl_reg_bar = BAR_0, 739 - .peer_spad_reg_bar = BAR_0, 740 - .db_reg_bar = BAR_2, 741 - .mw_bar = BAR_4, 743 + static const enum pci_barno mx8_map[NTB_BAR_NUM] = { 744 + [BAR_CONFIG] = BAR_0, 745 + [BAR_PEER_SPAD] = BAR_0, 746 + [BAR_DB] = BAR_2, 747 + [BAR_MW1] = BAR_4, 748 + [BAR_MW2] = BAR_5, 749 + [BAR_MW3] = NO_BAR, 750 + [BAR_MW4] = NO_BAR 742 751 }; 743 752 744 753 static const struct pci_device_id ntb_epf_pci_tbl[] = { 745 754 { 746 755 PCI_DEVICE(PCI_VENDOR_ID_TI, PCI_DEVICE_ID_TI_J721E), 747 756 .class = PCI_CLASS_MEMORY_RAM << 8, .class_mask = 0xffff00, 748 - .driver_data = (kernel_ulong_t)&j721e_data, 757 + .driver_data = (kernel_ulong_t)j721e_map, 749 758 }, 750 759 { 751 760 PCI_DEVICE(PCI_VENDOR_ID_FREESCALE, 0x0809), 752 761 .class = PCI_CLASS_MEMORY_RAM << 8, .class_mask = 0xffff00, 753 - .driver_data = (kernel_ulong_t)&mx8_data, 762 + .driver_data = (kernel_ulong_t)mx8_map, 754 763 }, 755 764 { }, 756 765 };