1/*	$OpenBSD: ufshcivar.h,v 1.9 2024/05/29 00:48:15 jsg Exp $ */
2
3/*
4 * Copyright (c) 2022 Marcus Glocker <mglocker@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#define UFSHCI_READ_4(sc, x) \
20    bus_space_read_4((sc)->sc_iot, (sc)->sc_ioh, (x))
21#define UFSHCI_WRITE_4(sc, x, y) \
22    bus_space_write_4((sc)->sc_iot, (sc)->sc_ioh, (x), (y))
23
24#define UFSHCI_DMA_MAP(_udm)	((_udm)->udm_map)
25#define UFSHCI_DMA_LEN(_udm)	((_udm)->udm_map->dm_segs[0].ds_len)
26#define UFSHCI_DMA_DVA(_udm)	((uint64_t)(_udm)->udm_map->dm_segs[0].ds_addr)
27#define UFSHCI_DMA_KVA(_udm)	((void *)(_udm)->udm_kva)
28struct ufshci_dmamem {
29	bus_dmamap_t		udm_map;
30	bus_dma_segment_t	udm_seg;
31	size_t			udm_size;
32	caddr_t			udm_kva;
33};
34
35struct ufshci_softc;
36
37/* SCSI */
38struct ufshci_ccb {
39	SIMPLEQ_ENTRY(ufshci_ccb)	 ccb_entry;
40	bus_dmamap_t			 ccb_dmamap;
41	void				*ccb_cookie;
42	int				 ccb_slot;
43#define CCB_STATUS_FREE		0
44#define CCB_STATUS_INPROGRESS	1
45#define CCB_STATUS_READY2FREE	2
46	int				 ccb_status;
47	void				 (*ccb_done)(struct ufshci_softc *,
48					     struct ufshci_ccb *);
49};
50SIMPLEQ_HEAD(ufshci_ccb_list, ufshci_ccb);
51
52struct ufshci_softc {
53	struct device		 sc_dev;
54
55	bus_space_tag_t		 sc_iot;
56	bus_space_handle_t	 sc_ioh;
57	bus_size_t		 sc_ios;
58	bus_dma_tag_t		 sc_dmat;
59
60	uint8_t			 sc_iacth;
61	struct mutex		 sc_cmd_mtx;
62
63#define UFSHCI_FLAGS_AGGR_INTR	 1
64	uint8_t			 sc_flags;
65	uint32_t		 sc_ver;
66	uint32_t		 sc_cap;
67	uint32_t		 sc_hcpid;
68	uint32_t		 sc_hcmid;
69	uint8_t			 sc_nutmrs;
70	uint8_t			 sc_rtt;
71	uint8_t			 sc_nutrs;
72
73	struct ufshci_dmamem	*sc_dmamem_utmrd;
74	struct ufshci_dmamem	*sc_dmamem_utrd;
75	struct ufshci_dmamem	*sc_dmamem_ucd;
76
77	/* SCSI */
78	struct scsi_iopool	 sc_iopool;
79	struct mutex		 sc_ccb_mtx;
80	struct ufshci_ccb_list	 sc_ccb_list;
81	struct ufshci_ccb	*sc_ccbs;
82};
83
84int	ufshci_intr(void *);
85int	ufshci_attach(struct ufshci_softc *);
86int	ufshci_activate(struct ufshci_softc *, int);
87