1 /* SPDX-License-Identifier: GPL-2.0 */ 2 /* 3 * Copyright 2018-2020 Broadcom. 4 */ 5 6 #ifndef BCM_VK_MSG_H 7 #define BCM_VK_MSG_H 8 9 #include <uapi/linux/misc/bcm_vk.h> 10 #include "bcm_vk_sg.h" 11 12 /* Single message queue control structure */ 13 struct bcm_vk_msgq { 14 u16 type; /* queue type */ 15 u16 num; /* queue number */ 16 u32 start; /* offset in BAR1 where the queue memory starts */ 17 18 u32 rd_idx; /* read idx */ 19 u32 wr_idx; /* write idx */ 20 21 u32 size; /* 22 * size, which is in number of 16byte blocks, 23 * to align with the message data structure. 24 */ 25 u32 nxt; /* 26 * nxt offset to the next msg queue struct. 27 * This is to provide flexibity for alignment purposes. 28 */ 29 30 /* Least significant 16 bits in below field hold doorbell register offset */ 31 #define DB_SHIFT 16 32 33 u32 db_offset; /* queue doorbell register offset in BAR0 */ 34 35 u32 rsvd; 36 }; 37 38 /* 39 * Structure to record static info from the msgq sync. We keep local copy 40 * for some of these variables for both performance + checking purpose. 41 */ 42 struct bcm_vk_sync_qinfo { 43 void __iomem *q_start; 44 u32 q_size; 45 u32 q_mask; 46 u32 q_low; 47 u32 q_db_offset; 48 }; 49 50 #define VK_MSGQ_MAX_NR 4 /* Maximum number of message queues */ 51 52 /* 53 * message block - basic unit in the message where a message's size is always 54 * N x sizeof(basic_block) 55 */ 56 struct vk_msg_blk { 57 u8 function_id; 58 #define VK_FID_TRANS_BUF 5 59 #define VK_FID_SHUTDOWN 8 60 #define VK_FID_INIT 9 61 u8 size; /* size of the message in number of vk_msg_blk's */ 62 u16 trans_id; /* transport id, queue & msg_id */ 63 u32 context_id; 64 #define VK_NEW_CTX 0 65 u32 cmd; 66 #define VK_CMD_PLANES_MASK 0x000f /* number of planes to up/download */ 67 #define VK_CMD_UPLOAD 0x0400 /* memory transfer to vk */ 68 #define VK_CMD_DOWNLOAD 0x0500 /* memory transfer from vk */ 69 #define VK_CMD_MASK 0x0f00 /* command mask */ 70 u32 arg; 71 }; 72 73 /* vk_msg_blk is 16 bytes fixed */ 74 #define VK_MSGQ_BLK_SIZE (sizeof(struct vk_msg_blk)) 75 /* shift for fast division of basic msg blk size */ 76 #define VK_MSGQ_BLK_SZ_SHIFT 4 77 78 /* use msg_id 0 for any simplex host2vk communication */ 79 #define VK_SIMPLEX_MSG_ID 0 80 81 /* context per session opening of sysfs */ 82 struct bcm_vk_ctx { 83 struct list_head node; /* use for linkage in Hash Table */ 84 unsigned int idx; 85 bool in_use; 86 pid_t pid; 87 u32 hash_idx; 88 u32 q_num; /* queue number used by the stream */ 89 struct miscdevice *miscdev; 90 atomic_t pend_cnt; /* number of items pending to be read from host */ 91 atomic_t dma_cnt; /* any dma transaction outstanding */ 92 wait_queue_head_t rd_wq; 93 }; 94 95 /* pid hash table entry */ 96 struct bcm_vk_ht_entry { 97 struct list_head head; 98 }; 99 100 #define VK_DMA_MAX_ADDRS 4 /* Max 4 DMA Addresses */ 101 /* structure for house keeping a single work entry */ 102 struct bcm_vk_wkent { 103 struct list_head node; /* for linking purpose */ 104 struct bcm_vk_ctx *ctx; 105 106 /* Store up to 4 dma pointers */ 107 struct bcm_vk_dma dma[VK_DMA_MAX_ADDRS]; 108 109 u32 to_h_blks; /* response */ 110 struct vk_msg_blk *to_h_msg; 111 112 /* 113 * put the to_v_msg at the end so that we could simply append to_v msg 114 * to the end of the allocated block 115 */ 116 u32 usr_msg_id; 117 u32 to_v_blks; 118 u32 seq_num; 119 struct vk_msg_blk to_v_msg[]; 120 }; 121 122 /* queue stats counters */ 123 struct bcm_vk_qs_cnts { 124 u32 cnt; /* general counter, used to limit output */ 125 u32 acc_sum; 126 u32 max_occ; /* max during a sampling period */ 127 u32 max_abs; /* the abs max since reset */ 128 }; 129 130 /* control channel structure for either to_v or to_h communication */ 131 struct bcm_vk_msg_chan { 132 u32 q_nr; 133 /* Mutex to access msgq */ 134 struct mutex msgq_mutex; 135 /* pointing to BAR locations */ 136 struct bcm_vk_msgq __iomem *msgq[VK_MSGQ_MAX_NR]; 137 /* Spinlock to access pending queue */ 138 spinlock_t pendq_lock; 139 /* for temporary storing pending items, one for each queue */ 140 struct list_head pendq[VK_MSGQ_MAX_NR]; 141 /* static queue info from the sync */ 142 struct bcm_vk_sync_qinfo sync_qinfo[VK_MSGQ_MAX_NR]; 143 }; 144 145 /* totol number of message q allowed by the driver */ 146 #define VK_MSGQ_PER_CHAN_MAX 3 147 #define VK_MSGQ_NUM_DEFAULT (VK_MSGQ_PER_CHAN_MAX - 1) 148 149 /* total number of supported ctx, 32 ctx each for 5 components */ 150 #define VK_CMPT_CTX_MAX (32 * 5) 151 152 /* hash table defines to store the opened FDs */ 153 #define VK_PID_HT_SHIFT_BIT 7 /* 128 */ 154 #define VK_PID_HT_SZ BIT(VK_PID_HT_SHIFT_BIT) 155 156 /* The following are offsets of DDR info provided by the vk card */ 157 #define VK_BAR0_SEG_SIZE (4 * SZ_1K) /* segment size for BAR0 */ 158 159 /* shutdown types supported */ 160 #define VK_SHUTDOWN_PID 1 161 #define VK_SHUTDOWN_GRACEFUL 2 162 163 #endif 164