0001
0002
0003
0004
0005
0006 #ifndef BCM_VK_MSG_H
0007 #define BCM_VK_MSG_H
0008
0009 #include <uapi/linux/misc/bcm_vk.h>
0010 #include "bcm_vk_sg.h"
0011
0012
0013 struct bcm_vk_msgq {
0014 u16 type;
0015 u16 num;
0016 u32 start;
0017
0018 u32 rd_idx;
0019 u32 wr_idx;
0020
0021 u32 size;
0022
0023
0024
0025 u32 nxt;
0026
0027
0028
0029
0030
0031 #define DB_SHIFT 16
0032
0033 u32 db_offset;
0034
0035 u32 rsvd;
0036 };
0037
0038
0039
0040
0041
0042 struct bcm_vk_sync_qinfo {
0043 void __iomem *q_start;
0044 u32 q_size;
0045 u32 q_mask;
0046 u32 q_low;
0047 u32 q_db_offset;
0048 };
0049
0050 #define VK_MSGQ_MAX_NR 4
0051
0052
0053
0054
0055
0056 struct vk_msg_blk {
0057 u8 function_id;
0058 #define VK_FID_TRANS_BUF 5
0059 #define VK_FID_SHUTDOWN 8
0060 #define VK_FID_INIT 9
0061 u8 size;
0062 u16 trans_id;
0063 u32 context_id;
0064 #define VK_NEW_CTX 0
0065 u32 cmd;
0066 #define VK_CMD_PLANES_MASK 0x000f
0067 #define VK_CMD_UPLOAD 0x0400
0068 #define VK_CMD_DOWNLOAD 0x0500
0069 #define VK_CMD_MASK 0x0f00
0070 u32 arg;
0071 };
0072
0073
0074 #define VK_MSGQ_BLK_SIZE (sizeof(struct vk_msg_blk))
0075
0076 #define VK_MSGQ_BLK_SZ_SHIFT 4
0077
0078
0079 #define VK_SIMPLEX_MSG_ID 0
0080
0081
0082 struct bcm_vk_ctx {
0083 struct list_head node;
0084 unsigned int idx;
0085 bool in_use;
0086 pid_t pid;
0087 u32 hash_idx;
0088 u32 q_num;
0089 struct miscdevice *miscdev;
0090 atomic_t pend_cnt;
0091 atomic_t dma_cnt;
0092 wait_queue_head_t rd_wq;
0093 };
0094
0095
0096 struct bcm_vk_ht_entry {
0097 struct list_head head;
0098 };
0099
0100 #define VK_DMA_MAX_ADDRS 4
0101
0102 struct bcm_vk_wkent {
0103 struct list_head node;
0104 struct bcm_vk_ctx *ctx;
0105
0106
0107 struct bcm_vk_dma dma[VK_DMA_MAX_ADDRS];
0108
0109 u32 to_h_blks;
0110 struct vk_msg_blk *to_h_msg;
0111
0112
0113
0114
0115
0116 u32 usr_msg_id;
0117 u32 to_v_blks;
0118 u32 seq_num;
0119 struct vk_msg_blk to_v_msg[];
0120 };
0121
0122
0123 struct bcm_vk_qs_cnts {
0124 u32 cnt;
0125 u32 acc_sum;
0126 u32 max_occ;
0127 u32 max_abs;
0128 };
0129
0130
0131 struct bcm_vk_msg_chan {
0132 u32 q_nr;
0133
0134 struct mutex msgq_mutex;
0135
0136 struct bcm_vk_msgq __iomem *msgq[VK_MSGQ_MAX_NR];
0137
0138 spinlock_t pendq_lock;
0139
0140 struct list_head pendq[VK_MSGQ_MAX_NR];
0141
0142 struct bcm_vk_sync_qinfo sync_qinfo[VK_MSGQ_MAX_NR];
0143 };
0144
0145
0146 #define VK_MSGQ_PER_CHAN_MAX 3
0147 #define VK_MSGQ_NUM_DEFAULT (VK_MSGQ_PER_CHAN_MAX - 1)
0148
0149
0150 #define VK_CMPT_CTX_MAX (32 * 5)
0151
0152
0153 #define VK_PID_HT_SHIFT_BIT 7
0154 #define VK_PID_HT_SZ BIT(VK_PID_HT_SHIFT_BIT)
0155
0156
0157 #define VK_BAR0_SEG_SIZE (4 * SZ_1K)
0158
0159
0160 #define VK_SHUTDOWN_PID 1
0161 #define VK_SHUTDOWN_GRACEFUL 2
0162
0163 #endif