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