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