Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1752094AbcLDAlb (ORCPT ); Sat, 3 Dec 2016 19:41:31 -0500 Received: from esa7.dell-outbound.iphmx.com ([68.232.153.96]:4857 "EHLO esa7.dell-outbound.iphmx.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1751638AbcLDAla (ORCPT ); Sat, 3 Dec 2016 19:41:30 -0500 DomainKey-Signature: s=smtpout; d=dell.com; c=simple; q=dns; h=Received:Received:Received:X-DKIM:Received:Received:From: To:Cc:Subject:Date:Message-ID:MIME-Version:Content-Type: Content-Transfer-Encoding:X-Mailer:Content-Language: Thread-Index:X-RSA-Classifications:X-Sentrion-Hostname; b=sdvkwiQnejJxb/+efnqxZDIxjTj6Gaqi3ZhFGh5Prl1UE/OBiYJTU0mr X0P84A7Yx90/v0X2FKQDqSW6t9qE7nVq7J9BjhNdUMW9JD+jopiuANh6h Y247GQmWI+f4GogKWIzuMBaHDxh95scVPJLHxuftlhJWCXxylAZLk3ctC s=; X-DKIM: OpenDKIM Filter v2.4.3 mailuogwprd02.lss.emc.com uB404bON014015 From: "Allen Hubbe" To: "'Serge Semin'" , , , Cc: , , Subject: RE: [PATCH 02/22] NTB: Add peer indexed ports NTB API Date: Sat, 3 Dec 2016 19:04:18 -0500 Message-ID: <003d01d24dc1$f5ba4d60$e12ee820$@dell.com> MIME-Version: 1.0 Content-Type: text/plain; charset="Windows-1252" Content-Transfer-Encoding: 7bit X-Mailer: Microsoft Outlook 14.0 Content-Language: en-us Thread-Index: AdJNwe0GkNEPhjRtSzKoPh8KwbdwOw== X-RSA-Classifications: public X-Sentrion-Hostname: mailuogwprd02.lss.emc.com Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Content-Length: 5920 Lines: 180 From: Serge Semin > Add new port-index NTB API. Additionally lets get rid of Primary and > Secondary topologies, since port-number can be effectively used instead. Split into two patches please. I see no harm to the TOPO changes, though I wonder if they are necessary. > Signed-off-by: Serge Semin > > --- > include/linux/ntb.h | 101 ++++++++++++++++++++++++++++++++++++++++------------ > 1 file changed, 79 insertions(+), 22 deletions(-) > > diff --git a/include/linux/ntb.h b/include/linux/ntb.h > index 5d1f260..0941a43 100644 > --- a/include/linux/ntb.h > +++ b/include/linux/ntb.h > @@ -64,37 +64,21 @@ struct pci_dev; > /** > * enum ntb_topo - NTB connection topology > * @NTB_TOPO_NONE: Topology is unknown or invalid. > - * @NTB_TOPO_PRI: On primary side of local ntb. > - * @NTB_TOPO_SEC: On secondary side of remote ntb. > - * @NTB_TOPO_B2B_USD: On primary side of local ntb upstream of remote ntb. > - * @NTB_TOPO_B2B_DSD: On primary side of local ntb downstream of remote ntb. > + * @NTB_TOPO_P2P: Simple port-to-port NTB topology > + * @NTB_TOPO_B2B: Bridge-to-bridge NTB topology > */ > enum ntb_topo { > NTB_TOPO_NONE = -1, > - NTB_TOPO_PRI, > - NTB_TOPO_SEC, > - NTB_TOPO_B2B_USD, > - NTB_TOPO_B2B_DSD, > + NTB_TOPO_P2P, > + NTB_TOPO_B2B > }; > > -static inline int ntb_topo_is_b2b(enum ntb_topo topo) > -{ > - switch ((int)topo) { > - case NTB_TOPO_B2B_USD: > - case NTB_TOPO_B2B_DSD: > - return 1; > - } > - return 0; > -} > - > static inline char *ntb_topo_string(enum ntb_topo topo) > { > switch (topo) { > case NTB_TOPO_NONE: return "NTB_TOPO_NONE"; > - case NTB_TOPO_PRI: return "NTB_TOPO_PRI"; > - case NTB_TOPO_SEC: return "NTB_TOPO_SEC"; > - case NTB_TOPO_B2B_USD: return "NTB_TOPO_B2B_USD"; > - case NTB_TOPO_B2B_DSD: return "NTB_TOPO_B2B_DSD"; > + case NTB_TOPO_P2P: return "NTB_TOPO_P2P"; > + case NTB_TOPO_B2B: return "NTB_TOPO_B2B"; > } > return "NTB_TOPO_INVALID"; > } > @@ -179,6 +163,10 @@ static inline int ntb_ctx_ops_is_valid(const struct ntb_ctx_ops *ops) > > /** > * struct ntb_ctx_ops - ntb device operations > + * @port_number: See ntb_port_number(). > + * @peer_port_count: See ntb_peer_port_count(). > + * @peer_port_number: See ntb_peer_port_number(). > + * @peer_port_idx: See ntb_peer_port_idx(). > * @link_is_up: See ntb_link_is_up(). > * @link_enable: See ntb_link_enable(). > * @link_disable: See ntb_link_disable(). > @@ -212,6 +200,11 @@ static inline int ntb_ctx_ops_is_valid(const struct ntb_ctx_ops *ops) > * @peer_spad_write: See ntb_peer_spad_write(). > */ > struct ntb_dev_ops { > + int (*port_number)(struct ntb_dev *ntb); > + int (*peer_port_count)(struct ntb_dev *ntb); > + int (*peer_port_number)(struct ntb_dev *ntb, int pidx); > + int (*peer_port_idx)(struct ntb_dev *ntb, int port); > + > int (*link_is_up)(struct ntb_dev *ntb, > enum ntb_speed *speed, enum ntb_width *width); > int (*link_enable)(struct ntb_dev *ntb, > @@ -265,6 +258,10 @@ static inline int ntb_dev_ops_is_valid(const struct ntb_dev_ops *ops) > { > /* commented callbacks are not required: */ > return > + ops->port_number && > + ops->peer_port_count && > + ops->peer_port_number && > + ops->peer_port_idx && > ops->link_is_up && > ops->link_enable && > ops->link_disable && > @@ -319,6 +316,7 @@ struct ntb_client { > * @dev: Linux device object. > * @pdev: Pci device entry of the ntb. > * @topo: Detected topology of the ntb. > + * @port: Local port of the ntb. > * @ops: See &ntb_dev_ops. > * @ctx: See &ntb_ctx_ops. > * @ctx_ops: See &ntb_ctx_ops. > @@ -327,6 +325,7 @@ struct ntb_dev { > struct device dev; > struct pci_dev *pdev; > enum ntb_topo topo; > + int port; > const struct ntb_dev_ops *ops; > void *ctx; > const struct ntb_ctx_ops *ctx_ops; > @@ -442,6 +441,64 @@ void ntb_link_event(struct ntb_dev *ntb); > void ntb_db_event(struct ntb_dev *ntb, int vector); > > /** > + * ntb_port_number() - get the local port number > + * @ntb: NTB device context. > + * > + * Hardware must support at least simple two-ports topology > + * > + * Return: the local port number > + */ > +static inline int ntb_port_number(struct ntb_dev *ntb) > +{ > + return ntb->ops->port_number(ntb); > +} > + > +/** > + * ntb_peer_port_count() - get the number of peer device ports > + * @ntb: NTB device context. > + * > + * Hardware may support an access to memory of several remote domains > + * over multi-port NTB devices. This method returns the number of peers, > + * local device can have shared memory with. > + * > + * Return: the number of peer ports > + */ > +static inline int ntb_peer_port_count(struct ntb_dev *ntb) > +{ > + return ntb->ops->peer_port_count(ntb); > +} > + > +/** > + * ntb_peer_port_number() - get the peer port by given index > + * @ntb: NTB device context. > + * @pidx: Peer port index. > + * > + * Peer ports are continuously enumerated by NTB API logic, so this methods > + * lets to retrieve port real number by its index. > + * > + * Return: the peer device port or negative value indicating an error > + */ > +static inline int ntb_peer_port_number(struct ntb_dev *ntb, int pidx) > +{ > + return ntb->ops->peer_port_number(ntb, pidx); > +} > + > +/** > + * ntb_peer_port_idx() - get the peer device port index by given port number > + * @ntb: NTB device context. > + * @port: Peer port number. > + * > + * Inverse operation of ntb_peer_port_number(), so one can get port index > + * by its port number. > + * > + * Return: the peer port index or negative value indicating an error > + */ > +static inline int ntb_peer_port_idx(struct ntb_dev *ntb, int port) > +{ > + return ntb->ops->peer_port_idx(ntb, port); > +} > + > +/** > * ntb_link_is_up() - get the current ntb link state > * @ntb: NTB device context. > * @speed: OUT - The link speed expressed as PCIe generation number. > -- > 2.6.6