RE: [PATCH v3 2/9] NTB: Add indexed ports NTB API
From: Serge Semin > There is some NTB hardware, which can combine more than just two domains > over NTB. For instance, some IDT PCIe-switches can have NTB-functions > activated on more than two-ports. The different domains are distinguished > by ports they are connected to. So the new port-related methods are added to > the NTB API: > ntb_port_number() - return local port > ntb_peer_port_count() - return number of peers local port can connect to > ntb_peer_port_number(pdix) - return port number by it index > ntb_peer_port_idx(port) - return port index by it number > > Current test-drivers aren't changed much. They still support two-ports devices > for the time being while multi-ports hardware drivers aren't added. > > By default port-related API is declared for two-ports hardware. > So corresponding hardware drivers won't need to implement it. > > Signed-off-by: Serge SeminAcked-by: Allen Hubbe > --- > drivers/ntb/ntb.c | 54 ++ > drivers/ntb/ntb_transport.c | 6 ++ > drivers/ntb/test/ntb_perf.c | 4 ++ > drivers/ntb/test/ntb_pingpong.c | 6 ++ > drivers/ntb/test/ntb_tool.c | 5 ++ > include/linux/ntb.h | 156 > > 6 files changed, 231 insertions(+) > > diff --git a/drivers/ntb/ntb.c b/drivers/ntb/ntb.c > index 2e25307..1e92e52 100644 > --- a/drivers/ntb/ntb.c > +++ b/drivers/ntb/ntb.c > @@ -191,6 +191,60 @@ void ntb_db_event(struct ntb_dev *ntb, int vector) > } > EXPORT_SYMBOL(ntb_db_event); > > +int ntb_default_port_number(struct ntb_dev *ntb) > +{ > + switch (ntb->topo) { > + case NTB_TOPO_PRI: > + case NTB_TOPO_B2B_USD: > + return NTB_PORT_PRI_USD; > + case NTB_TOPO_SEC: > + case NTB_TOPO_B2B_DSD: > + return NTB_PORT_SEC_DSD; > + default: > + break; > + } > + > + return -EINVAL; > +} > +EXPORT_SYMBOL(ntb_default_port_number); > + > +int ntb_default_peer_port_count(struct ntb_dev *ntb) > +{ > + return NTB_DEF_PEER_CNT; > +} > +EXPORT_SYMBOL(ntb_default_peer_port_count); > + > +int ntb_default_peer_port_number(struct ntb_dev *ntb, int pidx) > +{ > + if (pidx != NTB_DEF_PEER_IDX) > + return -EINVAL; > + > + switch (ntb->topo) { > + case NTB_TOPO_PRI: > + case NTB_TOPO_B2B_USD: > + return NTB_PORT_SEC_DSD; > + case NTB_TOPO_SEC: > + case NTB_TOPO_B2B_DSD: > + return NTB_PORT_PRI_USD; > + default: > + break; > + } > + > + return -EINVAL; > +} > +EXPORT_SYMBOL(ntb_default_peer_port_number); > + > +int ntb_default_peer_port_idx(struct ntb_dev *ntb, int port) > +{ > + int peer_port = ntb_default_peer_port_number(ntb, NTB_DEF_PEER_IDX); > + > + if (peer_port == -EINVAL || port != peer_port) > + return -EINVAL; > + > + return 0; > +} > +EXPORT_SYMBOL(ntb_default_peer_port_idx); > + > static int ntb_probe(struct device *dev) > { > struct ntb_dev *ntb; > diff --git a/drivers/ntb/ntb_transport.c b/drivers/ntb/ntb_transport.c > index 4eb8adb..10518b7 100644 > --- a/drivers/ntb/ntb_transport.c > +++ b/drivers/ntb/ntb_transport.c > @@ -94,6 +94,9 @@ MODULE_PARM_DESC(use_dma, "Use DMA engine to perform large > data copy"); > > static struct dentry *nt_debugfs_dir; > > +/* Only two-ports NTB devices are supported */ > +#define PIDX NTB_DEF_PEER_IDX > + > struct ntb_queue_entry { > /* ntb_queue list reference */ > struct list_head entry; > @@ -1083,6 +1086,9 @@ static int ntb_transport_probe(struct ntb_client *self, > struct > ntb_dev *ndev) > dev_dbg(>dev, > "scratchpad is unsafe, proceed anyway...\n"); > > + if (ntb_peer_port_count(ndev) != NTB_DEF_PEER_CNT) > + dev_warn(>dev, "Multi-port NTB devices unsupported\n"); > + > node = dev_to_node(>dev); > > nt = kzalloc_node(sizeof(*nt), GFP_KERNEL, node); > diff --git a/drivers/ntb/test/ntb_perf.c b/drivers/ntb/test/ntb_perf.c > index e75d4fd..c908b3a 100644 > --- a/drivers/ntb/test/ntb_perf.c > +++ b/drivers/ntb/test/ntb_perf.c > @@ -76,6 +76,7 @@ > #define DMA_RETRIES 20 > #define SZ_4G(1ULL << 32) > #define MAX_SEG_ORDER20 /* no larger than 1M for kmalloc > buffer */ > +#define PIDX NTB_DEF_PEER_IDX > > MODULE_LICENSE(DRIVER_LICENSE); > MODULE_VERSION(DRIVER_VERSION); > @@ -764,6 +765,9 @@ static int perf_probe(struct ntb_client *client, struct > ntb_dev *ntb) > return -EIO; > } > > + if (ntb_peer_port_count(ntb) != NTB_DEF_PEER_CNT) > + dev_warn(>dev, "Multi-port NTB devices unsupported\n"); > + > node = dev_to_node(>dev); > > perf = kzalloc_node(sizeof(*perf), GFP_KERNEL, node); > diff --git a/drivers/ntb/test/ntb_pingpong.c b/drivers/ntb/test/ntb_pingpong.c > index 4358611..12f8b40 100644 > ---
RE: [PATCH v3 2/9] NTB: Add indexed ports NTB API
From: Serge Semin > There is some NTB hardware, which can combine more than just two domains > over NTB. For instance, some IDT PCIe-switches can have NTB-functions > activated on more than two-ports. The different domains are distinguished > by ports they are connected to. So the new port-related methods are added to > the NTB API: > ntb_port_number() - return local port > ntb_peer_port_count() - return number of peers local port can connect to > ntb_peer_port_number(pdix) - return port number by it index > ntb_peer_port_idx(port) - return port index by it number > > Current test-drivers aren't changed much. They still support two-ports devices > for the time being while multi-ports hardware drivers aren't added. > > By default port-related API is declared for two-ports hardware. > So corresponding hardware drivers won't need to implement it. > > Signed-off-by: Serge Semin Acked-by: Allen Hubbe > --- > drivers/ntb/ntb.c | 54 ++ > drivers/ntb/ntb_transport.c | 6 ++ > drivers/ntb/test/ntb_perf.c | 4 ++ > drivers/ntb/test/ntb_pingpong.c | 6 ++ > drivers/ntb/test/ntb_tool.c | 5 ++ > include/linux/ntb.h | 156 > > 6 files changed, 231 insertions(+) > > diff --git a/drivers/ntb/ntb.c b/drivers/ntb/ntb.c > index 2e25307..1e92e52 100644 > --- a/drivers/ntb/ntb.c > +++ b/drivers/ntb/ntb.c > @@ -191,6 +191,60 @@ void ntb_db_event(struct ntb_dev *ntb, int vector) > } > EXPORT_SYMBOL(ntb_db_event); > > +int ntb_default_port_number(struct ntb_dev *ntb) > +{ > + switch (ntb->topo) { > + case NTB_TOPO_PRI: > + case NTB_TOPO_B2B_USD: > + return NTB_PORT_PRI_USD; > + case NTB_TOPO_SEC: > + case NTB_TOPO_B2B_DSD: > + return NTB_PORT_SEC_DSD; > + default: > + break; > + } > + > + return -EINVAL; > +} > +EXPORT_SYMBOL(ntb_default_port_number); > + > +int ntb_default_peer_port_count(struct ntb_dev *ntb) > +{ > + return NTB_DEF_PEER_CNT; > +} > +EXPORT_SYMBOL(ntb_default_peer_port_count); > + > +int ntb_default_peer_port_number(struct ntb_dev *ntb, int pidx) > +{ > + if (pidx != NTB_DEF_PEER_IDX) > + return -EINVAL; > + > + switch (ntb->topo) { > + case NTB_TOPO_PRI: > + case NTB_TOPO_B2B_USD: > + return NTB_PORT_SEC_DSD; > + case NTB_TOPO_SEC: > + case NTB_TOPO_B2B_DSD: > + return NTB_PORT_PRI_USD; > + default: > + break; > + } > + > + return -EINVAL; > +} > +EXPORT_SYMBOL(ntb_default_peer_port_number); > + > +int ntb_default_peer_port_idx(struct ntb_dev *ntb, int port) > +{ > + int peer_port = ntb_default_peer_port_number(ntb, NTB_DEF_PEER_IDX); > + > + if (peer_port == -EINVAL || port != peer_port) > + return -EINVAL; > + > + return 0; > +} > +EXPORT_SYMBOL(ntb_default_peer_port_idx); > + > static int ntb_probe(struct device *dev) > { > struct ntb_dev *ntb; > diff --git a/drivers/ntb/ntb_transport.c b/drivers/ntb/ntb_transport.c > index 4eb8adb..10518b7 100644 > --- a/drivers/ntb/ntb_transport.c > +++ b/drivers/ntb/ntb_transport.c > @@ -94,6 +94,9 @@ MODULE_PARM_DESC(use_dma, "Use DMA engine to perform large > data copy"); > > static struct dentry *nt_debugfs_dir; > > +/* Only two-ports NTB devices are supported */ > +#define PIDX NTB_DEF_PEER_IDX > + > struct ntb_queue_entry { > /* ntb_queue list reference */ > struct list_head entry; > @@ -1083,6 +1086,9 @@ static int ntb_transport_probe(struct ntb_client *self, > struct > ntb_dev *ndev) > dev_dbg(>dev, > "scratchpad is unsafe, proceed anyway...\n"); > > + if (ntb_peer_port_count(ndev) != NTB_DEF_PEER_CNT) > + dev_warn(>dev, "Multi-port NTB devices unsupported\n"); > + > node = dev_to_node(>dev); > > nt = kzalloc_node(sizeof(*nt), GFP_KERNEL, node); > diff --git a/drivers/ntb/test/ntb_perf.c b/drivers/ntb/test/ntb_perf.c > index e75d4fd..c908b3a 100644 > --- a/drivers/ntb/test/ntb_perf.c > +++ b/drivers/ntb/test/ntb_perf.c > @@ -76,6 +76,7 @@ > #define DMA_RETRIES 20 > #define SZ_4G(1ULL << 32) > #define MAX_SEG_ORDER20 /* no larger than 1M for kmalloc > buffer */ > +#define PIDX NTB_DEF_PEER_IDX > > MODULE_LICENSE(DRIVER_LICENSE); > MODULE_VERSION(DRIVER_VERSION); > @@ -764,6 +765,9 @@ static int perf_probe(struct ntb_client *client, struct > ntb_dev *ntb) > return -EIO; > } > > + if (ntb_peer_port_count(ntb) != NTB_DEF_PEER_CNT) > + dev_warn(>dev, "Multi-port NTB devices unsupported\n"); > + > node = dev_to_node(>dev); > > perf = kzalloc_node(sizeof(*perf), GFP_KERNEL, node); > diff --git a/drivers/ntb/test/ntb_pingpong.c b/drivers/ntb/test/ntb_pingpong.c > index 4358611..12f8b40 100644 > --- a/drivers/ntb/test/ntb_pingpong.c > +++