Print this page
8631 only 16 NVMe controllers usable per system due to 18bit minor number limit
Reviewed by: Robert Mustacchi <rm@joyent.com>
Reviewed by: Patrick Mooney <patrick.mooney@joyent.com>


 303 static int nvme_fill_prp(nvme_cmd_t *, bd_xfer_t *);
 304 
 305 static void nvme_bd_xfer_done(void *);
 306 static void nvme_bd_driveinfo(void *, bd_drive_t *);
 307 static int nvme_bd_mediainfo(void *, bd_media_t *);
 308 static int nvme_bd_cmd(nvme_namespace_t *, bd_xfer_t *, uint8_t);
 309 static int nvme_bd_read(void *, bd_xfer_t *);
 310 static int nvme_bd_write(void *, bd_xfer_t *);
 311 static int nvme_bd_sync(void *, bd_xfer_t *);
 312 static int nvme_bd_devid(void *, dev_info_t *, ddi_devid_t *);
 313 
 314 static int nvme_prp_dma_constructor(void *, void *, int);
 315 static void nvme_prp_dma_destructor(void *, void *);
 316 
 317 static void nvme_prepare_devid(nvme_t *, uint32_t);
 318 
 319 static int nvme_open(dev_t *, int, int, cred_t *);
 320 static int nvme_close(dev_t, int, int, cred_t *);
 321 static int nvme_ioctl(dev_t, int, intptr_t, int, cred_t *, int *);
 322 
 323 #define NVME_MINOR_INST_SHIFT   14
 324 #define NVME_MINOR(inst, nsid)  (((inst) << NVME_MINOR_INST_SHIFT) | (nsid))
 325 #define NVME_MINOR_INST(minor)  ((minor) >> NVME_MINOR_INST_SHIFT)
 326 #define NVME_MINOR_NSID(minor)  ((minor) & ((1 << NVME_MINOR_INST_SHIFT) - 1))
 327 #define NVME_MINOR_MAX          (NVME_MINOR(1, 0) - 2)
 328 
 329 static void *nvme_state;
 330 static kmem_cache_t *nvme_cmd_cache;
 331 
 332 /*
 333  * DMA attributes for queue DMA memory
 334  *
 335  * Queue DMA memory must be page aligned. The maximum length of a queue is
 336  * 65536 entries, and an entry can be 64 bytes long.
 337  */
 338 static ddi_dma_attr_t nvme_queue_dma_attr = {
 339         .dma_attr_version       = DMA_ATTR_V0,
 340         .dma_attr_addr_lo       = 0,
 341         .dma_attr_addr_hi       = 0xffffffffffffffffULL,
 342         .dma_attr_count_max     = (UINT16_MAX + 1) * sizeof (nvme_sqe_t) - 1,
 343         .dma_attr_align         = 0x1000,




 303 static int nvme_fill_prp(nvme_cmd_t *, bd_xfer_t *);
 304 
 305 static void nvme_bd_xfer_done(void *);
 306 static void nvme_bd_driveinfo(void *, bd_drive_t *);
 307 static int nvme_bd_mediainfo(void *, bd_media_t *);
 308 static int nvme_bd_cmd(nvme_namespace_t *, bd_xfer_t *, uint8_t);
 309 static int nvme_bd_read(void *, bd_xfer_t *);
 310 static int nvme_bd_write(void *, bd_xfer_t *);
 311 static int nvme_bd_sync(void *, bd_xfer_t *);
 312 static int nvme_bd_devid(void *, dev_info_t *, ddi_devid_t *);
 313 
 314 static int nvme_prp_dma_constructor(void *, void *, int);
 315 static void nvme_prp_dma_destructor(void *, void *);
 316 
 317 static void nvme_prepare_devid(nvme_t *, uint32_t);
 318 
 319 static int nvme_open(dev_t *, int, int, cred_t *);
 320 static int nvme_close(dev_t, int, int, cred_t *);
 321 static int nvme_ioctl(dev_t, int, intptr_t, int, cred_t *, int *);
 322 
 323 #define NVME_MINOR_INST_SHIFT   9
 324 #define NVME_MINOR(inst, nsid)  (((inst) << NVME_MINOR_INST_SHIFT) | (nsid))
 325 #define NVME_MINOR_INST(minor)  ((minor) >> NVME_MINOR_INST_SHIFT)
 326 #define NVME_MINOR_NSID(minor)  ((minor) & ((1 << NVME_MINOR_INST_SHIFT) - 1))
 327 #define NVME_MINOR_MAX          (NVME_MINOR(1, 0) - 2)
 328 
 329 static void *nvme_state;
 330 static kmem_cache_t *nvme_cmd_cache;
 331 
 332 /*
 333  * DMA attributes for queue DMA memory
 334  *
 335  * Queue DMA memory must be page aligned. The maximum length of a queue is
 336  * 65536 entries, and an entry can be 64 bytes long.
 337  */
 338 static ddi_dma_attr_t nvme_queue_dma_attr = {
 339         .dma_attr_version       = DMA_ATTR_V0,
 340         .dma_attr_addr_lo       = 0,
 341         .dma_attr_addr_hi       = 0xffffffffffffffffULL,
 342         .dma_attr_count_max     = (UINT16_MAX + 1) * sizeof (nvme_sqe_t) - 1,
 343         .dma_attr_align         = 0x1000,