linux/drivers/tty/serial
Aaron Sierra 398a9db655 serial: 8250_pci: Handle devices mapped above 4 GiB
Several init/setup functions passed the PCI BAR resource start address
to ioremap_nocache() via an unsigned long. This caused address truncation
for a 32-bit device mapped above 4 GiB (i.e. the CPU interacts with the
device via a translated address), which resulted in a kernel panic.

This patch replaces all of the instances of intermediate variable use
with pci_ioremap_bar() to ensure the full resource_size_t start address
is used and that ioremap_nocache() is still called.

The kernel panic (Exar XR17V358 PCIe device on a Freescale P2020 SBC):

Machine check in kernel mode.
Caused by (from MCSR=10008): Bus - Read Data Bus Error
Oops: Machine check, sig: 7 [#1]
SMP NR_CPUS=2 X-ES P2020
Modules linked in:
CPU: 1 PID: 1 Comm: swapper/0 Not tainted 3.14.15-xes_r2-00002-g560e401 #978
task: bf850000 ti: bffee000 task.ti: bf84c000
NIP: 80318e10 LR: 80319ecc CTR: 80318dfc
REGS: bffeff10 TRAP: 0204   Not tainted  (3.14.15-xes_r2-00002-g560e401)
MSR: 00021000 <CE,ME>  CR: 20adbe42  XER: 00000000
DEAR: c1058001 ESR: 00000000
GPR00: 00000000 bf84db30 bf850000 80cb4af8 00000001 00000000 80000007 80000000
GPR08: bf837c9c c1058001 00000001 00000000 80000007 00000000 80002a10 00000000
GPR16: 00000000 00000000 00000000 00000000 00000000 00000000 80cb0000 80c72dc4
GPR24: 80cb4900 fffffffe 00029000 00000001 bf8c11e8 ffffffea 80c72ce4 80cb4af8
NIP [80318e10] mem_serial_in+0x14/0x28
LR [80319ecc] serial8250_config_port+0x160/0xe38
Call Trace:
[bf84db30] [80319d94] serial8250_config_port+0x28/0xe38 (unreliable)
[bf84db60] [80315e3c] uart_add_one_port+0x148/0x3a4
[bf84dbf0] [8031bf40] serial8250_register_8250_port+0x2dc/0x3c8
[bf84dc20] [8032111c] pciserial_init_ports+0xd4/0x1c0
[bf84dd50] [803212f8] pciserial_init_one+0xf0/0x224
[bf84dd90] [802d8ff4] local_pci_probe+0x34/0x8c
[bf84dda0] [802d92c8] pci_device_probe+0x84/0xa0
[bf84ddc0] [80329ee0] driver_probe_device+0xac/0x26c
[bf84dde0] [8032a15c] __driver_attach+0xbc/0xc0
[bf84de00] [80328388] bus_for_each_dev+0x90/0xcc
[bf84de30] [80329cd0] driver_attach+0x24/0x34
[bf84de40] [80328e28] bus_add_driver+0x104/0x1fc
[bf84de60] [8032a8c8] driver_register+0x70/0x138
[bf84de70] [802d93c0] __pci_register_driver+0x48/0x58
[bf84de80] [8077e0e4] serial_pci_driver_init+0x24/0x34
[bf84de90] [80002228] do_one_initcall+0x34/0x1b0
[bf84df00] [80764294] kernel_init_freeable+0x138/0x1e8
[bf84df30] [80002a24] kernel_init+0x14/0x108
[bf84df40] [8000ef94] ret_from_kernel_thread+0x5c/0x64
Instruction dump:
800800c4 7d290214 39290001 7c0004ac 7ca049ae 7c0004ac 4e800020 88030035
81230008 7c840030 7d292214 7c0004ac <88690000> 0c030000 4c00012c 5463063e
---[ end trace e3c16443b5d573c6 ]---

Signed-off-by: Aaron Sierra <asierra@xes-inc.com>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
2014-11-06 14:57:25 -08:00
..
8250 serial: 8250_pci: Handle devices mapped above 4 GiB 2014-11-06 14:57:25 -08:00
cpm_uart serial: cpm_uart: use container_of to resolve uart_cpm_port from uart_port 2014-11-05 19:20:52 -08:00
jsm TTY: jsm: use container_of to resolve jsm_channel from uart_port 2014-11-05 19:20:52 -08:00
21285.c serial: treewide: Remove empty implementations of enable_ms() 2014-07-09 17:29:38 -07:00
68328serial.c
altera_jtaguart.c serial: altera: Make of_device_id arrays const 2014-09-08 15:28:28 -07:00
altera_uart.c serial: altera: Make of_device_id arrays const 2014-09-08 15:28:28 -07:00
amba-pl010.c serial: amba-pl010: use container_of to resolve uart_amba_port from uart_port 2014-11-05 19:20:52 -08:00
amba-pl011.c serial: pl011: Fix build breakage with !CONFIG_DMA_ENGINE 2014-11-06 09:35:54 -08:00
apbuart.c serial: treewide: Remove empty implementations of enable_ms() 2014-07-09 17:29:38 -07:00
apbuart.h
ar933x_uart.c tty: ar933x_uart: use container_of to resolve ar933x_uart_port from uart_port 2014-11-05 19:20:53 -08:00
arc_uart.c Merge 3.16-rc5 into tty-next. 2014-07-13 15:52:12 -07:00
atmel_serial.c serial: at91: Use dmaengine_slave_config API 2014-11-06 14:57:25 -08:00
bcm63xx_uart.c tty: serial: bcm63xx: Eliminate unnecessary request/release functions 2014-11-06 14:57:24 -08:00
bfin_sport_uart.c serial: blackfin: Fix missing gpio.h 2014-09-08 16:22:42 -07:00
bfin_sport_uart.h
bfin_uart.c serial: bfin-uart: Fix auto CTS 2014-09-23 21:19:35 -07:00
clps711x.c serial: clps711x: Use mctrl_gpio helpers for handling modem signals 2014-09-08 15:35:03 -07:00
crisv10.c cris: Remove obsolete ASYNC_SPLIT_TERMIOS behavior 2014-11-05 20:18:30 -08:00
crisv10.h cris: Remove obsolete ASYNC_SPLIT_TERMIOS behavior 2014-11-05 20:18:30 -08:00
dz.c serial: treewide: Remove empty implementations of enable_ms() 2014-07-09 17:29:38 -07:00
dz.h
earlycon-arm-semihost.c tty/serial: add arm/arm64 semihosting earlycon 2014-04-24 16:32:27 -07:00
earlycon.c tty/serial: earlycon: Fix print for implied MMIO case 2014-11-05 19:45:52 -08:00
efm32-uart.c serial: efm32: correct namespacing of location property 2014-07-11 17:49:46 -07:00
fsl_lpuart.c serial: fsl-lpuart: add lpuart32 power management support 2014-11-06 14:57:25 -08:00
icom.c serial: treewide: Remove empty implementations of enable_ms() 2014-07-09 17:29:38 -07:00
icom.h
ifx6x60.c serial: ifx6x60: Remove casting the return value which is a void pointer 2013-09-26 14:29:58 -07:00
ifx6x60.h
imx.c serial: imx: add imx_poll_init() 2014-11-06 14:57:23 -08:00
ioc3_serial.c serial: treewide: Remove empty implementations of enable_ms() 2014-07-09 17:29:38 -07:00
ioc4_serial.c serial: treewide: Remove empty implementations of enable_ms() 2014-07-09 17:29:38 -07:00
ip22zilog.c serial: use container_of to resolve uart_ip22zilog_port from uart_port 2014-11-05 19:20:52 -08:00
ip22zilog.h
Kconfig tty: serial: bcm63xx: Enable DT earlycon support 2014-11-06 14:57:24 -08:00
kgdb_nmi.c serial: kgdb_nmi: No CON_ENABLED by default 2014-09-08 16:26:07 -07:00
kgdboc.c treewide: Convert retrun typos to return 2013-09-04 12:26:36 +02:00
lantiq.c serial: Use UPF_* constants with struct uart_port flags 2014-07-10 16:06:49 -07:00
lpc32xx_hs.c serial: treewide: Remove empty implementations of enable_ms() 2014-07-09 17:29:38 -07:00
m32r_sio_reg.h
m32r_sio.c serial: use container_of to resolve uart_sio_port from uart_port 2014-11-05 19:20:52 -08:00
m32r_sio.h
Makefile ARM: meson: serial: add MesonX SoC on-chip uart driver 2014-09-08 16:12:40 -07:00
max310x.c serial/max310x: Remove obsolete #ifset TIOC[SG]RS485 2014-11-05 19:29:05 -08:00
max3100.c serial: use dev_get_platdata() 2013-07-31 17:56:15 -07:00
mcf.c serial: Use UPF_* constants with struct uart_port flags 2014-07-10 16:06:49 -07:00
men_z135_uart.c tty: serial: men_z135_uart: Wakeup UART after transmitting 2014-07-09 17:35:42 -07:00
meson_uart.c ARM: meson: serial: add MesonX SoC on-chip uart driver 2014-09-08 16:12:40 -07:00
mfd.c serial: Fix IGNBRK handling 2014-06-19 13:04:52 -07:00
mpc52xx_uart.c serial: mpc52xx: Use default serial core x_char handler 2014-09-08 16:22:42 -07:00
mpsc.c serial: mpsc: use container_of to resolve mpsc_port_info from uart_port 2014-11-05 19:20:52 -08:00
mrst_max3110.c serial: treewide: Remove empty implementations of enable_ms() 2014-07-09 17:29:38 -07:00
mrst_max3110.h
msm_serial_hs.c serial: use dev_get_platdata() 2013-07-31 17:56:15 -07:00
msm_serial.c tty: serial: msm_serial: Use DT aliases 2014-11-06 14:57:23 -08:00
msm_serial.h tty: serial: msm: Support sysrq on uartDM devices 2014-11-06 14:57:22 -08:00
msm_smd_tty.c
mux.c serial: treewide: Remove empty implementations of enable_ms() 2014-07-09 17:29:38 -07:00
mxs-auart.c serial: mxs-auart: enable PPS support 2014-11-06 14:57:18 -08:00
netx-serial.c serial: Fix IGNBRK handling 2014-06-19 13:04:52 -07:00
nwpserial.c serial: Fix build failure caused by missing header file 2014-09-08 16:17:45 -07:00
of_serial.c serial: of: add a PORT_RT2880 definition 2014-11-06 14:57:18 -08:00
omap-serial.c tty: serial: omap: Increase max consoles and add check to prevent crash 2014-11-06 14:57:18 -08:00
pch_uart.c pch_uart: don't hardcode PCI slot to get DMA device 2014-08-01 16:04:21 -07:00
pmac_zilog.c tty: use container_of to resolve uart_pmac_port from uart_port 2014-11-05 19:20:52 -08:00
pmac_zilog.h
pnx8xxx_uart.c serial: pnx8xxx: use container_of to resolve pnx8xxx_port from uart_port 2014-11-05 19:20:53 -08:00
pxa.c serial: pxa: fix build with !SERIAL_PXA_CONSOLE 2014-07-10 15:48:41 -07:00
rp2.c tty: remove DEFINE_PCI_DEVICE_TABLE macro 2013-12-08 17:09:07 -08:00
sa1100.c serial: sa1100: use container_of to resolve sa1100_port from uart_port 2014-11-05 19:20:52 -08:00
samsung.c serial: samsung: Remove checks for CONFIG_SAMSUNG_CLOCK 2014-11-05 19:22:09 -08:00
samsung.h serial: samsung: Neaten dbg uses 2014-05-28 12:27:22 -07:00
sb1250-duart.c serial: Fix IGNBRK handling 2014-06-19 13:04:52 -07:00
sc16is7xx.c serial/sc16is7xx: Remove obsolete #ifset TIOC[SG]RS485 2014-11-05 19:29:05 -08:00
sccnxp.c serial: treewide: Remove empty implementations of enable_ms() 2014-07-09 17:29:38 -07:00
serial_core.c Merge branch 'tty-linus' into 'tty-testing' 2014-11-05 19:43:23 -08:00
serial_ks8695.c serial: Fix IGNBRK handling 2014-06-19 13:04:52 -07:00
serial_mctrl_gpio.c tty: serial_mctrl_gpio: Fix COMPILE_TEST build for architectures with custom termios.h 2014-09-20 06:56:55 -07:00
serial_mctrl_gpio.h tty/serial: Add GPIOLIB helpers for controlling modem lines 2014-05-28 12:49:14 -07:00
serial_txx9.c serial: txx9: remove duplicate TXX9_SIFCR_TDIL_MASK define 2014-07-10 16:10:42 -07:00
serial-tegra.c serial: Refactor uart_flush_buffer() from uart_close() 2014-11-05 18:53:54 -08:00
sh-sci.c serial: sh-sci: use dmaengine_terminate_all() API 2014-10-15 21:31:00 +05:30
sh-sci.h serial: sh-sci: Move overrun_bit and error_mask fields out of pdata 2013-12-24 11:17:48 +09:00
sirfsoc_uart.c serial: sirf: transfer more bytes once to decrease interrupts 2014-07-09 17:37:00 -07:00
sirfsoc_uart.h serial: sirf: transfer more bytes once to decrease interrupts 2014-07-09 17:37:00 -07:00
sn_console.c serial: treewide: Remove empty implementations of enable_ms() 2014-07-09 17:29:38 -07:00
st-asc.c serial: asc: Conditionally use readl_relaxed (COMPILE_TEST) 2014-09-28 21:49:48 -04:00
suncore.c
sunhv.c serial: Fix send_xchar() handlers 2014-09-08 16:22:42 -07:00
sunsab.c serial: sunsab: use container_of to resolve uart_sunsu_port from uart_port 2014-11-05 19:20:52 -08:00
sunsab.h
sunsu.c serial: sunsu: use container_of to resolve uart_sunsu_port from uart_port 2014-11-05 19:20:52 -08:00
sunzilog.c serial: use container_of to resolve uart_sunzilog_port from uart_port 2014-11-05 19:20:53 -08:00
sunzilog.h
tilegx.c serial: treewide: Remove empty implementations of enable_ms() 2014-07-09 17:29:38 -07:00
timbuart.c serial: Refactor uart_flush_buffer() from uart_close() 2014-11-05 18:53:54 -08:00
timbuart.h
uartlite.c tty: serial: uartlite: Remove .owner field for driver 2014-09-08 16:09:13 -07:00
ucc_uart.c serial: treewide: Remove empty implementations of enable_ms() 2014-07-09 17:29:38 -07:00
vr41xx_siu.c serial: vr41xx_siu: delete double assignment 2014-09-08 16:17:45 -07:00
vt8500_serial.c tty: vt8500_serial: explicitly calculate base baud rate 2014-09-08 16:29:36 -07:00
xilinx_uartps.c serial: cadence: Add generic earlycon support 2014-09-28 21:32:37 -04:00
zs.c serial: Fix IGNBRK handling 2014-06-19 13:04:52 -07:00
zs.h