Skip to content

Commit dcf50ca

Browse files
committed
Merge tag 'ntb-6.18' of https://github.com/jonmason/ntb
Pull NTB updates from Jon Mason: - Add support for Renesas R-Car and allow arbitrary BAR mapping in EPF - Update ntb_hw_amd to support the latest generation secondary topology and add a new maintainer - Fix a bug by adding a mutex to ensure `link_event_callback` executes sequentially * tag 'ntb-6.18' of https://github.com/jonmason/ntb: NTB: epf: Add Renesas rcar support NTB: epf: Allow arbitrary BAR mapping ntb: Add mutex to make link_event_callback executed linearly. MAINTAINERS: Update for the NTB AMD driver maintainer ntb_hw_amd: Update amd_ntb_get_link_status to support latest generation secondary topology
2 parents aac3190 + 006824a commit dcf50ca

File tree

5 files changed

+94
-51
lines changed

5 files changed

+94
-51
lines changed

MAINTAINERS

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18338,6 +18338,7 @@ F: Documentation/core-api/symbol-namespaces.rst
1833818338
F: scripts/nsdeps
1833918339

1834018340
NTB AMD DRIVER
18341+
M: Basavaraj Natikar <Basavaraj.Natikar@amd.com>
1834118342
M: Shyam Sundar S K <Shyam-sundar.S-k@amd.com>
1834218343
L: ntb@lists.linux.dev
1834318344
S: Supported

drivers/ntb/hw/amd/ntb_hw_amd.c

Lines changed: 17 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -197,13 +197,22 @@ static int amd_ntb_mw_set_trans(struct ntb_dev *ntb, int pidx, int idx,
197197

198198
static int amd_ntb_get_link_status(struct amd_ntb_dev *ndev)
199199
{
200-
struct pci_dev *pdev = NULL;
200+
struct pci_dev *pdev = ndev->ntb.pdev;
201201
struct pci_dev *pci_swds = NULL;
202202
struct pci_dev *pci_swus = NULL;
203203
u32 stat;
204204
int rc;
205205

206206
if (ndev->ntb.topo == NTB_TOPO_SEC) {
207+
if (ndev->dev_data->is_endpoint) {
208+
rc = pcie_capability_read_dword(pdev, PCI_EXP_LNKCTL, &stat);
209+
if (rc)
210+
return rc;
211+
212+
ndev->lnk_sta = stat;
213+
return 0;
214+
}
215+
207216
/* Locate the pointer to Downstream Switch for this device */
208217
pci_swds = pci_upstream_bridge(ndev->ntb.pdev);
209218
if (pci_swds) {
@@ -1311,6 +1320,11 @@ static const struct ntb_dev_data dev_data[] = {
13111320
.mw_count = 2,
13121321
.mw_idx = 2,
13131322
},
1323+
{ /* for device 0x17d7 */
1324+
.mw_count = 2,
1325+
.mw_idx = 2,
1326+
.is_endpoint = true,
1327+
},
13141328
};
13151329

13161330
static const struct pci_device_id amd_ntb_pci_tbl[] = {
@@ -1319,6 +1333,8 @@ static const struct pci_device_id amd_ntb_pci_tbl[] = {
13191333
{ PCI_VDEVICE(AMD, 0x14c0), (kernel_ulong_t)&dev_data[1] },
13201334
{ PCI_VDEVICE(AMD, 0x14c3), (kernel_ulong_t)&dev_data[1] },
13211335
{ PCI_VDEVICE(AMD, 0x155a), (kernel_ulong_t)&dev_data[1] },
1336+
{ PCI_VDEVICE(AMD, 0x17d4), (kernel_ulong_t)&dev_data[1] },
1337+
{ PCI_VDEVICE(AMD, 0x17d7), (kernel_ulong_t)&dev_data[2] },
13221338
{ PCI_VDEVICE(HYGON, 0x145b), (kernel_ulong_t)&dev_data[0] },
13231339
{ 0, }
13241340
};

drivers/ntb/hw/amd/ntb_hw_amd.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -168,6 +168,7 @@ enum {
168168
struct ntb_dev_data {
169169
const unsigned char mw_count;
170170
const unsigned int mw_idx;
171+
const bool is_endpoint;
171172
};
172173

173174
struct amd_ntb_dev;

drivers/ntb/hw/epf/ntb_hw_epf.c

Lines changed: 68 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,51 @@ 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
748+
};
749+
750+
static const enum pci_barno rcar_barno[NTB_BAR_NUM] = {
751+
[BAR_CONFIG] = BAR_0,
752+
[BAR_PEER_SPAD] = BAR_0,
753+
[BAR_DB] = BAR_4,
754+
[BAR_MW1] = BAR_2,
755+
[BAR_MW2] = NO_BAR,
756+
[BAR_MW3] = NO_BAR,
757+
[BAR_MW4] = NO_BAR,
745758
};
746759

747760
static const struct pci_device_id ntb_epf_pci_tbl[] = {
748761
{
749762
PCI_DEVICE(PCI_VENDOR_ID_TI, PCI_DEVICE_ID_TI_J721E),
750763
.class = PCI_CLASS_MEMORY_RAM << 8, .class_mask = 0xffff00,
751-
.driver_data = (kernel_ulong_t)&j721e_data,
764+
.driver_data = (kernel_ulong_t)j721e_map,
752765
},
753766
{
754767
PCI_DEVICE(PCI_VENDOR_ID_FREESCALE, 0x0809),
755768
.class = PCI_CLASS_MEMORY_RAM << 8, .class_mask = 0xffff00,
756-
.driver_data = (kernel_ulong_t)&mx8_data,
769+
.driver_data = (kernel_ulong_t)mx8_map,
770+
},
771+
{
772+
PCI_DEVICE(PCI_VENDOR_ID_RENESAS, 0x0030),
773+
.class = PCI_CLASS_MEMORY_RAM << 8, .class_mask = 0xffff00,
774+
.driver_data = (kernel_ulong_t)rcar_barno,
757775
},
758776
{ },
759777
};

drivers/ntb/ntb_transport.c

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -59,6 +59,7 @@
5959
#include <linux/slab.h>
6060
#include <linux/types.h>
6161
#include <linux/uaccess.h>
62+
#include <linux/mutex.h>
6263
#include "linux/ntb.h"
6364
#include "linux/ntb_transport.h"
6465

@@ -241,6 +242,9 @@ struct ntb_transport_ctx {
241242
struct work_struct link_cleanup;
242243

243244
struct dentry *debugfs_node_dir;
245+
246+
/* Make sure workq of link event be executed serially */
247+
struct mutex link_event_lock;
244248
};
245249

246250
enum {
@@ -1024,6 +1028,7 @@ static void ntb_transport_link_cleanup_work(struct work_struct *work)
10241028
struct ntb_transport_ctx *nt =
10251029
container_of(work, struct ntb_transport_ctx, link_cleanup);
10261030

1031+
guard(mutex)(&nt->link_event_lock);
10271032
ntb_transport_link_cleanup(nt);
10281033
}
10291034

@@ -1047,6 +1052,8 @@ static void ntb_transport_link_work(struct work_struct *work)
10471052
u32 val;
10481053
int rc = 0, i, spad;
10491054

1055+
guard(mutex)(&nt->link_event_lock);
1056+
10501057
/* send the local info, in the opposite order of the way we read it */
10511058

10521059
if (nt->use_msi) {

0 commit comments

Comments
 (0)