From 5cc705512d61b0e69a92da59a5d034a0e882a6fd Mon Sep 17 00:00:00 2001 From: Marcel Moolenaar Date: Sun, 7 Sep 2003 21:51:03 +0000 Subject: [PATCH] Remove the assumption that a bus_space_handle_t is an I/O address from the SAB82532 and the Z8530 hardware drivers by introducing uart_cpu_busaddr(). The assumption is not true on pc98 where bus_space_handle_t is a pointer to a structure. The uart_cpu_busaddr() function will return the bus address corresponding the tag and handle given to it by the BAS. WARNING: the intend of the function is STRICTLY to allow hardware drivers to determine which logical channel they control and is NOT to be used for actual I/O. It is therefore EXPLICITLY allowed that uart_cpu_busaddr() returns only the lower 8 bits of the address and garbage in all other bits. No mistakes... --- sys/dev/uart/uart_cpu.h | 5 +++-- sys/dev/uart/uart_cpu_alpha.c | 21 ++++++++++++++------- sys/dev/uart/uart_cpu_amd64.c | 21 ++++++++++++++------- sys/dev/uart/uart_cpu_i386.c | 21 ++++++++++++++------- sys/dev/uart/uart_cpu_ia64.c | 21 ++++++++++++++------- sys/dev/uart/uart_cpu_pc98.c | 21 ++++++++++++++------- sys/dev/uart/uart_cpu_sparc64.c | 21 ++++++++++++++------- sys/dev/uart/uart_dev_sab82532.c | 4 ++-- sys/dev/uart/uart_dev_z8530.c | 4 ++-- 9 files changed, 91 insertions(+), 48 deletions(-) diff --git a/sys/dev/uart/uart_cpu.h b/sys/dev/uart/uart_cpu.h index f10e4ddbcff..e60ce578306 100644 --- a/sys/dev/uart/uart_cpu.h +++ b/sys/dev/uart/uart_cpu.h @@ -67,8 +67,9 @@ struct uart_devinfo { void *cookie; /* Type dependent use. */ }; -int uart_cpu_getdev(int devtype, struct uart_devinfo *di); -int uart_cpu_eqres(struct uart_bas *b1, struct uart_bas *b2); +bus_addr_t uart_cpu_busaddr(struct uart_bas *); +int uart_cpu_eqres(struct uart_bas *, struct uart_bas *); +int uart_cpu_getdev(int, struct uart_devinfo *); void uart_add_sysdev(struct uart_devinfo*); diff --git a/sys/dev/uart/uart_cpu_alpha.c b/sys/dev/uart/uart_cpu_alpha.c index 95ee2ffffa7..86382771d4e 100644 --- a/sys/dev/uart/uart_cpu_alpha.c +++ b/sys/dev/uart/uart_cpu_alpha.c @@ -39,6 +39,20 @@ __FBSDID("$FreeBSD$"); #include #include +bus_addr_t +uart_cpu_busaddr(struct uart_bas *bas) +{ + + return (bas->bsh); +} + +int +uart_cpu_eqres(struct uart_bas *b1, struct uart_bas *b2) +{ + + return ((b1->bsh == b2->bsh && b1->bst == b2->bst) ? 1 : 0); +} + int uart_cpu_getdev(int devtype, struct uart_devinfo *di) { @@ -102,10 +116,3 @@ uart_cpu_getdev(int devtype, struct uart_devinfo *di) return (ENXIO); } - -int -uart_cpu_eqres(struct uart_bas *b1, struct uart_bas *b2) -{ - - return ((b1->bsh == b2->bsh && b1->bst == b2->bst) ? 1 : 0); -} diff --git a/sys/dev/uart/uart_cpu_amd64.c b/sys/dev/uart/uart_cpu_amd64.c index a186216e24e..1852d40263d 100644 --- a/sys/dev/uart/uart_cpu_amd64.c +++ b/sys/dev/uart/uart_cpu_amd64.c @@ -36,6 +36,20 @@ __FBSDID("$FreeBSD$"); #include #include +bus_addr_t +uart_cpu_busaddr(struct uart_bas *bas) +{ + + return (bas->bsh); +} + +int +uart_cpu_eqres(struct uart_bas *b1, struct uart_bas *b2) +{ + + return ((b1->bsh == b2->bsh && b1->bst == b2->bst) ? 1 : 0); +} + int uart_cpu_getdev(int devtype, struct uart_devinfo *di) { @@ -83,10 +97,3 @@ uart_cpu_getdev(int devtype, struct uart_devinfo *di) return (ENXIO); } - -int -uart_cpu_eqres(struct uart_bas *b1, struct uart_bas *b2) -{ - - return ((b1->bsh == b2->bsh && b1->bst == b2->bst) ? 1 : 0); -} diff --git a/sys/dev/uart/uart_cpu_i386.c b/sys/dev/uart/uart_cpu_i386.c index 04de73a7da2..9e34290abf2 100644 --- a/sys/dev/uart/uart_cpu_i386.c +++ b/sys/dev/uart/uart_cpu_i386.c @@ -36,6 +36,20 @@ __FBSDID("$FreeBSD$"); #include #include +bus_addr_t +uart_cpu_busaddr(struct uart_bas *bas) +{ + + return (bas->bsh); +} + +int +uart_cpu_eqres(struct uart_bas *b1, struct uart_bas *b2) +{ + + return ((b1->bsh == b2->bsh && b1->bst == b2->bst) ? 1 : 0); +} + int uart_cpu_getdev(int devtype, struct uart_devinfo *di) { @@ -83,10 +97,3 @@ uart_cpu_getdev(int devtype, struct uart_devinfo *di) return (ENXIO); } - -int -uart_cpu_eqres(struct uart_bas *b1, struct uart_bas *b2) -{ - - return ((b1->bsh == b2->bsh && b1->bst == b2->bst) ? 1 : 0); -} diff --git a/sys/dev/uart/uart_cpu_ia64.c b/sys/dev/uart/uart_cpu_ia64.c index f3523fb55b6..32073fceef0 100644 --- a/sys/dev/uart/uart_cpu_ia64.c +++ b/sys/dev/uart/uart_cpu_ia64.c @@ -44,6 +44,20 @@ static int dig64_to_uart_parity[] = { UART_PARITY_ODD, UART_PARITY_MARK, UART_PARITY_SPACE }; +bus_addr_t +uart_cpu_busaddr(struct uart_bas *bas) +{ + + return (bas->bsh); +} + +int +uart_cpu_eqres(struct uart_bas *b1, struct uart_bas *b2) +{ + + return ((b1->bsh == b2->bsh && b1->bst == b2->bst) ? 1 : 0); +} + int uart_cpu_getdev(int devtype, struct uart_devinfo *di) { @@ -130,10 +144,3 @@ uart_cpu_getdev(int devtype, struct uart_devinfo *di) return (ENXIO); } - -int -uart_cpu_eqres(struct uart_bas *b1, struct uart_bas *b2) -{ - - return ((b1->bsh == b2->bsh && b1->bst == b2->bst) ? 1 : 0); -} diff --git a/sys/dev/uart/uart_cpu_pc98.c b/sys/dev/uart/uart_cpu_pc98.c index ab7f0b74a2a..05704d2f656 100644 --- a/sys/dev/uart/uart_cpu_pc98.c +++ b/sys/dev/uart/uart_cpu_pc98.c @@ -36,6 +36,20 @@ __FBSDID("$FreeBSD$"); #include #include +bus_addr_t +uart_cpu_busaddr(struct uart_bas *bas) +{ + + return (bas->bsh->bsh_base); +} + +int +uart_cpu_eqres(struct uart_bas *b1, struct uart_bas *b2) +{ + + return ((b1->bsh == b2->bsh && b1->bst == b2->bst) ? 1 : 0); +} + int uart_cpu_getdev(int devtype, struct uart_devinfo *di) { @@ -87,10 +101,3 @@ uart_cpu_getdev(int devtype, struct uart_devinfo *di) return (ENXIO); } - -int -uart_cpu_eqres(struct uart_bas *b1, struct uart_bas *b2) -{ - - return ((b1->bsh == b2->bsh && b1->bst == b2->bst) ? 1 : 0); -} diff --git a/sys/dev/uart/uart_cpu_sparc64.c b/sys/dev/uart/uart_cpu_sparc64.c index fed26a88950..d14c68b2b02 100644 --- a/sys/dev/uart/uart_cpu_sparc64.c +++ b/sys/dev/uart/uart_cpu_sparc64.c @@ -58,6 +58,20 @@ uart_cpu_channel(char *dev) return (alias[len - 1] - 'a'); } +bus_addr_t +uart_cpu_busaddr(struct uart_bas *bas) +{ + + return (bas->bsh); +} + +int +uart_cpu_eqres(struct uart_bas *b1, struct uart_bas *b2) +{ + + return ((b1->bsh == b2->bsh) ? 1 : 0); +} + int uart_cpu_getdev(int devtype, struct uart_devinfo *di) { @@ -147,10 +161,3 @@ uart_cpu_getdev(int devtype, struct uart_devinfo *di) (par == 'o') ? UART_PARITY_ODD : UART_PARITY_EVEN; return (0); } - -int -uart_cpu_eqres(struct uart_bas *b1, struct uart_bas *b2) -{ - - return ((b1->bsh == b2->bsh) ? 1 : 0); -} diff --git a/sys/dev/uart/uart_dev_sab82532.c b/sys/dev/uart/uart_dev_sab82532.c index b7ca2e4956c..5345e972d24 100644 --- a/sys/dev/uart/uart_dev_sab82532.c +++ b/sys/dev/uart/uart_dev_sab82532.c @@ -42,8 +42,8 @@ __FBSDID("$FreeBSD$"); #define DEFAULT_RCLK 29491200 -#define IS_CHANNEL_A(bas) (((bas)->bsh & 0x40) == 0x00) -#define IS_CHANNEL_B(bas) (((bas)->bsh & 0x40) == 0x40) +#define IS_CHANNEL_A(bas) ((uart_cpu_busaddr(bas) & 0x40) == 0x00) +#define IS_CHANNEL_B(bas) ((uart_cpu_busaddr(bas) & 0x40) == 0x40) /* * NOTE: To allow us to read the baudrate divisor from the chip, we diff --git a/sys/dev/uart/uart_dev_z8530.c b/sys/dev/uart/uart_dev_z8530.c index 498b3a33a48..a7c6e25b310 100644 --- a/sys/dev/uart/uart_dev_z8530.c +++ b/sys/dev/uart/uart_dev_z8530.c @@ -42,8 +42,8 @@ __FBSDID("$FreeBSD$"); #define DEFAULT_RCLK 307200 -#define IS_CHANNEL_A(bas) (((bas)->bsh & 7) != 0) -#define IS_CHANNEL_B(bas) (((bas)->bsh & 7) == 0) +#define IS_CHANNEL_A(bas) ((uart_cpu_busaddr(bas) & 7) != 0) +#define IS_CHANNEL_B(bas) ((uart_cpu_busaddr(bas) & 7) == 0) /* Multiplexed I/O. */ static __inline void