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