]> git.ipfire.org Git - thirdparty/mdadm.git/commitdiff
IMSM: Add support for Non-Intel NVMe drives under VMD
authorPawel Baldysiak <pawel.baldysiak@intel.com>
Mon, 12 Dec 2016 10:28:44 +0000 (11:28 +0100)
committerJes Sorensen <Jes.Sorensen@redhat.com>
Mon, 12 Dec 2016 19:23:39 +0000 (14:23 -0500)
This patch adds checking if platform (preOS) supports
non-Intel NVMe drives under VMD domain,
and - if so - allow creating IMSM Raid Volume
with those drives.

Signed-off-by: Pawel Baldysiak <pawel.baldysiak@intel.com>
Signed-off-by: Jes Sorensen <Jes.Sorensen@redhat.com>
platform-intel.h
super-intel.c

index a8ae85f4de836b2b66214a1cfdb888af135accb5..4851074c3fcab2c09ce4226c7a8ae39c6dea2b04 100644 (file)
@@ -99,6 +99,8 @@ struct imsm_orom {
        #define IMSM_OROM_CAPABILITIES_Rohi (1 << 5)
        #define IMSM_OROM_CAPABILITIES_ReadPatrol (1 << 6)
        #define IMSM_OROM_CAPABILITIES_XorHw (1 << 7)
+       #define IMSM_OROM_CAPABILITIES_SKUMode ((1 << 8)|(1 << 9))
+       #define IMSM_OROM_CAPABILITIES_TPV (1 << 10)
 } __attribute__((packed));
 
 static inline int imsm_orom_has_raid0(const struct imsm_orom *orom)
@@ -184,6 +186,11 @@ static inline int imsm_orom_is_nvme(const struct imsm_orom *orom)
                        sizeof(orom->signature)) == 0;
 }
 
+static inline int imsm_orom_has_tpv_support(const struct imsm_orom *orom)
+{
+       return !!(orom->driver_features & IMSM_OROM_CAPABILITIES_TPV);
+}
+
 enum sys_dev_type {
        SYS_DEV_UNKNOWN = 0,
        SYS_DEV_SAS,
index 0407d43071f014ab4fcc1a6ae6af0a4eb260588c..cee6951fa8ed9aaf25d0534ca59b034dd89e3de8 100644 (file)
@@ -2199,9 +2199,6 @@ static int print_vmd_attached_devs(struct sys_dev *hba)
                        continue;
 
                sprintf(path, "/sys/bus/pci/drivers/nvme/%s", ent->d_name);
-               /* if not a intel NVMe - skip it*/
-               if (devpath_to_vendor(path) != 0x8086)
-                       continue;
 
                rp = realpath(path, NULL);
                if (!rp)
@@ -2416,6 +2413,8 @@ static int detail_platform_imsm(int verbose, int enumerate_only, char *controlle
        for (entry = orom_entries; entry; entry = entry->next) {
                if (entry->type == SYS_DEV_VMD) {
                        print_imsm_capability(&entry->orom);
+                       printf(" 3rd party NVMe :%s supported\n",
+                           imsm_orom_has_tpv_support(&entry->orom)?"":" not");
                        for (hba = list; hba; hba = hba->next) {
                                if (hba->type == SYS_DEV_VMD) {
                                        char buf[PATH_MAX];
@@ -5609,6 +5608,13 @@ static int add_to_super_imsm(struct supertype *st, mdu_disk_info_t *dk,
                                                "\tRAID 0 is the only supported configuration for this type of x8 device.\n");
                                break;
                        }
+               } else if (super->hba->type == SYS_DEV_VMD && super->orom &&
+                   !imsm_orom_has_tpv_support(super->orom)) {
+                       pr_err("\tPlatform configuration does not support non-Intel NVMe drives.\n"
+                              "\tPlease refer to Intel(R) RSTe user guide.\n");
+                       free(dd->devname);
+                       free(dd);
+                       return 1;
                }
        }