12e99ea80SHyong Youb Kim /* SPDX-License-Identifier: BSD-3-Clause 22e99ea80SHyong Youb Kim * Copyright 2008-2017 Cisco Systems, Inc. All rights reserved. 372f3de30SBruce Richardson * Copyright 2007 Nuova Systems, Inc. All rights reserved. 472f3de30SBruce Richardson */ 572f3de30SBruce Richardson 672f3de30SBruce Richardson #include "vnic_dev.h" 772f3de30SBruce Richardson #include "vnic_cq.h" 8846ac76cSJohn Daley #include <rte_memzone.h> 972f3de30SBruce Richardson 1072f3de30SBruce Richardson void vnic_cq_free(struct vnic_cq *cq) 1172f3de30SBruce Richardson { 1272f3de30SBruce Richardson vnic_dev_free_desc_ring(cq->vdev, &cq->ring); 1372f3de30SBruce Richardson 1472f3de30SBruce Richardson cq->ctrl = NULL; 1572f3de30SBruce Richardson } 1672f3de30SBruce Richardson 1772f3de30SBruce Richardson int vnic_cq_alloc(struct vnic_dev *vdev, struct vnic_cq *cq, unsigned int index, 1872f3de30SBruce Richardson unsigned int socket_id, 1972f3de30SBruce Richardson unsigned int desc_count, unsigned int desc_size) 2072f3de30SBruce Richardson { 2172f3de30SBruce Richardson int err; 22846ac76cSJohn Daley char res_name[RTE_MEMZONE_NAMESIZE]; 2372f3de30SBruce Richardson static int instance; 2472f3de30SBruce Richardson 2572f3de30SBruce Richardson cq->index = index; 2672f3de30SBruce Richardson cq->vdev = vdev; 27*00ce4311SHyong Youb Kim cq->admin_chan = false; 2872f3de30SBruce Richardson 2972f3de30SBruce Richardson cq->ctrl = vnic_dev_get_res(vdev, RES_TYPE_CQ, index); 3072f3de30SBruce Richardson if (!cq->ctrl) { 3132d1206eSAaron Conole pr_err("Failed to hook CQ[%u] resource\n", index); 3272f3de30SBruce Richardson return -EINVAL; 3372f3de30SBruce Richardson } 3472f3de30SBruce Richardson 3532d1206eSAaron Conole snprintf(res_name, sizeof(res_name), "%d-cq-%u", instance++, index); 3672f3de30SBruce Richardson err = vnic_dev_alloc_desc_ring(vdev, &cq->ring, desc_count, desc_size, 3772f3de30SBruce Richardson socket_id, res_name); 3872f3de30SBruce Richardson if (err) 3972f3de30SBruce Richardson return err; 4072f3de30SBruce Richardson 4172f3de30SBruce Richardson return 0; 4272f3de30SBruce Richardson } 4372f3de30SBruce Richardson 44*00ce4311SHyong Youb Kim int vnic_admin_cq_alloc(struct vnic_dev *vdev, struct vnic_cq *cq, unsigned int index, 45*00ce4311SHyong Youb Kim unsigned int socket_id, unsigned int desc_count, unsigned int desc_size) 46*00ce4311SHyong Youb Kim { 47*00ce4311SHyong Youb Kim int err; 48*00ce4311SHyong Youb Kim char res_name[RTE_MEMZONE_NAMESIZE]; 49*00ce4311SHyong Youb Kim static int instance; 50*00ce4311SHyong Youb Kim 51*00ce4311SHyong Youb Kim cq->index = index; 52*00ce4311SHyong Youb Kim cq->vdev = vdev; 53*00ce4311SHyong Youb Kim cq->admin_chan = true; 54*00ce4311SHyong Youb Kim 55*00ce4311SHyong Youb Kim cq->ctrl = vnic_dev_get_res(vdev, RES_TYPE_ADMIN_CQ, index); 56*00ce4311SHyong Youb Kim if (!cq->ctrl) { 57*00ce4311SHyong Youb Kim pr_err("Failed to get admin CQ[%u] resource\n", index); 58*00ce4311SHyong Youb Kim return -EINVAL; 59*00ce4311SHyong Youb Kim } 60*00ce4311SHyong Youb Kim 61*00ce4311SHyong Youb Kim snprintf(res_name, sizeof(res_name), "%d-admin-cq-%u", instance++, index); 62*00ce4311SHyong Youb Kim err = vnic_dev_alloc_desc_ring(vdev, &cq->ring, desc_count, desc_size, 63*00ce4311SHyong Youb Kim socket_id, res_name); 64*00ce4311SHyong Youb Kim if (err) 65*00ce4311SHyong Youb Kim return err; 66*00ce4311SHyong Youb Kim 67*00ce4311SHyong Youb Kim return 0; 68*00ce4311SHyong Youb Kim } 69*00ce4311SHyong Youb Kim 7072f3de30SBruce Richardson void vnic_cq_init(struct vnic_cq *cq, unsigned int flow_control_enable, 7172f3de30SBruce Richardson unsigned int color_enable, unsigned int cq_head, unsigned int cq_tail, 7272f3de30SBruce Richardson unsigned int cq_tail_color, unsigned int interrupt_enable, 7372f3de30SBruce Richardson unsigned int cq_entry_enable, unsigned int cq_message_enable, 7404e8ec74SJohn Daley unsigned int interrupt_offset, uint64_t cq_message_addr) 7572f3de30SBruce Richardson { 7604e8ec74SJohn Daley uint64_t paddr; 7772f3de30SBruce Richardson 7804e8ec74SJohn Daley paddr = (uint64_t)cq->ring.base_addr | VNIC_PADDR_TARGET; 7972f3de30SBruce Richardson writeq(paddr, &cq->ctrl->ring_base); 8072f3de30SBruce Richardson iowrite32(cq->ring.desc_count, &cq->ctrl->ring_size); 8172f3de30SBruce Richardson iowrite32(flow_control_enable, &cq->ctrl->flow_control_enable); 8272f3de30SBruce Richardson iowrite32(color_enable, &cq->ctrl->color_enable); 8372f3de30SBruce Richardson iowrite32(cq_head, &cq->ctrl->cq_head); 8472f3de30SBruce Richardson iowrite32(cq_tail, &cq->ctrl->cq_tail); 8572f3de30SBruce Richardson iowrite32(cq_tail_color, &cq->ctrl->cq_tail_color); 8672f3de30SBruce Richardson iowrite32(interrupt_enable, &cq->ctrl->interrupt_enable); 8772f3de30SBruce Richardson iowrite32(cq_entry_enable, &cq->ctrl->cq_entry_enable); 8872f3de30SBruce Richardson iowrite32(cq_message_enable, &cq->ctrl->cq_message_enable); 8972f3de30SBruce Richardson iowrite32(interrupt_offset, &cq->ctrl->interrupt_offset); 9072f3de30SBruce Richardson writeq(cq_message_addr, &cq->ctrl->cq_message_addr); 9172f3de30SBruce Richardson 9272f3de30SBruce Richardson cq->interrupt_offset = interrupt_offset; 9372f3de30SBruce Richardson } 9472f3de30SBruce Richardson 9572f3de30SBruce Richardson void vnic_cq_clean(struct vnic_cq *cq) 9672f3de30SBruce Richardson { 9772f3de30SBruce Richardson cq->to_clean = 0; 9872f3de30SBruce Richardson cq->last_color = 0; 9972f3de30SBruce Richardson 10072f3de30SBruce Richardson iowrite32(0, &cq->ctrl->cq_head); 10172f3de30SBruce Richardson iowrite32(0, &cq->ctrl->cq_tail); 10272f3de30SBruce Richardson iowrite32(1, &cq->ctrl->cq_tail_color); 10372f3de30SBruce Richardson 10472f3de30SBruce Richardson vnic_dev_clear_desc_ring(&cq->ring); 10572f3de30SBruce Richardson } 106