1 /* $OpenBSD: nvmevar.h,v 1.8 2016/04/14 11:18:32 dlg Exp $ */ 2 3 /* 4 * Copyright (c) 2014 David Gwynne <dlg@openbsd.org> 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 struct nvme_dmamem { 20 bus_dmamap_t ndm_map; 21 bus_dma_segment_t ndm_seg; 22 size_t ndm_size; 23 caddr_t ndm_kva; 24 }; 25 #define NVME_DMA_MAP(_ndm) ((_ndm)->ndm_map) 26 #define NVME_DMA_LEN(_ndm) ((_ndm)->ndm_map->dm_segs[0].ds_len) 27 #define NVME_DMA_DVA(_ndm) ((u_int64_t)(_ndm)->ndm_map->dm_segs[0].ds_addr) 28 #define NVME_DMA_KVA(_ndm) ((void *)(_ndm)->ndm_kva) 29 30 struct nvme_softc; 31 struct nvme_queue; 32 33 struct nvme_ccb { 34 SIMPLEQ_ENTRY(nvme_ccb) ccb_entry; 35 36 bus_dmamap_t ccb_dmamap; 37 38 void *ccb_cookie; 39 void (*ccb_done)(struct nvme_softc *sc, 40 struct nvme_ccb *, struct nvme_cqe *); 41 42 bus_addr_t ccb_prpl_off; 43 u_int64_t ccb_prpl_dva; 44 u_int64_t *ccb_prpl; 45 46 u_int16_t ccb_id; 47 }; 48 SIMPLEQ_HEAD(nvme_ccb_list, nvme_ccb); 49 50 struct nvme_queue { 51 struct mutex q_sq_mtx; 52 struct mutex q_cq_mtx; 53 struct nvme_dmamem *q_sq_dmamem; 54 struct nvme_dmamem *q_cq_dmamem; 55 bus_size_t q_sqtdbl; /* submission queue tail doorbell */ 56 bus_size_t q_cqhdbl; /* completion queue head doorbell */ 57 u_int16_t q_id; 58 u_int32_t q_entries; 59 u_int32_t q_sq_tail; 60 u_int32_t q_cq_head; 61 u_int16_t q_cq_phase; 62 }; 63 64 struct nvme_namespace { 65 struct nvm_identify_namespace *ident; 66 }; 67 68 struct nvme_softc { 69 struct device sc_dev; 70 71 bus_space_tag_t sc_iot; 72 bus_space_handle_t sc_ioh; 73 bus_size_t sc_ios; 74 bus_dma_tag_t sc_dmat; 75 76 void *sc_ih; 77 78 u_int sc_rdy_to; 79 size_t sc_mps; 80 size_t sc_mdts; 81 u_int sc_max_sgl; 82 83 struct nvm_identify_controller 84 sc_identify; 85 86 u_int sc_nn; 87 struct nvme_namespace *sc_namespaces; 88 89 struct nvme_queue *sc_admin_q; 90 struct nvme_queue *sc_q; 91 92 struct mutex sc_ccb_mtx; 93 struct nvme_ccb *sc_ccbs; 94 struct nvme_ccb_list sc_ccb_list; 95 struct nvme_dmamem *sc_ccb_prpls; 96 struct scsi_iopool sc_iopool; 97 98 struct scsi_link sc_link; 99 struct scsibus_softc *sc_scsibus; 100 }; 101 102 int nvme_attach(struct nvme_softc *); 103 int nvme_activate(struct nvme_softc *, int); 104 int nvme_intr(void *); 105 106 #define DEVNAME(_sc) ((_sc)->sc_dev.dv_xname) 107