1 1.98 riastrad /* $NetBSD: comvar.h,v 1.98 2022/10/08 07:27:03 riastradh Exp $ */ 2 1.1 cgd 3 1.1 cgd /* 4 1.2 cgd * Copyright (c) 1996 Christopher G. Demetriou. All rights reserved. 5 1.1 cgd * 6 1.1 cgd * Redistribution and use in source and binary forms, with or without 7 1.1 cgd * modification, are permitted provided that the following conditions 8 1.1 cgd * are met: 9 1.1 cgd * 1. Redistributions of source code must retain the above copyright 10 1.1 cgd * notice, this list of conditions and the following disclaimer. 11 1.1 cgd * 2. Redistributions in binary form must reproduce the above copyright 12 1.1 cgd * notice, this list of conditions and the following disclaimer in the 13 1.1 cgd * documentation and/or other materials provided with the distribution. 14 1.1 cgd * 3. All advertising materials mentioning features or use of this software 15 1.1 cgd * must display the following acknowledgement: 16 1.1 cgd * This product includes software developed by Christopher G. Demetriou 17 1.1 cgd * for the NetBSD Project. 18 1.1 cgd * 4. The name of the author may not be used to endorse or promote products 19 1.1 cgd * derived from this software without specific prior written permission 20 1.1 cgd * 21 1.1 cgd * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR 22 1.1 cgd * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES 23 1.1 cgd * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. 24 1.1 cgd * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, 25 1.1 cgd * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT 26 1.1 cgd * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 27 1.1 cgd * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 28 1.1 cgd * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 29 1.1 cgd * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF 30 1.1 cgd * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 31 1.1 cgd */ 32 1.1 cgd 33 1.97 riastrad #ifndef _SYS_DEV_IC_COMVAR_H_ 34 1.97 riastrad #define _SYS_DEV_IC_COMVAR_H_ 35 1.97 riastrad 36 1.38 sommerfe #include "opt_multiprocessor.h" 37 1.38 sommerfe #include "opt_lockdebug.h" 38 1.38 sommerfe #include "opt_com.h" 39 1.40 lukem #include "opt_kgdb.h" 40 1.38 sommerfe 41 1.73 tls #ifdef RND_COM 42 1.80 riastrad #include <sys/rndsource.h> 43 1.17 explorer #endif 44 1.24 thorpej 45 1.32 thorpej #include <sys/callout.h> 46 1.24 thorpej #include <sys/timepps.h> 47 1.56 ad #include <sys/mutex.h> 48 1.71 uebayasi #include <sys/device.h> 49 1.17 explorer 50 1.54 gdamore #include <dev/ic/comreg.h> /* for COM_NPORTS */ 51 1.54 gdamore 52 1.54 gdamore struct com_regs; 53 1.54 gdamore 54 1.48 perry int comcnattach(bus_space_tag_t, bus_addr_t, int, int, int, tcflag_t); 55 1.54 gdamore int comcnattach1(struct com_regs *, int, int, int, tcflag_t); 56 1.12 drochner 57 1.12 drochner #ifdef KGDB 58 1.48 perry int com_kgdb_attach(bus_space_tag_t, bus_addr_t, int, int, int, tcflag_t); 59 1.54 gdamore int com_kgdb_attach1(struct com_regs *, int, int, int, tcflag_t); 60 1.12 drochner #endif 61 1.8 mycroft 62 1.48 perry int com_is_console(bus_space_tag_t, bus_addr_t, bus_space_handle_t *); 63 1.14 drochner 64 1.8 mycroft /* Hardware flag masks */ 65 1.8 mycroft #define COM_HW_NOIEN 0x01 66 1.8 mycroft #define COM_HW_FIFO 0x02 67 1.94 rin #define COM_HW_BROKEN_ETXRDY 0x04 68 1.18 fvdl #define COM_HW_FLOW 0x08 69 1.21 cgd #define COM_HW_DEV_OK 0x20 70 1.8 mycroft #define COM_HW_CONSOLE 0x40 71 1.11 thorpej #define COM_HW_KGDB 0x80 72 1.31 soda #define COM_HW_TXFIFO_DISABLE 0x100 73 1.43 thorpej #define COM_HW_NO_TXPRELOAD 0x200 74 1.77 jmcneill #define COM_HW_AFE 0x400 75 1.8 mycroft 76 1.8 mycroft /* Buffer size for character buffer */ 77 1.64 tsutsui #ifndef COM_RING_SIZE 78 1.19 mycroft #define COM_RING_SIZE 2048 79 1.64 tsutsui #endif 80 1.8 mycroft 81 1.54 gdamore #define COM_REG_RXDATA 0 82 1.54 gdamore #define COM_REG_TXDATA 1 83 1.54 gdamore #define COM_REG_DLBL 2 84 1.54 gdamore #define COM_REG_DLBH 3 85 1.54 gdamore #define COM_REG_IER 4 86 1.54 gdamore #define COM_REG_IIR 5 87 1.54 gdamore #define COM_REG_FIFO 6 88 1.92 thorpej #define COM_REG_TCR 7 89 1.92 thorpej #define COM_REG_EFR 8 90 1.92 thorpej #define COM_REG_TLR 9 91 1.92 thorpej #define COM_REG_LCR 10 92 1.92 thorpej #define COM_REG_MCR 11 93 1.92 thorpej #define COM_REG_LSR 12 94 1.92 thorpej #define COM_REG_MSR 13 95 1.92 thorpej #define COM_REG_MDR1 14 /* TI OMAP */ 96 1.92 thorpej #define COM_REG_USR 15 /* 16750/DW APB */ 97 1.92 thorpej #define COM_REG_TFL 16 /* DW APB */ 98 1.92 thorpej #define COM_REG_RFL 17 /* DW APB */ 99 1.92 thorpej #define COM_REG_HALT 18 /* DW APB */ 100 1.92 thorpej 101 1.92 thorpej #define COM_REGMAP_NENTRIES 19 102 1.54 gdamore 103 1.54 gdamore struct com_regs { 104 1.54 gdamore bus_space_tag_t cr_iot; 105 1.54 gdamore bus_space_handle_t cr_ioh; 106 1.54 gdamore bus_addr_t cr_iobase; 107 1.54 gdamore bus_size_t cr_nports; 108 1.92 thorpej bus_size_t cr_map[COM_REGMAP_NENTRIES]; 109 1.96 jmcneill uint8_t (*cr_read)(struct com_regs *, u_int); 110 1.96 jmcneill void (*cr_write)(struct com_regs *, u_int, uint8_t); 111 1.96 jmcneill void (*cr_write_multi)(struct com_regs *, u_int, 112 1.96 jmcneill const uint8_t *, 113 1.96 jmcneill bus_size_t); 114 1.96 jmcneill 115 1.54 gdamore }; 116 1.54 gdamore 117 1.89 thorpej void com_init_regs(struct com_regs *, bus_space_tag_t, bus_space_handle_t, 118 1.89 thorpej bus_addr_t); 119 1.91 thorpej void com_init_regs_stride(struct com_regs *, bus_space_tag_t, 120 1.91 thorpej bus_space_handle_t, bus_addr_t, u_int); 121 1.96 jmcneill void com_init_regs_stride_width(struct com_regs *, bus_space_tag_t, 122 1.96 jmcneill bus_space_handle_t, bus_addr_t, u_int, u_int); 123 1.54 gdamore 124 1.67 dyoung struct comcons_info { 125 1.67 dyoung struct com_regs regs; 126 1.67 dyoung int rate; 127 1.67 dyoung int frequency; 128 1.67 dyoung int type; 129 1.67 dyoung tcflag_t cflag; 130 1.67 dyoung }; 131 1.67 dyoung 132 1.8 mycroft struct com_softc { 133 1.61 cube device_t sc_dev; 134 1.8 mycroft void *sc_si; 135 1.8 mycroft struct tty *sc_tty; 136 1.32 thorpej 137 1.88 jmcneill callout_t sc_diag_callout; 138 1.88 jmcneill callout_t sc_poll_callout; 139 1.95 thorpej struct timeval sc_hup_pending; 140 1.8 mycroft 141 1.15 is int sc_frequency; 142 1.8 mycroft 143 1.54 gdamore struct com_regs sc_regs; 144 1.8 mycroft bus_space_handle_t sc_hayespioh; 145 1.8 mycroft 146 1.54 gdamore 147 1.19 mycroft u_int sc_overflows, 148 1.19 mycroft sc_floods, 149 1.19 mycroft sc_errors; 150 1.19 mycroft 151 1.19 mycroft int sc_hwflags, 152 1.19 mycroft sc_swflags; 153 1.19 mycroft u_int sc_fifolen; 154 1.19 mycroft 155 1.19 mycroft u_int sc_r_hiwat, 156 1.19 mycroft sc_r_lowat; 157 1.19 mycroft u_char *volatile sc_rbget, 158 1.19 mycroft *volatile sc_rbput; 159 1.19 mycroft volatile u_int sc_rbavail; 160 1.19 mycroft u_char *sc_rbuf, 161 1.19 mycroft *sc_ebuf; 162 1.8 mycroft 163 1.8 mycroft u_char *sc_tba; 164 1.19 mycroft u_int sc_tbc, 165 1.19 mycroft sc_heldtbc; 166 1.8 mycroft 167 1.10 mycroft volatile u_char sc_rx_flags, 168 1.10 mycroft #define RX_TTY_BLOCKED 0x01 169 1.10 mycroft #define RX_TTY_OVERFLOWED 0x02 170 1.10 mycroft #define RX_IBUF_BLOCKED 0x04 171 1.10 mycroft #define RX_IBUF_OVERFLOWED 0x08 172 1.10 mycroft #define RX_ANY_BLOCK 0x0f 173 1.8 mycroft sc_tx_busy, 174 1.8 mycroft sc_tx_done, 175 1.8 mycroft sc_tx_stopped, 176 1.8 mycroft sc_st_check, 177 1.8 mycroft sc_rx_ready; 178 1.8 mycroft 179 1.8 mycroft volatile u_char sc_heldchange; 180 1.19 mycroft volatile u_char sc_msr, sc_msr_delta, sc_msr_mask, sc_mcr, 181 1.19 mycroft sc_mcr_active, sc_lcr, sc_ier, sc_fifo, sc_dlbl, sc_dlbh, sc_efr; 182 1.19 mycroft u_char sc_mcr_dtr, sc_mcr_rts, sc_msr_cts, sc_msr_dcd; 183 1.42 enami 184 1.84 jmcneill u_char sc_prescaler; /* for COM_TYPE_HAYESP */ 185 1.45 thorpej 186 1.45 thorpej /* 187 1.45 thorpej * There are a great many almost-ns16550-compatible UARTs out 188 1.45 thorpej * there, which have minor differences. The type field here 189 1.45 thorpej * lets us distinguish between them. 190 1.45 thorpej */ 191 1.45 thorpej int sc_type; 192 1.45 thorpej #define COM_TYPE_NORMAL 0 /* normal 16x50 */ 193 1.45 thorpej #define COM_TYPE_HAYESP 1 /* Hayes ESP modem */ 194 1.45 thorpej #define COM_TYPE_PXA2x0 2 /* Intel PXA2x0 processor built-in */ 195 1.47 simonb #define COM_TYPE_AU1x00 3 /* AMD/Alchemy Au1x000 proc. built-in */ 196 1.62 matt #define COM_TYPE_OMAP 4 /* TI OMAP processor built-in */ 197 1.63 matt #define COM_TYPE_16550_NOERS 5 /* like a 16550, no ERS */ 198 1.79 macallan #define COM_TYPE_INGENIC 6 /* JZ4780 built-in */ 199 1.81 jmcneill #define COM_TYPE_TEGRA 7 /* NVIDIA Tegra built-in */ 200 1.83 jmcneill #define COM_TYPE_BCMAUXUART 8 /* BCM2835 AUX UART */ 201 1.84 jmcneill #define COM_TYPE_16650 9 202 1.84 jmcneill #define COM_TYPE_16750 10 203 1.87 jmcneill #define COM_TYPE_DW_APB 11 /* DesignWare APB UART */ 204 1.20 marc 205 1.93 rin int sc_poll_ticks; 206 1.93 rin 207 1.20 marc /* power management hooks */ 208 1.48 perry int (*enable)(struct com_softc *); 209 1.48 perry void (*disable)(struct com_softc *); 210 1.20 marc int enabled; 211 1.23 jonathan 212 1.52 kardel struct pps_state sc_pps_state; /* pps state */ 213 1.19 mycroft 214 1.73 tls #ifdef RND_COM 215 1.72 tls krndsource_t rnd_source; 216 1.36 sommerfe #endif 217 1.56 ad kmutex_t sc_lock; 218 1.1 cgd }; 219 1.1 cgd 220 1.48 perry int comprobe1(bus_space_tag_t, bus_space_handle_t); 221 1.48 perry int comintr(void *); 222 1.48 perry void com_attach_subr(struct com_softc *); 223 1.54 gdamore int com_probe_subr(struct com_regs *); 224 1.65 cegger int com_detach(device_t, int); 225 1.70 dyoung bool com_resume(device_t, const pmf_qual_t *); 226 1.60 dyoung bool com_cleanup(device_t, int); 227 1.70 dyoung bool com_suspend(device_t, const pmf_qual_t *); 228 1.56 ad 229 1.57 ad #ifndef IPL_SERIAL 230 1.56 ad #define IPL_SERIAL IPL_TTY 231 1.56 ad #define splserial() spltty() 232 1.56 ad #endif 233 1.97 riastrad 234 1.97 riastrad #endif /* _SYS_DEV_IC_COMVAR_H_ */ 235