16c3f93c7SWojciech Malikowski# VMD driver {#vmd} 26c3f93c7SWojciech Malikowski 31e1fd9acSwawryk## In this document {#vmd_toc} 46c3f93c7SWojciech Malikowski 56c3f93c7SWojciech Malikowski* @ref vmd_intro 66c3f93c7SWojciech Malikowski* @ref vmd_interface 76c3f93c7SWojciech Malikowski* @ref vmd_key_functions 86c3f93c7SWojciech Malikowski* @ref vmd_config 96c3f93c7SWojciech Malikowski* @ref vmd_app_frame 106c3f93c7SWojciech Malikowski* @ref vmd_app 116c3f93c7SWojciech Malikowski* @ref vmd_led 126c3f93c7SWojciech Malikowski 131e1fd9acSwawryk## Introduction {#vmd_intro} 146c3f93c7SWojciech Malikowski 156c3f93c7SWojciech MalikowskiIntel Volume Management Device is a hardware logic inside processor's Root Complex 166c3f93c7SWojciech Malikowskiresponsible for management of PCIe NVMe SSDs. It provides robust Hot Plug support 176c3f93c7SWojciech Malikowskiand Status LED management. 186c3f93c7SWojciech Malikowski 196c3f93c7SWojciech MalikowskiThe driver is responsible for enumeration and hooking NVMe devices behind VMD 206c3f93c7SWojciech Malikowskiinto SPDK PCIe subsystem. It also provides API for LED management and hot plug. 216c3f93c7SWojciech Malikowski 221e1fd9acSwawryk## Public Interface {#vmd_interface} 236c3f93c7SWojciech Malikowski 246c3f93c7SWojciech Malikowski- spdk/vmd.h 256c3f93c7SWojciech Malikowski 261e1fd9acSwawryk## Key Functions {#vmd_key_functions} 276c3f93c7SWojciech Malikowski 286c3f93c7SWojciech MalikowskiFunction | Description 296c3f93c7SWojciech Malikowski--------------------------------------- | ----------- 306c3f93c7SWojciech Malikowskispdk_vmd_init() | @copybrief spdk_vmd_init() 316c3f93c7SWojciech Malikowskispdk_vmd_pci_device_list() | @copybrief spdk_vmd_pci_device_list() 326c3f93c7SWojciech Malikowskispdk_vmd_set_led_state() | @copybrief spdk_vmd_set_led_state() 336c3f93c7SWojciech Malikowskispdk_vmd_get_led_state() | @copybrief spdk_vmd_get_led_state() 346c3f93c7SWojciech Malikowskispdk_vmd_hotplug_monitor() | @copybrief spdk_vmd_hotplug_monitor() 356c3f93c7SWojciech Malikowski 361e1fd9acSwawryk## Configuration {#vmd_config} 376c3f93c7SWojciech Malikowski 386c3f93c7SWojciech MalikowskiTo enable VMD driver enumeration, the following steps are required: 396c3f93c7SWojciech Malikowski 406c3f93c7SWojciech MalikowskiCheck for available VMD devices (VMD needs to be properly set up in BIOS first). 416c3f93c7SWojciech Malikowski 426c3f93c7SWojciech MalikowskiExample: 436c3f93c7SWojciech Malikowski``` 446c3f93c7SWojciech Malikowski$ lspci | grep 201d 456c3f93c7SWojciech Malikowski 466c3f93c7SWojciech Malikowski$ 5d:05.5 RAID bus controller: Intel Corporation Device 201d (rev 04) 476c3f93c7SWojciech Malikowski$ d7:05.5 RAID bus controller: Intel Corporation Device 201d (rev 04) 486c3f93c7SWojciech Malikowski``` 496c3f93c7SWojciech Malikowski 50a1280c98SJim HarrisRun setup.sh script with VMD devices set in PCI_ALLOWED. 516c3f93c7SWojciech Malikowski 526c3f93c7SWojciech MalikowskiExample: 536c3f93c7SWojciech Malikowski``` 54a1280c98SJim Harris$ PCI_ALLOWED="0000:5d:05.5 0000:d7:05.5" scripts/setup.sh 556c3f93c7SWojciech Malikowski``` 566c3f93c7SWojciech Malikowski 576c3f93c7SWojciech MalikowskiCheck for available devices behind the VMD with spdk_lspci. 586c3f93c7SWojciech Malikowski 596c3f93c7SWojciech MalikowskiExample: 606c3f93c7SWojciech Malikowski``` 616b9b448eSBen Walker$ ./build/bin/spdk_lspci 626c3f93c7SWojciech Malikowski 636c3f93c7SWojciech Malikowski 5d0505:01:00.0 (8086 a54) (NVMe disk behind VMD) 646c3f93c7SWojciech Malikowski 5d0505:03:00.0 (8086 a54) (NVMe disk behind VMD) 656c3f93c7SWojciech Malikowski d70505:01:00.0 (8086 a54) (NVMe disk behind VMD) 666c3f93c7SWojciech Malikowski d70505:03:00.0 (8086 a54) (NVMe disk behind VMD) 676c3f93c7SWojciech Malikowski 0000:5d:05.5 (8086 201d) (VMD) 686c3f93c7SWojciech Malikowski 0000:d7:05.5 (8086 201d) (VMD) 696c3f93c7SWojciech Malikowski``` 706c3f93c7SWojciech Malikowski 716c3f93c7SWojciech MalikowskiVMD NVMe BDF could be used as regular NVMe BDF. 726c3f93c7SWojciech Malikowski 736c3f93c7SWojciech MalikowskiExample: 746c3f93c7SWojciech Malikowski``` 756c3f93c7SWojciech Malikowski$ ./scripts/rpc.py bdev_nvme_attach_controller -b NVMe1 -t PCIe -a 5d0505:01:00.0 766c3f93c7SWojciech Malikowski``` 776c3f93c7SWojciech Malikowski 781e1fd9acSwawryk## Application framework {#vmd_app_frame} 796c3f93c7SWojciech Malikowski 806c3f93c7SWojciech MalikowskiWhen application framework is used, VMD section needs to be added to the configuration file: 816c3f93c7SWojciech Malikowski 826c3f93c7SWojciech MalikowskiJSON config: 836c3f93c7SWojciech Malikowski``` 846c3f93c7SWojciech Malikowski{ 856c3f93c7SWojciech Malikowski "subsystem": "vmd", 866c3f93c7SWojciech Malikowski "config": [ 876c3f93c7SWojciech Malikowski { 88f0441b29SKonrad Sztyber "method": "vmd_enable", 896c3f93c7SWojciech Malikowski "params": {} 906c3f93c7SWojciech Malikowski } 916c3f93c7SWojciech Malikowski ] 926c3f93c7SWojciech Malikowski} 936c3f93c7SWojciech Malikowski``` 946c3f93c7SWojciech Malikowski 956c3f93c7SWojciech Malikowskior use RPC call before framework starts e.g. 966c3f93c7SWojciech Malikowski``` 976b9b448eSBen Walker$ ./build/bin/spdk_tgt --wait_for_rpc 98f0441b29SKonrad Sztyber$ ./scripts/rpc.py vmd_enable 996c3f93c7SWojciech Malikowski$ ./scripts/rpc.py framework_start_init 1006c3f93c7SWojciech Malikowski``` 1011e1fd9acSwawryk## Applications w/o application framework {#vmd_app} 1026c3f93c7SWojciech Malikowski 1036c3f93c7SWojciech MalikowskiTo enable VMD enumeration in SPDK application that are not using application framework 104*017f65b5SBen Walkere.g spdk_nvme_perf, spdk_nvme_identify -V flag is required - please refer to app help if it supports VMD. 1056c3f93c7SWojciech Malikowski 1066c3f93c7SWojciech MalikowskiApplications need to call spdk_vmd_init() to enumerate NVMe devices behind the VMD prior to calling 1076c3f93c7SWojciech Malikowskispdk_nvme_(probe|connect). 1086c3f93c7SWojciech MalikowskiTo support hot plugs spdk_vmd_hotplug_monitor() needs to be called periodically. 1096c3f93c7SWojciech Malikowski 1101e1fd9acSwawryk## LED management {#vmd_led} 1116c3f93c7SWojciech Malikowski 1126c3f93c7SWojciech MalikowskiVMD LED utility in the [examples/vmd/led](https://github.com/spdk/spdk/tree/master/examples/vmd/led) 1136c3f93c7SWojciech Malikowskicould be used to set LED states. 114bc1a01c1SKonrad Sztyber 115bc1a01c1SKonrad SztyberIn order to verify that a platform is correctly configured to support LED management, ledctl(8) can 116bc1a01c1SKonrad Sztyberbe utilized. For instructions on how to use it, consult the manual page of this utility. 117