xref: /netbsd/sys/arch/sparc64/dev/ldcvar.h (revision 19a0c88d)
1 /*	$NetBSD: ldcvar.h,v 1.1 2016/08/19 19:02:07 palle Exp $	*/
2 /*	$OpenBSD: ldcvar.h,v 1.6 2014/09/29 17:43:29 kettenis Exp $	*/
3 /*
4  * Copyright (c) 2009 Mark Kettenis
5  *
6  * Permission to use, copy, modify, and distribute this software for any
7  * purpose with or without fee is hereby granted, provided that the above
8  * copyright notice and this permission notice appear in all copies.
9  *
10  * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
11  * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
12  * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
13  * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
14  * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
15  * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
16  * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
17  */
18 
19 /*
20  * LDC queues.
21  */
22 
23 #include <sys/mutex.h>
24 
25 struct ldc_queue {
26 	kmutex_t	lq_mtx;
27 #if OPENBSD_BUSDMA
28 	bus_dmamap_t	lq_map;
29 	bus_dma_segment_t lq_seg;
30 #endif
31 	vaddr_t		lq_va;
32 	int		lq_nentries;
33 };
34 
35 #if OPENBSD_BUSDMA
36 struct ldc_queue *ldc_queue_alloc(bus_dma_tag_t, int);
37 void	ldc_queue_free(bus_dma_tag_t, struct ldc_queue *);
38 #else
39 struct ldc_queue *ldc_queue_alloc(int);
40 void	ldc_queue_free(struct ldc_queue *);
41 #endif
42 
43 /*
44  * LDC virtual link layer protocol.
45  */
46 
47 #define LDC_VERSION_MAJOR	1
48 #define LDC_VERSION_MINOR	0
49 
50 #define LDC_PKT_PAYLOAD		56
51 
52 struct ldc_pkt {
53 	uint8_t		type;
54 	uint8_t		stype;
55 	uint8_t		ctrl;
56 	uint8_t		env;
57 	uint32_t	seqid;
58 
59 	uint16_t	major;
60 	uint16_t	minor;
61 	uint32_t	_reserved[13];
62 };
63 
64 /* Packet types. */
65 #define LDC_CTRL	0x01
66 #define LDC_DATA	0x02
67 #define LDC_ERR		0x10
68 
69 /* Packet subtypes. */
70 #define LDC_INFO	0x01
71 #define LDC_ACK		0x02
72 #define LDC_NACK	0x04
73 
74 /* Control info values. */
75 #define LDC_VERS	0x01
76 #define LDC_RTS		0x02
77 #define LDC_RTR		0x03
78 #define LDC_RDX		0x04
79 
80 /* Packet envelope. */
81 #define LDC_MODE_RAW		0x00
82 #define LDC_MODE_UNRELIABLE	0x01
83 #define LDC_MODE_RELIABLE	0x03
84 
85 #define LDC_LEN_MASK	0x3f
86 #define LDC_FRAG_MASK	0xc0
87 #define LDC_FRAG_START	0x40
88 #define LDC_FRAG_STOP	0x80
89 
90 /*
91  * XXX Get rid of the +8 once we no longer need to store the header of
92  * the first packet.
93  */
94 #define LDC_MSG_MAX	(128 + 8)
95 
96 struct ldc_conn {
97 	uint64_t	lc_id;
98 
99 	struct ldc_queue *lc_txq;
100 	struct ldc_queue *lc_rxq;
101 	uint64_t	lc_tx_state;
102 	uint64_t	lc_rx_state;
103 
104 	uint32_t	lc_tx_seqid;
105 	uint8_t		lc_state;
106 #define LDC_SND_VERS	1
107 #define LDC_RCV_VERS	2
108 #define LDC_SND_RTS	3
109 #define LDC_SND_RTR	4
110 #define LDC_SND_RDX	5
111 
112 	uint64_t	lc_msg[LDC_MSG_MAX / 8];
113 	size_t		lc_len;
114 
115 	void		*lc_sc;
116 	void		(*lc_reset)(struct ldc_conn *);
117 	void		(*lc_start)(struct ldc_conn *);
118 	void		(*lc_rx_data)(struct ldc_conn *, struct ldc_pkt *);
119 };
120 
121 void	ldc_rx_ctrl(struct ldc_conn *, struct ldc_pkt *);
122 void	ldc_rx_data(struct ldc_conn *, struct ldc_pkt *);
123 
124 void	ldc_send_vers(struct ldc_conn *);
125 int	ldc_send_unreliable(struct ldc_conn *, void *, size_t);
126 
127 void	ldc_reset(struct ldc_conn *);
128 
129 /*
130  * LDC map tables.
131  */
132 
133 struct ldc_map_slot {
134 	uint64_t	entry;
135 	uint64_t	cookie;
136 };
137 
138 #define LDC_MTE_R	0x0000000000000010ULL
139 #define LDC_MTE_W	0x0000000000000020ULL
140 #define LDC_MTE_X	0x0000000000000040ULL
141 #define LDC_MTE_IOR	0x0000000000000080ULL
142 #define LDC_MTE_IOW	0x0000000000000100ULL
143 #define LDC_MTE_CPR	0x0000000000000200ULL
144 #define LDC_MTE_CPW	0x0000000000000400ULL
145 #define LDC_MTE_RA_MASK	0x007fffffffffe000ULL
146 
147 struct ldc_map {
148 #if OPENBSD_BUSDMA
149 	bus_dmamap_t		lm_map;
150 	bus_dma_segment_t	lm_seg;
151 #endif
152 	struct ldc_map_slot	*lm_slot;
153 	int			lm_nentries;
154 	int			lm_next;
155 	int			lm_count;
156 };
157 
158 #if OPENBSD_BUSDMA
159 struct ldc_map *ldc_map_alloc(bus_dma_tag_t, int);
160 void	ldc_map_free(bus_dma_tag_t, struct ldc_map *);
161 #else
162 struct ldc_map *ldc_map_alloc(int);
163 void	ldc_map_free(struct ldc_map *);
164 #endif
165 
166 struct ldc_cookie {
167 	uint64_t	addr;
168 	uint64_t	size;
169 };
170