All of lore.kernel.org
 help / color / mirror / Atom feed
* [PATCH 0/2] imsm: fixes for platform capabilities checking
@ 2014-02-28 10:29 Artur Paszkiewicz
  2014-02-28 10:29 ` [PATCH 1/2] imsm: support for second AHCI controller in EFI mode Artur Paszkiewicz
  2014-02-28 10:29 ` [PATCH 2/2] imsm: improved platform capabilities checking Artur Paszkiewicz
  0 siblings, 2 replies; 3+ messages in thread
From: Artur Paszkiewicz @ 2014-02-28 10:29 UTC (permalink / raw)
  To: neilb; +Cc: linux-raid, pawel.baldysiak, Artur Paszkiewicz

These patches correct the behavior of mdadm on Intel platforms with more
than one AHCI controller with RAID capabilities.

When only one controller had RAID mode enabled in BIOS, IMSM platform
capabilities would be detected on both controllers. In EFI mode in some
situations IMSM capabilities were not detected at all.

Artur Paszkiewicz (2):
  imsm: support for second AHCI controller in EFI mode
  imsm: improved platform capabilities checking

 platform-intel.c | 27 +++++++++++++++++++++++----
 platform-intel.h |  3 ++-
 super-intel.c    | 13 ++++++-------
 3 files changed, 31 insertions(+), 12 deletions(-)

-- 
1.8.4.5


^ permalink raw reply	[flat|nested] 3+ messages in thread

* [PATCH 1/2] imsm: support for second AHCI controller in EFI mode
  2014-02-28 10:29 [PATCH 0/2] imsm: fixes for platform capabilities checking Artur Paszkiewicz
@ 2014-02-28 10:29 ` Artur Paszkiewicz
  2014-02-28 10:29 ` [PATCH 2/2] imsm: improved platform capabilities checking Artur Paszkiewicz
  1 sibling, 0 replies; 3+ messages in thread
From: Artur Paszkiewicz @ 2014-02-28 10:29 UTC (permalink / raw)
  To: neilb; +Cc: linux-raid, pawel.baldysiak, Artur Paszkiewicz

mdadm was unable to find IMSM platform capabilities when only the second
AHCI controller was enabled on a platform in EFI mode. The second AHCI
controller uses a different EFI variable and this patch adds support for
reading this variable.

Signed-off-by: Artur Paszkiewicz <artur.paszkiewicz@intel.com>
Reviewed-by: Lukasz Dorau <lukasz.dorau@intel.com>
---
 platform-intel.c | 11 ++++++++++-
 1 file changed, 10 insertions(+), 1 deletion(-)

diff --git a/platform-intel.c b/platform-intel.c
index f347382..77f8639 100644
--- a/platform-intel.c
+++ b/platform-intel.c
@@ -343,6 +343,7 @@ static const struct imsm_orom *find_imsm_hba_orom(enum sys_dev_type hba_id)
 #define SYS_EFI_VAR_PATH "/sys/firmware/efi/vars"
 #define SCU_PROP "RstScuV"
 #define AHCI_PROP "RstSataV"
+#define AHCI_SSATA_PROP "RstsSatV"
 
 #define VENDOR_GUID \
 	EFI_GUID(0x193dfefa, 0xa445, 0x4302, 0x99, 0xd8, 0xef, 0x3a, 0xad, 0x1a, 0x04, 0xc6)
