misc: bcm-vk: unlock on error in bcm_to_h_msg_dequeue()
[linux-2.6-microblaze.git] / drivers / misc / bcm-vk / bcm_vk_msg.c
1 // SPDX-License-Identifier: GPL-2.0
2 /*
3  * Copyright 2018-2020 Broadcom.
4  */
5
6 #include <linux/delay.h>
7 #include <linux/fs.h>
8 #include <linux/hash.h>
9 #include <linux/interrupt.h>
10 #include <linux/list.h>
11 #include <linux/module.h>
12 #include <linux/poll.h>
13 #include <linux/sizes.h>
14 #include <linux/spinlock.h>
15 #include <linux/timer.h>
16
17 #include "bcm_vk.h"
18 #include "bcm_vk_msg.h"
19 #include "bcm_vk_sg.h"
20
21 /* functions to manipulate the transport id in msg block */
22 #define BCM_VK_MSG_Q_SHIFT       4
23 #define BCM_VK_MSG_Q_MASK        0xF
24 #define BCM_VK_MSG_ID_MASK       0xFFF
25
26 #define BCM_VK_DMA_DRAIN_MAX_MS   2000
27
28 /* number x q_size will be the max number of msg processed per loop */
29 #define BCM_VK_MSG_PROC_MAX_LOOP 2
30
31 /* module parameter */
32 static bool hb_mon = true;
33 module_param(hb_mon, bool, 0444);
34 MODULE_PARM_DESC(hb_mon, "Monitoring heartbeat continuously.\n");
35 static int batch_log = 1;
36 module_param(batch_log, int, 0444);
37 MODULE_PARM_DESC(batch_log, "Max num of logs per batch operation.\n");
38
39 static bool hb_mon_is_on(void)
40 {
41         return hb_mon;
42 }
43
44 static u32 get_q_num(const struct vk_msg_blk *msg)
45 {
46         u32 q_num = msg->trans_id & BCM_VK_MSG_Q_MASK;
47
48         if (q_num >= VK_MSGQ_PER_CHAN_MAX)
49                 q_num = VK_MSGQ_NUM_DEFAULT;
50         return q_num;
51 }
52
53 static void set_q_num(struct vk_msg_blk *msg, u32 q_num)
54 {
55         u32 trans_q;
56
57         if (q_num >= VK_MSGQ_PER_CHAN_MAX)
58                 trans_q = VK_MSGQ_NUM_DEFAULT;
59         else
60                 trans_q = q_num;
61
62         msg->trans_id = (msg->trans_id & ~BCM_VK_MSG_Q_MASK) | trans_q;
63 }
64
65 static u32 get_msg_id(const struct vk_msg_blk *msg)
66 {
67         return ((msg->trans_id >> BCM_VK_MSG_Q_SHIFT) & BCM_VK_MSG_ID_MASK);
68 }
69
70 static void set_msg_id(struct vk_msg_blk *msg, u32 val)
71 {
72         msg->trans_id = (val << BCM_VK_MSG_Q_SHIFT) | get_q_num(msg);
73 }
74
75 static u32 msgq_inc(const struct bcm_vk_sync_qinfo *qinfo, u32 idx, u32 inc)
76 {
77         return ((idx + inc) & qinfo->q_mask);
78 }
79
80 static
81 struct vk_msg_blk __iomem *msgq_blk_addr(const struct bcm_vk_sync_qinfo *qinfo,
82                                          u32 idx)
83 {
84         return qinfo->q_start + (VK_MSGQ_BLK_SIZE * idx);
85 }
86
87 static u32 msgq_occupied(const struct bcm_vk_msgq __iomem *msgq,
88                          const struct bcm_vk_sync_qinfo *qinfo)
89 {
90         u32 wr_idx, rd_idx;
91
92         wr_idx = readl_relaxed(&msgq->wr_idx);
93         rd_idx = readl_relaxed(&msgq->rd_idx);
94
95         return ((wr_idx - rd_idx) & qinfo->q_mask);
96 }
97
98 static
99 u32 msgq_avail_space(const struct bcm_vk_msgq __iomem *msgq,
100                      const struct bcm_vk_sync_qinfo *qinfo)
101 {
102         return (qinfo->q_size - msgq_occupied(msgq, qinfo) - 1);
103 }
104
105 /* number of retries when enqueue message fails before returning EAGAIN */
106 #define BCM_VK_H2VK_ENQ_RETRY 10
107 #define BCM_VK_H2VK_ENQ_RETRY_DELAY_MS 50
108
109 bool bcm_vk_drv_access_ok(struct bcm_vk *vk)
110 {
111         return (!!atomic_read(&vk->msgq_inited));
112 }
113
114 void bcm_vk_set_host_alert(struct bcm_vk *vk, u32 bit_mask)
115 {
116         struct bcm_vk_alert *alert = &vk->host_alert;
117         unsigned long flags;
118
119         /* use irqsave version as this maybe called inside timer interrupt */
120         spin_lock_irqsave(&vk->host_alert_lock, flags);
121         alert->notfs |= bit_mask;
122         spin_unlock_irqrestore(&vk->host_alert_lock, flags);
123
124         if (test_and_set_bit(BCM_VK_WQ_NOTF_PEND, vk->wq_offload) == 0)
125                 queue_work(vk->wq_thread, &vk->wq_work);
126 }
127
128 /*
129  * Heartbeat related defines
130  * The heartbeat from host is a last resort.  If stuck condition happens
131  * on the card, firmware is supposed to detect it.  Therefore, the heartbeat
132  * values used will be more relaxed on the driver, which need to be bigger
133  * than the watchdog timeout on the card.  The watchdog timeout on the card
134  * is 20s, with a jitter of 2s => 22s.  We use a value of 27s here.
135  */
136 #define BCM_VK_HB_TIMER_S 3
137 #define BCM_VK_HB_TIMER_VALUE (BCM_VK_HB_TIMER_S * HZ)
138 #define BCM_VK_HB_LOST_MAX (27 / BCM_VK_HB_TIMER_S)
139
140 static void bcm_vk_hb_poll(struct timer_list *t)
141 {
142         u32 uptime_s;
143         struct bcm_vk_hb_ctrl *hb = container_of(t, struct bcm_vk_hb_ctrl,
144                                                  timer);
145         struct bcm_vk *vk = container_of(hb, struct bcm_vk, hb_ctrl);
146
147         if (bcm_vk_drv_access_ok(vk) && hb_mon_is_on()) {
148                 /* read uptime from register and compare */
149                 uptime_s = vkread32(vk, BAR_0, BAR_OS_UPTIME);
150
151                 if (uptime_s == hb->last_uptime)
152                         hb->lost_cnt++;
153                 else /* reset to avoid accumulation */
154                         hb->lost_cnt = 0;
155
156                 dev_dbg(&vk->pdev->dev, "Last uptime %d current %d, lost %d\n",
157                         hb->last_uptime, uptime_s, hb->lost_cnt);
158
159                 /*
160                  * if the interface goes down without any activity, a value
161                  * of 0xFFFFFFFF will be continuously read, and the detection
162                  * will be happened eventually.
163                  */
164                 hb->last_uptime = uptime_s;
165         } else {
166                 /* reset heart beat lost cnt */
167                 hb->lost_cnt = 0;
168         }
169
170         /* next, check if heartbeat exceeds limit */
171         if (hb->lost_cnt > BCM_VK_HB_LOST_MAX) {
172                 dev_err(&vk->pdev->dev, "Heartbeat Misses %d times, %d s!\n",
173                         BCM_VK_HB_LOST_MAX,
174                         BCM_VK_HB_LOST_MAX * BCM_VK_HB_TIMER_S);
175
176                 bcm_vk_blk_drv_access(vk);
177                 bcm_vk_set_host_alert(vk, ERR_LOG_HOST_HB_FAIL);
178         }
179         /* re-arm timer */
180         mod_timer(&hb->timer, jiffies + BCM_VK_HB_TIMER_VALUE);
181 }
182
183 void bcm_vk_hb_init(struct bcm_vk *vk)
184 {
185         struct bcm_vk_hb_ctrl *hb = &vk->hb_ctrl;
186
187         timer_setup(&hb->timer, bcm_vk_hb_poll, 0);
188         mod_timer(&hb->timer, jiffies + BCM_VK_HB_TIMER_VALUE);
189 }
190
191 void bcm_vk_hb_deinit(struct bcm_vk *vk)
192 {
193         struct bcm_vk_hb_ctrl *hb = &vk->hb_ctrl;
194
195         del_timer(&hb->timer);
196 }
197
198 static void bcm_vk_msgid_bitmap_clear(struct bcm_vk *vk,
199                                       unsigned int start,
200                                       unsigned int nbits)
201 {
202         spin_lock(&vk->msg_id_lock);
203         bitmap_clear(vk->bmap, start, nbits);
204         spin_unlock(&vk->msg_id_lock);
205 }
206
207 /*
208  * allocate a ctx per file struct
209  */
210 static struct bcm_vk_ctx *bcm_vk_get_ctx(struct bcm_vk *vk, const pid_t pid)
211 {
212         u32 i;
213         struct bcm_vk_ctx *ctx = NULL;
214         u32 hash_idx = hash_32(pid, VK_PID_HT_SHIFT_BIT);
215
216         spin_lock(&vk->ctx_lock);
217
218         /* check if it is in reset, if so, don't allow */
219         if (vk->reset_pid) {
220                 dev_err(&vk->pdev->dev,
221                         "No context allowed during reset by pid %d\n",
222                         vk->reset_pid);
223
224                 goto in_reset_exit;
225         }
226
227         for (i = 0; i < ARRAY_SIZE(vk->ctx); i++) {
228                 if (!vk->ctx[i].in_use) {
229                         vk->ctx[i].in_use = true;
230                         ctx = &vk->ctx[i];
231                         break;
232                 }
233         }
234
235         if (!ctx) {
236                 dev_err(&vk->pdev->dev, "All context in use\n");
237
238                 goto all_in_use_exit;
239         }
240
241         /* set the pid and insert it to hash table */
242         ctx->pid = pid;
243         ctx->hash_idx = hash_idx;
244         list_add_tail(&ctx->node, &vk->pid_ht[hash_idx].head);
245
246         /* increase kref */
247         kref_get(&vk->kref);
248
249         /* clear counter */
250         atomic_set(&ctx->pend_cnt, 0);
251         atomic_set(&ctx->dma_cnt, 0);
252         init_waitqueue_head(&ctx->rd_wq);
253
254 all_in_use_exit:
255 in_reset_exit:
256         spin_unlock(&vk->ctx_lock);
257
258         return ctx;
259 }
260
261 static u16 bcm_vk_get_msg_id(struct bcm_vk *vk)
262 {
263         u16 rc = VK_MSG_ID_OVERFLOW;
264         u16 test_bit_count = 0;
265
266         spin_lock(&vk->msg_id_lock);
267         while (test_bit_count < (VK_MSG_ID_BITMAP_SIZE - 1)) {
268                 /*
269                  * first time come in this loop, msg_id will be 0
270                  * and the first one tested will be 1.  We skip
271                  * VK_SIMPLEX_MSG_ID (0) for one way host2vk
272                  * communication
273                  */
274                 vk->msg_id++;
275                 if (vk->msg_id == VK_MSG_ID_BITMAP_SIZE)
276                         vk->msg_id = 1;
277
278                 if (test_bit(vk->msg_id, vk->bmap)) {
279                         test_bit_count++;
280                         continue;
281                 }
282                 rc = vk->msg_id;
283                 bitmap_set(vk->bmap, vk->msg_id, 1);
284                 break;
285         }
286         spin_unlock(&vk->msg_id_lock);
287
288         return rc;
289 }
290
291 static int bcm_vk_free_ctx(struct bcm_vk *vk, struct bcm_vk_ctx *ctx)
292 {
293         u32 idx;
294         u32 hash_idx;
295         pid_t pid;
296         struct bcm_vk_ctx *entry;
297         int count = 0;
298
299         if (!ctx) {
300                 dev_err(&vk->pdev->dev, "NULL context detected\n");
301                 return -EINVAL;
302         }
303         idx = ctx->idx;
304         pid = ctx->pid;
305
306         spin_lock(&vk->ctx_lock);
307
308         if (!vk->ctx[idx].in_use) {
309                 dev_err(&vk->pdev->dev, "context[%d] not in use!\n", idx);
310         } else {
311                 vk->ctx[idx].in_use = false;
312                 vk->ctx[idx].miscdev = NULL;
313
314                 /* Remove it from hash list and see if it is the last one. */
315                 list_del(&ctx->node);
316                 hash_idx = ctx->hash_idx;
317                 list_for_each_entry(entry, &vk->pid_ht[hash_idx].head, node) {
318                         if (entry->pid == pid)
319                                 count++;
320                 }
321         }
322
323         spin_unlock(&vk->ctx_lock);
324
325         return count;
326 }
327
328 static void bcm_vk_free_wkent(struct device *dev, struct bcm_vk_wkent *entry)
329 {
330         int proc_cnt;
331
332         bcm_vk_sg_free(dev, entry->dma, VK_DMA_MAX_ADDRS, &proc_cnt);
333         if (proc_cnt)
334                 atomic_dec(&entry->ctx->dma_cnt);
335
336         kfree(entry->to_h_msg);
337         kfree(entry);
338 }
339
340 static void bcm_vk_drain_all_pend(struct device *dev,
341                                   struct bcm_vk_msg_chan *chan,
342                                   struct bcm_vk_ctx *ctx)
343 {
344         u32 num;
345         struct bcm_vk_wkent *entry, *tmp;
346         struct bcm_vk *vk;
347         struct list_head del_q;
348
349         if (ctx)
350                 vk = container_of(ctx->miscdev, struct bcm_vk, miscdev);
351
352         INIT_LIST_HEAD(&del_q);
353         spin_lock(&chan->pendq_lock);
354         for (num = 0; num < chan->q_nr; num++) {
355                 list_for_each_entry_safe(entry, tmp, &chan->pendq[num], node) {
356                         if ((!ctx) || (entry->ctx->idx == ctx->idx)) {
357                                 list_del(&entry->node);
358                                 list_add_tail(&entry->node, &del_q);
359                         }
360                 }
361         }
362         spin_unlock(&chan->pendq_lock);
363
364         /* batch clean up */
365         num = 0;
366         list_for_each_entry_safe(entry, tmp, &del_q, node) {
367                 list_del(&entry->node);
368                 num++;
369                 if (ctx) {
370                         struct vk_msg_blk *msg;
371                         int bit_set;
372                         bool responded;
373                         u32 msg_id;
374
375                         /* if it is specific ctx, log for any stuck */
376                         msg = entry->to_v_msg;
377                         msg_id = get_msg_id(msg);
378                         bit_set = test_bit(msg_id, vk->bmap);
379                         responded = entry->to_h_msg ? true : false;
380                         if (num <= batch_log)
381                                 dev_info(dev,
382                                          "Drained: fid %u size %u msg 0x%x(seq-%x) ctx 0x%x[fd-%d] args:[0x%x 0x%x] resp %s, bmap %d\n",
383                                          msg->function_id, msg->size,
384                                          msg_id, entry->seq_num,
385                                          msg->context_id, entry->ctx->idx,
386                                          msg->cmd, msg->arg,
387                                          responded ? "T" : "F", bit_set);
388                         if (responded)
389                                 atomic_dec(&ctx->pend_cnt);
390                         else if (bit_set)
391                                 bcm_vk_msgid_bitmap_clear(vk, msg_id, 1);
392                 }
393                 bcm_vk_free_wkent(dev, entry);
394         }
395         if (num && ctx)
396                 dev_info(dev, "Total drained items %d [fd-%d]\n",
397                          num, ctx->idx);
398 }
399
400 void bcm_vk_drain_msg_on_reset(struct bcm_vk *vk)
401 {
402         bcm_vk_drain_all_pend(&vk->pdev->dev, &vk->to_v_msg_chan, NULL);
403         bcm_vk_drain_all_pend(&vk->pdev->dev, &vk->to_h_msg_chan, NULL);
404 }
405
406 /*
407  * Function to sync up the messages queue info that is provided by BAR1
408  */
409 int bcm_vk_sync_msgq(struct bcm_vk *vk, bool force_sync)
410 {
411         struct bcm_vk_msgq __iomem *msgq;
412         struct device *dev = &vk->pdev->dev;
413         u32 msgq_off;
414         u32 num_q;
415         struct bcm_vk_msg_chan *chan_list[] = {&vk->to_v_msg_chan,
416                                                &vk->to_h_msg_chan};
417         struct bcm_vk_msg_chan *chan;
418         int i, j;
419         int ret = 0;
420
421         /*
422          * If the driver is loaded at startup where vk OS is not up yet,
423          * the msgq-info may not be available until a later time.  In
424          * this case, we skip and the sync function is supposed to be
425          * called again.
426          */
427         if (!bcm_vk_msgq_marker_valid(vk)) {
428                 dev_info(dev, "BAR1 msgq marker not initialized.\n");
429                 return -EAGAIN;
430         }
431
432         msgq_off = vkread32(vk, BAR_1, VK_BAR1_MSGQ_CTRL_OFF);
433
434         /* each side is always half the total  */
435         num_q = vkread32(vk, BAR_1, VK_BAR1_MSGQ_NR) / 2;
436         if (!num_q || (num_q > VK_MSGQ_PER_CHAN_MAX)) {
437                 dev_err(dev,
438                         "Advertised msgq %d error - max %d allowed\n",
439                         num_q, VK_MSGQ_PER_CHAN_MAX);
440                 return -EINVAL;
441         }
442
443         vk->to_v_msg_chan.q_nr = num_q;
444         vk->to_h_msg_chan.q_nr = num_q;
445
446         /* first msgq location */
447         msgq = vk->bar[BAR_1] + msgq_off;
448
449         /*
450          * if this function is called when it is already inited,
451          * something is wrong
452          */
453         if (bcm_vk_drv_access_ok(vk) && !force_sync) {
454                 dev_err(dev, "Msgq info already in sync\n");
455                 return -EPERM;
456         }
457
458         for (i = 0; i < ARRAY_SIZE(chan_list); i++) {
459                 chan = chan_list[i];
460                 memset(chan->sync_qinfo, 0, sizeof(chan->sync_qinfo));
461
462                 for (j = 0; j < num_q; j++) {
463                         struct bcm_vk_sync_qinfo *qinfo;
464                         u32 msgq_start;
465                         u32 msgq_size;
466                         u32 msgq_nxt;
467                         u32 msgq_db_offset, q_db_offset;
468
469                         chan->msgq[j] = msgq;
470                         msgq_start = readl_relaxed(&msgq->start);
471                         msgq_size = readl_relaxed(&msgq->size);
472                         msgq_nxt = readl_relaxed(&msgq->nxt);
473                         msgq_db_offset = readl_relaxed(&msgq->db_offset);
474                         q_db_offset = (msgq_db_offset & ((1 << DB_SHIFT) - 1));
475                         if (q_db_offset  == (~msgq_db_offset >> DB_SHIFT))
476                                 msgq_db_offset = q_db_offset;
477                         else
478                                 /* fall back to default */
479                                 msgq_db_offset = VK_BAR0_Q_DB_BASE(j);
480
481                         dev_info(dev,
482                                  "MsgQ[%d] type %d num %d, @ 0x%x, db_offset 0x%x rd_idx %d wr_idx %d, size %d, nxt 0x%x\n",
483                                  j,
484                                  readw_relaxed(&msgq->type),
485                                  readw_relaxed(&msgq->num),
486                                  msgq_start,
487                                  msgq_db_offset,
488                                  readl_relaxed(&msgq->rd_idx),
489                                  readl_relaxed(&msgq->wr_idx),
490                                  msgq_size,
491                                  msgq_nxt);
492
493                         qinfo = &chan->sync_qinfo[j];
494                         /* formulate and record static info */
495                         qinfo->q_start = vk->bar[BAR_1] + msgq_start;
496                         qinfo->q_size = msgq_size;
497                         /* set low threshold as 50% or 1/2 */
498                         qinfo->q_low = qinfo->q_size >> 1;
499                         qinfo->q_mask = qinfo->q_size - 1;
500                         qinfo->q_db_offset = msgq_db_offset;
501
502                         msgq++;
503                 }
504         }
505         atomic_set(&vk->msgq_inited, 1);
506
507         return ret;
508 }
509
510 static int bcm_vk_msg_chan_init(struct bcm_vk_msg_chan *chan)
511 {
512         u32 i;
513
514         mutex_init(&chan->msgq_mutex);
515         spin_lock_init(&chan->pendq_lock);
516         for (i = 0; i < VK_MSGQ_MAX_NR; i++)
517                 INIT_LIST_HEAD(&chan->pendq[i]);
518
519         return 0;
520 }
521
522 static void bcm_vk_append_pendq(struct bcm_vk_msg_chan *chan, u16 q_num,
523                                 struct bcm_vk_wkent *entry)
524 {
525         struct bcm_vk_ctx *ctx;
526
527         spin_lock(&chan->pendq_lock);
528         list_add_tail(&entry->node, &chan->pendq[q_num]);
529         if (entry->to_h_msg) {
530                 ctx = entry->ctx;
531                 atomic_inc(&ctx->pend_cnt);
532                 wake_up_interruptible(&ctx->rd_wq);
533         }
534         spin_unlock(&chan->pendq_lock);
535 }
536
537 static u32 bcm_vk_append_ib_sgl(struct bcm_vk *vk,
538                                 struct bcm_vk_wkent *entry,
539                                 struct _vk_data *data,
540                                 unsigned int num_planes)
541 {
542         unsigned int i;
543         unsigned int item_cnt = 0;
544         struct device *dev = &vk->pdev->dev;
545         struct bcm_vk_msg_chan *chan = &vk->to_v_msg_chan;
546         struct vk_msg_blk *msg = &entry->to_v_msg[0];
547         struct bcm_vk_msgq __iomem *msgq;
548         struct bcm_vk_sync_qinfo *qinfo;
549         u32 ib_sgl_size = 0;
550         u8 *buf = (u8 *)&entry->to_v_msg[entry->to_v_blks];
551         u32 avail;
552         u32 q_num;
553
554         /* check if high watermark is hit, and if so, skip */
555         q_num = get_q_num(msg);
556         msgq = chan->msgq[q_num];
557         qinfo = &chan->sync_qinfo[q_num];
558         avail = msgq_avail_space(msgq, qinfo);
559         if (avail < qinfo->q_low) {
560                 dev_dbg(dev, "Skip inserting inband SGL, [0x%x/0x%x]\n",
561                         avail, qinfo->q_size);
562                 return 0;
563         }
564
565         for (i = 0; i < num_planes; i++) {
566                 if (data[i].address &&
567                     (ib_sgl_size + data[i].size) <= vk->ib_sgl_size) {
568                         item_cnt++;
569                         memcpy(buf, entry->dma[i].sglist, data[i].size);
570                         ib_sgl_size += data[i].size;
571                         buf += data[i].size;
572                 }
573         }
574
575         dev_dbg(dev, "Num %u sgl items appended, size 0x%x, room 0x%x\n",
576                 item_cnt, ib_sgl_size, vk->ib_sgl_size);
577
578         /* round up size */
579         ib_sgl_size = (ib_sgl_size + VK_MSGQ_BLK_SIZE - 1)
580                        >> VK_MSGQ_BLK_SZ_SHIFT;
581
582         return ib_sgl_size;
583 }
584
585 void bcm_to_v_q_doorbell(struct bcm_vk *vk, u32 q_num, u32 db_val)
586 {
587         struct bcm_vk_msg_chan *chan = &vk->to_v_msg_chan;
588         struct bcm_vk_sync_qinfo *qinfo = &chan->sync_qinfo[q_num];
589
590         vkwrite32(vk, db_val, BAR_0, qinfo->q_db_offset);
591 }
592
593 static int bcm_to_v_msg_enqueue(struct bcm_vk *vk, struct bcm_vk_wkent *entry)
594 {
595         static u32 seq_num;
596         struct bcm_vk_msg_chan *chan = &vk->to_v_msg_chan;
597         struct device *dev = &vk->pdev->dev;
598         struct vk_msg_blk *src = &entry->to_v_msg[0];
599
600         struct vk_msg_blk __iomem *dst;
601         struct bcm_vk_msgq __iomem *msgq;
602         struct bcm_vk_sync_qinfo *qinfo;
603         u32 q_num = get_q_num(src);
604         u32 wr_idx; /* local copy */
605         u32 i;
606         u32 avail;
607         u32 retry;
608
609         if (entry->to_v_blks != src->size + 1) {
610                 dev_err(dev, "number of blks %d not matching %d MsgId[0x%x]: func %d ctx 0x%x\n",
611                         entry->to_v_blks,
612                         src->size + 1,
613                         get_msg_id(src),
614                         src->function_id,
615                         src->context_id);
616                 return -EMSGSIZE;
617         }
618
619         msgq = chan->msgq[q_num];
620         qinfo = &chan->sync_qinfo[q_num];
621
622         mutex_lock(&chan->msgq_mutex);
623
624         avail = msgq_avail_space(msgq, qinfo);
625
626         /* if not enough space, return EAGAIN and let app handles it */
627         retry = 0;
628         while ((avail < entry->to_v_blks) &&
629                (retry++ < BCM_VK_H2VK_ENQ_RETRY)) {
630                 mutex_unlock(&chan->msgq_mutex);
631
632                 msleep(BCM_VK_H2VK_ENQ_RETRY_DELAY_MS);
633                 mutex_lock(&chan->msgq_mutex);
634                 avail = msgq_avail_space(msgq, qinfo);
635         }
636         if (retry > BCM_VK_H2VK_ENQ_RETRY) {
637                 mutex_unlock(&chan->msgq_mutex);
638                 return -EAGAIN;
639         }
640
641         /* at this point, mutex is taken and there is enough space */
642         entry->seq_num = seq_num++; /* update debug seq number */
643         wr_idx = readl_relaxed(&msgq->wr_idx);
644
645         if (wr_idx >= qinfo->q_size) {
646                 dev_crit(dev, "Invalid wr_idx 0x%x => max 0x%x!",
647                          wr_idx, qinfo->q_size);
648                 bcm_vk_blk_drv_access(vk);
649                 bcm_vk_set_host_alert(vk, ERR_LOG_HOST_PCIE_DWN);
650                 goto idx_err;
651         }
652
653         dst = msgq_blk_addr(qinfo, wr_idx);
654         for (i = 0; i < entry->to_v_blks; i++) {
655                 memcpy_toio(dst, src, sizeof(*dst));
656
657                 src++;
658                 wr_idx = msgq_inc(qinfo, wr_idx, 1);
659                 dst = msgq_blk_addr(qinfo, wr_idx);
660         }
661
662         /* flush the write pointer */
663         writel(wr_idx, &msgq->wr_idx);
664
665         /* log new info for debugging */
666         dev_dbg(dev,
667                 "MsgQ[%d] [Rd Wr] = [%d %d] blks inserted %d - Q = [u-%d a-%d]/%d\n",
668                 readl_relaxed(&msgq->num),
669                 readl_relaxed(&msgq->rd_idx),
670                 wr_idx,
671                 entry->to_v_blks,
672                 msgq_occupied(msgq, qinfo),
673                 msgq_avail_space(msgq, qinfo),
674                 readl_relaxed(&msgq->size));
675         /*
676          * press door bell based on queue number. 1 is added to the wr_idx
677          * to avoid the value of 0 appearing on the VK side to distinguish
678          * from initial value.
679          */
680         bcm_to_v_q_doorbell(vk, q_num, wr_idx + 1);
681 idx_err:
682         mutex_unlock(&chan->msgq_mutex);
683         return 0;
684 }
685
686 int bcm_vk_send_shutdown_msg(struct bcm_vk *vk, u32 shut_type,
687                              const pid_t pid, const u32 q_num)
688 {
689         int rc = 0;
690         struct bcm_vk_wkent *entry;
691         struct device *dev = &vk->pdev->dev;
692
693         /*
694          * check if the marker is still good.  Sometimes, the PCIe interface may
695          * have gone done, and if so and we ship down thing based on broken
696          * values, kernel may panic.
697          */
698         if (!bcm_vk_msgq_marker_valid(vk)) {
699                 dev_info(dev, "PCIe comm chan - invalid marker (0x%x)!\n",
700                          vkread32(vk, BAR_1, VK_BAR1_MSGQ_DEF_RDY));
701                 return -EINVAL;
702         }
703
704         entry = kzalloc(sizeof(*entry) +
705                         sizeof(struct vk_msg_blk), GFP_KERNEL);
706         if (!entry)
707                 return -ENOMEM;
708
709         /* fill up necessary data */
710         entry->to_v_msg[0].function_id = VK_FID_SHUTDOWN;
711         set_q_num(&entry->to_v_msg[0], q_num);
712         set_msg_id(&entry->to_v_msg[0], VK_SIMPLEX_MSG_ID);
713         entry->to_v_blks = 1; /* always 1 block */
714
715         entry->to_v_msg[0].cmd = shut_type;
716         entry->to_v_msg[0].arg = pid;
717
718         rc = bcm_to_v_msg_enqueue(vk, entry);
719         if (rc)
720                 dev_err(dev,
721                         "Sending shutdown message to q %d for pid %d fails.\n",
722                         get_q_num(&entry->to_v_msg[0]), pid);
723
724         kfree(entry);
725
726         return rc;
727 }
728
729 static int bcm_vk_handle_last_sess(struct bcm_vk *vk, const pid_t pid,
730                                    const u32 q_num)
731 {
732         int rc = 0;
733         struct device *dev = &vk->pdev->dev;
734
735         /*
736          * don't send down or do anything if message queue is not initialized
737          * and if it is the reset session, clear it.
738          */
739         if (!bcm_vk_drv_access_ok(vk)) {
740                 if (vk->reset_pid == pid)
741                         vk->reset_pid = 0;
742                 return -EPERM;
743         }
744
745         dev_dbg(dev, "No more sessions, shut down pid %d\n", pid);
746
747         /* only need to do it if it is not the reset process */
748         if (vk->reset_pid != pid)
749                 rc = bcm_vk_send_shutdown_msg(vk, VK_SHUTDOWN_PID, pid, q_num);
750         else
751                 /* put reset_pid to 0 if it is exiting last session */
752                 vk->reset_pid = 0;
753
754         return rc;
755 }
756
757 static struct bcm_vk_wkent *bcm_vk_dequeue_pending(struct bcm_vk *vk,
758                                                    struct bcm_vk_msg_chan *chan,
759                                                    u16 q_num,
760                                                    u16 msg_id)
761 {
762         bool found = false;
763         struct bcm_vk_wkent *entry;
764
765         spin_lock(&chan->pendq_lock);
766         list_for_each_entry(entry, &chan->pendq[q_num], node) {
767                 if (get_msg_id(&entry->to_v_msg[0]) == msg_id) {
768                         list_del(&entry->node);
769                         found = true;
770                         bcm_vk_msgid_bitmap_clear(vk, msg_id, 1);
771                         break;
772                 }
773         }
774         spin_unlock(&chan->pendq_lock);
775         return ((found) ? entry : NULL);
776 }
777
778 s32 bcm_to_h_msg_dequeue(struct bcm_vk *vk)
779 {
780         struct device *dev = &vk->pdev->dev;
781         struct bcm_vk_msg_chan *chan = &vk->to_h_msg_chan;
782         struct vk_msg_blk *data;
783         struct vk_msg_blk __iomem *src;
784         struct vk_msg_blk *dst;
785         struct bcm_vk_msgq __iomem *msgq;
786         struct bcm_vk_sync_qinfo *qinfo;
787         struct bcm_vk_wkent *entry;
788         u32 rd_idx, wr_idx;
789         u32 q_num, msg_id, j;
790         u32 num_blks;
791         s32 total = 0;
792         int cnt = 0;
793         int msg_processed = 0;
794         int max_msg_to_process;
795         bool exit_loop;
796
797         /*
798          * drain all the messages from the queues, and find its pending
799          * entry in the to_v queue, based on msg_id & q_num, and move the
800          * entry to the to_h pending queue, waiting for user space
801          * program to extract
802          */
803         mutex_lock(&chan->msgq_mutex);
804
805         for (q_num = 0; q_num < chan->q_nr; q_num++) {
806                 msgq = chan->msgq[q_num];
807                 qinfo = &chan->sync_qinfo[q_num];
808                 max_msg_to_process = BCM_VK_MSG_PROC_MAX_LOOP * qinfo->q_size;
809
810                 rd_idx = readl_relaxed(&msgq->rd_idx);
811                 wr_idx = readl_relaxed(&msgq->wr_idx);
812                 msg_processed = 0;
813                 exit_loop = false;
814                 while ((rd_idx != wr_idx) && !exit_loop) {
815                         u8 src_size;
816
817                         /*
818                          * Make a local copy and get pointer to src blk
819                          * The rd_idx is masked before getting the pointer to
820                          * avoid out of bound access in case the interface goes
821                          * down.  It will end up pointing to the last block in
822                          * the buffer, but subsequent src->size check would be
823                          * able to catch this.
824                          */
825                         src = msgq_blk_addr(qinfo, rd_idx & qinfo->q_mask);
826                         src_size = readb(&src->size);
827
828                         if ((rd_idx >= qinfo->q_size) ||
829                             (src_size > (qinfo->q_size - 1))) {
830                                 dev_crit(dev,
831                                          "Invalid rd_idx 0x%x or size 0x%x => max 0x%x!",
832                                          rd_idx, src_size, qinfo->q_size);
833                                 bcm_vk_blk_drv_access(vk);
834                                 bcm_vk_set_host_alert(vk,
835                                                       ERR_LOG_HOST_PCIE_DWN);
836                                 goto idx_err;
837                         }
838
839                         num_blks = src_size + 1;
840                         data = kzalloc(num_blks * VK_MSGQ_BLK_SIZE, GFP_KERNEL);
841                         if (data) {
842                                 /* copy messages and linearize it */
843                                 dst = data;
844                                 for (j = 0; j < num_blks; j++) {
845                                         memcpy_fromio(dst, src, sizeof(*dst));
846
847                                         dst++;
848                                         rd_idx = msgq_inc(qinfo, rd_idx, 1);
849                                         src = msgq_blk_addr(qinfo, rd_idx);
850                                 }
851                                 total++;
852                         } else {
853                                 /*
854                                  * if we could not allocate memory in kernel,
855                                  * that is fatal.
856                                  */
857                                 dev_crit(dev, "Kernel mem allocation failure.\n");
858                                 total = -ENOMEM;
859                                 goto idx_err;
860                         }
861
862                         /* flush rd pointer after a message is dequeued */
863                         writel(rd_idx, &msgq->rd_idx);
864
865                         /* log new info for debugging */
866                         dev_dbg(dev,
867                                 "MsgQ[%d] [Rd Wr] = [%d %d] blks extracted %d - Q = [u-%d a-%d]/%d\n",
868                                 readl_relaxed(&msgq->num),
869                                 rd_idx,
870                                 wr_idx,
871                                 num_blks,
872                                 msgq_occupied(msgq, qinfo),
873                                 msgq_avail_space(msgq, qinfo),
874                                 readl_relaxed(&msgq->size));
875
876                         /*
877                          * No need to search if it is an autonomous one-way
878                          * message from driver, as these messages do not bear
879                          * a to_v pending item. Currently, only the shutdown
880                          * message falls into this category.
881                          */
882                         if (data->function_id == VK_FID_SHUTDOWN) {
883                                 kfree(data);
884                                 continue;
885                         }
886
887                         msg_id = get_msg_id(data);
888                         /* lookup original message in to_v direction */
889                         entry = bcm_vk_dequeue_pending(vk,
890                                                        &vk->to_v_msg_chan,
891                                                        q_num,
892                                                        msg_id);
893
894                         /*
895                          * if there is message to does not have prior send,
896                          * this is the location to add here
897                          */
898                         if (entry) {
899                                 entry->to_h_blks = num_blks;
900                                 entry->to_h_msg = data;
901                                 bcm_vk_append_pendq(&vk->to_h_msg_chan,
902                                                     q_num, entry);
903
904                         } else {
905                                 if (cnt++ < batch_log)
906                                         dev_info(dev,
907                                                  "Could not find MsgId[0x%x] for resp func %d bmap %d\n",
908                                                  msg_id, data->function_id,
909                                                  test_bit(msg_id, vk->bmap));
910                                 kfree(data);
911                         }
912                         /* Fetch wr_idx to handle more back-to-back events */
913                         wr_idx = readl(&msgq->wr_idx);
914
915                         /*
916                          * cap the max so that even we try to handle more back-to-back events,
917                          * so that it won't hold CPU too long or in case rd/wr idexes are
918                          * corrupted which triggers infinite looping.
919                          */
920                         if (++msg_processed >= max_msg_to_process) {
921                                 dev_warn(dev, "Q[%d] Per loop processing exceeds %d\n",
922                                          q_num, max_msg_to_process);
923                                 exit_loop = true;
924                         }
925                 }
926         }
927 idx_err:
928         mutex_unlock(&chan->msgq_mutex);
929         dev_dbg(dev, "total %d drained from queues\n", total);
930
931         return total;
932 }
933
934 /*
935  * init routine for all required data structures
936  */
937 static int bcm_vk_data_init(struct bcm_vk *vk)
938 {
939         int i;
940
941         spin_lock_init(&vk->ctx_lock);
942         for (i = 0; i < ARRAY_SIZE(vk->ctx); i++) {
943                 vk->ctx[i].in_use = false;
944                 vk->ctx[i].idx = i;     /* self identity */
945                 vk->ctx[i].miscdev = NULL;
946         }
947         spin_lock_init(&vk->msg_id_lock);
948         spin_lock_init(&vk->host_alert_lock);
949         vk->msg_id = 0;
950
951         /* initialize hash table */
952         for (i = 0; i < VK_PID_HT_SZ; i++)
953                 INIT_LIST_HEAD(&vk->pid_ht[i].head);
954
955         return 0;
956 }
957
958 irqreturn_t bcm_vk_msgq_irqhandler(int irq, void *dev_id)
959 {
960         struct bcm_vk *vk = dev_id;
961
962         if (!bcm_vk_drv_access_ok(vk)) {
963                 dev_err(&vk->pdev->dev,
964                         "Interrupt %d received when msgq not inited\n", irq);
965                 goto skip_schedule_work;
966         }
967
968         queue_work(vk->wq_thread, &vk->wq_work);
969
970 skip_schedule_work:
971         return IRQ_HANDLED;
972 }
973
974 int bcm_vk_open(struct inode *inode, struct file *p_file)
975 {
976         struct bcm_vk_ctx *ctx;
977         struct miscdevice *miscdev = (struct miscdevice *)p_file->private_data;
978         struct bcm_vk *vk = container_of(miscdev, struct bcm_vk, miscdev);
979         struct device *dev = &vk->pdev->dev;
980         int rc = 0;
981
982         /* get a context and set it up for file */
983         ctx = bcm_vk_get_ctx(vk, task_tgid_nr(current));
984         if (!ctx) {
985                 dev_err(dev, "Error allocating context\n");
986                 rc = -ENOMEM;
987         } else {
988                 /*
989                  * set up context and replace private data with context for
990                  * other methods to use.  Reason for the context is because
991                  * it is allowed for multiple sessions to open the sysfs, and
992                  * for each file open, when upper layer query the response,
993                  * only those that are tied to a specific open should be
994                  * returned.  The context->idx will be used for such binding
995                  */
996                 ctx->miscdev = miscdev;
997                 p_file->private_data = ctx;
998                 dev_dbg(dev, "ctx_returned with idx %d, pid %d\n",
999                         ctx->idx, ctx->pid);
1000         }
1001         return rc;
1002 }
1003
1004 ssize_t bcm_vk_read(struct file *p_file,
1005                     char __user *buf,
1006                     size_t count,
1007                     loff_t *f_pos)
1008 {
1009         ssize_t rc = -ENOMSG;
1010         struct bcm_vk_ctx *ctx = p_file->private_data;
1011         struct bcm_vk *vk = container_of(ctx->miscdev, struct bcm_vk,
1012                                          miscdev);
1013         struct device *dev = &vk->pdev->dev;
1014         struct bcm_vk_msg_chan *chan = &vk->to_h_msg_chan;
1015         struct bcm_vk_wkent *entry = NULL;
1016         u32 q_num;
1017         u32 rsp_length;
1018         bool found = false;
1019
1020         if (!bcm_vk_drv_access_ok(vk))
1021                 return -EPERM;
1022
1023         dev_dbg(dev, "Buf count %zu\n", count);
1024         found = false;
1025
1026         /*
1027          * search through the pendq on the to_h chan, and return only those
1028          * that belongs to the same context.  Search is always from the high to
1029          * the low priority queues
1030          */
1031         spin_lock(&chan->pendq_lock);
1032         for (q_num = 0; q_num < chan->q_nr; q_num++) {
1033                 list_for_each_entry(entry, &chan->pendq[q_num], node) {
1034                         if (entry->ctx->idx == ctx->idx) {
1035                                 if (count >=
1036                                     (entry->to_h_blks * VK_MSGQ_BLK_SIZE)) {
1037                                         list_del(&entry->node);
1038                                         atomic_dec(&ctx->pend_cnt);
1039                                         found = true;
1040                                 } else {
1041                                         /* buffer not big enough */
1042                                         rc = -EMSGSIZE;
1043                                 }
1044                                 goto read_loop_exit;
1045                         }
1046                 }
1047         }
1048 read_loop_exit:
1049         spin_unlock(&chan->pendq_lock);
1050
1051         if (found) {
1052                 /* retrieve the passed down msg_id */
1053                 set_msg_id(&entry->to_h_msg[0], entry->usr_msg_id);
1054                 rsp_length = entry->to_h_blks * VK_MSGQ_BLK_SIZE;
1055                 if (copy_to_user(buf, entry->to_h_msg, rsp_length) == 0)
1056                         rc = rsp_length;
1057
1058                 bcm_vk_free_wkent(dev, entry);
1059         } else if (rc == -EMSGSIZE) {
1060                 struct vk_msg_blk tmp_msg = entry->to_h_msg[0];
1061
1062                 /*
1063                  * in this case, return just the first block, so
1064                  * that app knows what size it is looking for.
1065                  */
1066                 set_msg_id(&tmp_msg, entry->usr_msg_id);
1067                 tmp_msg.size = entry->to_h_blks - 1;
1068                 if (copy_to_user(buf, &tmp_msg, VK_MSGQ_BLK_SIZE) != 0) {
1069                         dev_err(dev, "Error return 1st block in -EMSGSIZE\n");
1070                         rc = -EFAULT;
1071                 }
1072         }
1073         return rc;
1074 }
1075
1076 ssize_t bcm_vk_write(struct file *p_file,
1077                      const char __user *buf,
1078                      size_t count,
1079                      loff_t *f_pos)
1080 {
1081         ssize_t rc;
1082         struct bcm_vk_ctx *ctx = p_file->private_data;
1083         struct bcm_vk *vk = container_of(ctx->miscdev, struct bcm_vk,
1084                                          miscdev);
1085         struct bcm_vk_msgq __iomem *msgq;
1086         struct device *dev = &vk->pdev->dev;
1087         struct bcm_vk_wkent *entry;
1088         u32 sgl_extra_blks;
1089         u32 q_num;
1090         u32 msg_size;
1091         u32 msgq_size;
1092
1093         if (!bcm_vk_drv_access_ok(vk))
1094                 return -EPERM;
1095
1096         dev_dbg(dev, "Msg count %zu\n", count);
1097
1098         /* first, do sanity check where count should be multiple of basic blk */
1099         if (count & (VK_MSGQ_BLK_SIZE - 1)) {
1100                 dev_err(dev, "Failure with size %zu not multiple of %zu\n",
1101                         count, VK_MSGQ_BLK_SIZE);
1102                 rc = -EINVAL;
1103                 goto write_err;
1104         }
1105
1106         /* allocate the work entry + buffer for size count and inband sgl */
1107         entry = kzalloc(sizeof(*entry) + count + vk->ib_sgl_size,
1108                         GFP_KERNEL);
1109         if (!entry) {
1110                 rc = -ENOMEM;
1111                 goto write_err;
1112         }
1113
1114         /* now copy msg from user space, and then formulate the work entry */
1115         if (copy_from_user(&entry->to_v_msg[0], buf, count)) {
1116                 rc = -EFAULT;
1117                 goto write_free_ent;
1118         }
1119
1120         entry->to_v_blks = count >> VK_MSGQ_BLK_SZ_SHIFT;
1121         entry->ctx = ctx;
1122
1123         /* do a check on the blk size which could not exceed queue space */
1124         q_num = get_q_num(&entry->to_v_msg[0]);
1125         msgq = vk->to_v_msg_chan.msgq[q_num];
1126         msgq_size = readl_relaxed(&msgq->size);
1127         if (entry->to_v_blks + (vk->ib_sgl_size >> VK_MSGQ_BLK_SZ_SHIFT)
1128             > (msgq_size - 1)) {
1129                 dev_err(dev, "Blk size %d exceed max queue size allowed %d\n",
1130                         entry->to_v_blks, msgq_size - 1);
1131                 rc = -EINVAL;
1132                 goto write_free_ent;
1133         }
1134
1135         /* Use internal message id */
1136         entry->usr_msg_id = get_msg_id(&entry->to_v_msg[0]);
1137         rc = bcm_vk_get_msg_id(vk);
1138         if (rc == VK_MSG_ID_OVERFLOW) {
1139                 dev_err(dev, "msg_id overflow\n");
1140                 rc = -EOVERFLOW;
1141                 goto write_free_ent;
1142         }
1143         set_msg_id(&entry->to_v_msg[0], rc);
1144         ctx->q_num = q_num;
1145
1146         dev_dbg(dev,
1147                 "[Q-%d]Message ctx id %d, usr_msg_id 0x%x sent msg_id 0x%x\n",
1148                 ctx->q_num, ctx->idx, entry->usr_msg_id,
1149                 get_msg_id(&entry->to_v_msg[0]));
1150
1151         if (entry->to_v_msg[0].function_id == VK_FID_TRANS_BUF) {
1152                 /* Convert any pointers to sg list */
1153                 unsigned int num_planes;
1154                 int dir;
1155                 struct _vk_data *data;
1156
1157                 /*
1158                  * check if we are in reset, if so, no buffer transfer is
1159                  * allowed and return error.
1160                  */
1161                 if (vk->reset_pid) {
1162                         dev_dbg(dev, "No Transfer allowed during reset, pid %d.\n",
1163                                 ctx->pid);
1164                         rc = -EACCES;
1165                         goto write_free_msgid;
1166                 }
1167
1168                 num_planes = entry->to_v_msg[0].cmd & VK_CMD_PLANES_MASK;
1169                 if ((entry->to_v_msg[0].cmd & VK_CMD_MASK) == VK_CMD_DOWNLOAD)
1170                         dir = DMA_FROM_DEVICE;
1171                 else
1172                         dir = DMA_TO_DEVICE;
1173
1174                 /* Calculate vk_data location */
1175                 /* Go to end of the message */
1176                 msg_size = entry->to_v_msg[0].size;
1177                 if (msg_size > entry->to_v_blks) {
1178                         rc = -EMSGSIZE;
1179                         goto write_free_msgid;
1180                 }
1181
1182                 data = (struct _vk_data *)&entry->to_v_msg[msg_size + 1];
1183
1184                 /* Now back up to the start of the pointers */
1185                 data -= num_planes;
1186
1187                 /* Convert user addresses to DMA SG List */
1188                 rc = bcm_vk_sg_alloc(dev, entry->dma, dir, data, num_planes);
1189                 if (rc)
1190                         goto write_free_msgid;
1191
1192                 atomic_inc(&ctx->dma_cnt);
1193                 /* try to embed inband sgl */
1194                 sgl_extra_blks = bcm_vk_append_ib_sgl(vk, entry, data,
1195                                                       num_planes);
1196                 entry->to_v_blks += sgl_extra_blks;
1197                 entry->to_v_msg[0].size += sgl_extra_blks;
1198         } else if (entry->to_v_msg[0].function_id == VK_FID_INIT &&
1199                    entry->to_v_msg[0].context_id == VK_NEW_CTX) {
1200                 /*
1201                  * Init happens in 2 stages, only the first stage contains the
1202                  * pid that needs translating.
1203                  */
1204                 pid_t org_pid, pid;
1205
1206                 /*
1207                  * translate the pid into the unique host space as user
1208                  * may run sessions inside containers or process
1209                  * namespaces.
1210                  */
1211 #define VK_MSG_PID_MASK 0xffffff00
1212 #define VK_MSG_PID_SH   8
1213                 org_pid = (entry->to_v_msg[0].arg & VK_MSG_PID_MASK)
1214                            >> VK_MSG_PID_SH;
1215
1216                 pid = task_tgid_nr(current);
1217                 entry->to_v_msg[0].arg =
1218                         (entry->to_v_msg[0].arg & ~VK_MSG_PID_MASK) |
1219                         (pid << VK_MSG_PID_SH);
1220                 if (org_pid != pid)
1221                         dev_dbg(dev, "In PID 0x%x(%d), converted PID 0x%x(%d)\n",
1222                                 org_pid, org_pid, pid, pid);
1223         }
1224
1225         /*
1226          * store work entry to pending queue until a response is received.
1227          * This needs to be done before enqueuing the message
1228          */
1229         bcm_vk_append_pendq(&vk->to_v_msg_chan, q_num, entry);
1230
1231         rc = bcm_to_v_msg_enqueue(vk, entry);
1232         if (rc) {
1233                 dev_err(dev, "Fail to enqueue msg to to_v queue\n");
1234
1235                 /* remove message from pending list */
1236                 entry = bcm_vk_dequeue_pending
1237                                (vk,
1238                                 &vk->to_v_msg_chan,
1239                                 q_num,
1240                                 get_msg_id(&entry->to_v_msg[0]));
1241                 goto write_free_ent;
1242         }
1243
1244         return count;
1245
1246 write_free_msgid:
1247         bcm_vk_msgid_bitmap_clear(vk, get_msg_id(&entry->to_v_msg[0]), 1);
1248 write_free_ent:
1249         kfree(entry);
1250 write_err:
1251         return rc;
1252 }
1253
1254 __poll_t bcm_vk_poll(struct file *p_file, struct poll_table_struct *wait)
1255 {
1256         __poll_t ret = 0;
1257         int cnt;
1258         struct bcm_vk_ctx *ctx = p_file->private_data;
1259         struct bcm_vk *vk = container_of(ctx->miscdev, struct bcm_vk, miscdev);
1260         struct device *dev = &vk->pdev->dev;
1261
1262         poll_wait(p_file, &ctx->rd_wq, wait);
1263
1264         cnt = atomic_read(&ctx->pend_cnt);
1265         if (cnt) {
1266                 ret = (__force __poll_t)(POLLIN | POLLRDNORM);
1267                 if (cnt < 0) {
1268                         dev_err(dev, "Error cnt %d, setting back to 0", cnt);
1269                         atomic_set(&ctx->pend_cnt, 0);
1270                 }
1271         }
1272
1273         return ret;
1274 }
1275
1276 int bcm_vk_release(struct inode *inode, struct file *p_file)
1277 {
1278         int ret;
1279         struct bcm_vk_ctx *ctx = p_file->private_data;
1280         struct bcm_vk *vk = container_of(ctx->miscdev, struct bcm_vk, miscdev);
1281         struct device *dev = &vk->pdev->dev;
1282         pid_t pid = ctx->pid;
1283         int dma_cnt;
1284         unsigned long timeout, start_time;
1285
1286         /*
1287          * if there are outstanding DMA transactions, need to delay long enough
1288          * to ensure that the card side would have stopped touching the host buffer
1289          * and its SGL list.  A race condition could happen if the host app is killed
1290          * abruptly, eg kill -9, while some DMA transfer orders are still inflight.
1291          * Nothing could be done except for a delay as host side is running in a
1292          * completely async fashion.
1293          */
1294         start_time = jiffies;
1295         timeout = start_time + msecs_to_jiffies(BCM_VK_DMA_DRAIN_MAX_MS);
1296         do {
1297                 if (time_after(jiffies, timeout)) {
1298                         dev_warn(dev, "%d dma still pending for [fd-%d] pid %d\n",
1299                                  dma_cnt, ctx->idx, pid);
1300                         break;
1301                 }
1302                 dma_cnt = atomic_read(&ctx->dma_cnt);
1303                 cpu_relax();
1304                 cond_resched();
1305         } while (dma_cnt);
1306         dev_dbg(dev, "Draining for [fd-%d] pid %d - delay %d ms\n",
1307                 ctx->idx, pid, jiffies_to_msecs(jiffies - start_time));
1308
1309         bcm_vk_drain_all_pend(&vk->pdev->dev, &vk->to_v_msg_chan, ctx);
1310         bcm_vk_drain_all_pend(&vk->pdev->dev, &vk->to_h_msg_chan, ctx);
1311
1312         ret = bcm_vk_free_ctx(vk, ctx);
1313         if (ret == 0)
1314                 ret = bcm_vk_handle_last_sess(vk, pid, ctx->q_num);
1315         else
1316                 ret = 0;
1317
1318         kref_put(&vk->kref, bcm_vk_release_data);
1319
1320         return ret;
1321 }
1322
1323 int bcm_vk_msg_init(struct bcm_vk *vk)
1324 {
1325         struct device *dev = &vk->pdev->dev;
1326         int ret;
1327
1328         if (bcm_vk_data_init(vk)) {
1329                 dev_err(dev, "Error initializing internal data structures\n");
1330                 return -EINVAL;
1331         }
1332
1333         if (bcm_vk_msg_chan_init(&vk->to_v_msg_chan) ||
1334             bcm_vk_msg_chan_init(&vk->to_h_msg_chan)) {
1335                 dev_err(dev, "Error initializing communication channel\n");
1336                 return -EIO;
1337         }
1338
1339         /* read msgq info if ready */
1340         ret = bcm_vk_sync_msgq(vk, false);
1341         if (ret && (ret != -EAGAIN)) {
1342                 dev_err(dev, "Error reading comm msg Q info\n");
1343                 return -EIO;
1344         }
1345
1346         return 0;
1347 }
1348
1349 void bcm_vk_msg_remove(struct bcm_vk *vk)
1350 {
1351         bcm_vk_blk_drv_access(vk);
1352
1353         /* drain all pending items */
1354         bcm_vk_drain_all_pend(&vk->pdev->dev, &vk->to_v_msg_chan, NULL);
1355         bcm_vk_drain_all_pend(&vk->pdev->dev, &vk->to_h_msg_chan, NULL);
1356 }
1357