Skip to content

Commit 5ad8658

Browse files
jbrun3tjonmason
authored andcommitted
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>
1 parent 3db835d commit 5ad8658

File tree

1 file changed

+53
-50
lines changed

1 file changed

+53
-50
lines changed

drivers/ntb/hw/epf/ntb_hw_epf.c

Lines changed: 53 additions & 50 deletions
Original file line numberDiff line numberDiff line change
@@ -49,6 +49,7 @@
4949
#define NTB_EPF_COMMAND_TIMEOUT 1000 /* 1 Sec */
5050

5151
enum pci_barno {
52+
NO_BAR = -1,
5253
BAR_0,
5354
BAR_1,
5455
BAR_2,
@@ -57,16 +58,26 @@ enum pci_barno {
5758
BAR_5,
5859
};
5960

61+
enum epf_ntb_bar {
62+
BAR_CONFIG,
63+
BAR_PEER_SPAD,
64+
BAR_DB,
65+
BAR_MW1,
66+
BAR_MW2,
67+
BAR_MW3,
68+
BAR_MW4,
69+
NTB_BAR_NUM,
70+
};
71+
72+
#define NTB_EPF_MAX_MW_COUNT (NTB_BAR_NUM - BAR_MW1)
73+
6074
struct ntb_epf_dev {
6175
struct ntb_dev ntb;
6276
struct device *dev;
6377
/* Mutex to protect providing commands to NTB EPF */
6478
struct mutex cmd_lock;
6579

66-
enum pci_barno ctrl_reg_bar;
67-
enum pci_barno peer_spad_reg_bar;
68-
enum pci_barno db_reg_bar;
69-
enum pci_barno mw_bar;
80+
const enum pci_barno *barno_map;
7081

7182
unsigned int mw_count;
7283
unsigned int spad_count;
@@ -85,17 +96,6 @@ struct ntb_epf_dev {
8596

8697
#define ntb_ndev(__ntb) container_of(__ntb, struct ntb_epf_dev, ntb)
8798

88-
struct ntb_epf_data {
89-
/* BAR that contains both control region and self spad region */
90-
enum pci_barno ctrl_reg_bar;
91-
/* BAR that contains peer spad region */
92-
enum pci_barno peer_spad_reg_bar;
93-
/* BAR that contains Doorbell region and Memory window '1' */
94-
enum pci_barno db_reg_bar;
95-
/* BAR that contains memory windows*/
96-
enum pci_barno mw_bar;
97-
};
98-
9999
static int ntb_epf_send_command(struct ntb_epf_dev *ndev, u32 command,
100100
u32 argument)
101101
{
@@ -144,7 +144,7 @@ static int ntb_epf_mw_to_bar(struct ntb_epf_dev *ndev, int idx)
144144
return -EINVAL;
145145
}
146146

147-
return idx + 2;
147+
return ndev->barno_map[BAR_MW1 + idx];
148148
}
149149

150150
static int ntb_epf_mw_count(struct ntb_dev *ntb, int pidx)
@@ -413,7 +413,9 @@ static int ntb_epf_mw_set_trans(struct ntb_dev *ntb, int pidx, int idx,
413413
return -EINVAL;
414414
}
415415

416-
bar = idx + ndev->mw_bar;
416+
bar = ntb_epf_mw_to_bar(ndev, idx);
417+
if (bar < 0)
418+
return bar;
417419

418420
mw_size = pci_resource_len(ntb->pdev, bar);
419421

@@ -455,7 +457,9 @@ static int ntb_epf_peer_mw_get_addr(struct ntb_dev *ntb, int idx,
455457
if (idx == 0)
456458
offset = readl(ndev->ctrl_reg + NTB_EPF_MW1_OFFSET);
457459

458-
bar = idx + ndev->mw_bar;
460+
bar = ntb_epf_mw_to_bar(ndev, idx);
461+
if (bar < 0)
462+
return bar;
459463

460464
if (base)
461465
*base = pci_resource_start(ndev->ntb.pdev, bar) + offset;
@@ -560,6 +564,11 @@ static int ntb_epf_init_dev(struct ntb_epf_dev *ndev)
560564
ndev->mw_count = readl(ndev->ctrl_reg + NTB_EPF_MW_COUNT);
561565
ndev->spad_count = readl(ndev->ctrl_reg + NTB_EPF_SPAD_COUNT);
562566

567+
if (ndev->mw_count > NTB_EPF_MAX_MW_COUNT) {
568+
dev_err(dev, "Unsupported MW count: %u\n", ndev->mw_count);
569+
return -EINVAL;
570+
}
571+
563572
return 0;
564573
}
565574

@@ -596,14 +605,15 @@ static int ntb_epf_init_pci(struct ntb_epf_dev *ndev,
596605
dev_warn(&pdev->dev, "Cannot DMA highmem\n");
597606
}
598607

599-
ndev->ctrl_reg = pci_iomap(pdev, ndev->ctrl_reg_bar, 0);
608+
ndev->ctrl_reg = pci_iomap(pdev, ndev->barno_map[BAR_CONFIG], 0);
600609
if (!ndev->ctrl_reg) {
601610
ret = -EIO;
602611
goto err_pci_regions;
603612
}
604613

605-
if (ndev->peer_spad_reg_bar) {
606-
ndev->peer_spad_reg = pci_iomap(pdev, ndev->peer_spad_reg_bar, 0);
614+
if (ndev->barno_map[BAR_PEER_SPAD] != ndev->barno_map[BAR_CONFIG]) {
615+
ndev->peer_spad_reg = pci_iomap(pdev,
616+
ndev->barno_map[BAR_PEER_SPAD], 0);
607617
if (!ndev->peer_spad_reg) {
608618
ret = -EIO;
609619
goto err_pci_regions;
@@ -614,7 +624,7 @@ static int ntb_epf_init_pci(struct ntb_epf_dev *ndev,
614624
ndev->peer_spad_reg = ndev->ctrl_reg + spad_off + spad_sz;
615625
}
616626

617-
ndev->db_reg = pci_iomap(pdev, ndev->db_reg_bar, 0);
627+
ndev->db_reg = pci_iomap(pdev, ndev->barno_map[BAR_DB], 0);
618628
if (!ndev->db_reg) {
619629
ret = -EIO;
620630
goto err_pci_regions;
@@ -659,12 +669,7 @@ static void ntb_epf_cleanup_isr(struct ntb_epf_dev *ndev)
659669
static int ntb_epf_pci_probe(struct pci_dev *pdev,
660670
const struct pci_device_id *id)
661671
{
662-
enum pci_barno peer_spad_reg_bar = BAR_1;
663-
enum pci_barno ctrl_reg_bar = BAR_0;
664-
enum pci_barno db_reg_bar = BAR_2;
665-
enum pci_barno mw_bar = BAR_2;
666672
struct device *dev = &pdev->dev;
667-
struct ntb_epf_data *data;
668673
struct ntb_epf_dev *ndev;
669674
int ret;
670675

@@ -675,18 +680,10 @@ static int ntb_epf_pci_probe(struct pci_dev *pdev,
675680
if (!ndev)
676681
return -ENOMEM;
677682

678-
data = (struct ntb_epf_data *)id->driver_data;
679-
if (data) {
680-
peer_spad_reg_bar = data->peer_spad_reg_bar;
681-
ctrl_reg_bar = data->ctrl_reg_bar;
682-
db_reg_bar = data->db_reg_bar;
683-
mw_bar = data->mw_bar;
684-
}
683+
ndev->barno_map = (const enum pci_barno *)id->driver_data;
684+
if (!ndev->barno_map)
685+
return -EINVAL;
685686

686-
ndev->peer_spad_reg_bar = peer_spad_reg_bar;
687-
ndev->ctrl_reg_bar = ctrl_reg_bar;
688-
ndev->db_reg_bar = db_reg_bar;
689-
ndev->mw_bar = mw_bar;
690687
ndev->dev = dev;
691688

692689
ntb_epf_init_struct(ndev, pdev);
@@ -730,30 +727,36 @@ static void ntb_epf_pci_remove(struct pci_dev *pdev)
730727
ntb_epf_deinit_pci(ndev);
731728
}
732729

733-
static const struct ntb_epf_data j721e_data = {
734-
.ctrl_reg_bar = BAR_0,
735-
.peer_spad_reg_bar = BAR_1,
736-
.db_reg_bar = BAR_2,
737-
.mw_bar = BAR_2,
730+
static const enum pci_barno j721e_map[NTB_BAR_NUM] = {
731+
[BAR_CONFIG] = BAR_0,
732+
[BAR_PEER_SPAD] = BAR_1,
733+
[BAR_DB] = BAR_2,
734+
[BAR_MW1] = BAR_2,
735+
[BAR_MW2] = BAR_3,
736+
[BAR_MW3] = BAR_4,
737+
[BAR_MW4] = BAR_5
738738
};
739739

740-
static const struct ntb_epf_data mx8_data = {
741-
.ctrl_reg_bar = BAR_0,
742-
.peer_spad_reg_bar = BAR_0,
743-
.db_reg_bar = BAR_2,
744-
.mw_bar = BAR_4,
740+
static const enum pci_barno mx8_map[NTB_BAR_NUM] = {
741+
[BAR_CONFIG] = BAR_0,
742+
[BAR_PEER_SPAD] = BAR_0,
743+
[BAR_DB] = BAR_2,
744+
[BAR_MW1] = BAR_4,
745+
[BAR_MW2] = BAR_5,
746+
[BAR_MW3] = NO_BAR,
747+
[BAR_MW4] = NO_BAR
745748
};
746749

747750
static const struct pci_device_id ntb_epf_pci_tbl[] = {
748751
{
749752
PCI_DEVICE(PCI_VENDOR_ID_TI, PCI_DEVICE_ID_TI_J721E),
750753
.class = PCI_CLASS_MEMORY_RAM << 8, .class_mask = 0xffff00,
751-
.driver_data = (kernel_ulong_t)&j721e_data,
754+
.driver_data = (kernel_ulong_t)j721e_map,
752755
},
753756
{
754757
PCI_DEVICE(PCI_VENDOR_ID_FREESCALE, 0x0809),
755758
.class = PCI_CLASS_MEMORY_RAM << 8, .class_mask = 0xffff00,
756-
.driver_data = (kernel_ulong_t)&mx8_data,
759+
.driver_data = (kernel_ulong_t)mx8_map,
757760
},
758761
{ },
759762
};

0 commit comments

Comments
 (0)