@@ -397,6 +398,8 @@ int read_efi_variable(void *buffer, ssize_t buf_size, char *variable_name, struc
 
 const struct imsm_orom *find_imsm_efi(enum sys_dev_type hba_id)
 {
+	int err;
+
 	if (hba_id >= SYS_DEV_MAX)
 		return NULL;
 
@@ -419,7 +422,13 @@ const struct imsm_orom *find_imsm_efi(enum sys_dev_type hba_id)
 	if (check_env("IMSM_TEST_OROM"))
 		return NULL;
 
-	if (read_efi_variable(&imsm_efi[hba_id], sizeof(imsm_efi[0]), hba_id == SYS_DEV_SAS ? SCU_PROP : AHCI_PROP, VENDOR_GUID)) {
+	err = read_efi_variable(&imsm_efi[hba_id], sizeof(imsm_efi[0]), hba_id == SYS_DEV_SAS ? SCU_PROP : AHCI_PROP, VENDOR_GUID);
+
+	/* try to read variable for second AHCI controller */
+	if (err && hba_id == SYS_DEV_SATA)
+		err = read_efi_variable(&imsm_efi[hba_id], sizeof(imsm_efi[0]), AHCI_SSATA_PROP, VENDOR_GUID);
+
+	if (err) {
 		populated_efi[hba_id] = 0;
 		return NULL;
 	}
-- 
1.8.4.5


^ permalink raw reply related	[flat|nested] 3+ messages in thread

* [PATCH 2/2] imsm: improved platform capabilities checking
  2014-02-28 10:29 [PATCH 0/2] imsm: fixes for platform capabilities checking Artur Paszkiewicz
  2014-02-28 10:29 ` [PATCH 1/2] imsm: support for second AHCI controller in EFI mode Artur Paszkiewicz
@ 2014-02-28 10:29 ` Artur Paszkiewicz
  1 sibling, 0 replies; 3+ messages in thread
From: Artur Paszkiewicz @ 2014-02-28 10:29 UTC (permalink / raw)
  To: neilb; +Cc: linux-raid, pawel.baldysiak, Artur Paszkiewicz

This patch ensures that on Intel platforms only AHCI controllers with
RAID mode enabled are seen as IMSM capable by mdadm.

Signed-off-by: Artur Paszkiewicz <artur.paszkiewicz@intel.com>
Reviewed-by: Lukasz Dorau <lukasz.dorau@intel.com>
---
 platform-intel.c | 16 +++++++++++++---
 platform-intel.h |  3 ++-
 super-intel.c    | 13 ++++++-------
 3 files changed, 21 insertions(+), 11 deletions(-)

diff --git a/platform-intel.c b/platform-intel.c
index 77f8639..3d4d9c7 100644
--- a/platform-intel.c
+++ b/platform-intel.c
@@ -59,6 +59,7 @@ struct sys_dev *find_driver_devices(const char *bus, const char *driver)
 	struct sys_dev *list = NULL;
 	enum sys_dev_type type;
 	unsigned long long dev_id;
+	unsigned long long class;
 
 	if (strcmp(driver, "isci") == 0)
 		type = SYS_DEV_SAS;
@@ -99,6 +100,9 @@ struct sys_dev *find_driver_devices(const char *bus, const char *driver)
 		if (devpath_to_ll(path, "device", &dev_id) != 0)
 			continue;
 
+		if (devpath_to_ll(path, "class", &class) != 0)
+			continue;
+
 		/* start / add list entry */
 		if (!head) {
 			head = xmalloc(sizeof(*head));
@@ -114,6 +118,7 @@ struct sys_dev *find_driver_devices(const char *bus, const char *driver)
 		}
 
 		list->dev_id = (__u16) dev_id;
+		list->class = (__u32) class;
 		list->type = type;
 		list->path = realpath(path, NULL);
 		list->next = NULL;
@@ -348,6 +353,8 @@ static const struct imsm_orom *find_imsm_hba_orom(enum sys_dev_type hba_id)
 #define VENDOR_GUID \
 	EFI_GUID(0x193dfefa, 0xa445, 0x4302, 0x99, 0xd8, 0xef, 0x3a, 0xad, 0x1a, 0x04, 0xc6)
 
+#define PCI_CLASS_RAID_CNTRL 0x010400
+
 int populated_efi[SYS_DEV_MAX] = { 0, 0 };
 
 static struct imsm_orom imsm_efi[SYS_DEV_MAX];
@@ -445,13 +452,16 @@ const struct imsm_orom *find_imsm_orom(void)
 	return find_imsm_hba_orom(SYS_DEV_SATA);
 }
 
-const struct imsm_orom *find_imsm_capability(enum sys_dev_type hba_id)
+const struct imsm_orom *find_imsm_capability(struct sys_dev *hba)
 {
 	const struct imsm_orom *cap=NULL;
 
-	if ((cap = find_imsm_efi(hba_id)) != NULL)
+	if (hba->type == SYS_DEV_SATA && hba->class != PCI_CLASS_RAID_CNTRL)
+		return NULL;
+
+	if ((cap = find_imsm_efi(hba->type)) != NULL)
 		return cap;
-	if ((cap = find_imsm_hba_orom(hba_id)) != NULL)
+	if ((cap = find_imsm_hba_orom(hba->type)) != NULL)
 		return cap;
 	return NULL;
 }
diff --git a/platform-intel.h b/platform-intel.h
index bcd84b7..6887097 100644
--- a/platform-intel.h
+++ b/platform-intel.h
@@ -180,6 +180,7 @@ struct sys_dev {
 	char *path;
 	char *pci_id;
 	__u16  dev_id;
+	__u32  class;
 	struct sys_dev *next;
 };
 
@@ -201,7 +202,7 @@ static inline char *guid_str(char *buf, struct efi_guid guid)
 char *diskfd_to_devpath(int fd);
 struct sys_dev *find_driver_devices(const char *bus, const char *driver);
 struct sys_dev *find_intel_devices(void);
-const struct imsm_orom *find_imsm_capability(enum sys_dev_type hba_id);
+const struct imsm_orom *find_imsm_capability(struct sys_dev *hba);
 const struct imsm_orom *find_imsm_orom(void);
 int disk_attached_to_hba(int fd, const char *hba_path);
 char *devt_to_devpath(dev_t dev);
diff --git a/super-intel.c b/super-intel.c
index f0a7ab5..b21fe67 100644
--- a/super-intel.c
+++ b/super-intel.c
@@ -1886,13 +1886,12 @@ static int detail_platform_imsm(int verbose, int enumerate_only, char *controlle
 		if (!list)
 			return 2;
 		for (hba = list; hba; hba = hba->next) {
-			orom = find_imsm_capability(hba->type);
-			if (!orom) {
-				result = 2;
+			if (find_imsm_capability(hba)) {
+				result = 0;
 				break;
 			}
 			else
-				result = 0;
+				result = 2;
 		}
 		return result;
 	}
@@ -1909,7 +1908,7 @@ static int detail_platform_imsm(int verbose, int enumerate_only, char *controlle
 	for (hba = list; hba; hba = hba->next) {
 		if (controller_path && (compare_paths(hba->path,controller_path) != 0))
 			continue;
-		orom = find_imsm_capability(hba->type);
+		orom = find_imsm_capability(hba);
 		if (!orom)
 			pr_err("imsm capabilities not found for controller: %s (type %s)\n",
 				hba->path, get_sys_dev_type(hba->type));
@@ -1954,7 +1953,7 @@ static int export_detail_platform_imsm(int verbose, char *controller_path)
 	for (hba = list; hba; hba = hba->next) {
 		if (controller_path && (compare_paths(hba->path,controller_path) != 0))
 			continue;
-		orom = find_imsm_capability(hba->type);
+		orom = find_imsm_capability(hba);
 		if (!orom) {
 			if (verbose > 0)
 				pr_err("IMSM_DETAIL_PLATFORM_ERROR=NO_IMSM_CAPABLE_DEVICE_UNDER_%s\n",hba->path);
@@ -3839,7 +3838,7 @@ static int find_intel_hba_capability(int fd, struct intel_super *super, char *de
 		}
 		return 2;
 	}
-	super->orom = find_imsm_capability(hba_name->type);
+	super->orom = find_imsm_capability(hba_name);
 	if (!super->orom)
 		return 3;
 	return 0;
-- 
1.8.4.5


^ permalink raw reply related	[flat|nested] 3+ messages in thread

end of thread, other threads:[~2014-02-28 10:29 UTC | newest]

Thread overview: 3+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2014-02-28 10:29 [PATCH 0/2] imsm: fixes for platform capabilities checking Artur Paszkiewicz
2014-02-28 10:29 ` [PATCH 1/2] imsm: support for second AHCI controller in EFI mode Artur Paszkiewicz
2014-02-28 10:29 ` [PATCH 2/2] imsm: improved platform capabilities checking Artur Paszkiewicz

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.