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 25struct 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 36struct ldc_queue *ldc_queue_alloc(bus_dma_tag_t, int); 37void ldc_queue_free(bus_dma_tag_t, struct ldc_queue *); 38#else 39struct ldc_queue *ldc_queue_alloc(int); 40void 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 52struct 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 96struct 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 121void ldc_rx_ctrl(struct ldc_conn *, struct ldc_pkt *); 122void ldc_rx_data(struct ldc_conn *, struct ldc_pkt *); 123 124void ldc_send_vers(struct ldc_conn *); 125int ldc_send_unreliable(struct ldc_conn *, void *, size_t); 126 127void ldc_reset(struct ldc_conn *); 128 129/* 130 * LDC map tables. 131 */ 132 133struct 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 147struct 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 159struct ldc_map *ldc_map_alloc(bus_dma_tag_t, int); 160void ldc_map_free(bus_dma_tag_t, struct ldc_map *); 161#else 162struct ldc_map *ldc_map_alloc(int); 163void ldc_map_free(struct ldc_map *); 164#endif 165 166struct ldc_cookie { 167 uint64_t addr; 168 uint64_t size; 169}; 170