Index: sys/dev/nvme/nvme.h =================================================================== --- sys/dev/nvme/nvme.h +++ sys/dev/nvme/nvme.h @@ -45,6 +45,9 @@ #define NVME_IO_TEST _IOWR('n', 100, struct nvme_io_test) #define NVME_BIO_TEST _IOWR('n', 101, struct nvme_io_test) +/* Pseudo-Linux compatibility ioctls */ +#define NVME_PCI_ID _IOR('n', 200, uint64_t) + /* * Macros to deal with NVME revisions, as defined VS register */ Index: sys/dev/nvme/nvme_ctrlr.c =================================================================== --- sys/dev/nvme/nvme_ctrlr.c +++ sys/dev/nvme/nvme_ctrlr.c @@ -1113,6 +1113,7 @@ { struct nvme_controller *ctrlr; struct nvme_pt_command *pt; + uint64_t id; ctrlr = cdev->si_drv1; @@ -1132,6 +1133,12 @@ gnsid->nsid = 0; break; } + case NVME_PCI_ID: + id = pci_get_devid(ctrlr->dev); + id |= (uint64_t)pci_get_subvendor(ctrlr->dev) << 32; + id |= (uint64_t)pci_get_subdevice(ctrlr->dev) << 48; + *(uint64_t *)arg = id; + break; default: return (ENOTTY); }