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