qmgr.h revision 1.2 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