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; 76*3b330f08SBen Skeggs spinlock_t lock; 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 85e442f1e4SBen Skeggs #define FLCNQ_PRINTK(q,l,p,f,a...) FLCN_PRINTK((q)->qmgr->falcon, l, p, "%s: "f, (q)->name, ##a) 86e442f1e4SBen Skeggs #define FLCNQ_DBG(q,f,a...) FLCNQ_PRINTK((q), DEBUG, info, f, ##a) 87e442f1e4SBen Skeggs #define FLCNQ_ERR(q,f,a...) FLCNQ_PRINTK((q), ERROR, err, f, ##a) 887e1659ccSBen Skeggs #endif 89