17e1659ccSBen Skeggs /* SPDX-License-Identifier: MIT */
27e1659ccSBen Skeggs #ifndef __NVKM_FALCON_QMGR_H__
37e1659ccSBen Skeggs #define __NVKM_FALCON_QMGR_H__
47e1659ccSBen Skeggs #include <core/falcon.h>
57e1659ccSBen Skeggs 
6b448a266STimur Tabi #define HDR_SIZE sizeof(struct nvfw_falcon_msg)
77e1659ccSBen Skeggs #define QUEUE_ALIGNMENT 4
87e1659ccSBen Skeggs /* max size of the messages we can receive */
97e1659ccSBen Skeggs #define MSG_BUF_SIZE 128
107e1659ccSBen Skeggs 
110ae59432SBen Skeggs /**
12a15d8f58SBen Skeggs  * struct nvkm_falcon_qmgr_seq - keep track of ongoing commands
130ae59432SBen Skeggs  *
140ae59432SBen Skeggs  * Every time a command is sent, a sequence is assigned to it so the
150ae59432SBen Skeggs  * corresponding message can be matched. Upon receiving the message, a callback
160ae59432SBen Skeggs  * can be called and/or a completion signaled.
170ae59432SBen Skeggs  *
180ae59432SBen Skeggs  * @id:		sequence ID
190ae59432SBen Skeggs  * @state:	current state
200ae59432SBen Skeggs  * @callback:	callback to call upon receiving matching message
210ae59432SBen Skeggs  * @completion:	completion to signal after callback is called
220ae59432SBen Skeggs  */
23a15d8f58SBen Skeggs struct nvkm_falcon_qmgr_seq {
240ae59432SBen Skeggs 	u16 id;
250ae59432SBen Skeggs 	enum {
260ae59432SBen Skeggs 		SEQ_STATE_FREE = 0,
270ae59432SBen Skeggs 		SEQ_STATE_PENDING,
280ae59432SBen Skeggs 		SEQ_STATE_USED,
290ae59432SBen Skeggs 		SEQ_STATE_CANCELLED
300ae59432SBen Skeggs 	} state;
318e90a98dSBen Skeggs 	bool async;
32c80157a2SBen Skeggs 	nvkm_falcon_qmgr_callback callback;
33c80157a2SBen Skeggs 	void *priv;
348e90a98dSBen Skeggs 	struct completion done;
35c80157a2SBen Skeggs 	int result;
368763955bSBen Skeggs };
378763955bSBen Skeggs 
380ae59432SBen Skeggs /*
390ae59432SBen Skeggs  * We can have an arbitrary number of sequences, but realistically we will
400ae59432SBen Skeggs  * probably not use that much simultaneously.
410ae59432SBen Skeggs  */
42a15d8f58SBen Skeggs #define NVKM_FALCON_QMGR_SEQ_NUM 16
430ae59432SBen Skeggs 
440ae59432SBen Skeggs struct nvkm_falcon_qmgr {
450ae59432SBen Skeggs 	struct nvkm_falcon *falcon;
460ae59432SBen Skeggs 
47a15d8f58SBen Skeggs 	struct {
48a15d8f58SBen Skeggs 		struct mutex mutex;
49a15d8f58SBen Skeggs 		struct nvkm_falcon_qmgr_seq id[NVKM_FALCON_QMGR_SEQ_NUM];
50a15d8f58SBen Skeggs 		unsigned long tbl[BITS_TO_LONGS(NVKM_FALCON_QMGR_SEQ_NUM)];
51a15d8f58SBen Skeggs 	} seq;
520ae59432SBen Skeggs };
530ae59432SBen Skeggs 
54a15d8f58SBen Skeggs struct nvkm_falcon_qmgr_seq *
550ae59432SBen Skeggs nvkm_falcon_qmgr_seq_acquire(struct nvkm_falcon_qmgr *);
560ae59432SBen Skeggs void nvkm_falcon_qmgr_seq_release(struct nvkm_falcon_qmgr *,
57a15d8f58SBen Skeggs 				  struct nvkm_falcon_qmgr_seq *);
58acc466abSBen Skeggs 
5991a4e83aSBen Skeggs struct nvkm_falcon_cmdq {
6091a4e83aSBen Skeggs 	struct nvkm_falcon_qmgr *qmgr;
6191a4e83aSBen Skeggs 	const char *name;
6291a4e83aSBen Skeggs 	struct mutex mutex;
6391a4e83aSBen Skeggs 	struct completion ready;
6491a4e83aSBen Skeggs 
6591a4e83aSBen Skeggs 	u32 head_reg;
6691a4e83aSBen Skeggs 	u32 tail_reg;
6791a4e83aSBen Skeggs 	u32 offset;
6891a4e83aSBen Skeggs 	u32 size;
6991a4e83aSBen Skeggs 
7091a4e83aSBen Skeggs 	u32 position;
7191a4e83aSBen Skeggs };
7291a4e83aSBen Skeggs 
7391a4e83aSBen Skeggs struct nvkm_falcon_msgq {
7491a4e83aSBen Skeggs 	struct nvkm_falcon_qmgr *qmgr;
7591a4e83aSBen Skeggs 	const char *name;
7691a4e83aSBen Skeggs 	struct mutex mutex;
7791a4e83aSBen Skeggs 
7891a4e83aSBen Skeggs 	u32 head_reg;
7991a4e83aSBen Skeggs 	u32 tail_reg;
8091a4e83aSBen Skeggs 	u32 offset;
8191a4e83aSBen Skeggs 
8291a4e83aSBen Skeggs 	u32 position;
8391a4e83aSBen Skeggs };
8491a4e83aSBen Skeggs 
85acc466abSBen Skeggs #define FLCNQ_PRINTK(t,q,f,a...)                                               \
86acc466abSBen Skeggs        FLCN_PRINTK(t, (q)->qmgr->falcon, "%s: "f, (q)->name, ##a)
87acc466abSBen Skeggs #define FLCNQ_DBG(q,f,a...) FLCNQ_PRINTK(debug, (q), f, ##a)
88acc466abSBen Skeggs #define FLCNQ_ERR(q,f,a...) FLCNQ_PRINTK(error, (q), f, ##a)
897e1659ccSBen Skeggs #endif
90