Commit a057a52e authored by Alexandre Bounine's avatar Alexandre Bounine Committed by Linus Torvalds

rapidio: change inbound window size type to u64

Current definition of map_inb() mport operations callback uses u32 type
to specify required inbound window (IBW) size.  This is limiting factor
because existing hardware - tsi721 and fsl_rio, both support IBW size up
to 16GB.

Changing type of size parameter to u64 to allow IBW size configurations
larger than 4GB.

[alexandre.bounine@idt.com: remove compiler warning about size of constant]
  Link: http://lkml.kernel.org/r/20160802184856.2566-1-alexandre.bounine@idt.com
Link: http://lkml.kernel.org/r/1469125134-16523-11-git-send-email-alexandre.bounine@idt.comSigned-off-by: default avatarAlexandre Bounine <alexandre.bounine@idt.com>
Cc: Matt Porter <mporter@kernel.crashing.org>
Cc: Benjamin Herrenschmidt <benh@kernel.crashing.org>
Cc: Michael Ellerman <mpe@ellerman.id.au>
Cc: Andre van Herk <andre.van.herk@prodrive-technologies.com>
Cc: Barry Wood <barry.wood@idt.com>
Signed-off-by: default avatarAndrew Morton <akpm@linux-foundation.org>
Signed-off-by: default avatarLinus Torvalds <torvalds@linux-foundation.org>
parent 60e377b5
...@@ -289,7 +289,7 @@ static void fsl_rio_inbound_mem_init(struct rio_priv *priv) ...@@ -289,7 +289,7 @@ static void fsl_rio_inbound_mem_init(struct rio_priv *priv)
} }
int fsl_map_inb_mem(struct rio_mport *mport, dma_addr_t lstart, int fsl_map_inb_mem(struct rio_mport *mport, dma_addr_t lstart,
u64 rstart, u32 size, u32 flags) u64 rstart, u64 size, u32 flags)
{ {
struct rio_priv *priv = mport->priv; struct rio_priv *priv = mport->priv;
u32 base_size; u32 base_size;
...@@ -298,7 +298,7 @@ int fsl_map_inb_mem(struct rio_mport *mport, dma_addr_t lstart, ...@@ -298,7 +298,7 @@ int fsl_map_inb_mem(struct rio_mport *mport, dma_addr_t lstart,
u32 riwar; u32 riwar;
int i; int i;
if ((size & (size - 1)) != 0) if ((size & (size - 1)) != 0 || size > 0x400000000ULL)
return -EINVAL; return -EINVAL;
base_size_log = ilog2(size); base_size_log = ilog2(size);
......
...@@ -1090,7 +1090,7 @@ static void tsi721_init_pc2sr_mapping(struct tsi721_device *priv) ...@@ -1090,7 +1090,7 @@ static void tsi721_init_pc2sr_mapping(struct tsi721_device *priv)
* from rstart to lstart. * from rstart to lstart.
*/ */
static int tsi721_rio_map_inb_mem(struct rio_mport *mport, dma_addr_t lstart, static int tsi721_rio_map_inb_mem(struct rio_mport *mport, dma_addr_t lstart,
u64 rstart, u32 size, u32 flags) u64 rstart, u64 size, u32 flags)
{ {
struct tsi721_device *priv = mport->priv; struct tsi721_device *priv = mport->priv;
int i, avail = -1; int i, avail = -1;
...@@ -1103,6 +1103,10 @@ static int tsi721_rio_map_inb_mem(struct rio_mport *mport, dma_addr_t lstart, ...@@ -1103,6 +1103,10 @@ static int tsi721_rio_map_inb_mem(struct rio_mport *mport, dma_addr_t lstart,
struct tsi721_ib_win_mapping *map = NULL; struct tsi721_ib_win_mapping *map = NULL;
int ret = -EBUSY; int ret = -EBUSY;
/* Max IBW size supported by HW is 16GB */
if (size > 0x400000000UL)
return -EINVAL;
if (direct) { if (direct) {
/* Calculate minimal acceptable window size and base address */ /* Calculate minimal acceptable window size and base address */
...@@ -1110,15 +1114,15 @@ static int tsi721_rio_map_inb_mem(struct rio_mport *mport, dma_addr_t lstart, ...@@ -1110,15 +1114,15 @@ static int tsi721_rio_map_inb_mem(struct rio_mport *mport, dma_addr_t lstart,
ibw_start = lstart & ~(ibw_size - 1); ibw_start = lstart & ~(ibw_size - 1);
tsi_debug(IBW, &priv->pdev->dev, tsi_debug(IBW, &priv->pdev->dev,
"Direct (RIO_0x%llx -> PCIe_%pad), size=0x%x, ibw_start = 0x%llx", "Direct (RIO_0x%llx -> PCIe_%pad), size=0x%llx, ibw_start = 0x%llx",
rstart, &lstart, size, ibw_start); rstart, &lstart, size, ibw_start);
while ((lstart + size) > (ibw_start + ibw_size)) { while ((lstart + size) > (ibw_start + ibw_size)) {
ibw_size *= 2; ibw_size *= 2;
ibw_start = lstart & ~(ibw_size - 1); ibw_start = lstart & ~(ibw_size - 1);
if (ibw_size > 0x80000000) { /* Limit max size to 2GB */ /* Check for crossing IBW max size 16GB */
if (ibw_size > 0x400000000UL)
return -EBUSY; return -EBUSY;
}
} }
loc_start = ibw_start; loc_start = ibw_start;
...@@ -1129,7 +1133,7 @@ static int tsi721_rio_map_inb_mem(struct rio_mport *mport, dma_addr_t lstart, ...@@ -1129,7 +1133,7 @@ static int tsi721_rio_map_inb_mem(struct rio_mport *mport, dma_addr_t lstart,
} else { } else {
tsi_debug(IBW, &priv->pdev->dev, tsi_debug(IBW, &priv->pdev->dev,
"Translated (RIO_0x%llx -> PCIe_%pad), size=0x%x", "Translated (RIO_0x%llx -> PCIe_%pad), size=0x%llx",
rstart, &lstart, size); rstart, &lstart, size);
if (!is_power_of_2(size) || size < 0x1000 || if (!is_power_of_2(size) || size < 0x1000 ||
......
...@@ -425,7 +425,7 @@ struct rio_ops { ...@@ -425,7 +425,7 @@ struct rio_ops {
int (*add_inb_buffer)(struct rio_mport *mport, int mbox, void *buf); int (*add_inb_buffer)(struct rio_mport *mport, int mbox, void *buf);
void *(*get_inb_message)(struct rio_mport *mport, int mbox); void *(*get_inb_message)(struct rio_mport *mport, int mbox);
int (*map_inb)(struct rio_mport *mport, dma_addr_t lstart, int (*map_inb)(struct rio_mport *mport, dma_addr_t lstart,
u64 rstart, u32 size, u32 flags); u64 rstart, u64 size, u32 flags);
void (*unmap_inb)(struct rio_mport *mport, dma_addr_t lstart); void (*unmap_inb)(struct rio_mport *mport, dma_addr_t lstart);
int (*query_mport)(struct rio_mport *mport, int (*query_mport)(struct rio_mport *mport,
struct rio_mport_attr *attr); struct rio_mport_attr *attr);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment