Back to home page

OSCL-LXR

 
 

    


0001 // SPDX-License-Identifier: GPL-2.0 OR BSD-3-Clause
0002 /* Copyright (c) 2021, Microsoft Corporation. */
0003 
0004 #include <linux/module.h>
0005 #include <linux/pci.h>
0006 #include <linux/utsname.h>
0007 #include <linux/version.h>
0008 
0009 #include "mana.h"
0010 
0011 static u32 mana_gd_r32(struct gdma_context *g, u64 offset)
0012 {
0013     return readl(g->bar0_va + offset);
0014 }
0015 
0016 static u64 mana_gd_r64(struct gdma_context *g, u64 offset)
0017 {
0018     return readq(g->bar0_va + offset);
0019 }
0020 
0021 static void mana_gd_init_pf_regs(struct pci_dev *pdev)
0022 {
0023     struct gdma_context *gc = pci_get_drvdata(pdev);
0024     void __iomem *sriov_base_va;
0025     u64 sriov_base_off;
0026 
0027     gc->db_page_size = mana_gd_r32(gc, GDMA_PF_REG_DB_PAGE_SIZE) & 0xFFFF;
0028     gc->db_page_base = gc->bar0_va +
0029                 mana_gd_r64(gc, GDMA_PF_REG_DB_PAGE_OFF);
0030 
0031     sriov_base_off = mana_gd_r64(gc, GDMA_SRIOV_REG_CFG_BASE_OFF);
0032 
0033     sriov_base_va = gc->bar0_va + sriov_base_off;
0034     gc->shm_base = sriov_base_va +
0035             mana_gd_r64(gc, sriov_base_off + GDMA_PF_REG_SHM_OFF);
0036 }
0037 
0038 static void mana_gd_init_vf_regs(struct pci_dev *pdev)
0039 {
0040     struct gdma_context *gc = pci_get_drvdata(pdev);
0041 
0042     gc->db_page_size = mana_gd_r32(gc, GDMA_REG_DB_PAGE_SIZE) & 0xFFFF;
0043 
0044     gc->db_page_base = gc->bar0_va +
0045                 mana_gd_r64(gc, GDMA_REG_DB_PAGE_OFFSET);
0046 
0047     gc->shm_base = gc->bar0_va + mana_gd_r64(gc, GDMA_REG_SHM_OFFSET);
0048 }
0049 
0050 static void mana_gd_init_registers(struct pci_dev *pdev)
0051 {
0052     struct gdma_context *gc = pci_get_drvdata(pdev);
0053 
0054     if (gc->is_pf)
0055         mana_gd_init_pf_regs(pdev);
0056     else
0057         mana_gd_init_vf_regs(pdev);
0058 }
0059 
0060 static int mana_gd_query_max_resources(struct pci_dev *pdev)
0061 {
0062     struct gdma_context *gc = pci_get_drvdata(pdev);
0063     struct gdma_query_max_resources_resp resp = {};
0064     struct gdma_general_req req = {};
0065     int err;
0066 
0067     mana_gd_init_req_hdr(&req.hdr, GDMA_QUERY_MAX_RESOURCES,
0068                  sizeof(req), sizeof(resp));
0069 
0070     err = mana_gd_send_request(gc, sizeof(req), &req, sizeof(resp), &resp);
0071     if (err || resp.hdr.status) {
0072         dev_err(gc->dev, "Failed to query resource info: %d, 0x%x\n",
0073             err, resp.hdr.status);
0074         return err ? err : -EPROTO;
0075     }
0076 
0077     if (gc->num_msix_usable > resp.max_msix)
0078         gc->num_msix_usable = resp.max_msix;
0079 
0080     if (gc->num_msix_usable <= 1)
0081         return -ENOSPC;
0082 
0083     gc->max_num_queues = num_online_cpus();
0084     if (gc->max_num_queues > MANA_MAX_NUM_QUEUES)
0085         gc->max_num_queues = MANA_MAX_NUM_QUEUES;
0086 
0087     if (gc->max_num_queues > resp.max_eq)
0088         gc->max_num_queues = resp.max_eq;
0089 
0090     if (gc->max_num_queues > resp.max_cq)
0091         gc->max_num_queues = resp.max_cq;
0092 
0093     if (gc->max_num_queues > resp.max_sq)
0094         gc->max_num_queues = resp.max_sq;
0095 
0096     if (gc->max_num_queues > resp.max_rq)
0097         gc->max_num_queues = resp.max_rq;
0098 
0099     /* The Hardware Channel (HWC) used 1 MSI-X */
0100     if (gc->max_num_queues > gc->num_msix_usable - 1)
0101         gc->max_num_queues = gc->num_msix_usable - 1;
0102 
0103     return 0;
0104 }
0105 
0106 static int mana_gd_detect_devices(struct pci_dev *pdev)
0107 {
0108     struct gdma_context *gc = pci_get_drvdata(pdev);
0109     struct gdma_list_devices_resp resp = {};
0110     struct gdma_general_req req = {};
0111     struct gdma_dev_id dev;
0112     u32 i, max_num_devs;
0113     u16 dev_type;
0114     int err;
0115 
0116     mana_gd_init_req_hdr(&req.hdr, GDMA_LIST_DEVICES, sizeof(req),
0117                  sizeof(resp));
0118 
0119     err = mana_gd_send_request(gc, sizeof(req), &req, sizeof(resp), &resp);
0120     if (err || resp.hdr.status) {
0121         dev_err(gc->dev, "Failed to detect devices: %d, 0x%x\n", err,
0122             resp.hdr.status);
0123         return err ? err : -EPROTO;
0124     }
0125 
0126     max_num_devs = min_t(u32, MAX_NUM_GDMA_DEVICES, resp.num_of_devs);
0127 
0128     for (i = 0; i < max_num_devs; i++) {
0129         dev = resp.devs[i];
0130         dev_type = dev.type;
0131 
0132         /* HWC is already detected in mana_hwc_create_channel(). */
0133         if (dev_type == GDMA_DEVICE_HWC)
0134             continue;
0135 
0136         if (dev_type == GDMA_DEVICE_MANA) {
0137             gc->mana.gdma_context = gc;
0138             gc->mana.dev_id = dev;
0139         }
0140     }
0141 
0142     return gc->mana.dev_id.type == 0 ? -ENODEV : 0;
0143 }
0144 
0145 int mana_gd_send_request(struct gdma_context *gc, u32 req_len, const void *req,
0146              u32 resp_len, void *resp)
0147 {
0148     struct hw_channel_context *hwc = gc->hwc.driver_data;
0149 
0150     return mana_hwc_send_request(hwc, req_len, req, resp_len, resp);
0151 }
0152 
0153 int mana_gd_alloc_memory(struct gdma_context *gc, unsigned int length,
0154              struct gdma_mem_info *gmi)
0155 {
0156     dma_addr_t dma_handle;
0157     void *buf;
0158 
0159     if (length < PAGE_SIZE || !is_power_of_2(length))
0160         return -EINVAL;
0161 
0162     gmi->dev = gc->dev;
0163     buf = dma_alloc_coherent(gmi->dev, length, &dma_handle, GFP_KERNEL);
0164     if (!buf)
0165         return -ENOMEM;
0166 
0167     gmi->dma_handle = dma_handle;
0168     gmi->virt_addr = buf;
0169     gmi->length = length;
0170 
0171     return 0;
0172 }
0173 
0174 void mana_gd_free_memory(struct gdma_mem_info *gmi)
0175 {
0176     dma_free_coherent(gmi->dev, gmi->length, gmi->virt_addr,
0177               gmi->dma_handle);
0178 }
0179 
0180 static int mana_gd_create_hw_eq(struct gdma_context *gc,
0181                 struct gdma_queue *queue)
0182 {
0183     struct gdma_create_queue_resp resp = {};
0184     struct gdma_create_queue_req req = {};
0185     int err;
0186 
0187     if (queue->type != GDMA_EQ)
0188         return -EINVAL;
0189 
0190     mana_gd_init_req_hdr(&req.hdr, GDMA_CREATE_QUEUE,
0191                  sizeof(req), sizeof(resp));
0192 
0193     req.hdr.dev_id = queue->gdma_dev->dev_id;
0194     req.type = queue->type;
0195     req.pdid = queue->gdma_dev->pdid;
0196     req.doolbell_id = queue->gdma_dev->doorbell;
0197     req.gdma_region = queue->mem_info.gdma_region;
0198     req.queue_size = queue->queue_size;
0199     req.log2_throttle_limit = queue->eq.log2_throttle_limit;
0200     req.eq_pci_msix_index = queue->eq.msix_index;
0201 
0202     err = mana_gd_send_request(gc, sizeof(req), &req, sizeof(resp), &resp);
0203     if (err || resp.hdr.status) {
0204         dev_err(gc->dev, "Failed to create queue: %d, 0x%x\n", err,
0205             resp.hdr.status);
0206         return err ? err : -EPROTO;
0207     }
0208 
0209     queue->id = resp.queue_index;
0210     queue->eq.disable_needed = true;
0211     queue->mem_info.gdma_region = GDMA_INVALID_DMA_REGION;
0212     return 0;
0213 }
0214 
0215 static int mana_gd_disable_queue(struct gdma_queue *queue)
0216 {
0217     struct gdma_context *gc = queue->gdma_dev->gdma_context;
0218     struct gdma_disable_queue_req req = {};
0219     struct gdma_general_resp resp = {};
0220     int err;
0221 
0222     WARN_ON(queue->type != GDMA_EQ);
0223 
0224     mana_gd_init_req_hdr(&req.hdr, GDMA_DISABLE_QUEUE,
0225                  sizeof(req), sizeof(resp));
0226 
0227     req.hdr.dev_id = queue->gdma_dev->dev_id;
0228     req.type = queue->type;
0229     req.queue_index =  queue->id;
0230     req.alloc_res_id_on_creation = 1;
0231 
0232     err = mana_gd_send_request(gc, sizeof(req), &req, sizeof(resp), &resp);
0233     if (err || resp.hdr.status) {
0234         dev_err(gc->dev, "Failed to disable queue: %d, 0x%x\n", err,
0235             resp.hdr.status);
0236         return err ? err : -EPROTO;
0237     }
0238 
0239     return 0;
0240 }
0241 
0242 #define DOORBELL_OFFSET_SQ  0x0
0243 #define DOORBELL_OFFSET_RQ  0x400
0244 #define DOORBELL_OFFSET_CQ  0x800
0245 #define DOORBELL_OFFSET_EQ  0xFF8
0246 
0247 static void mana_gd_ring_doorbell(struct gdma_context *gc, u32 db_index,
0248                   enum gdma_queue_type q_type, u32 qid,
0249                   u32 tail_ptr, u8 num_req)
0250 {
0251     void __iomem *addr = gc->db_page_base + gc->db_page_size * db_index;
0252     union gdma_doorbell_entry e = {};
0253 
0254     switch (q_type) {
0255     case GDMA_EQ:
0256         e.eq.id = qid;
0257         e.eq.tail_ptr = tail_ptr;
0258         e.eq.arm = num_req;
0259 
0260         addr += DOORBELL_OFFSET_EQ;
0261         break;
0262 
0263     case GDMA_CQ:
0264         e.cq.id = qid;
0265         e.cq.tail_ptr = tail_ptr;
0266         e.cq.arm = num_req;
0267 
0268         addr += DOORBELL_OFFSET_CQ;
0269         break;
0270 
0271     case GDMA_RQ:
0272         e.rq.id = qid;
0273         e.rq.tail_ptr = tail_ptr;
0274         e.rq.wqe_cnt = num_req;
0275 
0276         addr += DOORBELL_OFFSET_RQ;
0277         break;
0278 
0279     case GDMA_SQ:
0280         e.sq.id = qid;
0281         e.sq.tail_ptr = tail_ptr;
0282 
0283         addr += DOORBELL_OFFSET_SQ;
0284         break;
0285 
0286     default:
0287         WARN_ON(1);
0288         return;
0289     }
0290 
0291     /* Ensure all writes are done before ring doorbell */
0292     wmb();
0293 
0294     writeq(e.as_uint64, addr);
0295 }
0296 
0297 void mana_gd_wq_ring_doorbell(struct gdma_context *gc, struct gdma_queue *queue)
0298 {
0299     mana_gd_ring_doorbell(gc, queue->gdma_dev->doorbell, queue->type,
0300                   queue->id, queue->head * GDMA_WQE_BU_SIZE, 1);
0301 }
0302 
0303 void mana_gd_ring_cq(struct gdma_queue *cq, u8 arm_bit)
0304 {
0305     struct gdma_context *gc = cq->gdma_dev->gdma_context;
0306 
0307     u32 num_cqe = cq->queue_size / GDMA_CQE_SIZE;
0308 
0309     u32 head = cq->head % (num_cqe << GDMA_CQE_OWNER_BITS);
0310 
0311     mana_gd_ring_doorbell(gc, cq->gdma_dev->doorbell, cq->type, cq->id,
0312                   head, arm_bit);
0313 }
0314 
0315 static void mana_gd_process_eqe(struct gdma_queue *eq)
0316 {
0317     u32 head = eq->head % (eq->queue_size / GDMA_EQE_SIZE);
0318     struct gdma_context *gc = eq->gdma_dev->gdma_context;
0319     struct gdma_eqe *eq_eqe_ptr = eq->queue_mem_ptr;
0320     union gdma_eqe_info eqe_info;
0321     enum gdma_eqe_type type;
0322     struct gdma_event event;
0323     struct gdma_queue *cq;
0324     struct gdma_eqe *eqe;
0325     u32 cq_id;
0326 
0327     eqe = &eq_eqe_ptr[head];
0328     eqe_info.as_uint32 = eqe->eqe_info;
0329     type = eqe_info.type;
0330 
0331     switch (type) {
0332     case GDMA_EQE_COMPLETION:
0333         cq_id = eqe->details[0] & 0xFFFFFF;
0334         if (WARN_ON_ONCE(cq_id >= gc->max_num_cqs))
0335             break;
0336 
0337         cq = gc->cq_table[cq_id];
0338         if (WARN_ON_ONCE(!cq || cq->type != GDMA_CQ || cq->id != cq_id))
0339             break;
0340 
0341         if (cq->cq.callback)
0342             cq->cq.callback(cq->cq.context, cq);
0343 
0344         break;
0345 
0346     case GDMA_EQE_TEST_EVENT:
0347         gc->test_event_eq_id = eq->id;
0348         complete(&gc->eq_test_event);
0349         break;
0350 
0351     case GDMA_EQE_HWC_INIT_EQ_ID_DB:
0352     case GDMA_EQE_HWC_INIT_DATA:
0353     case GDMA_EQE_HWC_INIT_DONE:
0354         if (!eq->eq.callback)
0355             break;
0356 
0357         event.type = type;
0358         memcpy(&event.details, &eqe->details, GDMA_EVENT_DATA_SIZE);
0359         eq->eq.callback(eq->eq.context, eq, &event);
0360         break;
0361 
0362     default:
0363         break;
0364     }
0365 }
0366 
0367 static void mana_gd_process_eq_events(void *arg)
0368 {
0369     u32 owner_bits, new_bits, old_bits;
0370     union gdma_eqe_info eqe_info;
0371     struct gdma_eqe *eq_eqe_ptr;
0372     struct gdma_queue *eq = arg;
0373     struct gdma_context *gc;
0374     struct gdma_eqe *eqe;
0375     u32 head, num_eqe;
0376     int i;
0377 
0378     gc = eq->gdma_dev->gdma_context;
0379 
0380     num_eqe = eq->queue_size / GDMA_EQE_SIZE;
0381     eq_eqe_ptr = eq->queue_mem_ptr;
0382 
0383     /* Process up to 5 EQEs at a time, and update the HW head. */
0384     for (i = 0; i < 5; i++) {
0385         eqe = &eq_eqe_ptr[eq->head % num_eqe];
0386         eqe_info.as_uint32 = eqe->eqe_info;
0387         owner_bits = eqe_info.owner_bits;
0388 
0389         old_bits = (eq->head / num_eqe - 1) & GDMA_EQE_OWNER_MASK;
0390         /* No more entries */
0391         if (owner_bits == old_bits)
0392             break;
0393 
0394         new_bits = (eq->head / num_eqe) & GDMA_EQE_OWNER_MASK;
0395         if (owner_bits != new_bits) {
0396             dev_err(gc->dev, "EQ %d: overflow detected\n", eq->id);
0397             break;
0398         }
0399 
0400         /* Per GDMA spec, rmb is necessary after checking owner_bits, before
0401          * reading eqe.
0402          */
0403         rmb();
0404 
0405         mana_gd_process_eqe(eq);
0406 
0407         eq->head++;
0408     }
0409 
0410     head = eq->head % (num_eqe << GDMA_EQE_OWNER_BITS);
0411 
0412     mana_gd_ring_doorbell(gc, eq->gdma_dev->doorbell, eq->type, eq->id,
0413                   head, SET_ARM_BIT);
0414 }
0415 
0416 static int mana_gd_register_irq(struct gdma_queue *queue,
0417                 const struct gdma_queue_spec *spec)
0418 {
0419     struct gdma_dev *gd = queue->gdma_dev;
0420     struct gdma_irq_context *gic;
0421     struct gdma_context *gc;
0422     struct gdma_resource *r;
0423     unsigned int msi_index;
0424     unsigned long flags;
0425     struct device *dev;
0426     int err = 0;
0427 
0428     gc = gd->gdma_context;
0429     r = &gc->msix_resource;
0430     dev = gc->dev;
0431 
0432     spin_lock_irqsave(&r->lock, flags);
0433 
0434     msi_index = find_first_zero_bit(r->map, r->size);
0435     if (msi_index >= r->size || msi_index >= gc->num_msix_usable) {
0436         err = -ENOSPC;
0437     } else {
0438         bitmap_set(r->map, msi_index, 1);
0439         queue->eq.msix_index = msi_index;
0440     }
0441 
0442     spin_unlock_irqrestore(&r->lock, flags);
0443 
0444     if (err) {
0445         dev_err(dev, "Register IRQ err:%d, msi:%u rsize:%u, nMSI:%u",
0446             err, msi_index, r->size, gc->num_msix_usable);
0447 
0448         return err;
0449     }
0450 
0451     gic = &gc->irq_contexts[msi_index];
0452 
0453     WARN_ON(gic->handler || gic->arg);
0454 
0455     gic->arg = queue;
0456 
0457     gic->handler = mana_gd_process_eq_events;
0458 
0459     return 0;
0460 }
0461 
0462 static void mana_gd_deregiser_irq(struct gdma_queue *queue)
0463 {
0464     struct gdma_dev *gd = queue->gdma_dev;
0465     struct gdma_irq_context *gic;
0466     struct gdma_context *gc;
0467     struct gdma_resource *r;
0468     unsigned int msix_index;
0469     unsigned long flags;
0470 
0471     gc = gd->gdma_context;
0472     r = &gc->msix_resource;
0473 
0474     /* At most num_online_cpus() + 1 interrupts are used. */
0475     msix_index = queue->eq.msix_index;
0476     if (WARN_ON(msix_index >= gc->num_msix_usable))
0477         return;
0478 
0479     gic = &gc->irq_contexts[msix_index];
0480     gic->handler = NULL;
0481     gic->arg = NULL;
0482 
0483     spin_lock_irqsave(&r->lock, flags);
0484     bitmap_clear(r->map, msix_index, 1);
0485     spin_unlock_irqrestore(&r->lock, flags);
0486 
0487     queue->eq.msix_index = INVALID_PCI_MSIX_INDEX;
0488 }
0489 
0490 int mana_gd_test_eq(struct gdma_context *gc, struct gdma_queue *eq)
0491 {
0492     struct gdma_generate_test_event_req req = {};
0493     struct gdma_general_resp resp = {};
0494     struct device *dev = gc->dev;
0495     int err;
0496 
0497     mutex_lock(&gc->eq_test_event_mutex);
0498 
0499     init_completion(&gc->eq_test_event);
0500     gc->test_event_eq_id = INVALID_QUEUE_ID;
0501 
0502     mana_gd_init_req_hdr(&req.hdr, GDMA_GENERATE_TEST_EQE,
0503                  sizeof(req), sizeof(resp));
0504 
0505     req.hdr.dev_id = eq->gdma_dev->dev_id;
0506     req.queue_index = eq->id;
0507 
0508     err = mana_gd_send_request(gc, sizeof(req), &req, sizeof(resp), &resp);
0509     if (err) {
0510         dev_err(dev, "test_eq failed: %d\n", err);
0511         goto out;
0512     }
0513 
0514     err = -EPROTO;
0515 
0516     if (resp.hdr.status) {
0517         dev_err(dev, "test_eq failed: 0x%x\n", resp.hdr.status);
0518         goto out;
0519     }
0520 
0521     if (!wait_for_completion_timeout(&gc->eq_test_event, 30 * HZ)) {
0522         dev_err(dev, "test_eq timed out on queue %d\n", eq->id);
0523         goto out;
0524     }
0525 
0526     if (eq->id != gc->test_event_eq_id) {
0527         dev_err(dev, "test_eq got an event on wrong queue %d (%d)\n",
0528             gc->test_event_eq_id, eq->id);
0529         goto out;
0530     }
0531 
0532     err = 0;
0533 out:
0534     mutex_unlock(&gc->eq_test_event_mutex);
0535     return err;
0536 }
0537 
0538 static void mana_gd_destroy_eq(struct gdma_context *gc, bool flush_evenets,
0539                    struct gdma_queue *queue)
0540 {
0541     int err;
0542 
0543     if (flush_evenets) {
0544         err = mana_gd_test_eq(gc, queue);
0545         if (err)
0546             dev_warn(gc->dev, "Failed to flush EQ: %d\n", err);
0547     }
0548 
0549     mana_gd_deregiser_irq(queue);
0550 
0551     if (queue->eq.disable_needed)
0552         mana_gd_disable_queue(queue);
0553 }
0554 
0555 static int mana_gd_create_eq(struct gdma_dev *gd,
0556                  const struct gdma_queue_spec *spec,
0557                  bool create_hwq, struct gdma_queue *queue)
0558 {
0559     struct gdma_context *gc = gd->gdma_context;
0560     struct device *dev = gc->dev;
0561     u32 log2_num_entries;
0562     int err;
0563 
0564     queue->eq.msix_index = INVALID_PCI_MSIX_INDEX;
0565 
0566     log2_num_entries = ilog2(queue->queue_size / GDMA_EQE_SIZE);
0567 
0568     if (spec->eq.log2_throttle_limit > log2_num_entries) {
0569         dev_err(dev, "EQ throttling limit (%lu) > maximum EQE (%u)\n",
0570             spec->eq.log2_throttle_limit, log2_num_entries);
0571         return -EINVAL;
0572     }
0573 
0574     err = mana_gd_register_irq(queue, spec);
0575     if (err) {
0576         dev_err(dev, "Failed to register irq: %d\n", err);
0577         return err;
0578     }
0579 
0580     queue->eq.callback = spec->eq.callback;
0581     queue->eq.context = spec->eq.context;
0582     queue->head |= INITIALIZED_OWNER_BIT(log2_num_entries);
0583     queue->eq.log2_throttle_limit = spec->eq.log2_throttle_limit ?: 1;
0584 
0585     if (create_hwq) {
0586         err = mana_gd_create_hw_eq(gc, queue);
0587         if (err)
0588             goto out;
0589 
0590         err = mana_gd_test_eq(gc, queue);
0591         if (err)
0592             goto out;
0593     }
0594 
0595     return 0;
0596 out:
0597     dev_err(dev, "Failed to create EQ: %d\n", err);
0598     mana_gd_destroy_eq(gc, false, queue);
0599     return err;
0600 }
0601 
0602 static void mana_gd_create_cq(const struct gdma_queue_spec *spec,
0603                   struct gdma_queue *queue)
0604 {
0605     u32 log2_num_entries = ilog2(spec->queue_size / GDMA_CQE_SIZE);
0606 
0607     queue->head |= INITIALIZED_OWNER_BIT(log2_num_entries);
0608     queue->cq.parent = spec->cq.parent_eq;
0609     queue->cq.context = spec->cq.context;
0610     queue->cq.callback = spec->cq.callback;
0611 }
0612 
0613 static void mana_gd_destroy_cq(struct gdma_context *gc,
0614                    struct gdma_queue *queue)
0615 {
0616     u32 id = queue->id;
0617 
0618     if (id >= gc->max_num_cqs)
0619         return;
0620 
0621     if (!gc->cq_table[id])
0622         return;
0623 
0624     gc->cq_table[id] = NULL;
0625 }
0626 
0627 int mana_gd_create_hwc_queue(struct gdma_dev *gd,
0628                  const struct gdma_queue_spec *spec,
0629                  struct gdma_queue **queue_ptr)
0630 {
0631     struct gdma_context *gc = gd->gdma_context;
0632     struct gdma_mem_info *gmi;
0633     struct gdma_queue *queue;
0634     int err;
0635 
0636     queue = kzalloc(sizeof(*queue), GFP_KERNEL);
0637     if (!queue)
0638         return -ENOMEM;
0639 
0640     gmi = &queue->mem_info;
0641     err = mana_gd_alloc_memory(gc, spec->queue_size, gmi);
0642     if (err)
0643         goto free_q;
0644 
0645     queue->head = 0;
0646     queue->tail = 0;
0647     queue->queue_mem_ptr = gmi->virt_addr;
0648     queue->queue_size = spec->queue_size;
0649     queue->monitor_avl_buf = spec->monitor_avl_buf;
0650     queue->type = spec->type;
0651     queue->gdma_dev = gd;
0652 
0653     if (spec->type == GDMA_EQ)
0654         err = mana_gd_create_eq(gd, spec, false, queue);
0655     else if (spec->type == GDMA_CQ)
0656         mana_gd_create_cq(spec, queue);
0657 
0658     if (err)
0659         goto out;
0660 
0661     *queue_ptr = queue;
0662     return 0;
0663 out:
0664     mana_gd_free_memory(gmi);
0665 free_q:
0666     kfree(queue);
0667     return err;
0668 }
0669 
0670 static void mana_gd_destroy_dma_region(struct gdma_context *gc, u64 gdma_region)
0671 {
0672     struct gdma_destroy_dma_region_req req = {};
0673     struct gdma_general_resp resp = {};
0674     int err;
0675 
0676     if (gdma_region == GDMA_INVALID_DMA_REGION)
0677         return;
0678 
0679     mana_gd_init_req_hdr(&req.hdr, GDMA_DESTROY_DMA_REGION, sizeof(req),
0680                  sizeof(resp));
0681     req.gdma_region = gdma_region;
0682 
0683     err = mana_gd_send_request(gc, sizeof(req), &req, sizeof(resp), &resp);
0684     if (err || resp.hdr.status)
0685         dev_err(gc->dev, "Failed to destroy DMA region: %d, 0x%x\n",
0686             err, resp.hdr.status);
0687 }
0688 
0689 static int mana_gd_create_dma_region(struct gdma_dev *gd,
0690                      struct gdma_mem_info *gmi)
0691 {
0692     unsigned int num_page = gmi->length / PAGE_SIZE;
0693     struct gdma_create_dma_region_req *req = NULL;
0694     struct gdma_create_dma_region_resp resp = {};
0695     struct gdma_context *gc = gd->gdma_context;
0696     struct hw_channel_context *hwc;
0697     u32 length = gmi->length;
0698     size_t req_msg_size;
0699     int err;
0700     int i;
0701 
0702     if (length < PAGE_SIZE || !is_power_of_2(length))
0703         return -EINVAL;
0704 
0705     if (offset_in_page(gmi->virt_addr) != 0)
0706         return -EINVAL;
0707 
0708     hwc = gc->hwc.driver_data;
0709     req_msg_size = struct_size(req, page_addr_list, num_page);
0710     if (req_msg_size > hwc->max_req_msg_size)
0711         return -EINVAL;
0712 
0713     req = kzalloc(req_msg_size, GFP_KERNEL);
0714     if (!req)
0715         return -ENOMEM;
0716 
0717     mana_gd_init_req_hdr(&req->hdr, GDMA_CREATE_DMA_REGION,
0718                  req_msg_size, sizeof(resp));
0719     req->length = length;
0720     req->offset_in_page = 0;
0721     req->gdma_page_type = GDMA_PAGE_TYPE_4K;
0722     req->page_count = num_page;
0723     req->page_addr_list_len = num_page;
0724 
0725     for (i = 0; i < num_page; i++)
0726         req->page_addr_list[i] = gmi->dma_handle +  i * PAGE_SIZE;
0727 
0728     err = mana_gd_send_request(gc, req_msg_size, req, sizeof(resp), &resp);
0729     if (err)
0730         goto out;
0731 
0732     if (resp.hdr.status || resp.gdma_region == GDMA_INVALID_DMA_REGION) {
0733         dev_err(gc->dev, "Failed to create DMA region: 0x%x\n",
0734             resp.hdr.status);
0735         err = -EPROTO;
0736         goto out;
0737     }
0738 
0739     gmi->gdma_region = resp.gdma_region;
0740 out:
0741     kfree(req);
0742     return err;
0743 }
0744 
0745 int mana_gd_create_mana_eq(struct gdma_dev *gd,
0746                const struct gdma_queue_spec *spec,
0747                struct gdma_queue **queue_ptr)
0748 {
0749     struct gdma_context *gc = gd->gdma_context;
0750     struct gdma_mem_info *gmi;
0751     struct gdma_queue *queue;
0752     int err;
0753 
0754     if (spec->type != GDMA_EQ)
0755         return -EINVAL;
0756 
0757     queue = kzalloc(sizeof(*queue), GFP_KERNEL);
0758     if (!queue)
0759         return -ENOMEM;
0760 
0761     gmi = &queue->mem_info;
0762     err = mana_gd_alloc_memory(gc, spec->queue_size, gmi);
0763     if (err)
0764         goto free_q;
0765 
0766     err = mana_gd_create_dma_region(gd, gmi);
0767     if (err)
0768         goto out;
0769 
0770     queue->head = 0;
0771     queue->tail = 0;
0772     queue->queue_mem_ptr = gmi->virt_addr;
0773     queue->queue_size = spec->queue_size;
0774     queue->monitor_avl_buf = spec->monitor_avl_buf;
0775     queue->type = spec->type;
0776     queue->gdma_dev = gd;
0777 
0778     err = mana_gd_create_eq(gd, spec, true, queue);
0779     if (err)
0780         goto out;
0781 
0782     *queue_ptr = queue;
0783     return 0;
0784 out:
0785     mana_gd_free_memory(gmi);
0786 free_q:
0787     kfree(queue);
0788     return err;
0789 }
0790 
0791 int mana_gd_create_mana_wq_cq(struct gdma_dev *gd,
0792                   const struct gdma_queue_spec *spec,
0793                   struct gdma_queue **queue_ptr)
0794 {
0795     struct gdma_context *gc = gd->gdma_context;
0796     struct gdma_mem_info *gmi;
0797     struct gdma_queue *queue;
0798     int err;
0799 
0800     if (spec->type != GDMA_CQ && spec->type != GDMA_SQ &&
0801         spec->type != GDMA_RQ)
0802         return -EINVAL;
0803 
0804     queue = kzalloc(sizeof(*queue), GFP_KERNEL);
0805     if (!queue)
0806         return -ENOMEM;
0807 
0808     gmi = &queue->mem_info;
0809     err = mana_gd_alloc_memory(gc, spec->queue_size, gmi);
0810     if (err)
0811         goto free_q;
0812 
0813     err = mana_gd_create_dma_region(gd, gmi);
0814     if (err)
0815         goto out;
0816 
0817     queue->head = 0;
0818     queue->tail = 0;
0819     queue->queue_mem_ptr = gmi->virt_addr;
0820     queue->queue_size = spec->queue_size;
0821     queue->monitor_avl_buf = spec->monitor_avl_buf;
0822     queue->type = spec->type;
0823     queue->gdma_dev = gd;
0824 
0825     if (spec->type == GDMA_CQ)
0826         mana_gd_create_cq(spec, queue);
0827 
0828     *queue_ptr = queue;
0829     return 0;
0830 out:
0831     mana_gd_free_memory(gmi);
0832 free_q:
0833     kfree(queue);
0834     return err;
0835 }
0836 
0837 void mana_gd_destroy_queue(struct gdma_context *gc, struct gdma_queue *queue)
0838 {
0839     struct gdma_mem_info *gmi = &queue->mem_info;
0840 
0841     switch (queue->type) {
0842     case GDMA_EQ:
0843         mana_gd_destroy_eq(gc, queue->eq.disable_needed, queue);
0844         break;
0845 
0846     case GDMA_CQ:
0847         mana_gd_destroy_cq(gc, queue);
0848         break;
0849 
0850     case GDMA_RQ:
0851         break;
0852 
0853     case GDMA_SQ:
0854         break;
0855 
0856     default:
0857         dev_err(gc->dev, "Can't destroy unknown queue: type=%d\n",
0858             queue->type);
0859         return;
0860     }
0861 
0862     mana_gd_destroy_dma_region(gc, gmi->gdma_region);
0863     mana_gd_free_memory(gmi);
0864     kfree(queue);
0865 }
0866 
0867 int mana_gd_verify_vf_version(struct pci_dev *pdev)
0868 {
0869     struct gdma_context *gc = pci_get_drvdata(pdev);
0870     struct gdma_verify_ver_resp resp = {};
0871     struct gdma_verify_ver_req req = {};
0872     int err;
0873 
0874     mana_gd_init_req_hdr(&req.hdr, GDMA_VERIFY_VF_DRIVER_VERSION,
0875                  sizeof(req), sizeof(resp));
0876 
0877     req.protocol_ver_min = GDMA_PROTOCOL_FIRST;
0878     req.protocol_ver_max = GDMA_PROTOCOL_LAST;
0879 
0880     req.gd_drv_cap_flags1 = GDMA_DRV_CAP_FLAGS1;
0881     req.gd_drv_cap_flags2 = GDMA_DRV_CAP_FLAGS2;
0882     req.gd_drv_cap_flags3 = GDMA_DRV_CAP_FLAGS3;
0883     req.gd_drv_cap_flags4 = GDMA_DRV_CAP_FLAGS4;
0884 
0885     req.drv_ver = 0;    /* Unused*/
0886     req.os_type = 0x10; /* Linux */
0887     req.os_ver_major = LINUX_VERSION_MAJOR;
0888     req.os_ver_minor = LINUX_VERSION_PATCHLEVEL;
0889     req.os_ver_build = LINUX_VERSION_SUBLEVEL;
0890     strscpy(req.os_ver_str1, utsname()->sysname, sizeof(req.os_ver_str1));
0891     strscpy(req.os_ver_str2, utsname()->release, sizeof(req.os_ver_str2));
0892     strscpy(req.os_ver_str3, utsname()->version, sizeof(req.os_ver_str3));
0893 
0894     err = mana_gd_send_request(gc, sizeof(req), &req, sizeof(resp), &resp);
0895     if (err || resp.hdr.status) {
0896         dev_err(gc->dev, "VfVerifyVersionOutput: %d, status=0x%x\n",
0897             err, resp.hdr.status);
0898         return err ? err : -EPROTO;
0899     }
0900 
0901     return 0;
0902 }
0903 
0904 int mana_gd_register_device(struct gdma_dev *gd)
0905 {
0906     struct gdma_context *gc = gd->gdma_context;
0907     struct gdma_register_device_resp resp = {};
0908     struct gdma_general_req req = {};
0909     int err;
0910 
0911     gd->pdid = INVALID_PDID;
0912     gd->doorbell = INVALID_DOORBELL;
0913     gd->gpa_mkey = INVALID_MEM_KEY;
0914 
0915     mana_gd_init_req_hdr(&req.hdr, GDMA_REGISTER_DEVICE, sizeof(req),
0916                  sizeof(resp));
0917 
0918     req.hdr.dev_id = gd->dev_id;
0919 
0920     err = mana_gd_send_request(gc, sizeof(req), &req, sizeof(resp), &resp);
0921     if (err || resp.hdr.status) {
0922         dev_err(gc->dev, "gdma_register_device_resp failed: %d, 0x%x\n",
0923             err, resp.hdr.status);
0924         return err ? err : -EPROTO;
0925     }
0926 
0927     gd->pdid = resp.pdid;
0928     gd->gpa_mkey = resp.gpa_mkey;
0929     gd->doorbell = resp.db_id;
0930 
0931     return 0;
0932 }
0933 
0934 int mana_gd_deregister_device(struct gdma_dev *gd)
0935 {
0936     struct gdma_context *gc = gd->gdma_context;
0937     struct gdma_general_resp resp = {};
0938     struct gdma_general_req req = {};
0939     int err;
0940 
0941     if (gd->pdid == INVALID_PDID)
0942         return -EINVAL;
0943 
0944     mana_gd_init_req_hdr(&req.hdr, GDMA_DEREGISTER_DEVICE, sizeof(req),
0945                  sizeof(resp));
0946 
0947     req.hdr.dev_id = gd->dev_id;
0948 
0949     err = mana_gd_send_request(gc, sizeof(req), &req, sizeof(resp), &resp);
0950     if (err || resp.hdr.status) {
0951         dev_err(gc->dev, "Failed to deregister device: %d, 0x%x\n",
0952             err, resp.hdr.status);
0953         if (!err)
0954             err = -EPROTO;
0955     }
0956 
0957     gd->pdid = INVALID_PDID;
0958     gd->doorbell = INVALID_DOORBELL;
0959     gd->gpa_mkey = INVALID_MEM_KEY;
0960 
0961     return err;
0962 }
0963 
0964 u32 mana_gd_wq_avail_space(struct gdma_queue *wq)
0965 {
0966     u32 used_space = (wq->head - wq->tail) * GDMA_WQE_BU_SIZE;
0967     u32 wq_size = wq->queue_size;
0968 
0969     WARN_ON_ONCE(used_space > wq_size);
0970 
0971     return wq_size - used_space;
0972 }
0973 
0974 u8 *mana_gd_get_wqe_ptr(const struct gdma_queue *wq, u32 wqe_offset)
0975 {
0976     u32 offset = (wqe_offset * GDMA_WQE_BU_SIZE) & (wq->queue_size - 1);
0977 
0978     WARN_ON_ONCE((offset + GDMA_WQE_BU_SIZE) > wq->queue_size);
0979 
0980     return wq->queue_mem_ptr + offset;
0981 }
0982 
0983 static u32 mana_gd_write_client_oob(const struct gdma_wqe_request *wqe_req,
0984                     enum gdma_queue_type q_type,
0985                     u32 client_oob_size, u32 sgl_data_size,
0986                     u8 *wqe_ptr)
0987 {
0988     bool oob_in_sgl = !!(wqe_req->flags & GDMA_WR_OOB_IN_SGL);
0989     bool pad_data = !!(wqe_req->flags & GDMA_WR_PAD_BY_SGE0);
0990     struct gdma_wqe *header = (struct gdma_wqe *)wqe_ptr;
0991     u8 *ptr;
0992 
0993     memset(header, 0, sizeof(struct gdma_wqe));
0994     header->num_sge = wqe_req->num_sge;
0995     header->inline_oob_size_div4 = client_oob_size / sizeof(u32);
0996 
0997     if (oob_in_sgl) {
0998         WARN_ON_ONCE(!pad_data || wqe_req->num_sge < 2);
0999 
1000         header->client_oob_in_sgl = 1;
1001 
1002         if (pad_data)
1003             header->last_vbytes = wqe_req->sgl[0].size;
1004     }
1005 
1006     if (q_type == GDMA_SQ)
1007         header->client_data_unit = wqe_req->client_data_unit;
1008 
1009     /* The size of gdma_wqe + client_oob_size must be less than or equal
1010      * to one Basic Unit (i.e. 32 bytes), so the pointer can't go beyond
1011      * the queue memory buffer boundary.
1012      */
1013     ptr = wqe_ptr + sizeof(header);
1014 
1015     if (wqe_req->inline_oob_data && wqe_req->inline_oob_size > 0) {
1016         memcpy(ptr, wqe_req->inline_oob_data, wqe_req->inline_oob_size);
1017 
1018         if (client_oob_size > wqe_req->inline_oob_size)
1019             memset(ptr + wqe_req->inline_oob_size, 0,
1020                    client_oob_size - wqe_req->inline_oob_size);
1021     }
1022 
1023     return sizeof(header) + client_oob_size;
1024 }
1025 
1026 static void mana_gd_write_sgl(struct gdma_queue *wq, u8 *wqe_ptr,
1027                   const struct gdma_wqe_request *wqe_req)
1028 {
1029     u32 sgl_size = sizeof(struct gdma_sge) * wqe_req->num_sge;
1030     const u8 *address = (u8 *)wqe_req->sgl;
1031     u8 *base_ptr, *end_ptr;
1032     u32 size_to_end;
1033 
1034     base_ptr = wq->queue_mem_ptr;
1035     end_ptr = base_ptr + wq->queue_size;
1036     size_to_end = (u32)(end_ptr - wqe_ptr);
1037 
1038     if (size_to_end < sgl_size) {
1039         memcpy(wqe_ptr, address, size_to_end);
1040 
1041         wqe_ptr = base_ptr;
1042         address += size_to_end;
1043         sgl_size -= size_to_end;
1044     }
1045 
1046     memcpy(wqe_ptr, address, sgl_size);
1047 }
1048 
1049 int mana_gd_post_work_request(struct gdma_queue *wq,
1050                   const struct gdma_wqe_request *wqe_req,
1051                   struct gdma_posted_wqe_info *wqe_info)
1052 {
1053     u32 client_oob_size = wqe_req->inline_oob_size;
1054     struct gdma_context *gc;
1055     u32 sgl_data_size;
1056     u32 max_wqe_size;
1057     u32 wqe_size;
1058     u8 *wqe_ptr;
1059 
1060     if (wqe_req->num_sge == 0)
1061         return -EINVAL;
1062 
1063     if (wq->type == GDMA_RQ) {
1064         if (client_oob_size != 0)
1065             return -EINVAL;
1066 
1067         client_oob_size = INLINE_OOB_SMALL_SIZE;
1068 
1069         max_wqe_size = GDMA_MAX_RQE_SIZE;
1070     } else {
1071         if (client_oob_size != INLINE_OOB_SMALL_SIZE &&
1072             client_oob_size != INLINE_OOB_LARGE_SIZE)
1073             return -EINVAL;
1074 
1075         max_wqe_size = GDMA_MAX_SQE_SIZE;
1076     }
1077 
1078     sgl_data_size = sizeof(struct gdma_sge) * wqe_req->num_sge;
1079     wqe_size = ALIGN(sizeof(struct gdma_wqe) + client_oob_size +
1080              sgl_data_size, GDMA_WQE_BU_SIZE);
1081     if (wqe_size > max_wqe_size)
1082         return -EINVAL;
1083 
1084     if (wq->monitor_avl_buf && wqe_size > mana_gd_wq_avail_space(wq)) {
1085         gc = wq->gdma_dev->gdma_context;
1086         dev_err(gc->dev, "unsuccessful flow control!\n");
1087         return -ENOSPC;
1088     }
1089 
1090     if (wqe_info)
1091         wqe_info->wqe_size_in_bu = wqe_size / GDMA_WQE_BU_SIZE;
1092 
1093     wqe_ptr = mana_gd_get_wqe_ptr(wq, wq->head);
1094     wqe_ptr += mana_gd_write_client_oob(wqe_req, wq->type, client_oob_size,
1095                         sgl_data_size, wqe_ptr);
1096     if (wqe_ptr >= (u8 *)wq->queue_mem_ptr + wq->queue_size)
1097         wqe_ptr -= wq->queue_size;
1098 
1099     mana_gd_write_sgl(wq, wqe_ptr, wqe_req);
1100 
1101     wq->head += wqe_size / GDMA_WQE_BU_SIZE;
1102 
1103     return 0;
1104 }
1105 
1106 int mana_gd_post_and_ring(struct gdma_queue *queue,
1107               const struct gdma_wqe_request *wqe_req,
1108               struct gdma_posted_wqe_info *wqe_info)
1109 {
1110     struct gdma_context *gc = queue->gdma_dev->gdma_context;
1111     int err;
1112 
1113     err = mana_gd_post_work_request(queue, wqe_req, wqe_info);
1114     if (err)
1115         return err;
1116 
1117     mana_gd_wq_ring_doorbell(gc, queue);
1118 
1119     return 0;
1120 }
1121 
1122 static int mana_gd_read_cqe(struct gdma_queue *cq, struct gdma_comp *comp)
1123 {
1124     unsigned int num_cqe = cq->queue_size / sizeof(struct gdma_cqe);
1125     struct gdma_cqe *cq_cqe = cq->queue_mem_ptr;
1126     u32 owner_bits, new_bits, old_bits;
1127     struct gdma_cqe *cqe;
1128 
1129     cqe = &cq_cqe[cq->head % num_cqe];
1130     owner_bits = cqe->cqe_info.owner_bits;
1131 
1132     old_bits = (cq->head / num_cqe - 1) & GDMA_CQE_OWNER_MASK;
1133     /* Return 0 if no more entries. */
1134     if (owner_bits == old_bits)
1135         return 0;
1136 
1137     new_bits = (cq->head / num_cqe) & GDMA_CQE_OWNER_MASK;
1138     /* Return -1 if overflow detected. */
1139     if (WARN_ON_ONCE(owner_bits != new_bits))
1140         return -1;
1141 
1142     /* Per GDMA spec, rmb is necessary after checking owner_bits, before
1143      * reading completion info
1144      */
1145     rmb();
1146 
1147     comp->wq_num = cqe->cqe_info.wq_num;
1148     comp->is_sq = cqe->cqe_info.is_sq;
1149     memcpy(comp->cqe_data, cqe->cqe_data, GDMA_COMP_DATA_SIZE);
1150 
1151     return 1;
1152 }
1153 
1154 int mana_gd_poll_cq(struct gdma_queue *cq, struct gdma_comp *comp, int num_cqe)
1155 {
1156     int cqe_idx;
1157     int ret;
1158 
1159     for (cqe_idx = 0; cqe_idx < num_cqe; cqe_idx++) {
1160         ret = mana_gd_read_cqe(cq, &comp[cqe_idx]);
1161 
1162         if (ret < 0) {
1163             cq->head -= cqe_idx;
1164             return ret;
1165         }
1166 
1167         if (ret == 0)
1168             break;
1169 
1170         cq->head++;
1171     }
1172 
1173     return cqe_idx;
1174 }
1175 
1176 static irqreturn_t mana_gd_intr(int irq, void *arg)
1177 {
1178     struct gdma_irq_context *gic = arg;
1179 
1180     if (gic->handler)
1181         gic->handler(gic->arg);
1182 
1183     return IRQ_HANDLED;
1184 }
1185 
1186 int mana_gd_alloc_res_map(u32 res_avail, struct gdma_resource *r)
1187 {
1188     r->map = bitmap_zalloc(res_avail, GFP_KERNEL);
1189     if (!r->map)
1190         return -ENOMEM;
1191 
1192     r->size = res_avail;
1193     spin_lock_init(&r->lock);
1194 
1195     return 0;
1196 }
1197 
1198 void mana_gd_free_res_map(struct gdma_resource *r)
1199 {
1200     bitmap_free(r->map);
1201     r->map = NULL;
1202     r->size = 0;
1203 }
1204 
1205 static int mana_gd_setup_irqs(struct pci_dev *pdev)
1206 {
1207     unsigned int max_queues_per_port = num_online_cpus();
1208     struct gdma_context *gc = pci_get_drvdata(pdev);
1209     struct gdma_irq_context *gic;
1210     unsigned int max_irqs;
1211     int nvec, irq;
1212     int err, i, j;
1213 
1214     if (max_queues_per_port > MANA_MAX_NUM_QUEUES)
1215         max_queues_per_port = MANA_MAX_NUM_QUEUES;
1216 
1217     /* Need 1 interrupt for the Hardware communication Channel (HWC) */
1218     max_irqs = max_queues_per_port + 1;
1219 
1220     nvec = pci_alloc_irq_vectors(pdev, 2, max_irqs, PCI_IRQ_MSIX);
1221     if (nvec < 0)
1222         return nvec;
1223 
1224     gc->irq_contexts = kcalloc(nvec, sizeof(struct gdma_irq_context),
1225                    GFP_KERNEL);
1226     if (!gc->irq_contexts) {
1227         err = -ENOMEM;
1228         goto free_irq_vector;
1229     }
1230 
1231     for (i = 0; i < nvec; i++) {
1232         gic = &gc->irq_contexts[i];
1233         gic->handler = NULL;
1234         gic->arg = NULL;
1235 
1236         irq = pci_irq_vector(pdev, i);
1237         if (irq < 0) {
1238             err = irq;
1239             goto free_irq;
1240         }
1241 
1242         err = request_irq(irq, mana_gd_intr, 0, "mana_intr", gic);
1243         if (err)
1244             goto free_irq;
1245     }
1246 
1247     err = mana_gd_alloc_res_map(nvec, &gc->msix_resource);
1248     if (err)
1249         goto free_irq;
1250 
1251     gc->max_num_msix = nvec;
1252     gc->num_msix_usable = nvec;
1253 
1254     return 0;
1255 
1256 free_irq:
1257     for (j = i - 1; j >= 0; j--) {
1258         irq = pci_irq_vector(pdev, j);
1259         gic = &gc->irq_contexts[j];
1260         free_irq(irq, gic);
1261     }
1262 
1263     kfree(gc->irq_contexts);
1264     gc->irq_contexts = NULL;
1265 free_irq_vector:
1266     pci_free_irq_vectors(pdev);
1267     return err;
1268 }
1269 
1270 static void mana_gd_remove_irqs(struct pci_dev *pdev)
1271 {
1272     struct gdma_context *gc = pci_get_drvdata(pdev);
1273     struct gdma_irq_context *gic;
1274     int irq, i;
1275 
1276     if (gc->max_num_msix < 1)
1277         return;
1278 
1279     mana_gd_free_res_map(&gc->msix_resource);
1280 
1281     for (i = 0; i < gc->max_num_msix; i++) {
1282         irq = pci_irq_vector(pdev, i);
1283         if (irq < 0)
1284             continue;
1285 
1286         gic = &gc->irq_contexts[i];
1287         free_irq(irq, gic);
1288     }
1289 
1290     pci_free_irq_vectors(pdev);
1291 
1292     gc->max_num_msix = 0;
1293     gc->num_msix_usable = 0;
1294     kfree(gc->irq_contexts);
1295     gc->irq_contexts = NULL;
1296 }
1297 
1298 static int mana_gd_setup(struct pci_dev *pdev)
1299 {
1300     struct gdma_context *gc = pci_get_drvdata(pdev);
1301     int err;
1302 
1303     mana_gd_init_registers(pdev);
1304     mana_smc_init(&gc->shm_channel, gc->dev, gc->shm_base);
1305 
1306     err = mana_gd_setup_irqs(pdev);
1307     if (err)
1308         return err;
1309 
1310     err = mana_hwc_create_channel(gc);
1311     if (err)
1312         goto remove_irq;
1313 
1314     err = mana_gd_verify_vf_version(pdev);
1315     if (err)
1316         goto destroy_hwc;
1317 
1318     err = mana_gd_query_max_resources(pdev);
1319     if (err)
1320         goto destroy_hwc;
1321 
1322     err = mana_gd_detect_devices(pdev);
1323     if (err)
1324         goto destroy_hwc;
1325 
1326     return 0;
1327 
1328 destroy_hwc:
1329     mana_hwc_destroy_channel(gc);
1330 remove_irq:
1331     mana_gd_remove_irqs(pdev);
1332     return err;
1333 }
1334 
1335 static void mana_gd_cleanup(struct pci_dev *pdev)
1336 {
1337     struct gdma_context *gc = pci_get_drvdata(pdev);
1338 
1339     mana_hwc_destroy_channel(gc);
1340 
1341     mana_gd_remove_irqs(pdev);
1342 }
1343 
1344 static bool mana_is_pf(unsigned short dev_id)
1345 {
1346     return dev_id == MANA_PF_DEVICE_ID;
1347 }
1348 
1349 static int mana_gd_probe(struct pci_dev *pdev, const struct pci_device_id *ent)
1350 {
1351     struct gdma_context *gc;
1352     void __iomem *bar0_va;
1353     int bar = 0;
1354     int err;
1355 
1356     /* Each port has 2 CQs, each CQ has at most 1 EQE at a time */
1357     BUILD_BUG_ON(2 * MAX_PORTS_IN_MANA_DEV * GDMA_EQE_SIZE > EQ_SIZE);
1358 
1359     err = pci_enable_device(pdev);
1360     if (err)
1361         return -ENXIO;
1362 
1363     pci_set_master(pdev);
1364 
1365     err = pci_request_regions(pdev, "mana");
1366     if (err)
1367         goto disable_dev;
1368 
1369     err = dma_set_mask_and_coherent(&pdev->dev, DMA_BIT_MASK(64));
1370     if (err)
1371         goto release_region;
1372 
1373     err = -ENOMEM;
1374     gc = vzalloc(sizeof(*gc));
1375     if (!gc)
1376         goto release_region;
1377 
1378     mutex_init(&gc->eq_test_event_mutex);
1379     pci_set_drvdata(pdev, gc);
1380 
1381     bar0_va = pci_iomap(pdev, bar, 0);
1382     if (!bar0_va)
1383         goto free_gc;
1384 
1385     gc->is_pf = mana_is_pf(pdev->device);
1386     gc->bar0_va = bar0_va;
1387     gc->dev = &pdev->dev;
1388 
1389     err = mana_gd_setup(pdev);
1390     if (err)
1391         goto unmap_bar;
1392 
1393     err = mana_probe(&gc->mana, false);
1394     if (err)
1395         goto cleanup_gd;
1396 
1397     return 0;
1398 
1399 cleanup_gd:
1400     mana_gd_cleanup(pdev);
1401 unmap_bar:
1402     pci_iounmap(pdev, bar0_va);
1403 free_gc:
1404     pci_set_drvdata(pdev, NULL);
1405     vfree(gc);
1406 release_region:
1407     pci_release_regions(pdev);
1408 disable_dev:
1409     pci_clear_master(pdev);
1410     pci_disable_device(pdev);
1411     dev_err(&pdev->dev, "gdma probe failed: err = %d\n", err);
1412     return err;
1413 }
1414 
1415 static void mana_gd_remove(struct pci_dev *pdev)
1416 {
1417     struct gdma_context *gc = pci_get_drvdata(pdev);
1418 
1419     mana_remove(&gc->mana, false);
1420 
1421     mana_gd_cleanup(pdev);
1422 
1423     pci_iounmap(pdev, gc->bar0_va);
1424 
1425     vfree(gc);
1426 
1427     pci_release_regions(pdev);
1428     pci_clear_master(pdev);
1429     pci_disable_device(pdev);
1430 }
1431 
1432 /* The 'state' parameter is not used. */
1433 static int mana_gd_suspend(struct pci_dev *pdev, pm_message_t state)
1434 {
1435     struct gdma_context *gc = pci_get_drvdata(pdev);
1436 
1437     mana_remove(&gc->mana, true);
1438 
1439     mana_gd_cleanup(pdev);
1440 
1441     return 0;
1442 }
1443 
1444 /* In case the NIC hardware stops working, the suspend and resume callbacks will
1445  * fail -- if this happens, it's safer to just report an error than try to undo
1446  * what has been done.
1447  */
1448 static int mana_gd_resume(struct pci_dev *pdev)
1449 {
1450     struct gdma_context *gc = pci_get_drvdata(pdev);
1451     int err;
1452 
1453     err = mana_gd_setup(pdev);
1454     if (err)
1455         return err;
1456 
1457     err = mana_probe(&gc->mana, true);
1458     if (err)
1459         return err;
1460 
1461     return 0;
1462 }
1463 
1464 /* Quiesce the device for kexec. This is also called upon reboot/shutdown. */
1465 static void mana_gd_shutdown(struct pci_dev *pdev)
1466 {
1467     struct gdma_context *gc = pci_get_drvdata(pdev);
1468 
1469     dev_info(&pdev->dev, "Shutdown was called\n");
1470 
1471     mana_remove(&gc->mana, true);
1472 
1473     mana_gd_cleanup(pdev);
1474 
1475     pci_disable_device(pdev);
1476 }
1477 
1478 static const struct pci_device_id mana_id_table[] = {
1479     { PCI_DEVICE(PCI_VENDOR_ID_MICROSOFT, MANA_PF_DEVICE_ID) },
1480     { PCI_DEVICE(PCI_VENDOR_ID_MICROSOFT, MANA_VF_DEVICE_ID) },
1481     { }
1482 };
1483 
1484 static struct pci_driver mana_driver = {
1485     .name       = "mana",
1486     .id_table   = mana_id_table,
1487     .probe      = mana_gd_probe,
1488     .remove     = mana_gd_remove,
1489     .suspend    = mana_gd_suspend,
1490     .resume     = mana_gd_resume,
1491     .shutdown   = mana_gd_shutdown,
1492 };
1493 
1494 module_pci_driver(mana_driver);
1495 
1496 MODULE_DEVICE_TABLE(pci, mana_id_table);
1497 
1498 MODULE_LICENSE("Dual BSD/GPL");
1499 MODULE_DESCRIPTION("Microsoft Azure Network Adapter driver");