Skip site navigation (1)Skip section navigation (2)
Date:      Mon, 29 Jun 2020 00:32:15 +0000 (UTC)
From:      Chuck Tuffli <chuck@FreeBSD.org>
To:        src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-head@freebsd.org
Subject:   svn commit: r362763 - head/usr.sbin/bhyve
Message-ID:  <202006290032.05T0WF6V050053@repo.freebsd.org>

next in thread | raw e-mail | index | archive | help
Author: chuck
Date: Mon Jun 29 00:32:15 2020
New Revision: 362763
URL: https://svnweb.freebsd.org/changeset/base/362763

Log:
  bhyve: add NVMe Feature Interrupt Vector Config
  
  This adds support for NVMe Get Features, Interrupt Vector Config
  parameter error checking done by the UNH compliance tests.
  
  Fixes UNH Tests 1.6.8 and 5.5.6
  
  Tested by:	Jason Tubnor
  MFC after:	2 weeks
  Differential Revision: https://reviews.freebsd.org/D24898

Modified:
  head/usr.sbin/bhyve/pci_nvme.c

Modified: head/usr.sbin/bhyve/pci_nvme.c
==============================================================================
--- head/usr.sbin/bhyve/pci_nvme.c	Mon Jun 29 00:32:11 2020	(r362762)
+++ head/usr.sbin/bhyve/pci_nvme.c	Mon Jun 29 00:32:15 2020	(r362763)
@@ -356,6 +356,10 @@ static void nvme_feature_num_queues(struct pci_nvme_so
     struct nvme_feature_obj *,
     struct nvme_command *,
     struct nvme_completion *);
+static void nvme_feature_iv_config(struct pci_nvme_softc *,
+    struct nvme_feature_obj *,
+    struct nvme_command *,
+    struct nvme_completion *);
 
 static __inline void
 cpywithpad(char *dst, size_t dst_size, const char *src, char pad)
@@ -612,6 +616,8 @@ pci_nvme_init_features(struct pci_nvme_softc *sc)
 	sc->feat[NVME_FEAT_LBA_RANGE_TYPE].namespace_specific = true;
 	sc->feat[NVME_FEAT_ERROR_RECOVERY].namespace_specific = true;
 	sc->feat[NVME_FEAT_NUMBER_OF_QUEUES].set = nvme_feature_num_queues;
+	sc->feat[NVME_FEAT_INTERRUPT_VECTOR_CONFIGURATION].set =
+	    nvme_feature_iv_config;
 }
 
 static void
@@ -1273,6 +1279,39 @@ nvme_feature_invalid_cb(struct pci_nvme_softc *sc,
 {
 
 	pci_nvme_status_genc(&compl->status, NVME_SC_INVALID_FIELD);
+}
+
+static void
+nvme_feature_iv_config(struct pci_nvme_softc *sc,
+    struct nvme_feature_obj *feat,
+    struct nvme_command *command,
+    struct nvme_completion *compl)
+{
+	uint32_t i;
+	uint32_t cdw11 = command->cdw11;
+	uint16_t iv;
+	bool cd;
+
+	pci_nvme_status_genc(&compl->status, NVME_SC_INVALID_FIELD);
+
+	iv = cdw11 & 0xffff;
+	cd = cdw11 & (1 << 16);
+
+	if (iv > (sc->max_queues + 1)) {
+		return;
+	}
+
+	/* No Interrupt Coalescing (i.e. not Coalescing Disable) for Admin Q */
+	if ((iv == 0) && !cd)
+		return;
+
+	/* Requested Interrupt Vector must be used by a CQ */
+	for (i = 0; i < sc->num_cqueues + 1; i++) {
+		if (sc->compl_queues[i].intr_vec == iv) {
+			pci_nvme_status_genc(&compl->status, NVME_SC_SUCCESS);
+		}
+	}
+
 }
 
 static void



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?202006290032.05T0WF6V050053>