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