cachepc-linux

Fork of AMDESE/linux with modifications for CachePC side-channel attack
git clone https://git.sinitax.com/sinitax/cachepc-linux
Log | Files | Refs | README | LICENSE | sfeed.txt

fun_dev.c (21292B)


      1// SPDX-License-Identifier: (GPL-2.0-only OR BSD-3-Clause)
      2
      3#include <linux/aer.h>
      4#include <linux/bitmap.h>
      5#include <linux/delay.h>
      6#include <linux/interrupt.h>
      7#include <linux/io.h>
      8#include <linux/io-64-nonatomic-lo-hi.h>
      9#include <linux/mm.h>
     10#include <linux/module.h>
     11#include <linux/nvme.h>
     12#include <linux/pci.h>
     13#include <linux/wait.h>
     14#include <linux/sched/signal.h>
     15
     16#include "fun_queue.h"
     17#include "fun_dev.h"
     18
     19#define FUN_ADMIN_CMD_TO_MS 3000
     20
     21enum {
     22	AQA_ASQS_SHIFT = 0,
     23	AQA_ACQS_SHIFT = 16,
     24	AQA_MIN_QUEUE_SIZE = 2,
     25	AQA_MAX_QUEUE_SIZE = 4096
     26};
     27
     28/* context for admin commands */
     29struct fun_cmd_ctx {
     30	fun_admin_callback_t cb;  /* callback to invoke on completion */
     31	void *cb_data;            /* user data provided to callback */
     32	int cpu;                  /* CPU where the cmd's tag was allocated */
     33};
     34
     35/* Context for synchronous admin commands. */
     36struct fun_sync_cmd_ctx {
     37	struct completion compl;
     38	u8 *rsp_buf;              /* caller provided response buffer */
     39	unsigned int rsp_len;     /* response buffer size */
     40	u8 rsp_status;            /* command response status */
     41};
     42
     43/* Wait for the CSTS.RDY bit to match @enabled. */
     44static int fun_wait_ready(struct fun_dev *fdev, bool enabled)
     45{
     46	unsigned int cap_to = NVME_CAP_TIMEOUT(fdev->cap_reg);
     47	u32 bit = enabled ? NVME_CSTS_RDY : 0;
     48	unsigned long deadline;
     49
     50	deadline = ((cap_to + 1) * HZ / 2) + jiffies; /* CAP.TO is in 500ms */
     51
     52	for (;;) {
     53		u32 csts = readl(fdev->bar + NVME_REG_CSTS);
     54
     55		if (csts == ~0) {
     56			dev_err(fdev->dev, "CSTS register read %#x\n", csts);
     57			return -EIO;
     58		}
     59
     60		if ((csts & NVME_CSTS_RDY) == bit)
     61			return 0;
     62
     63		if (time_is_before_jiffies(deadline))
     64			break;
     65
     66		msleep(100);
     67	}
     68
     69	dev_err(fdev->dev,
     70		"Timed out waiting for device to indicate RDY %u; aborting %s\n",
     71		enabled, enabled ? "initialization" : "reset");
     72	return -ETIMEDOUT;
     73}
     74
     75/* Check CSTS and return an error if it is unreadable or has unexpected
     76 * RDY value.
     77 */
     78static int fun_check_csts_rdy(struct fun_dev *fdev, unsigned int expected_rdy)
     79{
     80	u32 csts = readl(fdev->bar + NVME_REG_CSTS);
     81	u32 actual_rdy = csts & NVME_CSTS_RDY;
     82
     83	if (csts == ~0) {
     84		dev_err(fdev->dev, "CSTS register read %#x\n", csts);
     85		return -EIO;
     86	}
     87	if (actual_rdy != expected_rdy) {
     88		dev_err(fdev->dev, "Unexpected CSTS RDY %u\n", actual_rdy);
     89		return -EINVAL;
     90	}
     91	return 0;
     92}
     93
     94/* Check that CSTS RDY has the expected value. Then write a new value to the CC
     95 * register and wait for CSTS RDY to match the new CC ENABLE state.
     96 */
     97static int fun_update_cc_enable(struct fun_dev *fdev, unsigned int initial_rdy)
     98{
     99	int rc = fun_check_csts_rdy(fdev, initial_rdy);
    100
    101	if (rc)
    102		return rc;
    103	writel(fdev->cc_reg, fdev->bar + NVME_REG_CC);
    104	return fun_wait_ready(fdev, !!(fdev->cc_reg & NVME_CC_ENABLE));
    105}
    106
    107static int fun_disable_ctrl(struct fun_dev *fdev)
    108{
    109	fdev->cc_reg &= ~(NVME_CC_SHN_MASK | NVME_CC_ENABLE);
    110	return fun_update_cc_enable(fdev, 1);
    111}
    112
    113static int fun_enable_ctrl(struct fun_dev *fdev, u32 admin_cqesz_log2,
    114			   u32 admin_sqesz_log2)
    115{
    116	fdev->cc_reg = (admin_cqesz_log2 << NVME_CC_IOCQES_SHIFT) |
    117		       (admin_sqesz_log2 << NVME_CC_IOSQES_SHIFT) |
    118		       ((PAGE_SHIFT - 12) << NVME_CC_MPS_SHIFT) |
    119		       NVME_CC_ENABLE;
    120
    121	return fun_update_cc_enable(fdev, 0);
    122}
    123
    124static int fun_map_bars(struct fun_dev *fdev, const char *name)
    125{
    126	struct pci_dev *pdev = to_pci_dev(fdev->dev);
    127	int err;
    128
    129	err = pci_request_mem_regions(pdev, name);
    130	if (err) {
    131		dev_err(&pdev->dev,
    132			"Couldn't get PCI memory resources, err %d\n", err);
    133		return err;
    134	}
    135
    136	fdev->bar = pci_ioremap_bar(pdev, 0);
    137	if (!fdev->bar) {
    138		dev_err(&pdev->dev, "Couldn't map BAR 0\n");
    139		pci_release_mem_regions(pdev);
    140		return -ENOMEM;
    141	}
    142
    143	return 0;
    144}
    145
    146static void fun_unmap_bars(struct fun_dev *fdev)
    147{
    148	struct pci_dev *pdev = to_pci_dev(fdev->dev);
    149
    150	if (fdev->bar) {
    151		iounmap(fdev->bar);
    152		fdev->bar = NULL;
    153		pci_release_mem_regions(pdev);
    154	}
    155}
    156
    157static int fun_set_dma_masks(struct device *dev)
    158{
    159	int err;
    160
    161	err = dma_set_mask_and_coherent(dev, DMA_BIT_MASK(64));
    162	if (err)
    163		dev_err(dev, "DMA mask configuration failed, err %d\n", err);
    164	return err;
    165}
    166
    167static irqreturn_t fun_admin_irq(int irq, void *data)
    168{
    169	struct fun_queue *funq = data;
    170
    171	return fun_process_cq(funq, 0) ? IRQ_HANDLED : IRQ_NONE;
    172}
    173
    174static void fun_complete_admin_cmd(struct fun_queue *funq, void *data,
    175				   void *entry, const struct fun_cqe_info *info)
    176{
    177	const struct fun_admin_rsp_common *rsp_common = entry;
    178	struct fun_dev *fdev = funq->fdev;
    179	struct fun_cmd_ctx *cmd_ctx;
    180	int cpu;
    181	u16 cid;
    182
    183	if (info->sqhd == cpu_to_be16(0xffff)) {
    184		dev_dbg(fdev->dev, "adminq event");
    185		if (fdev->adminq_cb)
    186			fdev->adminq_cb(fdev, entry);
    187		return;
    188	}
    189
    190	cid = be16_to_cpu(rsp_common->cid);
    191	dev_dbg(fdev->dev, "admin CQE cid %u, op %u, ret %u\n", cid,
    192		rsp_common->op, rsp_common->ret);
    193
    194	cmd_ctx = &fdev->cmd_ctx[cid];
    195	if (cmd_ctx->cpu < 0) {
    196		dev_err(fdev->dev,
    197			"admin CQE with CID=%u, op=%u does not match a pending command\n",
    198			cid, rsp_common->op);
    199		return;
    200	}
    201
    202	if (cmd_ctx->cb)
    203		cmd_ctx->cb(fdev, entry, xchg(&cmd_ctx->cb_data, NULL));
    204
    205	cpu = cmd_ctx->cpu;
    206	cmd_ctx->cpu = -1;
    207	sbitmap_queue_clear(&fdev->admin_sbq, cid, cpu);
    208}
    209
    210static int fun_init_cmd_ctx(struct fun_dev *fdev, unsigned int ntags)
    211{
    212	unsigned int i;
    213
    214	fdev->cmd_ctx = kvcalloc(ntags, sizeof(*fdev->cmd_ctx), GFP_KERNEL);
    215	if (!fdev->cmd_ctx)
    216		return -ENOMEM;
    217
    218	for (i = 0; i < ntags; i++)
    219		fdev->cmd_ctx[i].cpu = -1;
    220
    221	return 0;
    222}
    223
    224/* Allocate and enable an admin queue and assign it the first IRQ vector. */
    225static int fun_enable_admin_queue(struct fun_dev *fdev,
    226				  const struct fun_dev_params *areq)
    227{
    228	struct fun_queue_alloc_req qreq = {
    229		.cqe_size_log2 = areq->cqe_size_log2,
    230		.sqe_size_log2 = areq->sqe_size_log2,
    231		.cq_depth = areq->cq_depth,
    232		.sq_depth = areq->sq_depth,
    233		.rq_depth = areq->rq_depth,
    234	};
    235	unsigned int ntags = areq->sq_depth - 1;
    236	struct fun_queue *funq;
    237	int rc;
    238
    239	if (fdev->admin_q)
    240		return -EEXIST;
    241
    242	if (areq->sq_depth < AQA_MIN_QUEUE_SIZE ||
    243	    areq->sq_depth > AQA_MAX_QUEUE_SIZE ||
    244	    areq->cq_depth < AQA_MIN_QUEUE_SIZE ||
    245	    areq->cq_depth > AQA_MAX_QUEUE_SIZE)
    246		return -EINVAL;
    247
    248	fdev->admin_q = fun_alloc_queue(fdev, 0, &qreq);
    249	if (!fdev->admin_q)
    250		return -ENOMEM;
    251
    252	rc = fun_init_cmd_ctx(fdev, ntags);
    253	if (rc)
    254		goto free_q;
    255
    256	rc = sbitmap_queue_init_node(&fdev->admin_sbq, ntags, -1, false,
    257				     GFP_KERNEL, dev_to_node(fdev->dev));
    258	if (rc)
    259		goto free_cmd_ctx;
    260
    261	funq = fdev->admin_q;
    262	funq->cq_vector = 0;
    263	rc = fun_request_irq(funq, dev_name(fdev->dev), fun_admin_irq, funq);
    264	if (rc)
    265		goto free_sbq;
    266
    267	fun_set_cq_callback(funq, fun_complete_admin_cmd, NULL);
    268	fdev->adminq_cb = areq->event_cb;
    269
    270	writel((funq->sq_depth - 1) << AQA_ASQS_SHIFT |
    271	       (funq->cq_depth - 1) << AQA_ACQS_SHIFT,
    272	       fdev->bar + NVME_REG_AQA);
    273
    274	writeq(funq->sq_dma_addr, fdev->bar + NVME_REG_ASQ);
    275	writeq(funq->cq_dma_addr, fdev->bar + NVME_REG_ACQ);
    276
    277	rc = fun_enable_ctrl(fdev, areq->cqe_size_log2, areq->sqe_size_log2);
    278	if (rc)
    279		goto free_irq;
    280
    281	if (areq->rq_depth) {
    282		rc = fun_create_rq(funq);
    283		if (rc)
    284			goto disable_ctrl;
    285
    286		funq_rq_post(funq);
    287	}
    288
    289	return 0;
    290
    291disable_ctrl:
    292	fun_disable_ctrl(fdev);
    293free_irq:
    294	fun_free_irq(funq);
    295free_sbq:
    296	sbitmap_queue_free(&fdev->admin_sbq);
    297free_cmd_ctx:
    298	kvfree(fdev->cmd_ctx);
    299	fdev->cmd_ctx = NULL;
    300free_q:
    301	fun_free_queue(fdev->admin_q);
    302	fdev->admin_q = NULL;
    303	return rc;
    304}
    305
    306static void fun_disable_admin_queue(struct fun_dev *fdev)
    307{
    308	struct fun_queue *admq = fdev->admin_q;
    309
    310	if (!admq)
    311		return;
    312
    313	fun_disable_ctrl(fdev);
    314
    315	fun_free_irq(admq);
    316	__fun_process_cq(admq, 0);
    317
    318	sbitmap_queue_free(&fdev->admin_sbq);
    319
    320	kvfree(fdev->cmd_ctx);
    321	fdev->cmd_ctx = NULL;
    322
    323	fun_free_queue(admq);
    324	fdev->admin_q = NULL;
    325}
    326
    327/* Return %true if the admin queue has stopped servicing commands as can be
    328 * detected through registers. This isn't exhaustive and may provide false
    329 * negatives.
    330 */
    331static bool fun_adminq_stopped(struct fun_dev *fdev)
    332{
    333	u32 csts = readl(fdev->bar + NVME_REG_CSTS);
    334
    335	return (csts & (NVME_CSTS_CFS | NVME_CSTS_RDY)) != NVME_CSTS_RDY;
    336}
    337
    338static int fun_wait_for_tag(struct fun_dev *fdev, int *cpup)
    339{
    340	struct sbitmap_queue *sbq = &fdev->admin_sbq;
    341	struct sbq_wait_state *ws = &sbq->ws[0];
    342	DEFINE_SBQ_WAIT(wait);
    343	int tag;
    344
    345	for (;;) {
    346		sbitmap_prepare_to_wait(sbq, ws, &wait, TASK_UNINTERRUPTIBLE);
    347		if (fdev->suppress_cmds) {
    348			tag = -ESHUTDOWN;
    349			break;
    350		}
    351		tag = sbitmap_queue_get(sbq, cpup);
    352		if (tag >= 0)
    353			break;
    354		schedule();
    355	}
    356
    357	sbitmap_finish_wait(sbq, ws, &wait);
    358	return tag;
    359}
    360
    361/* Submit an asynchronous admin command. Caller is responsible for implementing
    362 * any waiting or timeout. Upon command completion the callback @cb is called.
    363 */
    364int fun_submit_admin_cmd(struct fun_dev *fdev, struct fun_admin_req_common *cmd,
    365			 fun_admin_callback_t cb, void *cb_data, bool wait_ok)
    366{
    367	struct fun_queue *funq = fdev->admin_q;
    368	unsigned int cmdsize = cmd->len8 * 8;
    369	struct fun_cmd_ctx *cmd_ctx;
    370	int tag, cpu, rc = 0;
    371
    372	if (WARN_ON(cmdsize > (1 << funq->sqe_size_log2)))
    373		return -EMSGSIZE;
    374
    375	tag = sbitmap_queue_get(&fdev->admin_sbq, &cpu);
    376	if (tag < 0) {
    377		if (!wait_ok)
    378			return -EAGAIN;
    379		tag = fun_wait_for_tag(fdev, &cpu);
    380		if (tag < 0)
    381			return tag;
    382	}
    383
    384	cmd->cid = cpu_to_be16(tag);
    385
    386	cmd_ctx = &fdev->cmd_ctx[tag];
    387	cmd_ctx->cb = cb;
    388	cmd_ctx->cb_data = cb_data;
    389
    390	spin_lock(&funq->sq_lock);
    391
    392	if (unlikely(fdev->suppress_cmds)) {
    393		rc = -ESHUTDOWN;
    394		sbitmap_queue_clear(&fdev->admin_sbq, tag, cpu);
    395	} else {
    396		cmd_ctx->cpu = cpu;
    397		memcpy(fun_sqe_at(funq, funq->sq_tail), cmd, cmdsize);
    398
    399		dev_dbg(fdev->dev, "admin cmd @ %u: %8ph\n", funq->sq_tail,
    400			cmd);
    401
    402		if (++funq->sq_tail == funq->sq_depth)
    403			funq->sq_tail = 0;
    404		writel(funq->sq_tail, funq->sq_db);
    405	}
    406	spin_unlock(&funq->sq_lock);
    407	return rc;
    408}
    409
    410/* Abandon a pending admin command by clearing the issuer's callback data.
    411 * Failure indicates that the command either has already completed or its
    412 * completion is racing with this call.
    413 */
    414static bool fun_abandon_admin_cmd(struct fun_dev *fd,
    415				  const struct fun_admin_req_common *cmd,
    416				  void *cb_data)
    417{
    418	u16 cid = be16_to_cpu(cmd->cid);
    419	struct fun_cmd_ctx *cmd_ctx = &fd->cmd_ctx[cid];
    420
    421	return cmpxchg(&cmd_ctx->cb_data, cb_data, NULL) == cb_data;
    422}
    423
    424/* Stop submission of new admin commands and wake up any processes waiting for
    425 * tags. Already submitted commands are left to complete or time out.
    426 */
    427static void fun_admin_stop(struct fun_dev *fdev)
    428{
    429	spin_lock(&fdev->admin_q->sq_lock);
    430	fdev->suppress_cmds = true;
    431	spin_unlock(&fdev->admin_q->sq_lock);
    432	sbitmap_queue_wake_all(&fdev->admin_sbq);
    433}
    434
    435/* The callback for synchronous execution of admin commands. It copies the
    436 * command response to the caller's buffer and signals completion.
    437 */
    438static void fun_admin_cmd_sync_cb(struct fun_dev *fd, void *rsp, void *cb_data)
    439{
    440	const struct fun_admin_rsp_common *rsp_common = rsp;
    441	struct fun_sync_cmd_ctx *ctx = cb_data;
    442
    443	if (!ctx)
    444		return;         /* command issuer timed out and left */
    445	if (ctx->rsp_buf) {
    446		unsigned int rsp_len = rsp_common->len8 * 8;
    447
    448		if (unlikely(rsp_len > ctx->rsp_len)) {
    449			dev_err(fd->dev,
    450				"response for op %u is %uB > response buffer %uB\n",
    451				rsp_common->op, rsp_len, ctx->rsp_len);
    452			rsp_len = ctx->rsp_len;
    453		}
    454		memcpy(ctx->rsp_buf, rsp, rsp_len);
    455	}
    456	ctx->rsp_status = rsp_common->ret;
    457	complete(&ctx->compl);
    458}
    459
    460/* Submit a synchronous admin command. */
    461int fun_submit_admin_sync_cmd(struct fun_dev *fdev,
    462			      struct fun_admin_req_common *cmd, void *rsp,
    463			      size_t rspsize, unsigned int timeout)
    464{
    465	struct fun_sync_cmd_ctx ctx = {
    466		.compl = COMPLETION_INITIALIZER_ONSTACK(ctx.compl),
    467		.rsp_buf = rsp,
    468		.rsp_len = rspsize,
    469	};
    470	unsigned int cmdlen = cmd->len8 * 8;
    471	unsigned long jiffies_left;
    472	int ret;
    473
    474	ret = fun_submit_admin_cmd(fdev, cmd, fun_admin_cmd_sync_cb, &ctx,
    475				   true);
    476	if (ret)
    477		return ret;
    478
    479	if (!timeout)
    480		timeout = FUN_ADMIN_CMD_TO_MS;
    481
    482	jiffies_left = wait_for_completion_timeout(&ctx.compl,
    483						   msecs_to_jiffies(timeout));
    484	if (!jiffies_left) {
    485		/* The command timed out. Attempt to cancel it so we can return.
    486		 * But if the command is in the process of completing we'll
    487		 * wait for it.
    488		 */
    489		if (fun_abandon_admin_cmd(fdev, cmd, &ctx)) {
    490			dev_err(fdev->dev, "admin command timed out: %*ph\n",
    491				cmdlen, cmd);
    492			fun_admin_stop(fdev);
    493			/* see if the timeout was due to a queue failure */
    494			if (fun_adminq_stopped(fdev))
    495				dev_err(fdev->dev,
    496					"device does not accept admin commands\n");
    497
    498			return -ETIMEDOUT;
    499		}
    500		wait_for_completion(&ctx.compl);
    501	}
    502
    503	if (ctx.rsp_status) {
    504		dev_err(fdev->dev, "admin command failed, err %d: %*ph\n",
    505			ctx.rsp_status, cmdlen, cmd);
    506	}
    507
    508	return -ctx.rsp_status;
    509}
    510EXPORT_SYMBOL_GPL(fun_submit_admin_sync_cmd);
    511
    512/* Return the number of device resources of the requested type. */
    513int fun_get_res_count(struct fun_dev *fdev, enum fun_admin_op res)
    514{
    515	union {
    516		struct fun_admin_res_count_req req;
    517		struct fun_admin_res_count_rsp rsp;
    518	} cmd;
    519	int rc;
    520
    521	cmd.req.common = FUN_ADMIN_REQ_COMMON_INIT2(res, sizeof(cmd.req));
    522	cmd.req.count = FUN_ADMIN_SIMPLE_SUBOP_INIT(FUN_ADMIN_SUBOP_RES_COUNT,
    523						    0, 0);
    524
    525	rc = fun_submit_admin_sync_cmd(fdev, &cmd.req.common, &cmd.rsp,
    526				       sizeof(cmd), 0);
    527	return rc ? rc : be32_to_cpu(cmd.rsp.count.data);
    528}
    529EXPORT_SYMBOL_GPL(fun_get_res_count);
    530
    531/* Request that the instance of resource @res with the given id be deleted. */
    532int fun_res_destroy(struct fun_dev *fdev, enum fun_admin_op res,
    533		    unsigned int flags, u32 id)
    534{
    535	struct fun_admin_generic_destroy_req req = {
    536		.common = FUN_ADMIN_REQ_COMMON_INIT2(res, sizeof(req)),
    537		.destroy = FUN_ADMIN_SIMPLE_SUBOP_INIT(FUN_ADMIN_SUBOP_DESTROY,
    538						       flags, id)
    539	};
    540
    541	return fun_submit_admin_sync_cmd(fdev, &req.common, NULL, 0, 0);
    542}
    543EXPORT_SYMBOL_GPL(fun_res_destroy);
    544
    545/* Bind two entities of the given types and IDs. */
    546int fun_bind(struct fun_dev *fdev, enum fun_admin_bind_type type0,
    547	     unsigned int id0, enum fun_admin_bind_type type1,
    548	     unsigned int id1)
    549{
    550	struct {
    551		struct fun_admin_bind_req req;
    552		struct fun_admin_bind_entry entry[2];
    553	} cmd = {
    554		.req.common = FUN_ADMIN_REQ_COMMON_INIT2(FUN_ADMIN_OP_BIND,
    555							 sizeof(cmd)),
    556		.entry[0] = FUN_ADMIN_BIND_ENTRY_INIT(type0, id0),
    557		.entry[1] = FUN_ADMIN_BIND_ENTRY_INIT(type1, id1),
    558	};
    559
    560	return fun_submit_admin_sync_cmd(fdev, &cmd.req.common, NULL, 0, 0);
    561}
    562EXPORT_SYMBOL_GPL(fun_bind);
    563
    564static int fun_get_dev_limits(struct fun_dev *fdev)
    565{
    566	struct pci_dev *pdev = to_pci_dev(fdev->dev);
    567	unsigned int cq_count, sq_count, num_dbs;
    568	int rc;
    569
    570	rc = fun_get_res_count(fdev, FUN_ADMIN_OP_EPCQ);
    571	if (rc < 0)
    572		return rc;
    573	cq_count = rc;
    574
    575	rc = fun_get_res_count(fdev, FUN_ADMIN_OP_EPSQ);
    576	if (rc < 0)
    577		return rc;
    578	sq_count = rc;
    579
    580	/* The admin queue consumes 1 CQ and at least 1 SQ. To be usable the
    581	 * device must provide additional queues.
    582	 */
    583	if (cq_count < 2 || sq_count < 2 + !!fdev->admin_q->rq_depth)
    584		return -EINVAL;
    585
    586	/* Calculate the max QID based on SQ/CQ/doorbell counts.
    587	 * SQ/CQ doorbells alternate.
    588	 */
    589	num_dbs = (pci_resource_len(pdev, 0) - NVME_REG_DBS) >>
    590		  (2 + NVME_CAP_STRIDE(fdev->cap_reg));
    591	fdev->max_qid = min3(cq_count, sq_count, num_dbs / 2) - 1;
    592	fdev->kern_end_qid = fdev->max_qid + 1;
    593	return 0;
    594}
    595
    596/* Allocate all MSI-X vectors available on a function and at least @min_vecs. */
    597static int fun_alloc_irqs(struct pci_dev *pdev, unsigned int min_vecs)
    598{
    599	int vecs, num_msix = pci_msix_vec_count(pdev);
    600
    601	if (num_msix < 0)
    602		return num_msix;
    603	if (min_vecs > num_msix)
    604		return -ERANGE;
    605
    606	vecs = pci_alloc_irq_vectors(pdev, min_vecs, num_msix, PCI_IRQ_MSIX);
    607	if (vecs > 0) {
    608		dev_info(&pdev->dev,
    609			 "Allocated %d IRQ vectors of %d requested\n",
    610			 vecs, num_msix);
    611	} else {
    612		dev_err(&pdev->dev,
    613			"Unable to allocate at least %u IRQ vectors\n",
    614			min_vecs);
    615	}
    616	return vecs;
    617}
    618
    619/* Allocate and initialize the IRQ manager state. */
    620static int fun_alloc_irq_mgr(struct fun_dev *fdev)
    621{
    622	fdev->irq_map = bitmap_zalloc(fdev->num_irqs, GFP_KERNEL);
    623	if (!fdev->irq_map)
    624		return -ENOMEM;
    625
    626	spin_lock_init(&fdev->irqmgr_lock);
    627	/* mark IRQ 0 allocated, it is used by the admin queue */
    628	__set_bit(0, fdev->irq_map);
    629	fdev->irqs_avail = fdev->num_irqs - 1;
    630	return 0;
    631}
    632
    633/* Reserve @nirqs of the currently available IRQs and return their indices. */
    634int fun_reserve_irqs(struct fun_dev *fdev, unsigned int nirqs, u16 *irq_indices)
    635{
    636	unsigned int b, n = 0;
    637	int err = -ENOSPC;
    638
    639	if (!nirqs)
    640		return 0;
    641
    642	spin_lock(&fdev->irqmgr_lock);
    643	if (nirqs > fdev->irqs_avail)
    644		goto unlock;
    645
    646	for_each_clear_bit(b, fdev->irq_map, fdev->num_irqs) {
    647		__set_bit(b, fdev->irq_map);
    648		irq_indices[n++] = b;
    649		if (n >= nirqs)
    650			break;
    651	}
    652
    653	WARN_ON(n < nirqs);
    654	fdev->irqs_avail -= n;
    655	err = n;
    656unlock:
    657	spin_unlock(&fdev->irqmgr_lock);
    658	return err;
    659}
    660EXPORT_SYMBOL(fun_reserve_irqs);
    661
    662/* Release @nirqs previously allocated IRQS with the supplied indices. */
    663void fun_release_irqs(struct fun_dev *fdev, unsigned int nirqs,
    664		      u16 *irq_indices)
    665{
    666	unsigned int i;
    667
    668	spin_lock(&fdev->irqmgr_lock);
    669	for (i = 0; i < nirqs; i++)
    670		__clear_bit(irq_indices[i], fdev->irq_map);
    671	fdev->irqs_avail += nirqs;
    672	spin_unlock(&fdev->irqmgr_lock);
    673}
    674EXPORT_SYMBOL(fun_release_irqs);
    675
    676static void fun_serv_handler(struct work_struct *work)
    677{
    678	struct fun_dev *fd = container_of(work, struct fun_dev, service_task);
    679
    680	if (test_bit(FUN_SERV_DISABLED, &fd->service_flags))
    681		return;
    682	if (fd->serv_cb)
    683		fd->serv_cb(fd);
    684}
    685
    686void fun_serv_stop(struct fun_dev *fd)
    687{
    688	set_bit(FUN_SERV_DISABLED, &fd->service_flags);
    689	cancel_work_sync(&fd->service_task);
    690}
    691EXPORT_SYMBOL_GPL(fun_serv_stop);
    692
    693void fun_serv_restart(struct fun_dev *fd)
    694{
    695	clear_bit(FUN_SERV_DISABLED, &fd->service_flags);
    696	if (fd->service_flags)
    697		schedule_work(&fd->service_task);
    698}
    699EXPORT_SYMBOL_GPL(fun_serv_restart);
    700
    701void fun_serv_sched(struct fun_dev *fd)
    702{
    703	if (!test_bit(FUN_SERV_DISABLED, &fd->service_flags))
    704		schedule_work(&fd->service_task);
    705}
    706EXPORT_SYMBOL_GPL(fun_serv_sched);
    707
    708/* Check and try to get the device into a proper state for initialization,
    709 * i.e., CSTS.RDY = CC.EN = 0.
    710 */
    711static int sanitize_dev(struct fun_dev *fdev)
    712{
    713	int rc;
    714
    715	fdev->cap_reg = readq(fdev->bar + NVME_REG_CAP);
    716	fdev->cc_reg = readl(fdev->bar + NVME_REG_CC);
    717
    718	/* First get RDY to agree with the current EN. Give RDY the opportunity
    719	 * to complete a potential recent EN change.
    720	 */
    721	rc = fun_wait_ready(fdev, fdev->cc_reg & NVME_CC_ENABLE);
    722	if (rc)
    723		return rc;
    724
    725	/* Next, reset the device if EN is currently 1. */
    726	if (fdev->cc_reg & NVME_CC_ENABLE)
    727		rc = fun_disable_ctrl(fdev);
    728
    729	return rc;
    730}
    731
    732/* Undo the device initialization of fun_dev_enable(). */
    733void fun_dev_disable(struct fun_dev *fdev)
    734{
    735	struct pci_dev *pdev = to_pci_dev(fdev->dev);
    736
    737	pci_set_drvdata(pdev, NULL);
    738
    739	if (fdev->fw_handle != FUN_HCI_ID_INVALID) {
    740		fun_res_destroy(fdev, FUN_ADMIN_OP_SWUPGRADE, 0,
    741				fdev->fw_handle);
    742		fdev->fw_handle = FUN_HCI_ID_INVALID;
    743	}
    744
    745	fun_disable_admin_queue(fdev);
    746
    747	bitmap_free(fdev->irq_map);
    748	pci_free_irq_vectors(pdev);
    749
    750	pci_clear_master(pdev);
    751	pci_disable_pcie_error_reporting(pdev);
    752	pci_disable_device(pdev);
    753
    754	fun_unmap_bars(fdev);
    755}
    756EXPORT_SYMBOL(fun_dev_disable);
    757
    758/* Perform basic initialization of a device, including
    759 * - PCI config space setup and BAR0 mapping
    760 * - interrupt management initialization
    761 * - 1 admin queue setup
    762 * - determination of some device limits, such as number of queues.
    763 */
    764int fun_dev_enable(struct fun_dev *fdev, struct pci_dev *pdev,
    765		   const struct fun_dev_params *areq, const char *name)
    766{
    767	int rc;
    768
    769	fdev->dev = &pdev->dev;
    770	rc = fun_map_bars(fdev, name);
    771	if (rc)
    772		return rc;
    773
    774	rc = fun_set_dma_masks(fdev->dev);
    775	if (rc)
    776		goto unmap;
    777
    778	rc = pci_enable_device_mem(pdev);
    779	if (rc) {
    780		dev_err(&pdev->dev, "Couldn't enable device, err %d\n", rc);
    781		goto unmap;
    782	}
    783
    784	pci_enable_pcie_error_reporting(pdev);
    785
    786	rc = sanitize_dev(fdev);
    787	if (rc)
    788		goto disable_dev;
    789
    790	fdev->fw_handle = FUN_HCI_ID_INVALID;
    791	fdev->q_depth = NVME_CAP_MQES(fdev->cap_reg) + 1;
    792	fdev->db_stride = 1 << NVME_CAP_STRIDE(fdev->cap_reg);
    793	fdev->dbs = fdev->bar + NVME_REG_DBS;
    794
    795	INIT_WORK(&fdev->service_task, fun_serv_handler);
    796	fdev->service_flags = FUN_SERV_DISABLED;
    797	fdev->serv_cb = areq->serv_cb;
    798
    799	rc = fun_alloc_irqs(pdev, areq->min_msix + 1); /* +1 for admin CQ */
    800	if (rc < 0)
    801		goto disable_dev;
    802	fdev->num_irqs = rc;
    803
    804	rc = fun_alloc_irq_mgr(fdev);
    805	if (rc)
    806		goto free_irqs;
    807
    808	pci_set_master(pdev);
    809	rc = fun_enable_admin_queue(fdev, areq);
    810	if (rc)
    811		goto free_irq_mgr;
    812
    813	rc = fun_get_dev_limits(fdev);
    814	if (rc < 0)
    815		goto disable_admin;
    816
    817	pci_save_state(pdev);
    818	pci_set_drvdata(pdev, fdev);
    819	pcie_print_link_status(pdev);
    820	dev_dbg(fdev->dev, "q_depth %u, db_stride %u, max qid %d kern_end_qid %d\n",
    821		fdev->q_depth, fdev->db_stride, fdev->max_qid,
    822		fdev->kern_end_qid);
    823	return 0;
    824
    825disable_admin:
    826	fun_disable_admin_queue(fdev);
    827free_irq_mgr:
    828	pci_clear_master(pdev);
    829	bitmap_free(fdev->irq_map);
    830free_irqs:
    831	pci_free_irq_vectors(pdev);
    832disable_dev:
    833	pci_disable_pcie_error_reporting(pdev);
    834	pci_disable_device(pdev);
    835unmap:
    836	fun_unmap_bars(fdev);
    837	return rc;
    838}
    839EXPORT_SYMBOL(fun_dev_enable);
    840
    841MODULE_AUTHOR("Dimitris Michailidis <dmichail@fungible.com>");
    842MODULE_DESCRIPTION("Core services driver for Fungible devices");
    843MODULE_LICENSE("Dual BSD/GPL");