Commit 4f640efb authored by Josh Boyer's avatar Josh Boyer Committed by Linus Torvalds

Use resource_size_t for serial port IO addresses

At present, various parts of the serial code use unsigned long to define
resource addresses.  This is a problem, because some 32-bit platforms have
physical addresses larger than 32-bits, and have mmio serial uarts located
above the 4GB point.

This patch changes the type of mapbase in both struct uart_port and struct
plat_serial8250_port to resource_size_t, which can be configured to be 64
bits on such platforms.  The mapbase in serial_struct can't safely be
changed, because that structure is user visible.
Signed-off-by: default avatarDavid Gibson <dwg@au1.ibm.com>
Signed-off-by: default avatarJosh Boyer <jwboyer@linux.vnet.ibm.com>
Cc: Russell King <rmk@arm.linux.org.uk>
Cc: Paul Mackerras <paulus@samba.org>
Cc: Jason Wessel <jason.wessel@windriver.com>
Signed-off-by: default avatarAndrew Morton <akpm@linux-foundation.org>
Signed-off-by: default avatarLinus Torvalds <torvalds@linux-foundation.org>
parent f695baf2
...@@ -2650,8 +2650,9 @@ static int __devinit serial8250_probe(struct platform_device *dev) ...@@ -2650,8 +2650,9 @@ static int __devinit serial8250_probe(struct platform_device *dev)
ret = serial8250_register_port(&port); ret = serial8250_register_port(&port);
if (ret < 0) { if (ret < 0) {
dev_err(&dev->dev, "unable to register port at index %d " dev_err(&dev->dev, "unable to register port at index %d "
"(IO%lx MEM%lx IRQ%d): %d\n", i, "(IO%lx MEM%llx IRQ%d): %d\n", i,
p->iobase, p->mapbase, p->irq, ret); p->iobase, (unsigned long long)p->mapbase,
p->irq, ret);
} }
} }
return 0; return 0;
......
...@@ -151,8 +151,9 @@ static int __init parse_options(struct early_serial8250_device *device, char *op ...@@ -151,8 +151,9 @@ static int __init parse_options(struct early_serial8250_device *device, char *op
#else #else
port->membase = ioremap(port->mapbase, 64); port->membase = ioremap(port->mapbase, 64);
if (!port->membase) { if (!port->membase) {
printk(KERN_ERR "%s: Couldn't ioremap 0x%lx\n", printk(KERN_ERR "%s: Couldn't ioremap 0x%llx\n",
__FUNCTION__, port->mapbase); __FUNCTION__,
(unsigned long long)port->mapbase);
return -ENOMEM; return -ENOMEM;
} }
#endif #endif
...@@ -175,9 +176,10 @@ static int __init parse_options(struct early_serial8250_device *device, char *op ...@@ -175,9 +176,10 @@ static int __init parse_options(struct early_serial8250_device *device, char *op
device->baud); device->baud);
} }
printk(KERN_INFO "Early serial console at %s 0x%lx (options '%s')\n", printk(KERN_INFO "Early serial console at %s 0x%llx (options '%s')\n",
mmio ? "MMIO" : "I/O port", mmio ? "MMIO" : "I/O port",
mmio ? port->mapbase : (unsigned long) port->iobase, mmio ? (unsigned long long) port->mapbase
: (unsigned long long) port->iobase,
device->options); device->options);
return 0; return 0;
} }
......
...@@ -626,7 +626,7 @@ static int uart_get_info(struct uart_state *state, ...@@ -626,7 +626,7 @@ static int uart_get_info(struct uart_state *state,
tmp.hub6 = port->hub6; tmp.hub6 = port->hub6;
tmp.io_type = port->iotype; tmp.io_type = port->iotype;
tmp.iomem_reg_shift = port->regshift; tmp.iomem_reg_shift = port->regshift;
tmp.iomem_base = (void *)port->mapbase; tmp.iomem_base = (void *)(unsigned long)port->mapbase;
if (copy_to_user(retinfo, &tmp, sizeof(*retinfo))) if (copy_to_user(retinfo, &tmp, sizeof(*retinfo)))
return -EFAULT; return -EFAULT;
...@@ -1666,10 +1666,11 @@ static int uart_line_info(char *buf, struct uart_driver *drv, int i) ...@@ -1666,10 +1666,11 @@ static int uart_line_info(char *buf, struct uart_driver *drv, int i)
return 0; return 0;
mmio = port->iotype >= UPIO_MEM; mmio = port->iotype >= UPIO_MEM;
ret = sprintf(buf, "%d: uart:%s %s%08lX irq:%d", ret = sprintf(buf, "%d: uart:%s %s%08llX irq:%d",
port->line, uart_type(port), port->line, uart_type(port),
mmio ? "mmio:0x" : "port:", mmio ? "mmio:0x" : "port:",
mmio ? port->mapbase : (unsigned long) port->iobase, mmio ? (unsigned long long)port->mapbase
: (unsigned long long) port->iobase,
port->irq); port->irq);
if (port->type == PORT_UNKNOWN) { if (port->type == PORT_UNKNOWN) {
...@@ -2069,7 +2070,7 @@ uart_report_port(struct uart_driver *drv, struct uart_port *port) ...@@ -2069,7 +2070,7 @@ uart_report_port(struct uart_driver *drv, struct uart_port *port)
case UPIO_TSI: case UPIO_TSI:
case UPIO_DWAPB: case UPIO_DWAPB:
snprintf(address, sizeof(address), snprintf(address, sizeof(address),
"MMIO 0x%lx", port->mapbase); "MMIO 0x%llx", (unsigned long long)port->mapbase);
break; break;
default: default:
strlcpy(address, "*unknown*", sizeof(address)); strlcpy(address, "*unknown*", sizeof(address));
......
...@@ -20,7 +20,7 @@ ...@@ -20,7 +20,7 @@
struct plat_serial8250_port { struct plat_serial8250_port {
unsigned long iobase; /* io base address */ unsigned long iobase; /* io base address */
void __iomem *membase; /* ioremap cookie or NULL */ void __iomem *membase; /* ioremap cookie or NULL */
unsigned long mapbase; /* resource base */ resource_size_t mapbase; /* resource base */
unsigned int irq; /* interrupt number */ unsigned int irq; /* interrupt number */
unsigned int uartclk; /* UART clock rate */ unsigned int uartclk; /* UART clock rate */
unsigned char regshift; /* register shift */ unsigned char regshift; /* register shift */
......
...@@ -288,7 +288,7 @@ struct uart_port { ...@@ -288,7 +288,7 @@ struct uart_port {
const struct uart_ops *ops; const struct uart_ops *ops;
unsigned int custom_divisor; unsigned int custom_divisor;
unsigned int line; /* port index */ unsigned int line; /* port index */
unsigned long mapbase; /* for ioremap */ resource_size_t mapbase; /* for ioremap */
struct device *dev; /* parent device */ struct device *dev; /* parent device */
unsigned char hub6; /* this should be in the 8250 driver */ unsigned char hub6; /* this should be in the 8250 driver */
unsigned char unused[3]; unsigned char unused[3];
......
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