xref: /spdk/doc/vmd.md (revision 017f65b5f153f2c2e80798fa09f25d052523578e)
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