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