mirror of
https://github.com/torvalds/linux
synced 2024-09-06 18:01:05 +00:00
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.com Signed-off-by: Alexandre 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: Andrew Morton <akpm@linux-foundation.org> Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
This commit is contained in:
parent
60e377b5c1
commit
a057a52e94
|
@ -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,
|
||||||
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)
|
||||||
* 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,
|
||||||
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,
|
||||||
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,
|
||||||
|
|
||||||
} 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 {
|
||||||
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);
|
||||||
|
|
Loading…
Reference in a new issue