xref: /netbsd-src/sys/external/bsd/drm2/dist/drm/nouveau/nvkm/falcon/qmgr.h (revision 41ec02673d281bbb3d38e6c78504ce6e30c228c1)
1 /*	$NetBSD: qmgr.h,v 1.2 2021/12/18 23:45:38 riastradh Exp $	*/
2 
3 /* SPDX-License-Identifier: MIT */
4 #ifndef __NVKM_FALCON_QMGR_H__
5 #define __NVKM_FALCON_QMGR_H__
6 #include <core/falcon.h>
7 
8 #define HDR_SIZE sizeof(struct nv_falcon_msg)
9 #define QUEUE_ALIGNMENT 4
10 /* max size of the messages we can receive */
11 #define MSG_BUF_SIZE 128
12 
13 /**
14  * struct nvkm_falcon_qmgr_seq - keep track of ongoing commands
15  *
16  * Every time a command is sent, a sequence is assigned to it so the
17  * corresponding message can be matched. Upon receiving the message, a callback
18  * can be called and/or a completion signaled.
19  *
20  * @id:		sequence ID
21  * @state:	current state
22  * @callback:	callback to call upon receiving matching message
23  * @completion:	completion to signal after callback is called
24  */
25 struct nvkm_falcon_qmgr_seq {
26 	u16 id;
27 	enum {
28 		SEQ_STATE_FREE = 0,
29 		SEQ_STATE_PENDING,
30 		SEQ_STATE_USED,
31 		SEQ_STATE_CANCELLED
32 	} state;
33 	bool async;
34 	nvkm_falcon_qmgr_callback callback;
35 	void *priv;
36 	struct completion done;
37 	int result;
38 };
39 
40 /*
41  * We can have an arbitrary number of sequences, but realistically we will
42  * probably not use that much simultaneously.
43  */
44 #define NVKM_FALCON_QMGR_SEQ_NUM 16
45 
46 struct nvkm_falcon_qmgr {
47 	struct nvkm_falcon *falcon;
48 
49 	struct {
50 		struct mutex mutex;
51 		struct nvkm_falcon_qmgr_seq id[NVKM_FALCON_QMGR_SEQ_NUM];
52 		unsigned long tbl[BITS_TO_LONGS(NVKM_FALCON_QMGR_SEQ_NUM)];
53 	} seq;
54 };
55 
56 struct nvkm_falcon_qmgr_seq *
57 nvkm_falcon_qmgr_seq_acquire(struct nvkm_falcon_qmgr *);
58 void nvkm_falcon_qmgr_seq_release(struct nvkm_falcon_qmgr *,
59 				  struct nvkm_falcon_qmgr_seq *);
60 
61 struct nvkm_falcon_cmdq {
62 	struct nvkm_falcon_qmgr *qmgr;
63 	const char *name;
64 	struct mutex mutex;
65 	struct completion ready;
66 
67 	u32 head_reg;
68 	u32 tail_reg;
69 	u32 offset;
70 	u32 size;
71 
72 	u32 position;
73 };
74 
75 struct nvkm_falcon_msgq {
76 	struct nvkm_falcon_qmgr *qmgr;
77 	const char *name;
78 	struct mutex mutex;
79 
80 	u32 head_reg;
81 	u32 tail_reg;
82 	u32 offset;
83 
84 	u32 position;
85 };
86 
87 #define FLCNQ_PRINTK(t,q,f,a...)                                               \
88        FLCN_PRINTK(t, (q)->qmgr->falcon, "%s: "f, (q)->name, ##a)
89 #define FLCNQ_DBG(q,f,a...) FLCNQ_PRINTK(debug, (q), f, ##a)
90 #define FLCNQ_ERR(q,f,a...) FLCNQ_PRINTK(error, (q), f, ##a)
91 #endif
92