xref: /netbsd/sys/dev/ic/comvar.h (revision 817bf2f8)
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