bcm_vk_msg.c (35199B)
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 */ 32static bool hb_mon = true; 33module_param(hb_mon, bool, 0444); 34MODULE_PARM_DESC(hb_mon, "Monitoring heartbeat continuously.\n"); 35static int batch_log = 1; 36module_param(batch_log, int, 0444); 37MODULE_PARM_DESC(batch_log, "Max num of logs per batch operation.\n"); 38 39static bool hb_mon_is_on(void) 40{ 41 return hb_mon; 42} 43 44static 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 53static 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 65static 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 70static 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 75static u32 msgq_inc(const struct bcm_vk_sync_qinfo *qinfo, u32 idx, u32 inc) 76{ 77 return ((idx + inc) & qinfo->q_mask); 78} 79 80static 81struct 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 87static 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 98static 99u32 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 109bool bcm_vk_drv_access_ok(struct bcm_vk *vk) 110{ 111 return (!!atomic_read(&vk->msgq_inited)); 112} 113 114void 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 140static 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 183void 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 191void 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 198static 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 */ 210static 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 254all_in_use_exit: 255in_reset_exit: 256 spin_unlock(&vk->ctx_lock); 257 258 return ctx; 259} 260 261static 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 291static 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 328static 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 340static 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_move_tail(&entry->node, &del_q); 358 } 359 } 360 } 361 spin_unlock(&chan->pendq_lock); 362 363 /* batch clean up */ 364 num = 0; 365 list_for_each_entry_safe(entry, tmp, &del_q, node) { 366 list_del(&entry->node); 367 num++; 368 if (ctx) { 369 struct vk_msg_blk *msg; 370 int bit_set; 371 bool responded; 372 u32 msg_id; 373 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) 380 dev_info(dev, 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, 385 msg->cmd, msg->arg, 386 responded ? "T" : "F", bit_set); 387 if (responded) 388 atomic_dec(&ctx->pend_cnt); 389 else if (bit_set) 390 bcm_vk_msgid_bitmap_clear(vk, msg_id, 1); 391 } 392 bcm_vk_free_wkent(dev, entry); 393 } 394 if (num && ctx) 395 dev_info(dev, "Total drained items %d [fd-%d]\n", 396 num, ctx->idx); 397} 398 399void bcm_vk_drain_msg_on_reset(struct bcm_vk *vk) 400{ 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); 403} 404 405/* 406 * Function to sync up the messages queue info that is provided by BAR1 407 */ 408int bcm_vk_sync_msgq(struct bcm_vk *vk, bool force_sync) 409{ 410 struct bcm_vk_msgq __iomem *msgq; 411 struct device *dev = &vk->pdev->dev; 412 u32 msgq_off; 413 u32 num_q; 414 struct bcm_vk_msg_chan *chan_list[] = {&vk->to_v_msg_chan, 415 &vk->to_h_msg_chan}; 416 struct bcm_vk_msg_chan *chan; 417 int i, j; 418 int ret = 0; 419 420 /* 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 424 * called again. 425 */ 426 if (!bcm_vk_msgq_marker_valid(vk)) { 427 dev_info(dev, "BAR1 msgq marker not initialized.\n"); 428 return -EAGAIN; 429 } 430 431 msgq_off = vkread32(vk, BAR_1, VK_BAR1_MSGQ_CTRL_OFF); 432 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)) { 436 dev_err(dev, 437 "Advertised msgq %d error - max %d allowed\n", 438 num_q, VK_MSGQ_PER_CHAN_MAX); 439 return -EINVAL; 440 } 441 442 vk->to_v_msg_chan.q_nr = num_q; 443 vk->to_h_msg_chan.q_nr = num_q; 444 445 /* first msgq location */ 446 msgq = vk->bar[BAR_1] + msgq_off; 447 448 /* 449 * if this function is called when it is already inited, 450 * something is wrong 451 */ 452 if (bcm_vk_drv_access_ok(vk) && !force_sync) { 453 dev_err(dev, "Msgq info already in sync\n"); 454 return -EPERM; 455 } 456 457 for (i = 0; i < ARRAY_SIZE(chan_list); i++) { 458 chan = chan_list[i]; 459 memset(chan->sync_qinfo, 0, sizeof(chan->sync_qinfo)); 460 461 for (j = 0; j < num_q; j++) { 462 struct bcm_vk_sync_qinfo *qinfo; 463 u32 msgq_start; 464 u32 msgq_size; 465 u32 msgq_nxt; 466 u32 msgq_db_offset, q_db_offset; 467 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; 476 else 477 /* fall back to default */ 478 msgq_db_offset = VK_BAR0_Q_DB_BASE(j); 479 480 dev_info(dev, 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", 482 j, 483 readw_relaxed(&msgq->type), 484 readw_relaxed(&msgq->num), 485 msgq_start, 486 msgq_db_offset, 487 readl_relaxed(&msgq->rd_idx), 488 readl_relaxed(&msgq->wr_idx), 489 msgq_size, 490 msgq_nxt); 491 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; 500 501 msgq++; 502 } 503 } 504 atomic_set(&vk->msgq_inited, 1); 505 506 return ret; 507} 508 509static int bcm_vk_msg_chan_init(struct bcm_vk_msg_chan *chan) 510{ 511 u32 i; 512 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]); 517 518 return 0; 519} 520 521static void bcm_vk_append_pendq(struct bcm_vk_msg_chan *chan, u16 q_num, 522 struct bcm_vk_wkent *entry) 523{ 524 struct bcm_vk_ctx *ctx; 525 526 spin_lock(&chan->pendq_lock); 527 list_add_tail(&entry->node, &chan->pendq[q_num]); 528 if (entry->to_h_msg) { 529 ctx = entry->ctx; 530 atomic_inc(&ctx->pend_cnt); 531 wake_up_interruptible(&ctx->rd_wq); 532 } 533 spin_unlock(&chan->pendq_lock); 534} 535 536static 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) 540{ 541 unsigned int i; 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; 548 u32 ib_sgl_size = 0; 549 u8 *buf = (u8 *)&entry->to_v_msg[entry->to_v_blks]; 550 u32 avail; 551 u32 q_num; 552 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); 561 return 0; 562 } 563 564 for (i = 0; i < num_planes; i++) { 565 if (data[i].address && 566 (ib_sgl_size + data[i].size) <= vk->ib_sgl_size) { 567 item_cnt++; 568 memcpy(buf, entry->dma[i].sglist, data[i].size); 569 ib_sgl_size += data[i].size; 570 buf += data[i].size; 571 } 572 } 573 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); 576 577 /* round up size */ 578 ib_sgl_size = (ib_sgl_size + VK_MSGQ_BLK_SIZE - 1) 579 >> VK_MSGQ_BLK_SZ_SHIFT; 580 581 return ib_sgl_size; 582} 583 584void bcm_to_v_q_doorbell(struct bcm_vk *vk, u32 q_num, u32 db_val) 585{ 586 struct bcm_vk_msg_chan *chan = &vk->to_v_msg_chan; 587 struct bcm_vk_sync_qinfo *qinfo = &chan->sync_qinfo[q_num]; 588 589 vkwrite32(vk, db_val, BAR_0, qinfo->q_db_offset); 590} 591 592static int bcm_to_v_msg_enqueue(struct bcm_vk *vk, struct bcm_vk_wkent *entry) 593{ 594 static u32 seq_num; 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]; 598 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 */ 604 u32 i; 605 u32 avail; 606 u32 retry; 607 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", 610 entry->to_v_blks, 611 src->size + 1, 612 get_msg_id(src), 613 src->function_id, 614 src->context_id); 615 return -EMSGSIZE; 616 } 617 618 msgq = chan->msgq[q_num]; 619 qinfo = &chan->sync_qinfo[q_num]; 620 621 mutex_lock(&chan->msgq_mutex); 622 623 avail = msgq_avail_space(msgq, qinfo); 624 625 /* if not enough space, return EAGAIN and let app handles it */ 626 retry = 0; 627 while ((avail < entry->to_v_blks) && 628 (retry++ < BCM_VK_H2VK_ENQ_RETRY)) { 629 mutex_unlock(&chan->msgq_mutex); 630 631 msleep(BCM_VK_H2VK_ENQ_RETRY_DELAY_MS); 632 mutex_lock(&chan->msgq_mutex); 633 avail = msgq_avail_space(msgq, qinfo); 634 } 635 if (retry > BCM_VK_H2VK_ENQ_RETRY) { 636 mutex_unlock(&chan->msgq_mutex); 637 return -EAGAIN; 638 } 639 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); 643 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); 649 goto idx_err; 650 } 651 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)); 655 656 src++; 657 wr_idx = msgq_inc(qinfo, wr_idx, 1); 658 dst = msgq_blk_addr(qinfo, wr_idx); 659 } 660 661 /* flush the write pointer */ 662 writel(wr_idx, &msgq->wr_idx); 663 664 /* log new info for debugging */ 665 dev_dbg(dev, 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), 669 wr_idx, 670 entry->to_v_blks, 671 msgq_occupied(msgq, qinfo), 672 msgq_avail_space(msgq, qinfo), 673 readl_relaxed(&msgq->size)); 674 /* 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. 678 */ 679 bcm_to_v_q_doorbell(vk, q_num, wr_idx + 1); 680idx_err: 681 mutex_unlock(&chan->msgq_mutex); 682 return 0; 683} 684 685int bcm_vk_send_shutdown_msg(struct bcm_vk *vk, u32 shut_type, 686 const pid_t pid, const u32 q_num) 687{ 688 int rc = 0; 689 struct bcm_vk_wkent *entry; 690 struct device *dev = &vk->pdev->dev; 691 692 /* 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. 696 */ 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)); 700 return -EINVAL; 701 } 702 703 entry = kzalloc(struct_size(entry, to_v_msg, 1), GFP_KERNEL); 704 if (!entry) 705 return -ENOMEM; 706 707 /* fill up necessary data */ 708 entry->to_v_msg[0].function_id = VK_FID_SHUTDOWN; 709 set_q_num(&entry->to_v_msg[0], q_num); 710 set_msg_id(&entry->to_v_msg[0], VK_SIMPLEX_MSG_ID); 711 entry->to_v_blks = 1; /* always 1 block */ 712 713 entry->to_v_msg[0].cmd = shut_type; 714 entry->to_v_msg[0].arg = pid; 715 716 rc = bcm_to_v_msg_enqueue(vk, entry); 717 if (rc) 718 dev_err(dev, 719 "Sending shutdown message to q %d for pid %d fails.\n", 720 get_q_num(&entry->to_v_msg[0]), pid); 721 722 kfree(entry); 723 724 return rc; 725} 726 727static int bcm_vk_handle_last_sess(struct bcm_vk *vk, const pid_t pid, 728 const u32 q_num) 729{ 730 int rc = 0; 731 struct device *dev = &vk->pdev->dev; 732 733 /* 734 * don't send down or do anything if message queue is not initialized 735 * and if it is the reset session, clear it. 736 */ 737 if (!bcm_vk_drv_access_ok(vk)) { 738 if (vk->reset_pid == pid) 739 vk->reset_pid = 0; 740 return -EPERM; 741 } 742 743 dev_dbg(dev, "No more sessions, shut down pid %d\n", pid); 744 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); 748 else 749 /* put reset_pid to 0 if it is exiting last session */ 750 vk->reset_pid = 0; 751 752 return rc; 753} 754 755static struct bcm_vk_wkent *bcm_vk_dequeue_pending(struct bcm_vk *vk, 756 struct bcm_vk_msg_chan *chan, 757 u16 q_num, 758 u16 msg_id) 759{ 760 struct bcm_vk_wkent *entry = NULL, *iter; 761 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); 766 entry = iter; 767 bcm_vk_msgid_bitmap_clear(vk, msg_id, 1); 768 break; 769 } 770 } 771 spin_unlock(&chan->pendq_lock); 772 return entry; 773} 774 775s32 bcm_to_h_msg_dequeue(struct bcm_vk *vk) 776{ 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; 785 u32 rd_idx, wr_idx; 786 u32 q_num, msg_id, j; 787 u32 num_blks; 788 s32 total = 0; 789 int cnt = 0; 790 int msg_processed = 0; 791 int max_msg_to_process; 792 bool exit_loop; 793 794 /* 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 798 * program to extract 799 */ 800 mutex_lock(&chan->msgq_mutex); 801 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; 806 807 rd_idx = readl_relaxed(&msgq->rd_idx); 808 wr_idx = readl_relaxed(&msgq->wr_idx); 809 msg_processed = 0; 810 exit_loop = false; 811 while ((rd_idx != wr_idx) && !exit_loop) { 812 u8 src_size; 813 814 /* 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. 821 */ 822 src = msgq_blk_addr(qinfo, rd_idx & qinfo->q_mask); 823 src_size = readb(&src->size); 824 825 if ((rd_idx >= qinfo->q_size) || 826 (src_size > (qinfo->q_size - 1))) { 827 dev_crit(dev, 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); 833 goto idx_err; 834 } 835 836 num_blks = src_size + 1; 837 data = kzalloc(num_blks * VK_MSGQ_BLK_SIZE, GFP_KERNEL); 838 if (data) { 839 /* copy messages and linearize it */ 840 dst = data; 841 for (j = 0; j < num_blks; j++) { 842 memcpy_fromio(dst, src, sizeof(*dst)); 843 844 dst++; 845 rd_idx = msgq_inc(qinfo, rd_idx, 1); 846 src = msgq_blk_addr(qinfo, rd_idx); 847 } 848 total++; 849 } else { 850 /* 851 * if we could not allocate memory in kernel, 852 * that is fatal. 853 */ 854 dev_crit(dev, "Kernel mem allocation failure.\n"); 855 total = -ENOMEM; 856 goto idx_err; 857 } 858 859 /* flush rd pointer after a message is dequeued */ 860 writel(rd_idx, &msgq->rd_idx); 861 862 /* log new info for debugging */ 863 dev_dbg(dev, 864 "MsgQ[%d] [Rd Wr] = [%d %d] blks extracted %d - Q = [u-%d a-%d]/%d\n", 865 readl_relaxed(&msgq->num), 866 rd_idx, 867 wr_idx, 868 num_blks, 869 msgq_occupied(msgq, qinfo), 870 msgq_avail_space(msgq, qinfo), 871 readl_relaxed(&msgq->size)); 872 873 /* 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. 878 */ 879 if (data->function_id == VK_FID_SHUTDOWN) { 880 kfree(data); 881 continue; 882 } 883 884 msg_id = get_msg_id(data); 885 /* lookup original message in to_v direction */ 886 entry = bcm_vk_dequeue_pending(vk, 887 &vk->to_v_msg_chan, 888 q_num, 889 msg_id); 890 891 /* 892 * if there is message to does not have prior send, 893 * this is the location to add here 894 */ 895 if (entry) { 896 entry->to_h_blks = num_blks; 897 entry->to_h_msg = data; 898 bcm_vk_append_pendq(&vk->to_h_msg_chan, 899 q_num, entry); 900 901 } else { 902 if (cnt++ < batch_log) 903 dev_info(dev, 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)); 907 kfree(data); 908 } 909 /* Fetch wr_idx to handle more back-to-back events */ 910 wr_idx = readl(&msgq->wr_idx); 911 912 /* 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. 916 */ 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); 920 exit_loop = true; 921 } 922 } 923 } 924idx_err: 925 mutex_unlock(&chan->msgq_mutex); 926 dev_dbg(dev, "total %d drained from queues\n", total); 927 928 return total; 929} 930 931/* 932 * init routine for all required data structures 933 */ 934static int bcm_vk_data_init(struct bcm_vk *vk) 935{ 936 int i; 937 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; 943 } 944 spin_lock_init(&vk->msg_id_lock); 945 spin_lock_init(&vk->host_alert_lock); 946 vk->msg_id = 0; 947 948 /* initialize hash table */ 949 for (i = 0; i < VK_PID_HT_SZ; i++) 950 INIT_LIST_HEAD(&vk->pid_ht[i].head); 951 952 return 0; 953} 954 955irqreturn_t bcm_vk_msgq_irqhandler(int irq, void *dev_id) 956{ 957 struct bcm_vk *vk = dev_id; 958 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; 963 } 964 965 queue_work(vk->wq_thread, &vk->wq_work); 966 967skip_schedule_work: 968 return IRQ_HANDLED; 969} 970 971int bcm_vk_open(struct inode *inode, struct file *p_file) 972{ 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; 977 int rc = 0; 978 979 /* get a context and set it up for file */ 980 ctx = bcm_vk_get_ctx(vk, task_tgid_nr(current)); 981 if (!ctx) { 982 dev_err(dev, "Error allocating context\n"); 983 rc = -ENOMEM; 984 } else { 985 /* 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 992 */ 993 ctx->miscdev = miscdev; 994 p_file->private_data = ctx; 995 dev_dbg(dev, "ctx_returned with idx %d, pid %d\n", 996 ctx->idx, ctx->pid); 997 } 998 return rc; 999} 1000 1001ssize_t bcm_vk_read(struct file *p_file, 1002 char __user *buf, 1003 size_t count, 1004 loff_t *f_pos) 1005{ 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, 1009 miscdev); 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; 1013 u32 q_num; 1014 u32 rsp_length; 1015 1016 if (!bcm_vk_drv_access_ok(vk)) 1017 return -EPERM; 1018 1019 dev_dbg(dev, "Buf count %zu\n", count); 1020 1021 /* 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 1025 */ 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) { 1030 if (count >= 1031 (iter->to_h_blks * VK_MSGQ_BLK_SIZE)) { 1032 list_del(&iter->node); 1033 atomic_dec(&ctx->pend_cnt); 1034 entry = iter; 1035 } else { 1036 /* buffer not big enough */ 1037 rc = -EMSGSIZE; 1038 } 1039 goto read_loop_exit; 1040 } 1041 } 1042 } 1043read_loop_exit: 1044 spin_unlock(&chan->pendq_lock); 1045 1046 if (entry) { 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) 1051 rc = rsp_length; 1052 1053 bcm_vk_free_wkent(dev, entry); 1054 } else if (rc == -EMSGSIZE) { 1055 struct vk_msg_blk tmp_msg = entry->to_h_msg[0]; 1056 1057 /* 1058 * in this case, return just the first block, so 1059 * that app knows what size it is looking for. 1060 */ 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"); 1065 rc = -EFAULT; 1066 } 1067 } 1068 return rc; 1069} 1070 1071ssize_t bcm_vk_write(struct file *p_file, 1072 const char __user *buf, 1073 size_t count, 1074 loff_t *f_pos) 1075{ 1076 ssize_t rc; 1077 struct bcm_vk_ctx *ctx = p_file->private_data; 1078 struct bcm_vk *vk = container_of(ctx->miscdev, struct bcm_vk, 1079 miscdev); 1080 struct bcm_vk_msgq __iomem *msgq; 1081 struct device *dev = &vk->pdev->dev; 1082 struct bcm_vk_wkent *entry; 1083 u32 sgl_extra_blks; 1084 u32 q_num; 1085 u32 msg_size; 1086 u32 msgq_size; 1087 1088 if (!bcm_vk_drv_access_ok(vk)) 1089 return -EPERM; 1090 1091 dev_dbg(dev, "Msg count %zu\n", count); 1092 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); 1097 rc = -EINVAL; 1098 goto write_err; 1099 } 1100 1101 /* allocate the work entry + buffer for size count and inband sgl */ 1102 entry = kzalloc(sizeof(*entry) + count + vk->ib_sgl_size, 1103 GFP_KERNEL); 1104 if (!entry) { 1105 rc = -ENOMEM; 1106 goto write_err; 1107 } 1108 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)) { 1111 rc = -EFAULT; 1112 goto write_free_ent; 1113 } 1114 1115 entry->to_v_blks = count >> VK_MSGQ_BLK_SZ_SHIFT; 1116 entry->ctx = ctx; 1117 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); 1126 rc = -EINVAL; 1127 goto write_free_ent; 1128 } 1129 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"); 1135 rc = -EOVERFLOW; 1136 goto write_free_ent; 1137 } 1138 set_msg_id(&entry->to_v_msg[0], rc); 1139 ctx->q_num = q_num; 1140 1141 dev_dbg(dev, 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])); 1145 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; 1149 int dir; 1150 struct _vk_data *data; 1151 1152 /* 1153 * check if we are in reset, if so, no buffer transfer is 1154 * allowed and return error. 1155 */ 1156 if (vk->reset_pid) { 1157 dev_dbg(dev, "No Transfer allowed during reset, pid %d.\n", 1158 ctx->pid); 1159 rc = -EACCES; 1160 goto write_free_msgid; 1161 } 1162 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; 1166 else 1167 dir = DMA_TO_DEVICE; 1168 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) { 1173 rc = -EMSGSIZE; 1174 goto write_free_msgid; 1175 } 1176 1177 data = (struct _vk_data *)&entry->to_v_msg[msg_size + 1]; 1178 1179 /* Now back up to the start of the pointers */ 1180 data -= num_planes; 1181 1182 /* Convert user addresses to DMA SG List */ 1183 rc = bcm_vk_sg_alloc(dev, entry->dma, dir, data, num_planes); 1184 if (rc) 1185 goto write_free_msgid; 1186 1187 atomic_inc(&ctx->dma_cnt); 1188 /* try to embed inband sgl */ 1189 sgl_extra_blks = bcm_vk_append_ib_sgl(vk, entry, data, 1190 num_planes); 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) { 1195 /* 1196 * Init happens in 2 stages, only the first stage contains the 1197 * pid that needs translating. 1198 */ 1199 pid_t org_pid, pid; 1200 1201 /* 1202 * translate the pid into the unique host space as user 1203 * may run sessions inside containers or process 1204 * namespaces. 1205 */ 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) 1209 >> VK_MSG_PID_SH; 1210 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); 1215 if (org_pid != pid) 1216 dev_dbg(dev, "In PID 0x%x(%d), converted PID 0x%x(%d)\n", 1217 org_pid, org_pid, pid, pid); 1218 } 1219 1220 /* 1221 * store work entry to pending queue until a response is received. 1222 * This needs to be done before enqueuing the message 1223 */ 1224 bcm_vk_append_pendq(&vk->to_v_msg_chan, q_num, entry); 1225 1226 rc = bcm_to_v_msg_enqueue(vk, entry); 1227 if (rc) { 1228 dev_err(dev, "Fail to enqueue msg to to_v queue\n"); 1229 1230 /* remove message from pending list */ 1231 entry = bcm_vk_dequeue_pending 1232 (vk, 1233 &vk->to_v_msg_chan, 1234 q_num, 1235 get_msg_id(&entry->to_v_msg[0])); 1236 goto write_free_ent; 1237 } 1238 1239 return count; 1240 1241write_free_msgid: 1242 bcm_vk_msgid_bitmap_clear(vk, get_msg_id(&entry->to_v_msg[0]), 1); 1243write_free_ent: 1244 kfree(entry); 1245write_err: 1246 return rc; 1247} 1248 1249__poll_t bcm_vk_poll(struct file *p_file, struct poll_table_struct *wait) 1250{ 1251 __poll_t ret = 0; 1252 int cnt; 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; 1256 1257 poll_wait(p_file, &ctx->rd_wq, wait); 1258 1259 cnt = atomic_read(&ctx->pend_cnt); 1260 if (cnt) { 1261 ret = (__force __poll_t)(POLLIN | POLLRDNORM); 1262 if (cnt < 0) { 1263 dev_err(dev, "Error cnt %d, setting back to 0", cnt); 1264 atomic_set(&ctx->pend_cnt, 0); 1265 } 1266 } 1267 1268 return ret; 1269} 1270 1271int bcm_vk_release(struct inode *inode, struct file *p_file) 1272{ 1273 int ret; 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; 1278 int dma_cnt; 1279 unsigned long timeout, start_time; 1280 1281 /* 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. 1288 */ 1289 start_time = jiffies; 1290 timeout = start_time + msecs_to_jiffies(BCM_VK_DMA_DRAIN_MAX_MS); 1291 do { 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); 1295 break; 1296 } 1297 dma_cnt = atomic_read(&ctx->dma_cnt); 1298 cpu_relax(); 1299 cond_resched(); 1300 } while (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)); 1303 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); 1306 1307 ret = bcm_vk_free_ctx(vk, ctx); 1308 if (ret == 0) 1309 ret = bcm_vk_handle_last_sess(vk, pid, ctx->q_num); 1310 else 1311 ret = 0; 1312 1313 kref_put(&vk->kref, bcm_vk_release_data); 1314 1315 return ret; 1316} 1317 1318int bcm_vk_msg_init(struct bcm_vk *vk) 1319{ 1320 struct device *dev = &vk->pdev->dev; 1321 int ret; 1322 1323 if (bcm_vk_data_init(vk)) { 1324 dev_err(dev, "Error initializing internal data structures\n"); 1325 return -EINVAL; 1326 } 1327 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"); 1331 return -EIO; 1332 } 1333 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"); 1338 return -EIO; 1339 } 1340 1341 return 0; 1342} 1343 1344void bcm_vk_msg_remove(struct bcm_vk *vk) 1345{ 1346 bcm_vk_blk_drv_access(vk); 1347 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); 1351} 1352