1 // SPDX-License-Identifier: GPL-2.0
3 * Copyright 2018-2020 Broadcom.
6 #include <linux/delay.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>
18 #include "bcm_vk_msg.h"
19 #include "bcm_vk_sg.h"
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
26 #define BCM_VK_DMA_DRAIN_MAX_MS 2000
28 /* number x q_size will be the max number of msg processed per loop */
29 #define BCM_VK_MSG_PROC_MAX_LOOP 2
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");
39 static bool hb_mon_is_on(void)
44 static u32
get_q_num(const struct vk_msg_blk
*msg
)
46 u32 q_num
= msg
->trans_id
& BCM_VK_MSG_Q_MASK
;
48 if (q_num
>= VK_MSGQ_PER_CHAN_MAX
)
49 q_num
= VK_MSGQ_NUM_DEFAULT
;
53 static void set_q_num(struct vk_msg_blk
*msg
, u32 q_num
)
57 if (q_num
>= VK_MSGQ_PER_CHAN_MAX
)
58 trans_q
= VK_MSGQ_NUM_DEFAULT
;
62 msg
->trans_id
= (msg
->trans_id
& ~BCM_VK_MSG_Q_MASK
) | trans_q
;
65 static u32
get_msg_id(const struct vk_msg_blk
*msg
)
67 return ((msg
->trans_id
>> BCM_VK_MSG_Q_SHIFT
) & BCM_VK_MSG_ID_MASK
);
70 static void set_msg_id(struct vk_msg_blk
*msg
, u32 val
)
72 msg
->trans_id
= (val
<< BCM_VK_MSG_Q_SHIFT
) | get_q_num(msg
);
75 static u32
msgq_inc(const struct bcm_vk_sync_qinfo
*qinfo
, u32 idx
, u32 inc
)
77 return ((idx
+ inc
) & qinfo
->q_mask
);
81 struct vk_msg_blk __iomem
*msgq_blk_addr(const struct bcm_vk_sync_qinfo
*qinfo
,
84 return qinfo
->q_start
+ (VK_MSGQ_BLK_SIZE
* idx
);
87 static u32
msgq_occupied(const struct bcm_vk_msgq __iomem
*msgq
,
88 const struct bcm_vk_sync_qinfo
*qinfo
)
92 wr_idx
= readl_relaxed(&msgq
->wr_idx
);
93 rd_idx
= readl_relaxed(&msgq
->rd_idx
);
95 return ((wr_idx
- rd_idx
) & qinfo
->q_mask
);
99 u32
msgq_avail_space(const struct bcm_vk_msgq __iomem
*msgq
,
100 const struct bcm_vk_sync_qinfo
*qinfo
)
102 return (qinfo
->q_size
- msgq_occupied(msgq
, qinfo
) - 1);
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
109 bool bcm_vk_drv_access_ok(struct bcm_vk
*vk
)
111 return (!!atomic_read(&vk
->msgq_inited
));
114 void bcm_vk_set_host_alert(struct bcm_vk
*vk
, u32 bit_mask
)
116 struct bcm_vk_alert
*alert
= &vk
->host_alert
;
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
);
124 if (test_and_set_bit(BCM_VK_WQ_NOTF_PEND
, vk
->wq_offload
) == 0)
125 queue_work(vk
->wq_thread
, &vk
->wq_work
);
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.
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)
140 static void bcm_vk_hb_poll(struct work_struct
*work
)
143 struct bcm_vk_hb_ctrl
*hb
= container_of(to_delayed_work(work
), struct bcm_vk_hb_ctrl
,
145 struct bcm_vk
*vk
= container_of(hb
, struct bcm_vk
, hb_ctrl
);
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
);
151 if (uptime_s
== hb
->last_uptime
)
153 else /* reset to avoid accumulation */
156 dev_dbg(&vk
->pdev
->dev
, "Last uptime %d current %d, lost %d\n",
157 hb
->last_uptime
, uptime_s
, hb
->lost_cnt
);
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.
164 hb
->last_uptime
= uptime_s
;
166 /* reset heart beat lost cnt */
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",
174 BCM_VK_HB_LOST_MAX
* BCM_VK_HB_TIMER_S
);
176 bcm_vk_blk_drv_access(vk
);
177 bcm_vk_set_host_alert(vk
, ERR_LOG_HOST_HB_FAIL
);
180 schedule_delayed_work(&hb
->work
, BCM_VK_HB_TIMER_VALUE
);
183 void bcm_vk_hb_init(struct bcm_vk
*vk
)
185 struct bcm_vk_hb_ctrl
*hb
= &vk
->hb_ctrl
;
187 INIT_DELAYED_WORK(&hb
->work
, bcm_vk_hb_poll
);
188 schedule_delayed_work(&hb
->work
, BCM_VK_HB_TIMER_VALUE
);
191 void bcm_vk_hb_deinit(struct bcm_vk
*vk
)
193 struct bcm_vk_hb_ctrl
*hb
= &vk
->hb_ctrl
;
195 cancel_delayed_work_sync(&hb
->work
);
198 static void bcm_vk_msgid_bitmap_clear(struct bcm_vk
*vk
,
202 spin_lock(&vk
->msg_id_lock
);
203 bitmap_clear(vk
->bmap
, start
, nbits
);
204 spin_unlock(&vk
->msg_id_lock
);
208 * allocate a ctx per file struct
210 static struct bcm_vk_ctx
*bcm_vk_get_ctx(struct bcm_vk
*vk
, const pid_t pid
)
213 struct bcm_vk_ctx
*ctx
= NULL
;
214 u32 hash_idx
= hash_32(pid
, VK_PID_HT_SHIFT_BIT
);
216 spin_lock(&vk
->ctx_lock
);
218 /* check if it is in reset, if so, don't allow */
220 dev_err(&vk
->pdev
->dev
,
221 "No context allowed during reset by pid %d\n",
227 for (i
= 0; i
< ARRAY_SIZE(vk
->ctx
); i
++) {
228 if (!vk
->ctx
[i
].in_use
) {
229 vk
->ctx
[i
].in_use
= true;
236 dev_err(&vk
->pdev
->dev
, "All context in use\n");
238 goto all_in_use_exit
;
241 /* set the pid and insert it to hash table */
243 ctx
->hash_idx
= hash_idx
;
244 list_add_tail(&ctx
->node
, &vk
->pid_ht
[hash_idx
].head
);
250 atomic_set(&ctx
->pend_cnt
, 0);
251 atomic_set(&ctx
->dma_cnt
, 0);
252 init_waitqueue_head(&ctx
->rd_wq
);
256 spin_unlock(&vk
->ctx_lock
);
261 static u16
bcm_vk_get_msg_id(struct bcm_vk
*vk
)
263 u16 rc
= VK_MSG_ID_OVERFLOW
;
264 u16 test_bit_count
= 0;
266 spin_lock(&vk
->msg_id_lock
);
267 while (test_bit_count
< (VK_MSG_ID_BITMAP_SIZE
- 1)) {
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
275 if (vk
->msg_id
== VK_MSG_ID_BITMAP_SIZE
)
278 if (test_bit(vk
->msg_id
, vk
->bmap
)) {
283 bitmap_set(vk
->bmap
, vk
->msg_id
, 1);
286 spin_unlock(&vk
->msg_id_lock
);
291 static int bcm_vk_free_ctx(struct bcm_vk
*vk
, struct bcm_vk_ctx
*ctx
)
296 struct bcm_vk_ctx
*entry
;
300 dev_err(&vk
->pdev
->dev
, "NULL context detected\n");
306 spin_lock(&vk
->ctx_lock
);
308 if (!vk
->ctx
[idx
].in_use
) {
309 dev_err(&vk
->pdev
->dev
, "context[%d] not in use!\n", idx
);
311 vk
->ctx
[idx
].in_use
= false;
312 vk
->ctx
[idx
].miscdev
= NULL
;
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
)
323 spin_unlock(&vk
->ctx_lock
);
328 static void bcm_vk_free_wkent(struct device
*dev
, struct bcm_vk_wkent
*entry
)
332 bcm_vk_sg_free(dev
, entry
->dma
, VK_DMA_MAX_ADDRS
, &proc_cnt
);
334 atomic_dec(&entry
->ctx
->dma_cnt
);
336 kfree(entry
->to_h_msg
);
340 static void bcm_vk_drain_all_pend(struct device
*dev
,
341 struct bcm_vk_msg_chan
*chan
,
342 struct bcm_vk_ctx
*ctx
)
345 struct bcm_vk_wkent
*entry
, *tmp
;
347 struct list_head del_q
;
350 vk
= container_of(ctx
->miscdev
, struct bcm_vk
, miscdev
);
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_move_tail(&entry
->node
, &del_q
);
361 spin_unlock(&chan
->pendq_lock
);
365 list_for_each_entry_safe(entry
, tmp
, &del_q
, node
) {
366 list_del(&entry
->node
);
369 struct vk_msg_blk
*msg
;
374 /* if it is specific ctx, log for any stuck */
375 msg
= entry
->to_v_msg
;
376 msg_id
= get_msg_id(msg
);
377 bit_set
= test_bit(msg_id
, vk
->bmap
);
378 responded
= entry
->to_h_msg
? true : false;
379 if (num
<= batch_log
)
381 "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",
382 msg
->function_id
, msg
->size
,
383 msg_id
, entry
->seq_num
,
384 msg
->context_id
, entry
->ctx
->idx
,
386 responded
? "T" : "F", bit_set
);
388 atomic_dec(&ctx
->pend_cnt
);
390 bcm_vk_msgid_bitmap_clear(vk
, msg_id
, 1);
392 bcm_vk_free_wkent(dev
, entry
);
395 dev_info(dev
, "Total drained items %d [fd-%d]\n",
399 void bcm_vk_drain_msg_on_reset(struct bcm_vk
*vk
)
401 bcm_vk_drain_all_pend(&vk
->pdev
->dev
, &vk
->to_v_msg_chan
, NULL
);
402 bcm_vk_drain_all_pend(&vk
->pdev
->dev
, &vk
->to_h_msg_chan
, NULL
);
406 * Function to sync up the messages queue info that is provided by BAR1
408 int bcm_vk_sync_msgq(struct bcm_vk
*vk
, bool force_sync
)
410 struct bcm_vk_msgq __iomem
*msgq
;
411 struct device
*dev
= &vk
->pdev
->dev
;
414 struct bcm_vk_msg_chan
*chan_list
[] = {&vk
->to_v_msg_chan
,
416 struct bcm_vk_msg_chan
*chan
;
421 * If the driver is loaded at startup where vk OS is not up yet,
422 * the msgq-info may not be available until a later time. In
423 * this case, we skip and the sync function is supposed to be
426 if (!bcm_vk_msgq_marker_valid(vk
)) {
427 dev_info(dev
, "BAR1 msgq marker not initialized.\n");
431 msgq_off
= vkread32(vk
, BAR_1
, VK_BAR1_MSGQ_CTRL_OFF
);
433 /* each side is always half the total */
434 num_q
= vkread32(vk
, BAR_1
, VK_BAR1_MSGQ_NR
) / 2;
435 if (!num_q
|| (num_q
> VK_MSGQ_PER_CHAN_MAX
)) {
437 "Advertised msgq %d error - max %d allowed\n",
438 num_q
, VK_MSGQ_PER_CHAN_MAX
);
442 vk
->to_v_msg_chan
.q_nr
= num_q
;
443 vk
->to_h_msg_chan
.q_nr
= num_q
;
445 /* first msgq location */
446 msgq
= vk
->bar
[BAR_1
] + msgq_off
;
449 * if this function is called when it is already inited,
452 if (bcm_vk_drv_access_ok(vk
) && !force_sync
) {
453 dev_err(dev
, "Msgq info already in sync\n");
457 for (i
= 0; i
< ARRAY_SIZE(chan_list
); i
++) {
459 memset(chan
->sync_qinfo
, 0, sizeof(chan
->sync_qinfo
));
461 for (j
= 0; j
< num_q
; j
++) {
462 struct bcm_vk_sync_qinfo
*qinfo
;
466 u32 msgq_db_offset
, q_db_offset
;
468 chan
->msgq
[j
] = msgq
;
469 msgq_start
= readl_relaxed(&msgq
->start
);
470 msgq_size
= readl_relaxed(&msgq
->size
);
471 msgq_nxt
= readl_relaxed(&msgq
->nxt
);
472 msgq_db_offset
= readl_relaxed(&msgq
->db_offset
);
473 q_db_offset
= (msgq_db_offset
& ((1 << DB_SHIFT
) - 1));
474 if (q_db_offset
== (~msgq_db_offset
>> DB_SHIFT
))
475 msgq_db_offset
= q_db_offset
;
477 /* fall back to default */
478 msgq_db_offset
= VK_BAR0_Q_DB_BASE(j
);
481 "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 readw_relaxed(&msgq
->type
),
484 readw_relaxed(&msgq
->num
),
487 readl_relaxed(&msgq
->rd_idx
),
488 readl_relaxed(&msgq
->wr_idx
),
492 qinfo
= &chan
->sync_qinfo
[j
];
493 /* formulate and record static info */
494 qinfo
->q_start
= vk
->bar
[BAR_1
] + msgq_start
;
495 qinfo
->q_size
= msgq_size
;
496 /* set low threshold as 50% or 1/2 */
497 qinfo
->q_low
= qinfo
->q_size
>> 1;
498 qinfo
->q_mask
= qinfo
->q_size
- 1;
499 qinfo
->q_db_offset
= msgq_db_offset
;
504 atomic_set(&vk
->msgq_inited
, 1);
509 static int bcm_vk_msg_chan_init(struct bcm_vk_msg_chan
*chan
)
513 mutex_init(&chan
->msgq_mutex
);
514 spin_lock_init(&chan
->pendq_lock
);
515 for (i
= 0; i
< VK_MSGQ_MAX_NR
; i
++)
516 INIT_LIST_HEAD(&chan
->pendq
[i
]);
521 static void bcm_vk_append_pendq(struct bcm_vk_msg_chan
*chan
, u16 q_num
,
522 struct bcm_vk_wkent
*entry
)
524 struct bcm_vk_ctx
*ctx
;
526 spin_lock(&chan
->pendq_lock
);
527 list_add_tail(&entry
->node
, &chan
->pendq
[q_num
]);
528 if (entry
->to_h_msg
) {
530 atomic_inc(&ctx
->pend_cnt
);
531 wake_up_interruptible(&ctx
->rd_wq
);
533 spin_unlock(&chan
->pendq_lock
);
536 static u32
bcm_vk_append_ib_sgl(struct bcm_vk
*vk
,
537 struct bcm_vk_wkent
*entry
,
538 struct _vk_data
*data
,
539 unsigned int num_planes
)
542 unsigned int item_cnt
= 0;
543 struct device
*dev
= &vk
->pdev
->dev
;
544 struct bcm_vk_msg_chan
*chan
= &vk
->to_v_msg_chan
;
545 struct vk_msg_blk
*msg
= &entry
->to_v_msg
[0];
546 struct bcm_vk_msgq __iomem
*msgq
;
547 struct bcm_vk_sync_qinfo
*qinfo
;
549 u8
*buf
= (u8
*)&entry
->to_v_msg
[entry
->to_v_blks
];
553 /* check if high watermark is hit, and if so, skip */
554 q_num
= get_q_num(msg
);
555 msgq
= chan
->msgq
[q_num
];
556 qinfo
= &chan
->sync_qinfo
[q_num
];
557 avail
= msgq_avail_space(msgq
, qinfo
);
558 if (avail
< qinfo
->q_low
) {
559 dev_dbg(dev
, "Skip inserting inband SGL, [0x%x/0x%x]\n",
560 avail
, qinfo
->q_size
);
564 for (i
= 0; i
< num_planes
; i
++) {
565 if (data
[i
].address
&&
566 (ib_sgl_size
+ data
[i
].size
) <= vk
->ib_sgl_size
) {
568 memcpy(buf
, entry
->dma
[i
].sglist
, data
[i
].size
);
569 ib_sgl_size
+= data
[i
].size
;
574 dev_dbg(dev
, "Num %u sgl items appended, size 0x%x, room 0x%x\n",
575 item_cnt
, ib_sgl_size
, vk
->ib_sgl_size
);
578 ib_sgl_size
= (ib_sgl_size
+ VK_MSGQ_BLK_SIZE
- 1)
579 >> VK_MSGQ_BLK_SZ_SHIFT
;
584 void bcm_to_v_q_doorbell(struct bcm_vk
*vk
, u32 q_num
, u32 db_val
)
586 struct bcm_vk_msg_chan
*chan
= &vk
->to_v_msg_chan
;
587 struct bcm_vk_sync_qinfo
*qinfo
= &chan
->sync_qinfo
[q_num
];
589 vkwrite32(vk
, db_val
, BAR_0
, qinfo
->q_db_offset
);
592 static int bcm_to_v_msg_enqueue(struct bcm_vk
*vk
, struct bcm_vk_wkent
*entry
)
595 struct bcm_vk_msg_chan
*chan
= &vk
->to_v_msg_chan
;
596 struct device
*dev
= &vk
->pdev
->dev
;
597 struct vk_msg_blk
*src
= &entry
->to_v_msg
[0];
599 struct vk_msg_blk __iomem
*dst
;
600 struct bcm_vk_msgq __iomem
*msgq
;
601 struct bcm_vk_sync_qinfo
*qinfo
;
602 u32 q_num
= get_q_num(src
);
603 u32 wr_idx
; /* local copy */
608 if (entry
->to_v_blks
!= src
->size
+ 1) {
609 dev_err(dev
, "number of blks %d not matching %d MsgId[0x%x]: func %d ctx 0x%x\n",
618 msgq
= chan
->msgq
[q_num
];
619 qinfo
= &chan
->sync_qinfo
[q_num
];
621 mutex_lock(&chan
->msgq_mutex
);
623 avail
= msgq_avail_space(msgq
, qinfo
);
625 /* if not enough space, return EAGAIN and let app handles it */
627 while ((avail
< entry
->to_v_blks
) &&
628 (retry
++ < BCM_VK_H2VK_ENQ_RETRY
)) {
629 mutex_unlock(&chan
->msgq_mutex
);
631 msleep(BCM_VK_H2VK_ENQ_RETRY_DELAY_MS
);
632 mutex_lock(&chan
->msgq_mutex
);
633 avail
= msgq_avail_space(msgq
, qinfo
);
635 if (retry
> BCM_VK_H2VK_ENQ_RETRY
) {
636 mutex_unlock(&chan
->msgq_mutex
);
640 /* at this point, mutex is taken and there is enough space */
641 entry
->seq_num
= seq_num
++; /* update debug seq number */
642 wr_idx
= readl_relaxed(&msgq
->wr_idx
);
644 if (wr_idx
>= qinfo
->q_size
) {
645 dev_crit(dev
, "Invalid wr_idx 0x%x => max 0x%x!",
646 wr_idx
, qinfo
->q_size
);
647 bcm_vk_blk_drv_access(vk
);
648 bcm_vk_set_host_alert(vk
, ERR_LOG_HOST_PCIE_DWN
);
652 dst
= msgq_blk_addr(qinfo
, wr_idx
);
653 for (i
= 0; i
< entry
->to_v_blks
; i
++) {
654 memcpy_toio(dst
, src
, sizeof(*dst
));
657 wr_idx
= msgq_inc(qinfo
, wr_idx
, 1);
658 dst
= msgq_blk_addr(qinfo
, wr_idx
);
661 /* flush the write pointer */
662 writel(wr_idx
, &msgq
->wr_idx
);
664 /* log new info for debugging */
666 "MsgQ[%d] [Rd Wr] = [%d %d] blks inserted %d - Q = [u-%d a-%d]/%d\n",
667 readl_relaxed(&msgq
->num
),
668 readl_relaxed(&msgq
->rd_idx
),
671 msgq_occupied(msgq
, qinfo
),
672 msgq_avail_space(msgq
, qinfo
),
673 readl_relaxed(&msgq
->size
));
675 * press door bell based on queue number. 1 is added to the wr_idx
676 * to avoid the value of 0 appearing on the VK side to distinguish
677 * from initial value.
679 bcm_to_v_q_doorbell(vk
, q_num
, wr_idx
+ 1);
681 mutex_unlock(&chan
->msgq_mutex
);
685 int bcm_vk_send_shutdown_msg(struct bcm_vk
*vk
, u32 shut_type
,
686 const pid_t pid
, const u32 q_num
)
689 struct bcm_vk_wkent
*entry
;
690 struct device
*dev
= &vk
->pdev
->dev
;
693 * check if the marker is still good. Sometimes, the PCIe interface may
694 * have gone done, and if so and we ship down thing based on broken
695 * values, kernel may panic.
697 if (!bcm_vk_msgq_marker_valid(vk
)) {
698 dev_info(dev
, "PCIe comm chan - invalid marker (0x%x)!\n",
699 vkread32(vk
, BAR_1
, VK_BAR1_MSGQ_DEF_RDY
));
703 entry
= kzalloc(struct_size(entry
, to_v_msg
, 1), GFP_KERNEL
);
706 entry
->to_v_blks
= 1; /* always 1 block */
708 /* fill up necessary data */
709 entry
->to_v_msg
[0].function_id
= VK_FID_SHUTDOWN
;
710 set_q_num(&entry
->to_v_msg
[0], q_num
);
711 set_msg_id(&entry
->to_v_msg
[0], VK_SIMPLEX_MSG_ID
);
713 entry
->to_v_msg
[0].cmd
= shut_type
;
714 entry
->to_v_msg
[0].arg
= pid
;
716 rc
= bcm_to_v_msg_enqueue(vk
, entry
);
719 "Sending shutdown message to q %d for pid %d fails.\n",
720 get_q_num(&entry
->to_v_msg
[0]), pid
);
727 static int bcm_vk_handle_last_sess(struct bcm_vk
*vk
, const pid_t pid
,
731 struct device
*dev
= &vk
->pdev
->dev
;
734 * don't send down or do anything if message queue is not initialized
735 * and if it is the reset session, clear it.
737 if (!bcm_vk_drv_access_ok(vk
)) {
738 if (vk
->reset_pid
== pid
)
743 dev_dbg(dev
, "No more sessions, shut down pid %d\n", pid
);
745 /* only need to do it if it is not the reset process */
746 if (vk
->reset_pid
!= pid
)
747 rc
= bcm_vk_send_shutdown_msg(vk
, VK_SHUTDOWN_PID
, pid
, q_num
);
749 /* put reset_pid to 0 if it is exiting last session */
755 static struct bcm_vk_wkent
*bcm_vk_dequeue_pending(struct bcm_vk
*vk
,
756 struct bcm_vk_msg_chan
*chan
,
760 struct bcm_vk_wkent
*entry
= NULL
, *iter
;
762 spin_lock(&chan
->pendq_lock
);
763 list_for_each_entry(iter
, &chan
->pendq
[q_num
], node
) {
764 if (get_msg_id(&iter
->to_v_msg
[0]) == msg_id
) {
765 list_del(&iter
->node
);
767 bcm_vk_msgid_bitmap_clear(vk
, msg_id
, 1);
771 spin_unlock(&chan
->pendq_lock
);
775 s32
bcm_to_h_msg_dequeue(struct bcm_vk
*vk
)
777 struct device
*dev
= &vk
->pdev
->dev
;
778 struct bcm_vk_msg_chan
*chan
= &vk
->to_h_msg_chan
;
779 struct vk_msg_blk
*data
;
780 struct vk_msg_blk __iomem
*src
;
781 struct vk_msg_blk
*dst
;
782 struct bcm_vk_msgq __iomem
*msgq
;
783 struct bcm_vk_sync_qinfo
*qinfo
;
784 struct bcm_vk_wkent
*entry
;
786 u32 q_num
, msg_id
, j
;
790 int msg_processed
= 0;
791 int max_msg_to_process
;
795 * drain all the messages from the queues, and find its pending
796 * entry in the to_v queue, based on msg_id & q_num, and move the
797 * entry to the to_h pending queue, waiting for user space
800 mutex_lock(&chan
->msgq_mutex
);
802 for (q_num
= 0; q_num
< chan
->q_nr
; q_num
++) {
803 msgq
= chan
->msgq
[q_num
];
804 qinfo
= &chan
->sync_qinfo
[q_num
];
805 max_msg_to_process
= BCM_VK_MSG_PROC_MAX_LOOP
* qinfo
->q_size
;
807 rd_idx
= readl_relaxed(&msgq
->rd_idx
);
808 wr_idx
= readl_relaxed(&msgq
->wr_idx
);
811 while ((rd_idx
!= wr_idx
) && !exit_loop
) {
815 * Make a local copy and get pointer to src blk
816 * The rd_idx is masked before getting the pointer to
817 * avoid out of bound access in case the interface goes
818 * down. It will end up pointing to the last block in
819 * the buffer, but subsequent src->size check would be
820 * able to catch this.
822 src
= msgq_blk_addr(qinfo
, rd_idx
& qinfo
->q_mask
);
823 src_size
= readb(&src
->size
);
825 if ((rd_idx
>= qinfo
->q_size
) ||
826 (src_size
> (qinfo
->q_size
- 1))) {
828 "Invalid rd_idx 0x%x or size 0x%x => max 0x%x!",
829 rd_idx
, src_size
, qinfo
->q_size
);
830 bcm_vk_blk_drv_access(vk
);
831 bcm_vk_set_host_alert(vk
,
832 ERR_LOG_HOST_PCIE_DWN
);
836 num_blks
= src_size
+ 1;
837 data
= kzalloc(num_blks
* VK_MSGQ_BLK_SIZE
, GFP_KERNEL
);
839 /* copy messages and linearize it */
841 for (j
= 0; j
< num_blks
; j
++) {
842 memcpy_fromio(dst
, src
, sizeof(*dst
));
845 rd_idx
= msgq_inc(qinfo
, rd_idx
, 1);
846 src
= msgq_blk_addr(qinfo
, rd_idx
);
851 * if we could not allocate memory in kernel,
854 dev_crit(dev
, "Kernel mem allocation failure.\n");
859 /* flush rd pointer after a message is dequeued */
860 writel(rd_idx
, &msgq
->rd_idx
);
862 /* log new info for debugging */
864 "MsgQ[%d] [Rd Wr] = [%d %d] blks extracted %d - Q = [u-%d a-%d]/%d\n",
865 readl_relaxed(&msgq
->num
),
869 msgq_occupied(msgq
, qinfo
),
870 msgq_avail_space(msgq
, qinfo
),
871 readl_relaxed(&msgq
->size
));
874 * No need to search if it is an autonomous one-way
875 * message from driver, as these messages do not bear
876 * a to_v pending item. Currently, only the shutdown
877 * message falls into this category.
879 if (data
->function_id
== VK_FID_SHUTDOWN
) {
884 msg_id
= get_msg_id(data
);
885 /* lookup original message in to_v direction */
886 entry
= bcm_vk_dequeue_pending(vk
,
892 * if there is message to does not have prior send,
893 * this is the location to add here
896 entry
->to_h_blks
= num_blks
;
897 entry
->to_h_msg
= data
;
898 bcm_vk_append_pendq(&vk
->to_h_msg_chan
,
902 if (cnt
++ < batch_log
)
904 "Could not find MsgId[0x%x] for resp func %d bmap %d\n",
905 msg_id
, data
->function_id
,
906 test_bit(msg_id
, vk
->bmap
));
909 /* Fetch wr_idx to handle more back-to-back events */
910 wr_idx
= readl(&msgq
->wr_idx
);
913 * cap the max so that even we try to handle more back-to-back events,
914 * so that it won't hold CPU too long or in case rd/wr idexes are
915 * corrupted which triggers infinite looping.
917 if (++msg_processed
>= max_msg_to_process
) {
918 dev_warn(dev
, "Q[%d] Per loop processing exceeds %d\n",
919 q_num
, max_msg_to_process
);
925 mutex_unlock(&chan
->msgq_mutex
);
926 dev_dbg(dev
, "total %d drained from queues\n", total
);
932 * init routine for all required data structures
934 static int bcm_vk_data_init(struct bcm_vk
*vk
)
938 spin_lock_init(&vk
->ctx_lock
);
939 for (i
= 0; i
< ARRAY_SIZE(vk
->ctx
); i
++) {
940 vk
->ctx
[i
].in_use
= false;
941 vk
->ctx
[i
].idx
= i
; /* self identity */
942 vk
->ctx
[i
].miscdev
= NULL
;
944 spin_lock_init(&vk
->msg_id_lock
);
945 spin_lock_init(&vk
->host_alert_lock
);
948 /* initialize hash table */
949 for (i
= 0; i
< VK_PID_HT_SZ
; i
++)
950 INIT_LIST_HEAD(&vk
->pid_ht
[i
].head
);
955 irqreturn_t
bcm_vk_msgq_irqhandler(int irq
, void *dev_id
)
957 struct bcm_vk
*vk
= dev_id
;
959 if (!bcm_vk_drv_access_ok(vk
)) {
960 dev_err(&vk
->pdev
->dev
,
961 "Interrupt %d received when msgq not inited\n", irq
);
962 goto skip_schedule_work
;
965 queue_work(vk
->wq_thread
, &vk
->wq_work
);
971 int bcm_vk_open(struct inode
*inode
, struct file
*p_file
)
973 struct bcm_vk_ctx
*ctx
;
974 struct miscdevice
*miscdev
= (struct miscdevice
*)p_file
->private_data
;
975 struct bcm_vk
*vk
= container_of(miscdev
, struct bcm_vk
, miscdev
);
976 struct device
*dev
= &vk
->pdev
->dev
;
979 /* get a context and set it up for file */
980 ctx
= bcm_vk_get_ctx(vk
, task_tgid_nr(current
));
982 dev_err(dev
, "Error allocating context\n");
986 * set up context and replace private data with context for
987 * other methods to use. Reason for the context is because
988 * it is allowed for multiple sessions to open the sysfs, and
989 * for each file open, when upper layer query the response,
990 * only those that are tied to a specific open should be
991 * returned. The context->idx will be used for such binding
993 ctx
->miscdev
= miscdev
;
994 p_file
->private_data
= ctx
;
995 dev_dbg(dev
, "ctx_returned with idx %d, pid %d\n",
1001 ssize_t
bcm_vk_read(struct file
*p_file
,
1006 ssize_t rc
= -ENOMSG
;
1007 struct bcm_vk_ctx
*ctx
= p_file
->private_data
;
1008 struct bcm_vk
*vk
= container_of(ctx
->miscdev
, struct bcm_vk
,
1010 struct device
*dev
= &vk
->pdev
->dev
;
1011 struct bcm_vk_msg_chan
*chan
= &vk
->to_h_msg_chan
;
1012 struct bcm_vk_wkent
*entry
= NULL
, *iter
;
1016 if (!bcm_vk_drv_access_ok(vk
))
1019 dev_dbg(dev
, "Buf count %zu\n", count
);
1022 * search through the pendq on the to_h chan, and return only those
1023 * that belongs to the same context. Search is always from the high to
1024 * the low priority queues
1026 spin_lock(&chan
->pendq_lock
);
1027 for (q_num
= 0; q_num
< chan
->q_nr
; q_num
++) {
1028 list_for_each_entry(iter
, &chan
->pendq
[q_num
], node
) {
1029 if (iter
->ctx
->idx
== ctx
->idx
) {
1031 (iter
->to_h_blks
* VK_MSGQ_BLK_SIZE
)) {
1032 list_del(&iter
->node
);
1033 atomic_dec(&ctx
->pend_cnt
);
1036 /* buffer not big enough */
1039 goto read_loop_exit
;
1044 spin_unlock(&chan
->pendq_lock
);
1047 /* retrieve the passed down msg_id */
1048 set_msg_id(&entry
->to_h_msg
[0], entry
->usr_msg_id
);
1049 rsp_length
= entry
->to_h_blks
* VK_MSGQ_BLK_SIZE
;
1050 if (copy_to_user(buf
, entry
->to_h_msg
, rsp_length
) == 0)
1053 bcm_vk_free_wkent(dev
, entry
);
1054 } else if (rc
== -EMSGSIZE
) {
1055 struct vk_msg_blk tmp_msg
= entry
->to_h_msg
[0];
1058 * in this case, return just the first block, so
1059 * that app knows what size it is looking for.
1061 set_msg_id(&tmp_msg
, entry
->usr_msg_id
);
1062 tmp_msg
.size
= entry
->to_h_blks
- 1;
1063 if (copy_to_user(buf
, &tmp_msg
, VK_MSGQ_BLK_SIZE
) != 0) {
1064 dev_err(dev
, "Error return 1st block in -EMSGSIZE\n");
1071 ssize_t
bcm_vk_write(struct file
*p_file
,
1072 const char __user
*buf
,
1077 struct bcm_vk_ctx
*ctx
= p_file
->private_data
;
1078 struct bcm_vk
*vk
= container_of(ctx
->miscdev
, struct bcm_vk
,
1080 struct bcm_vk_msgq __iomem
*msgq
;
1081 struct device
*dev
= &vk
->pdev
->dev
;
1082 struct bcm_vk_wkent
*entry
;
1088 if (!bcm_vk_drv_access_ok(vk
))
1091 dev_dbg(dev
, "Msg count %zu\n", count
);
1093 /* first, do sanity check where count should be multiple of basic blk */
1094 if (count
& (VK_MSGQ_BLK_SIZE
- 1)) {
1095 dev_err(dev
, "Failure with size %zu not multiple of %zu\n",
1096 count
, VK_MSGQ_BLK_SIZE
);
1101 /* allocate the work entry + buffer for size count and inband sgl */
1102 entry
= kzalloc(sizeof(*entry
) + count
+ vk
->ib_sgl_size
,
1109 /* now copy msg from user space, and then formulate the work entry */
1110 if (copy_from_user(&entry
->to_v_msg
[0], buf
, count
)) {
1112 goto write_free_ent
;
1115 entry
->to_v_blks
= count
>> VK_MSGQ_BLK_SZ_SHIFT
;
1118 /* do a check on the blk size which could not exceed queue space */
1119 q_num
= get_q_num(&entry
->to_v_msg
[0]);
1120 msgq
= vk
->to_v_msg_chan
.msgq
[q_num
];
1121 msgq_size
= readl_relaxed(&msgq
->size
);
1122 if (entry
->to_v_blks
+ (vk
->ib_sgl_size
>> VK_MSGQ_BLK_SZ_SHIFT
)
1123 > (msgq_size
- 1)) {
1124 dev_err(dev
, "Blk size %d exceed max queue size allowed %d\n",
1125 entry
->to_v_blks
, msgq_size
- 1);
1127 goto write_free_ent
;
1130 /* Use internal message id */
1131 entry
->usr_msg_id
= get_msg_id(&entry
->to_v_msg
[0]);
1132 rc
= bcm_vk_get_msg_id(vk
);
1133 if (rc
== VK_MSG_ID_OVERFLOW
) {
1134 dev_err(dev
, "msg_id overflow\n");
1136 goto write_free_ent
;
1138 set_msg_id(&entry
->to_v_msg
[0], rc
);
1142 "[Q-%d]Message ctx id %d, usr_msg_id 0x%x sent msg_id 0x%x\n",
1143 ctx
->q_num
, ctx
->idx
, entry
->usr_msg_id
,
1144 get_msg_id(&entry
->to_v_msg
[0]));
1146 if (entry
->to_v_msg
[0].function_id
== VK_FID_TRANS_BUF
) {
1147 /* Convert any pointers to sg list */
1148 unsigned int num_planes
;
1150 struct _vk_data
*data
;
1153 * check if we are in reset, if so, no buffer transfer is
1154 * allowed and return error.
1156 if (vk
->reset_pid
) {
1157 dev_dbg(dev
, "No Transfer allowed during reset, pid %d.\n",
1160 goto write_free_msgid
;
1163 num_planes
= entry
->to_v_msg
[0].cmd
& VK_CMD_PLANES_MASK
;
1164 if ((entry
->to_v_msg
[0].cmd
& VK_CMD_MASK
) == VK_CMD_DOWNLOAD
)
1165 dir
= DMA_FROM_DEVICE
;
1167 dir
= DMA_TO_DEVICE
;
1169 /* Calculate vk_data location */
1170 /* Go to end of the message */
1171 msg_size
= entry
->to_v_msg
[0].size
;
1172 if (msg_size
> entry
->to_v_blks
) {
1174 goto write_free_msgid
;
1177 data
= (struct _vk_data
*)&entry
->to_v_msg
[msg_size
+ 1];
1179 /* Now back up to the start of the pointers */
1182 /* Convert user addresses to DMA SG List */
1183 rc
= bcm_vk_sg_alloc(dev
, entry
->dma
, dir
, data
, num_planes
);
1185 goto write_free_msgid
;
1187 atomic_inc(&ctx
->dma_cnt
);
1188 /* try to embed inband sgl */
1189 sgl_extra_blks
= bcm_vk_append_ib_sgl(vk
, entry
, data
,
1191 entry
->to_v_blks
+= sgl_extra_blks
;
1192 entry
->to_v_msg
[0].size
+= sgl_extra_blks
;
1193 } else if (entry
->to_v_msg
[0].function_id
== VK_FID_INIT
&&
1194 entry
->to_v_msg
[0].context_id
== VK_NEW_CTX
) {
1196 * Init happens in 2 stages, only the first stage contains the
1197 * pid that needs translating.
1202 * translate the pid into the unique host space as user
1203 * may run sessions inside containers or process
1206 #define VK_MSG_PID_MASK 0xffffff00
1207 #define VK_MSG_PID_SH 8
1208 org_pid
= (entry
->to_v_msg
[0].arg
& VK_MSG_PID_MASK
)
1211 pid
= task_tgid_nr(current
);
1212 entry
->to_v_msg
[0].arg
=
1213 (entry
->to_v_msg
[0].arg
& ~VK_MSG_PID_MASK
) |
1214 (pid
<< VK_MSG_PID_SH
);
1216 dev_dbg(dev
, "In PID 0x%x(%d), converted PID 0x%x(%d)\n",
1217 org_pid
, org_pid
, pid
, pid
);
1221 * store work entry to pending queue until a response is received.
1222 * This needs to be done before enqueuing the message
1224 bcm_vk_append_pendq(&vk
->to_v_msg_chan
, q_num
, entry
);
1226 rc
= bcm_to_v_msg_enqueue(vk
, entry
);
1228 dev_err(dev
, "Fail to enqueue msg to to_v queue\n");
1230 /* remove message from pending list */
1231 entry
= bcm_vk_dequeue_pending
1235 get_msg_id(&entry
->to_v_msg
[0]));
1236 goto write_free_ent
;
1242 bcm_vk_msgid_bitmap_clear(vk
, get_msg_id(&entry
->to_v_msg
[0]), 1);
1249 __poll_t
bcm_vk_poll(struct file
*p_file
, struct poll_table_struct
*wait
)
1253 struct bcm_vk_ctx
*ctx
= p_file
->private_data
;
1254 struct bcm_vk
*vk
= container_of(ctx
->miscdev
, struct bcm_vk
, miscdev
);
1255 struct device
*dev
= &vk
->pdev
->dev
;
1257 poll_wait(p_file
, &ctx
->rd_wq
, wait
);
1259 cnt
= atomic_read(&ctx
->pend_cnt
);
1261 ret
= (__force __poll_t
)(POLLIN
| POLLRDNORM
);
1263 dev_err(dev
, "Error cnt %d, setting back to 0", cnt
);
1264 atomic_set(&ctx
->pend_cnt
, 0);
1271 int bcm_vk_release(struct inode
*inode
, struct file
*p_file
)
1274 struct bcm_vk_ctx
*ctx
= p_file
->private_data
;
1275 struct bcm_vk
*vk
= container_of(ctx
->miscdev
, struct bcm_vk
, miscdev
);
1276 struct device
*dev
= &vk
->pdev
->dev
;
1277 pid_t pid
= ctx
->pid
;
1279 unsigned long timeout
, start_time
;
1282 * if there are outstanding DMA transactions, need to delay long enough
1283 * to ensure that the card side would have stopped touching the host buffer
1284 * and its SGL list. A race condition could happen if the host app is killed
1285 * abruptly, eg kill -9, while some DMA transfer orders are still inflight.
1286 * Nothing could be done except for a delay as host side is running in a
1287 * completely async fashion.
1289 start_time
= jiffies
;
1290 timeout
= start_time
+ msecs_to_jiffies(BCM_VK_DMA_DRAIN_MAX_MS
);
1292 if (time_after(jiffies
, timeout
)) {
1293 dev_warn(dev
, "%d dma still pending for [fd-%d] pid %d\n",
1294 dma_cnt
, ctx
->idx
, pid
);
1297 dma_cnt
= atomic_read(&ctx
->dma_cnt
);
1301 dev_dbg(dev
, "Draining for [fd-%d] pid %d - delay %d ms\n",
1302 ctx
->idx
, pid
, jiffies_to_msecs(jiffies
- start_time
));
1304 bcm_vk_drain_all_pend(&vk
->pdev
->dev
, &vk
->to_v_msg_chan
, ctx
);
1305 bcm_vk_drain_all_pend(&vk
->pdev
->dev
, &vk
->to_h_msg_chan
, ctx
);
1307 ret
= bcm_vk_free_ctx(vk
, ctx
);
1309 ret
= bcm_vk_handle_last_sess(vk
, pid
, ctx
->q_num
);
1313 kref_put(&vk
->kref
, bcm_vk_release_data
);
1318 int bcm_vk_msg_init(struct bcm_vk
*vk
)
1320 struct device
*dev
= &vk
->pdev
->dev
;
1323 if (bcm_vk_data_init(vk
)) {
1324 dev_err(dev
, "Error initializing internal data structures\n");
1328 if (bcm_vk_msg_chan_init(&vk
->to_v_msg_chan
) ||
1329 bcm_vk_msg_chan_init(&vk
->to_h_msg_chan
)) {
1330 dev_err(dev
, "Error initializing communication channel\n");
1334 /* read msgq info if ready */
1335 ret
= bcm_vk_sync_msgq(vk
, false);
1336 if (ret
&& (ret
!= -EAGAIN
)) {
1337 dev_err(dev
, "Error reading comm msg Q info\n");
1344 void bcm_vk_msg_remove(struct bcm_vk
*vk
)
1346 bcm_vk_blk_drv_access(vk
);
1348 /* drain all pending items */
1349 bcm_vk_drain_all_pend(&vk
->pdev
->dev
, &vk
->to_v_msg_chan
, NULL
);
1350 bcm_vk_drain_all_pend(&vk
->pdev
->dev
, &vk
->to_h_msg_chan
, NULL
);