Re: [PATCH 2/2] Use resource_size_t for serial port IO addresses
On Tue, 20 Feb 2007 14:19:51 +1100 (EST) David Gibson <[EMAIL PROTECTED]> wrote: > 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: David Gibson <[EMAIL PROTECTED]> Acked-by: Alan Cox <[EMAIL PROTECTED]> - To unsubscribe from this list: send the line "unsubscribe linux-kernel" in the body of a message to [EMAIL PROTECTED] More majordomo info at http://vger.kernel.org/majordomo-info.html Please read the FAQ at http://www.tux.org/lkml/
Re: [PATCH 2/2] Use resource_size_t for serial port IO addresses
On Tue, 20 Feb 2007 14:19:51 +1100 (EST) David Gibson [EMAIL PROTECTED] wrote: 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: David Gibson [EMAIL PROTECTED] Acked-by: Alan Cox [EMAIL PROTECTED] - To unsubscribe from this list: send the line unsubscribe linux-kernel in the body of a message to [EMAIL PROTECTED] More majordomo info at http://vger.kernel.org/majordomo-info.html Please read the FAQ at http://www.tux.org/lkml/
[PATCH 2/2] 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: David Gibson <[EMAIL PROTECTED]> --- drivers/serial/8250.c|5 +++-- drivers/serial/8250_early.c | 16 +--- drivers/serial/serial_core.c |9 + include/linux/serial_8250.h |2 +- include/linux/serial_core.h |2 +- 5 files changed, 19 insertions(+), 15 deletions(-) Index: working-2.6/include/linux/serial_core.h === --- working-2.6.orig/include/linux/serial_core.h2007-02-19 11:07:42.0 +1100 +++ working-2.6/include/linux/serial_core.h 2007-02-19 11:07:43.0 +1100 @@ -273,7 +273,7 @@ struct uart_port { const struct uart_ops *ops; unsigned intcustom_divisor; unsigned intline; /* port index */ - unsigned long mapbase;/* for ioremap */ + resource_size_t mapbase;/* for ioremap */ struct device *dev; /* parent device */ unsigned char hub6; /* this should be in the 8250 driver */ unsigned char unused[3]; Index: working-2.6/drivers/serial/serial_core.c === --- working-2.6.orig/drivers/serial/serial_core.c 2007-02-19 11:07:42.0 +1100 +++ working-2.6/drivers/serial/serial_core.c2007-02-19 11:07:43.0 +1100 @@ -633,7 +633,7 @@ static int uart_get_info(struct uart_sta tmp.hub6= port->hub6; tmp.io_type = port->iotype; 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, , sizeof(*retinfo))) return -EFAULT; @@ -1673,10 +1673,11 @@ static int uart_line_info(char *buf, str return 0; 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), mmio ? "mmio:0x" : "port:", - mmio ? port->mapbase : (unsigned long) port->iobase, + mmio ? (unsigned long long)port->mapbase +: (unsigned long long) port->iobase, port->irq); if (port->type == PORT_UNKNOWN) { @@ -2069,7 +2070,7 @@ uart_report_port(struct uart_driver *drv case UPIO_AU: case UPIO_TSI: snprintf(address, sizeof(address), -"MMIO 0x%lx", port->mapbase); +"MMIO 0x%llx", (unsigned long long)port->mapbase); break; default: strlcpy(address, "*unknown*", sizeof(address)); Index: working-2.6/drivers/serial/8250_early.c === --- working-2.6.orig/drivers/serial/8250_early.c2007-02-19 11:07:40.0 +1100 +++ working-2.6/drivers/serial/8250_early.c 2007-02-19 11:07:43.0 +1100 @@ -145,8 +145,9 @@ static int __init parse_options(struct e port->mapbase = simple_strtoul(options + 5, , 0); port->membase = ioremap(port->mapbase, mapsize); if (!port->membase) { - printk(KERN_ERR "%s: Couldn't ioremap 0x%lx\n", - __FUNCTION__, port->mapbase); + printk(KERN_ERR "%s: Couldn't ioremap 0x%llx\n", + __FUNCTION__, + (unsigned long long)port->mapbase); return -ENOMEM; } mmio = 1; @@ -168,9 +169,10 @@ static int __init parse_options(struct e 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 ? port->mapbase : (unsigned long) port->iobase, + mmio ? (unsigned long long) port->mapbase +: (unsigned long long) port->iobase, device->options); return 0; } @@ -236,10 +238,10 @@ static int __init early_uart_console_swi mmio =
[PATCH 2/2] 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: David Gibson [EMAIL PROTECTED] --- drivers/serial/8250.c|5 +++-- drivers/serial/8250_early.c | 16 +--- drivers/serial/serial_core.c |9 + include/linux/serial_8250.h |2 +- include/linux/serial_core.h |2 +- 5 files changed, 19 insertions(+), 15 deletions(-) Index: working-2.6/include/linux/serial_core.h === --- working-2.6.orig/include/linux/serial_core.h2007-02-19 11:07:42.0 +1100 +++ working-2.6/include/linux/serial_core.h 2007-02-19 11:07:43.0 +1100 @@ -273,7 +273,7 @@ struct uart_port { const struct uart_ops *ops; unsigned intcustom_divisor; unsigned intline; /* port index */ - unsigned long mapbase;/* for ioremap */ + resource_size_t mapbase;/* for ioremap */ struct device *dev; /* parent device */ unsigned char hub6; /* this should be in the 8250 driver */ unsigned char unused[3]; Index: working-2.6/drivers/serial/serial_core.c === --- working-2.6.orig/drivers/serial/serial_core.c 2007-02-19 11:07:42.0 +1100 +++ working-2.6/drivers/serial/serial_core.c2007-02-19 11:07:43.0 +1100 @@ -633,7 +633,7 @@ static int uart_get_info(struct uart_sta tmp.hub6= port-hub6; tmp.io_type = port-iotype; 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))) return -EFAULT; @@ -1673,10 +1673,11 @@ static int uart_line_info(char *buf, str return 0; 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), mmio ? mmio:0x : port:, - mmio ? port-mapbase : (unsigned long) port-iobase, + mmio ? (unsigned long long)port-mapbase +: (unsigned long long) port-iobase, port-irq); if (port-type == PORT_UNKNOWN) { @@ -2069,7 +2070,7 @@ uart_report_port(struct uart_driver *drv case UPIO_AU: case UPIO_TSI: snprintf(address, sizeof(address), -MMIO 0x%lx, port-mapbase); +MMIO 0x%llx, (unsigned long long)port-mapbase); break; default: strlcpy(address, *unknown*, sizeof(address)); Index: working-2.6/drivers/serial/8250_early.c === --- working-2.6.orig/drivers/serial/8250_early.c2007-02-19 11:07:40.0 +1100 +++ working-2.6/drivers/serial/8250_early.c 2007-02-19 11:07:43.0 +1100 @@ -145,8 +145,9 @@ static int __init parse_options(struct e port-mapbase = simple_strtoul(options + 5, options, 0); port-membase = ioremap(port-mapbase, mapsize); if (!port-membase) { - printk(KERN_ERR %s: Couldn't ioremap 0x%lx\n, - __FUNCTION__, port-mapbase); + printk(KERN_ERR %s: Couldn't ioremap 0x%llx\n, + __FUNCTION__, + (unsigned long long)port-mapbase); return -ENOMEM; } mmio = 1; @@ -168,9 +169,10 @@ static int __init parse_options(struct e 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 ? port-mapbase : (unsigned long) port-iobase, + mmio ? (unsigned long long) port-mapbase +: (unsigned long long) port-iobase, device-options); return 0; } @@ -236,10 +238,10 @@ static int __init early_uart_console_swi mmio = (port-iotype == UPIO_MEM); line =