Re: [PATCH v3 5/9] NTB: Alter Scratchpads API to support multi-ports devices
On Tue, Jan 10, 2017 at 7:13 PM, Serge Semin wrote: > Even though there is no any real NTB hardware, which would have both more > than two ports and Scratchpad registers, it is logically correct to have > Scratchpad API accepting a peer port index as well. Intel/AMD drivers utilize > Primary and Secondary topology to split Scratchpad between connected root > devices. Since port-index API introduced, Intel/AMD NTB hardware drivers can > use device port to determine which Scratchpad registers actually belong to > local and peer devices. The same approach can be used if some potential > hardware in future will be multi-port and have some set of Scratchpads. > Here are the brief of changes in the API: > ntb_spad_count() - return number of Scratchpads per each port > ntb_peer_spad_addr(pidx, sidx) - address of Scratchpad register of the > peer device with pidx-index > ntb_peer_spad_read(pidx, sidx) - read specified Scratchpad register of the > peer with pidx-index > ntb_peer_spad_write(pidx, sidx) - write data to Scratchpad register of the > peer with pidx-index > > Since there is hardware which doesn't support Scratchpad registers, the > corresponding API methods are now made optional. > > Acked-by: Allen Hubbe > Signed-off-by: Serge Semin The series has been applied to my ntb-next branch. Thanks, Jon > --- > drivers/ntb/hw/amd/ntb_hw_amd.c | 14 +++ > drivers/ntb/hw/intel/ntb_hw_intel.c | 14 +++ > drivers/ntb/ntb_transport.c | 17 - > drivers/ntb/test/ntb_perf.c | 6 +-- > drivers/ntb/test/ntb_pingpong.c | 8 +++- > drivers/ntb/test/ntb_tool.c | 21 -- > include/linux/ntb.h | 76 > +++-- > 7 files changed, 98 insertions(+), 58 deletions(-) > > diff --git a/drivers/ntb/hw/amd/ntb_hw_amd.c b/drivers/ntb/hw/amd/ntb_hw_amd.c > index 6a41c38..bc537aa 100644 > --- a/drivers/ntb/hw/amd/ntb_hw_amd.c > +++ b/drivers/ntb/hw/amd/ntb_hw_amd.c > @@ -433,30 +433,30 @@ static int amd_ntb_spad_write(struct ntb_dev *ntb, > return 0; > } > > -static u32 amd_ntb_peer_spad_read(struct ntb_dev *ntb, int idx) > +static u32 amd_ntb_peer_spad_read(struct ntb_dev *ntb, int pidx, int sidx) > { > struct amd_ntb_dev *ndev = ntb_ndev(ntb); > void __iomem *mmio = ndev->self_mmio; > u32 offset; > > - if (idx < 0 || idx >= ndev->spad_count) > + if (sidx < 0 || sidx >= ndev->spad_count) > return -EINVAL; > > - offset = ndev->peer_spad + (idx << 2); > + offset = ndev->peer_spad + (sidx << 2); > return readl(mmio + AMD_SPAD_OFFSET + offset); > } > > -static int amd_ntb_peer_spad_write(struct ntb_dev *ntb, > - int idx, u32 val) > +static int amd_ntb_peer_spad_write(struct ntb_dev *ntb, int pidx, > + int sidx, u32 val) > { > struct amd_ntb_dev *ndev = ntb_ndev(ntb); > void __iomem *mmio = ndev->self_mmio; > u32 offset; > > - if (idx < 0 || idx >= ndev->spad_count) > + if (sidx < 0 || sidx >= ndev->spad_count) > return -EINVAL; > > - offset = ndev->peer_spad + (idx << 2); > + offset = ndev->peer_spad + (sidx << 2); > writel(val, mmio + AMD_SPAD_OFFSET + offset); > > return 0; > diff --git a/drivers/ntb/hw/intel/ntb_hw_intel.c > b/drivers/ntb/hw/intel/ntb_hw_intel.c > index 4b84012..7bb14cb 100644 > --- a/drivers/ntb/hw/intel/ntb_hw_intel.c > +++ b/drivers/ntb/hw/intel/ntb_hw_intel.c > @@ -1409,30 +1409,30 @@ static int intel_ntb_spad_write(struct ntb_dev *ntb, >ndev->self_reg->spad); > } > > -static int intel_ntb_peer_spad_addr(struct ntb_dev *ntb, int idx, > +static int intel_ntb_peer_spad_addr(struct ntb_dev *ntb, int pidx, int sidx, > phys_addr_t *spad_addr) > { > struct intel_ntb_dev *ndev = ntb_ndev(ntb); > > - return ndev_spad_addr(ndev, idx, spad_addr, ndev->peer_addr, > + return ndev_spad_addr(ndev, sidx, spad_addr, ndev->peer_addr, > ndev->peer_reg->spad); > } > > -static u32 intel_ntb_peer_spad_read(struct ntb_dev *ntb, int idx) > +static u32 intel_ntb_peer_spad_read(struct ntb_dev *ntb, int pidx, int sidx) > { > struct intel_ntb_dev *ndev = ntb_ndev(ntb); > > - return ndev_spad_read(ndev, idx, > + return ndev_spad_read(ndev, sidx, > ndev->peer_mmio + > ndev->peer_reg->spad); > } > > -static int intel_ntb_peer_spad_write(struct ntb_dev *ntb, > -int idx, u32 val) > +static int intel_ntb_peer_spad_write(struct ntb_dev *ntb, int pidx, > +int sidx, u32 val) > { > struct intel_ntb_dev *ndev = ntb_ndev(ntb); > > - return ndev_spad_write(ndev, idx, val, > + return ndev_spad_write(ndev, sidx, val, >
RE: [PATCH v3 5/9] NTB: Alter Scratchpads API to support multi-ports devices
From: Serge Semin > Even though there is no any real NTB hardware, which would have both more > than two ports and Scratchpad registers, it is logically correct to have > Scratchpad API accepting a peer port index as well. Intel/AMD drivers utilize > Primary and Secondary topology to split Scratchpad between connected root > devices. Since port-index API introduced, Intel/AMD NTB hardware drivers can > use device port to determine which Scratchpad registers actually belong to > local and peer devices. The same approach can be used if some potential > hardware in future will be multi-port and have some set of Scratchpads. > Here are the brief of changes in the API: > ntb_spad_count() - return number of Scratchpads per each port > ntb_peer_spad_addr(pidx, sidx) - address of Scratchpad register of the > peer device with pidx-index > ntb_peer_spad_read(pidx, sidx) - read specified Scratchpad register of the > peer with pidx-index > ntb_peer_spad_write(pidx, sidx) - write data to Scratchpad register of the > peer with pidx-index > > Since there is hardware which doesn't support Scratchpad registers, the > corresponding API methods are now made optional. > > Signed-off-by: Serge Semin Acked-by: Allen Hubbe > --- > drivers/ntb/hw/amd/ntb_hw_amd.c | 14 +++ > drivers/ntb/hw/intel/ntb_hw_intel.c | 14 +++ > drivers/ntb/ntb_transport.c | 17 - > drivers/ntb/test/ntb_perf.c | 6 +-- > drivers/ntb/test/ntb_pingpong.c | 8 +++- > drivers/ntb/test/ntb_tool.c | 21 -- > include/linux/ntb.h | 76 > +++-- > 7 files changed, 98 insertions(+), 58 deletions(-) > > diff --git a/drivers/ntb/hw/amd/ntb_hw_amd.c b/drivers/ntb/hw/amd/ntb_hw_amd.c > index 6a41c38..bc537aa 100644 > --- a/drivers/ntb/hw/amd/ntb_hw_amd.c > +++ b/drivers/ntb/hw/amd/ntb_hw_amd.c > @@ -433,30 +433,30 @@ static int amd_ntb_spad_write(struct ntb_dev *ntb, > return 0; > } > > -static u32 amd_ntb_peer_spad_read(struct ntb_dev *ntb, int idx) > +static u32 amd_ntb_peer_spad_read(struct ntb_dev *ntb, int pidx, int sidx) > { > struct amd_ntb_dev *ndev = ntb_ndev(ntb); > void __iomem *mmio = ndev->self_mmio; > u32 offset; > > - if (idx < 0 || idx >= ndev->spad_count) > + if (sidx < 0 || sidx >= ndev->spad_count) > return -EINVAL; > > - offset = ndev->peer_spad + (idx << 2); > + offset = ndev->peer_spad + (sidx << 2); > return readl(mmio + AMD_SPAD_OFFSET + offset); > } > > -static int amd_ntb_peer_spad_write(struct ntb_dev *ntb, > -int idx, u32 val) > +static int amd_ntb_peer_spad_write(struct ntb_dev *ntb, int pidx, > +int sidx, u32 val) > { > struct amd_ntb_dev *ndev = ntb_ndev(ntb); > void __iomem *mmio = ndev->self_mmio; > u32 offset; > > - if (idx < 0 || idx >= ndev->spad_count) > + if (sidx < 0 || sidx >= ndev->spad_count) > return -EINVAL; > > - offset = ndev->peer_spad + (idx << 2); > + offset = ndev->peer_spad + (sidx << 2); > writel(val, mmio + AMD_SPAD_OFFSET + offset); > > return 0; > diff --git a/drivers/ntb/hw/intel/ntb_hw_intel.c > b/drivers/ntb/hw/intel/ntb_hw_intel.c > index 4b84012..7bb14cb 100644 > --- a/drivers/ntb/hw/intel/ntb_hw_intel.c > +++ b/drivers/ntb/hw/intel/ntb_hw_intel.c > @@ -1409,30 +1409,30 @@ static int intel_ntb_spad_write(struct ntb_dev *ntb, > ndev->self_reg->spad); > } > > -static int intel_ntb_peer_spad_addr(struct ntb_dev *ntb, int idx, > +static int intel_ntb_peer_spad_addr(struct ntb_dev *ntb, int pidx, int sidx, > phys_addr_t *spad_addr) > { > struct intel_ntb_dev *ndev = ntb_ndev(ntb); > > - return ndev_spad_addr(ndev, idx, spad_addr, ndev->peer_addr, > + return ndev_spad_addr(ndev, sidx, spad_addr, ndev->peer_addr, > ndev->peer_reg->spad); > } > > -static u32 intel_ntb_peer_spad_read(struct ntb_dev *ntb, int idx) > +static u32 intel_ntb_peer_spad_read(struct ntb_dev *ntb, int pidx, int sidx) > { > struct intel_ntb_dev *ndev = ntb_ndev(ntb); > > - return ndev_spad_read(ndev, idx, > + return ndev_spad_read(ndev, sidx, > ndev->peer_mmio + > ndev->peer_reg->spad); > } > > -static int intel_ntb_peer_spad_write(struct ntb_dev *ntb, > - int idx, u32 val) > +static int intel_ntb_peer_spad_write(struct ntb_dev *ntb, int pidx, > + int sidx, u32 val) > { > struct intel_ntb_dev *ndev = ntb_ndev(ntb); > > - return ndev_spad_write(ndev, idx, val, > + return ndev_spad_write(ndev, sidx, val, > ndev->peer_mmio + > ndev->peer_reg->spad); > } > diff --git a/drivers/ntb/ntb_transport.c b/drivers/ntb/ntb_trans