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

NTB: epf: Allow more flexibility in the memory BAR map method

Support the below BAR configuration methods for epf NTB.

BAR 0: config and scratchpad
BAR 2: doorbell
BAR 4: memory map windows

Set difference BAR number information into struct ntb_epf_data. So difference
VID/PID can choose different BAR configurations. There are difference
BAR map method between epf NTB and epf vNTB Endpoint function.

Signed-off-by: Frank Li <Frank.Li@nxp.com>
Signed-off-by: Jon Mason <jdmason@kudzu.us>

authored by

Frank Li and committed by
Jon Mason
e75d5ae8 4284c88f

+35 -13
+35 -13
drivers/ntb/hw/epf/ntb_hw_epf.c
··· 45 45 46 46 #define NTB_EPF_MIN_DB_COUNT 3 47 47 #define NTB_EPF_MAX_DB_COUNT 31 48 - #define NTB_EPF_MW_OFFSET 2 49 48 50 49 #define NTB_EPF_COMMAND_TIMEOUT 1000 /* 1 Sec */ 51 50 ··· 66 67 enum pci_barno ctrl_reg_bar; 67 68 enum pci_barno peer_spad_reg_bar; 68 69 enum pci_barno db_reg_bar; 70 + enum pci_barno mw_bar; 69 71 70 72 unsigned int mw_count; 71 73 unsigned int spad_count; ··· 92 92 enum pci_barno peer_spad_reg_bar; 93 93 /* BAR that contains Doorbell region and Memory window '1' */ 94 94 enum pci_barno db_reg_bar; 95 + /* BAR that contains memory windows*/ 96 + enum pci_barno mw_bar; 95 97 }; 96 98 97 99 static int ntb_epf_send_command(struct ntb_epf_dev *ndev, u32 command, ··· 413 411 return -EINVAL; 414 412 } 415 413 416 - bar = idx + NTB_EPF_MW_OFFSET; 414 + bar = idx + ndev->mw_bar; 417 415 418 416 mw_size = pci_resource_len(ntb->pdev, bar); 419 417 ··· 455 453 if (idx == 0) 456 454 offset = readl(ndev->ctrl_reg + NTB_EPF_MW1_OFFSET); 457 455 458 - bar = idx + NTB_EPF_MW_OFFSET; 456 + bar = idx + ndev->mw_bar; 459 457 460 458 if (base) 461 459 *base = pci_resource_start(ndev->ntb.pdev, bar) + offset; ··· 567 565 struct pci_dev *pdev) 568 566 { 569 567 struct device *dev = ndev->dev; 568 + size_t spad_sz, spad_off; 570 569 int ret; 571 570 572 571 pci_set_drvdata(pdev, ndev); ··· 602 599 goto err_dma_mask; 603 600 } 604 601 605 - ndev->peer_spad_reg = pci_iomap(pdev, ndev->peer_spad_reg_bar, 0); 606 - if (!ndev->peer_spad_reg) { 607 - ret = -EIO; 608 - goto err_dma_mask; 602 + if (ndev->peer_spad_reg_bar) { 603 + ndev->peer_spad_reg = pci_iomap(pdev, ndev->peer_spad_reg_bar, 0); 604 + if (!ndev->peer_spad_reg) { 605 + ret = -EIO; 606 + goto err_dma_mask; 607 + } 608 + } else { 609 + spad_sz = 4 * readl(ndev->ctrl_reg + NTB_EPF_SPAD_COUNT); 610 + spad_off = readl(ndev->ctrl_reg + NTB_EPF_SPAD_OFFSET); 611 + ndev->peer_spad_reg = ndev->ctrl_reg + spad_off + spad_sz; 609 612 } 610 613 611 614 ndev->db_reg = pci_iomap(pdev, ndev->db_reg_bar, 0); ··· 666 657 enum pci_barno peer_spad_reg_bar = BAR_1; 667 658 enum pci_barno ctrl_reg_bar = BAR_0; 668 659 enum pci_barno db_reg_bar = BAR_2; 660 + enum pci_barno mw_bar = BAR_2; 669 661 struct device *dev = &pdev->dev; 670 662 struct ntb_epf_data *data; 671 663 struct ntb_epf_dev *ndev; ··· 681 671 682 672 data = (struct ntb_epf_data *)id->driver_data; 683 673 if (data) { 684 - if (data->peer_spad_reg_bar) 685 - peer_spad_reg_bar = data->peer_spad_reg_bar; 686 - if (data->ctrl_reg_bar) 687 - ctrl_reg_bar = data->ctrl_reg_bar; 688 - if (data->db_reg_bar) 689 - db_reg_bar = data->db_reg_bar; 674 + peer_spad_reg_bar = data->peer_spad_reg_bar; 675 + ctrl_reg_bar = data->ctrl_reg_bar; 676 + db_reg_bar = data->db_reg_bar; 677 + mw_bar = data->mw_bar; 690 678 } 691 679 692 680 ndev->peer_spad_reg_bar = peer_spad_reg_bar; 693 681 ndev->ctrl_reg_bar = ctrl_reg_bar; 694 682 ndev->db_reg_bar = db_reg_bar; 683 + ndev->mw_bar = mw_bar; 695 684 ndev->dev = dev; 696 685 697 686 ntb_epf_init_struct(ndev, pdev); ··· 738 729 .ctrl_reg_bar = BAR_0, 739 730 .peer_spad_reg_bar = BAR_1, 740 731 .db_reg_bar = BAR_2, 732 + .mw_bar = BAR_2, 733 + }; 734 + 735 + static const struct ntb_epf_data mx8_data = { 736 + .ctrl_reg_bar = BAR_0, 737 + .peer_spad_reg_bar = BAR_0, 738 + .db_reg_bar = BAR_2, 739 + .mw_bar = BAR_4, 741 740 }; 742 741 743 742 static const struct pci_device_id ntb_epf_pci_tbl[] = { ··· 753 736 PCI_DEVICE(PCI_VENDOR_ID_TI, PCI_DEVICE_ID_TI_J721E), 754 737 .class = PCI_CLASS_MEMORY_RAM << 8, .class_mask = 0xffff00, 755 738 .driver_data = (kernel_ulong_t)&j721e_data, 739 + }, 740 + { 741 + PCI_DEVICE(PCI_VENDOR_ID_FREESCALE, 0x0809), 742 + .class = PCI_CLASS_MEMORY_RAM << 8, .class_mask = 0xffff00, 743 + .driver_data = (kernel_ulong_t)&mx8_data, 756 744 }, 757 745 { }, 758 746 };