All of lore.kernel.org
 help / color / mirror / Atom feed
From: "Kweh, Hock Leong" <hock.leong.kweh@intel.com>
To: Ming Lei <ming.lei@canonical.com>,
	Matt Fleming <matt@console-pimps.org>,
	Greg Kroah-Hartman <gregkh@linuxfoundation.org>
Cc: Ong Boon Leong <boon.leong.ong@intel.com>,
	"Kweh, Hock Leong" <hock.leong.kweh@intel.com>,
	LKML <linux-kernel@vger.kernel.org>,
	linux-efi@vger.kernel.org,
	Sam Protsenko <semen.protsenko@linaro.org>,
	Peter Jones <pjones@redhat.com>,
	Andy Lutomirski <luto@amacapital.net>,
	Roy Franz <roy.franz@linaro.org>, Borislav Petkov <bp@alien8.de>
Subject: [PATCH v4 2/2] efi: an sysfs interface for user to update efi firmware
Date: Tue, 14 Apr 2015 17:44:56 +0800	[thread overview]
Message-ID: <1429004697-28320-3-git-send-email-hock.leong.kweh@intel.com> (raw)
In-Reply-To: <1429004697-28320-1-git-send-email-hock.leong.kweh@intel.com>

From: "Kweh, Hock Leong" <hock.leong.kweh@intel.com>

Introducing a kernel module to expose capsule loader interface
for user to upload capsule binaries. This module leverage the
request_firmware_direct_full_path() to obtain the binary at a
specific path input by user.

Example method to load the capsule binary:
echo -n "/path/to/capsule/binary" > /sys/devices/platform/efi_capsule_loader/capsule_loader

Cc: Matt Fleming <matt.fleming@intel.com>
Signed-off-by: Kweh, Hock Leong <hock.leong.kweh@intel.com>
---
 drivers/firmware/efi/Kconfig              |   12 ++
 drivers/firmware/efi/Makefile             |    1 +
 drivers/firmware/efi/efi-capsule-loader.c |  169 +++++++++++++++++++++++++++++
 3 files changed, 182 insertions(+)
 create mode 100644 drivers/firmware/efi/efi-capsule-loader.c

diff --git a/drivers/firmware/efi/Kconfig b/drivers/firmware/efi/Kconfig
index f712d47..3e84ec0 100644
--- a/drivers/firmware/efi/Kconfig
+++ b/drivers/firmware/efi/Kconfig
@@ -60,6 +60,18 @@ config EFI_RUNTIME_WRAPPERS
 config EFI_ARMSTUB
 	bool
 
+config EFI_CAPSULE_LOADER
+	tristate "EFI capsule loader"
+	depends on EFI
+	select FW_LOADER
+	help
+	  This option exposes a loader interface for user to load EFI
+	  capsule binary and update the EFI firmware through system reboot.
+	  This feature does not support auto locating capsule binaries at the
+	  firmware lib search path.
+
+	  If unsure, say N.
+
 endmenu
 
 config UEFI_CPER
diff --git a/drivers/firmware/efi/Makefile b/drivers/firmware/efi/Makefile
index 698846e..5ab031a 100644
--- a/drivers/firmware/efi/Makefile
+++ b/drivers/firmware/efi/Makefile
@@ -8,3 +8,4 @@ obj-$(CONFIG_UEFI_CPER)			+= cper.o
 obj-$(CONFIG_EFI_RUNTIME_MAP)		+= runtime-map.o
 obj-$(CONFIG_EFI_RUNTIME_WRAPPERS)	+= runtime-wrappers.o
 obj-$(CONFIG_EFI_STUB)			+= libstub/
+obj-$(CONFIG_EFI_CAPSULE_LOADER)	+= efi-capsule-loader.o
diff --git a/drivers/firmware/efi/efi-capsule-loader.c b/drivers/firmware/efi/efi-capsule-loader.c
new file mode 100644
index 0000000..84b979b
--- /dev/null
+++ b/drivers/firmware/efi/efi-capsule-loader.c
@@ -0,0 +1,169 @@
+/*
+ * EFI capsule loader driver.
+ *
+ * Copyright 2015 Intel Corporation
+ *
+ * This file is part of the Linux kernel, and is made available under
+ * the terms of the GNU General Public License version 2.
+ */
+
+#define pr_fmt(fmt) KBUILD_MODNAME ": " fmt
+
+#include <linux/kernel.h>
+#include <linux/module.h>
+#include <linux/platform_device.h>
+#include <linux/highmem.h>
+#include <linux/slab.h>
+#include <linux/mutex.h>
+#include <linux/efi.h>
+#include <linux/firmware.h>
+
+#define DEV_NAME "efi_capsule_loader"
+
+static DEFINE_MUTEX(capsule_loader_lock);
+static struct platform_device *efi_capsule_pdev;
+
+/*
+ * This function will store the capsule binary and pass it to
+ * efi_capsule_update() API in capsule.c
+ */
+static int efi_capsule_store(const struct firmware *fw)
+{
+	int i;
+	int ret;
+	int count = fw->size;
+	int copy_size = (fw->size > PAGE_SIZE) ? PAGE_SIZE : fw->size;
+	int pages_needed = ALIGN(fw->size, PAGE_SIZE) >> PAGE_SHIFT;
+	struct page **pages;
+	void *page_data;
+	efi_capsule_header_t *capsule = NULL;
+
+	if (!count) {
+		pr_err("%s: Received zero binary size\n", __func__);
+		return -ENOENT;
+	}
+
+	pages = kmalloc_array(pages_needed, sizeof(void *), GFP_KERNEL);
+	if (!pages) {
+		pr_err("%s: kmalloc_array() failed\n", __func__);
+		return -ENOMEM;
+	}
+
+	for (i = 0; i < pages_needed; i++) {
+		pages[i] = alloc_page(GFP_KERNEL);
+		if (!pages[i]) {
+			pr_err("%s: alloc_page() failed\n", __func__);
+			--i;
+			ret = -ENOMEM;
+			goto failed;
+		}
+	}
+
+	for (i = 0; i < pages_needed; i++) {
+		page_data = kmap(pages[i]);
+		memcpy(page_data, fw->data + (i * PAGE_SIZE), copy_size);
+
+		if (i == 0)
+			capsule = (efi_capsule_header_t *)page_data;
+		else
+			kunmap(pages[i]);
+
+		count -= copy_size;
+		if (count < PAGE_SIZE)
+			copy_size = count;
+	}
+
+	ret = efi_capsule_update(capsule, pages);
+	if (ret) {
+		pr_err("%s: efi_capsule_update() failed\n", __func__);
+		--i;
+		goto failed;
+	}
+	kunmap(pages[0]);
+
+	/*
+	 * we cannot free the pages here due to reboot need that data
+	 * maintained.
+	 */
+	return 0;
+
+failed:
+	while (i >= 0)
+		__free_page(pages[i--]);
+	kfree(pages);
+	return ret;
+}
+
+static ssize_t capsule_loader_store(struct device *dev,
+				    struct device_attribute *attr,
+				    const char *buf, size_t count)
+{
+	int ret = -EBUSY;
+	const struct firmware *fw;
+
+	pr_debug("%s: Received path = %s\n", __func__, buf);
+	if (mutex_trylock(&capsule_loader_lock)) {
+		ret = request_firmware_direct_full_path(&fw, buf,
+							&efi_capsule_pdev->dev);
+		if (ret) {
+			pr_err("%s: request_firmware_direct_full_path() %s\n",
+			       __func__,
+			       "failed");
+			mutex_unlock(&capsule_loader_lock);
+			return ret;
+		}
+
+		ret = efi_capsule_store(fw);
+		if (ret)
+			pr_err("%s: %s, return error code = %d\n",
+			       __func__,
+			       "Failed to store capsule binary",
+			       ret);
+		release_firmware(fw);
+		mutex_unlock(&capsule_loader_lock);
+	}
+
+	return ret ? ret : count;
+}
+static DEVICE_ATTR_WO(capsule_loader);
+
+static int __init efi_capsule_loader_init(void)
+{
+	int ret = 0;
+
+	efi_capsule_pdev = platform_device_register_simple(DEV_NAME,
+							   PLATFORM_DEVID_NONE,
+							   NULL, 0);
+	if (IS_ERR(efi_capsule_pdev)) {
+		pr_err("%s: platform_device_register_simple() failed\n",
+		       __func__);
+		return PTR_ERR(efi_capsule_pdev);
+	}
+
+	/*
+	 * create this file node for user to pass in the full path of the
+	 * capsule binary
+	 */
+	ret = device_create_file(&efi_capsule_pdev->dev,
+				 &dev_attr_capsule_loader);
+	if (ret) {
+		pr_err("%s: device_create_file() failed\n", __func__);
+		platform_device_unregister(efi_capsule_pdev);
+	}
+
+	return ret;
+}
+module_init(efi_capsule_loader_init);
+
+/*
+ * To remove this kernel module, just perform:
+ * rmmod efi_capsule_loader.ko
+ */
+static void __exit efi_capsule_loader_exit(void)
+{
+	platform_device_unregister(efi_capsule_pdev);
+}
+module_exit(efi_capsule_loader_exit);
+
+MODULE_DESCRIPTION("EFI capsule firmware binary loader");
+MODULE_LICENSE("GPL v2");
-- 
1.7.9.5


WARNING: multiple messages have this Message-ID (diff)
From: "Kweh, Hock Leong" <hock.leong.kweh-ral2JQCrhuEAvxtiuMwx3w@public.gmane.org>
To: Ming Lei <ming.lei-Z7WLFzj8eWMS+FvcfC7Uqw@public.gmane.org>,
	Matt Fleming
	<matt-HNK1S37rvNbeXh+fF434Mdi2O/JbrIOy@public.gmane.org>,
	Greg Kroah-Hartman
	<gregkh-hQyY1W1yCW8ekmWlsbkhG0B+6BGkLq7r@public.gmane.org>
Cc: Ong Boon Leong
	<boon.leong.ong-ral2JQCrhuEAvxtiuMwx3w@public.gmane.org>,
	"Kweh,
	Hock Leong"
	<hock.leong.kweh-ral2JQCrhuEAvxtiuMwx3w@public.gmane.org>,
	LKML <linux-kernel-u79uwXL29TY76Z2rM5mHXA@public.gmane.org>,
	linux-efi-u79uwXL29TY76Z2rM5mHXA@public.gmane.org,
	Sam Protsenko
	<semen.protsenko-QSEj5FYQhm4dnm+yROfE0A@public.gmane.org>,
	Peter Jones <pjones-H+wXaHxf7aLQT0dZR+AlfA@public.gmane.org>,
	Andy Lutomirski <luto-kltTT9wpgjJwATOyAt5JVQ@public.gmane.org>,
	Roy Franz <roy.franz-QSEj5FYQhm4dnm+yROfE0A@public.gmane.org>,
	Borislav Petkov <bp-Gina5bIWoIWzQB+pC5nmwQ@public.gmane.org>
Subject: [PATCH v4 2/2] efi: an sysfs interface for user to update efi firmware
Date: Tue, 14 Apr 2015 17:44:56 +0800	[thread overview]
Message-ID: <1429004697-28320-3-git-send-email-hock.leong.kweh@intel.com> (raw)
In-Reply-To: <1429004697-28320-1-git-send-email-hock.leong.kweh-ral2JQCrhuEAvxtiuMwx3w@public.gmane.org>

From: "Kweh, Hock Leong" <hock.leong.kweh-ral2JQCrhuEAvxtiuMwx3w@public.gmane.org>

Introducing a kernel module to expose capsule loader interface
for user to upload capsule binaries. This module leverage the
request_firmware_direct_full_path() to obtain the binary at a
specific path input by user.

Example method to load the capsule binary:
echo -n "/path/to/capsule/binary" > /sys/devices/platform/efi_capsule_loader/capsule_loader

Cc: Matt Fleming <matt.fleming-ral2JQCrhuEAvxtiuMwx3w@public.gmane.org>
Signed-off-by: Kweh, Hock Leong <hock.leong.kweh-ral2JQCrhuEAvxtiuMwx3w@public.gmane.org>
---
 drivers/firmware/efi/Kconfig              |   12 ++
 drivers/firmware/efi/Makefile             |    1 +
 drivers/firmware/efi/efi-capsule-loader.c |  169 +++++++++++++++++++++++++++++
 3 files changed, 182 insertions(+)
 create mode 100644 drivers/firmware/efi/efi-capsule-loader.c

diff --git a/drivers/firmware/efi/Kconfig b/drivers/firmware/efi/Kconfig
index f712d47..3e84ec0 100644
--- a/drivers/firmware/efi/Kconfig
+++ b/drivers/firmware/efi/Kconfig
@@ -60,6 +60,18 @@ config EFI_RUNTIME_WRAPPERS
 config EFI_ARMSTUB
 	bool
 
+config EFI_CAPSULE_LOADER
+	tristate "EFI capsule loader"
+	depends on EFI
+	select FW_LOADER
+	help
+	  This option exposes a loader interface for user to load EFI
+	  capsule binary and update the EFI firmware through system reboot.
+	  This feature does not support auto locating capsule binaries at the
+	  firmware lib search path.
+
+	  If unsure, say N.
+
 endmenu
 
 config UEFI_CPER
diff --git a/drivers/firmware/efi/Makefile b/drivers/firmware/efi/Makefile
index 698846e..5ab031a 100644
--- a/drivers/firmware/efi/Makefile
+++ b/drivers/firmware/efi/Makefile
@@ -8,3 +8,4 @@ obj-$(CONFIG_UEFI_CPER)			+= cper.o
 obj-$(CONFIG_EFI_RUNTIME_MAP)		+= runtime-map.o
 obj-$(CONFIG_EFI_RUNTIME_WRAPPERS)	+= runtime-wrappers.o
 obj-$(CONFIG_EFI_STUB)			+= libstub/
+obj-$(CONFIG_EFI_CAPSULE_LOADER)	+= efi-capsule-loader.o
diff --git a/drivers/firmware/efi/efi-capsule-loader.c b/drivers/firmware/efi/efi-capsule-loader.c
new file mode 100644
index 0000000..84b979b
--- /dev/null
+++ b/drivers/firmware/efi/efi-capsule-loader.c
@@ -0,0 +1,169 @@
+/*
+ * EFI capsule loader driver.
+ *
+ * Copyright 2015 Intel Corporation
+ *
+ * This file is part of the Linux kernel, and is made available under
+ * the terms of the GNU General Public License version 2.
+ */
+
+#define pr_fmt(fmt) KBUILD_MODNAME ": " fmt
+
+#include <linux/kernel.h>
+#include <linux/module.h>
+#include <linux/platform_device.h>
+#include <linux/highmem.h>
+#include <linux/slab.h>
+#include <linux/mutex.h>
+#include <linux/efi.h>
+#include <linux/firmware.h>
+
+#define DEV_NAME "efi_capsule_loader"
+
+static DEFINE_MUTEX(capsule_loader_lock);
+static struct platform_device *efi_capsule_pdev;
+
+/*
+ * This function will store the capsule binary and pass it to
+ * efi_capsule_update() API in capsule.c
+ */
+static int efi_capsule_store(const struct firmware *fw)
+{
+	int i;
+	int ret;
+	int count = fw->size;
+	int copy_size = (fw->size > PAGE_SIZE) ? PAGE_SIZE : fw->size;
+	int pages_needed = ALIGN(fw->size, PAGE_SIZE) >> PAGE_SHIFT;
+	struct page **pages;
+	void *page_data;
+	efi_capsule_header_t *capsule = NULL;
+
+	if (!count) {
+		pr_err("%s: Received zero binary size\n", __func__);
+		return -ENOENT;
+	}
+
+	pages = kmalloc_array(pages_needed, sizeof(void *), GFP_KERNEL);
+	if (!pages) {
+		pr_err("%s: kmalloc_array() failed\n", __func__);
+		return -ENOMEM;
+	}
+
+	for (i = 0; i < pages_needed; i++) {
+		pages[i] = alloc_page(GFP_KERNEL);
+		if (!pages[i]) {
+			pr_err("%s: alloc_page() failed\n", __func__);
+			--i;
+			ret = -ENOMEM;
+			goto failed;
+		}
+	}
+
+	for (i = 0; i < pages_needed; i++) {
+		page_data = kmap(pages[i]);
+		memcpy(page_data, fw->data + (i * PAGE_SIZE), copy_size);
+
+		if (i == 0)
+			capsule = (efi_capsule_header_t *)page_data;
+		else
+			kunmap(pages[i]);
+
+		count -= copy_size;
+		if (count < PAGE_SIZE)
+			copy_size = count;
+	}
+
+	ret = efi_capsule_update(capsule, pages);
+	if (ret) {
+		pr_err("%s: efi_capsule_update() failed\n", __func__);
+		--i;
+		goto failed;
+	}
+	kunmap(pages[0]);
+
+	/*
+	 * we cannot free the pages here due to reboot need that data
+	 * maintained.
+	 */
+	return 0;
+
+failed:
+	while (i >= 0)
+		__free_page(pages[i--]);
+	kfree(pages);
+	return ret;
+}
+
+static ssize_t capsule_loader_store(struct device *dev,
+				    struct device_attribute *attr,
+				    const char *buf, size_t count)
+{
+	int ret = -EBUSY;
+	const struct firmware *fw;
+
+	pr_debug("%s: Received path = %s\n", __func__, buf);
+	if (mutex_trylock(&capsule_loader_lock)) {
+		ret = request_firmware_direct_full_path(&fw, buf,
+							&efi_capsule_pdev->dev);
+		if (ret) {
+			pr_err("%s: request_firmware_direct_full_path() %s\n",
+			       __func__,
+			       "failed");
+			mutex_unlock(&capsule_loader_lock);
+			return ret;
+		}
+
+		ret = efi_capsule_store(fw);
+		if (ret)
+			pr_err("%s: %s, return error code = %d\n",
+			       __func__,
+			       "Failed to store capsule binary",
+			       ret);
+		release_firmware(fw);
+		mutex_unlock(&capsule_loader_lock);
+	}
+
+	return ret ? ret : count;
+}
+static DEVICE_ATTR_WO(capsule_loader);
+
+static int __init efi_capsule_loader_init(void)
+{
+	int ret = 0;
+
+	efi_capsule_pdev = platform_device_register_simple(DEV_NAME,
+							   PLATFORM_DEVID_NONE,
+							   NULL, 0);
+	if (IS_ERR(efi_capsule_pdev)) {
+		pr_err("%s: platform_device_register_simple() failed\n",
+		       __func__);
+		return PTR_ERR(efi_capsule_pdev);
+	}
+
+	/*
+	 * create this file node for user to pass in the full path of the
+	 * capsule binary
+	 */
+	ret = device_create_file(&efi_capsule_pdev->dev,
+				 &dev_attr_capsule_loader);
+	if (ret) {
+		pr_err("%s: device_create_file() failed\n", __func__);
+		platform_device_unregister(efi_capsule_pdev);
+	}
+
+	return ret;
+}
+module_init(efi_capsule_loader_init);
+
+/*
+ * To remove this kernel module, just perform:
+ * rmmod efi_capsule_loader.ko
+ */
+static void __exit efi_capsule_loader_exit(void)
+{
+	platform_device_unregister(efi_capsule_pdev);
+}
+module_exit(efi_capsule_loader_exit);
+
+MODULE_DESCRIPTION("EFI capsule firmware binary loader");
+MODULE_LICENSE("GPL v2");
-- 
1.7.9.5

  parent reply	other threads:[~2015-04-14  1:45 UTC|newest]

Thread overview: 109+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2015-04-14  9:44 [PATCH v4 0/2] Enable capsule loader interface for efi firmware updating Kweh, Hock Leong
2015-04-14  9:44 ` Kweh, Hock Leong
2015-04-14  9:44 ` [PATCH v4 1/2] firmware_loader: introduce new API - request_firmware_direct_full_path() Kweh, Hock Leong
2015-04-14  9:44   ` Kweh, Hock Leong
2015-04-14 14:08   ` Greg Kroah-Hartman
2015-04-14 15:56     ` Andy Lutomirski
2015-04-14 16:18       ` Borislav Petkov
2015-04-14 16:18         ` Borislav Petkov
2015-04-15 10:14         ` Matt Fleming
2015-04-15 10:14           ` Matt Fleming
2015-04-15 10:18           ` Borislav Petkov
2015-04-15 10:18             ` Borislav Petkov
2015-04-15 11:09             ` Matt Fleming
2015-04-15 11:09               ` Matt Fleming
2015-04-15 13:15       ` Greg Kroah-Hartman
2015-04-15 13:15         ` Greg Kroah-Hartman
2015-04-15 15:53         ` Andy Lutomirski
2015-04-15 12:48   ` Matt Fleming
2015-04-15 12:48     ` Matt Fleming
2015-04-14  9:44 ` Kweh, Hock Leong [this message]
2015-04-14  9:44   ` [PATCH v4 2/2] efi: an sysfs interface for user to update efi firmware Kweh, Hock Leong
2015-04-14 14:09   ` Greg Kroah-Hartman
2015-04-14 14:09     ` Greg Kroah-Hartman
2015-04-14 15:52     ` Andy Lutomirski
2015-04-14 15:52       ` Andy Lutomirski
2015-04-15 13:20       ` Greg Kroah-Hartman
2015-04-15 13:20         ` Greg Kroah-Hartman
2015-04-15 15:45         ` Andy Lutomirski
2015-04-15 15:45           ` Andy Lutomirski
2015-04-16  0:19           ` Roy Franz
2015-04-16  0:19             ` Roy Franz
2015-04-17 13:50             ` Greg KH
2015-04-17 13:50               ` Greg KH
2015-04-15 11:32     ` Kweh, Hock Leong
2015-04-15 11:32       ` Kweh, Hock Leong
2015-04-15 13:19       ` Greg Kroah-Hartman
2015-04-15 13:19         ` Greg Kroah-Hartman
2015-04-16  9:42         ` Kweh, Hock Leong
2015-04-17 13:49           ` Greg Kroah-Hartman
2015-04-17 13:49             ` Greg Kroah-Hartman
2015-04-17 14:36             ` Matt Fleming
2015-04-20  3:28               ` Kweh, Hock Leong
2015-04-20  3:28                 ` Kweh, Hock Leong
2015-04-20 14:43                 ` Greg Kroah-Hartman
2015-04-21  3:23                   ` Kweh, Hock Leong
2015-04-21  3:23                     ` Kweh, Hock Leong
2015-04-21  7:56                     ` Greg Kroah-Hartman
2015-04-21  7:56                       ` Greg Kroah-Hartman
2015-04-22  1:21                       ` James Bottomley
2015-04-22  1:21                         ` James Bottomley
2015-04-22  1:58                         ` Andy Lutomirski
2015-04-22  1:58                           ` Andy Lutomirski
2015-04-22  2:20                           ` James Bottomley
2015-04-22  3:24                             ` Andy Lutomirski
2015-04-22  3:24                               ` Andy Lutomirski
2015-04-22  4:51                               ` James Bottomley
2015-04-22  4:51                                 ` James Bottomley
2015-04-22 16:50                                 ` Andy Lutomirski
2015-04-22 16:50                                   ` Andy Lutomirski
2015-04-22 17:34                                   ` James Bottomley
2015-04-22 17:34                                     ` James Bottomley
2015-04-22 17:45                                     ` Andy Lutomirski
2015-04-22 17:45                                       ` Andy Lutomirski
2015-04-22 13:27                           ` Peter Jones
2015-04-22 13:27                             ` Peter Jones
2015-04-22 15:18                             ` James Bottomley
2015-04-22 15:24                               ` One Thousand Gnomes
2015-04-22 15:24                                 ` One Thousand Gnomes
2015-04-23  8:30                               ` Kweh, Hock Leong
2015-04-23  8:30                                 ` Kweh, Hock Leong
2015-04-23 14:09                                 ` James Bottomley
2015-04-24  2:14                                   ` Kweh, Hock Leong
2015-04-24  2:14                                     ` Kweh, Hock Leong
2015-04-24 15:16                                     ` James Bottomley
2015-04-24 15:16                                       ` James Bottomley
2015-04-27 21:59                                       ` Andy Lutomirski
2015-04-27 21:59                                         ` Andy Lutomirski
2015-04-27 22:35                                         ` James Bottomley
2015-04-27 22:35                                           ` James Bottomley
2015-04-27 22:40                                           ` Andy Lutomirski
2015-04-27 22:40                                             ` Andy Lutomirski
2015-04-27 22:51                                             ` James Bottomley
2015-04-27 22:51                                               ` James Bottomley
2015-04-29 11:23                                               ` Kweh, Hock Leong
2015-04-29 11:23                                                 ` Kweh, Hock Leong
2015-04-29 18:40                                                 ` Andy Lutomirski
2015-04-29 21:37                                                   ` James Bottomley
2015-04-29 21:37                                                     ` James Bottomley
2015-04-30  9:17                                                   ` Kweh, Hock Leong
2015-04-30  9:17                                                     ` Kweh, Hock Leong
2015-04-30 17:55                                                     ` Andy Lutomirski
2015-04-30 17:55                                                       ` Andy Lutomirski
2015-04-29 21:35                                                 ` James Bottomley
2015-04-29 21:35                                                   ` James Bottomley
2015-04-29 21:36                                                   ` Andy Lutomirski
2015-04-29 21:39                                                     ` James Bottomley
2015-04-29 21:42                                                       ` Andy Lutomirski
2015-04-20 17:59             ` James Bottomley
2015-04-22 15:35         ` James Bottomley
2015-04-22 15:35           ` James Bottomley
2015-04-22 15:46           ` Greg Kroah-Hartman
2015-04-22 15:46             ` Greg Kroah-Hartman
2015-04-22 16:11             ` James Bottomley
2015-04-22 16:11               ` James Bottomley
2015-04-23  9:50               ` Greg Kroah-Hartman
2015-04-23  9:50                 ` Greg Kroah-Hartman
2015-04-23 16:14                 ` James Bottomley
2015-04-23 20:38                   ` Greg Kroah-Hartman
2015-04-23 20:38                     ` Greg Kroah-Hartman

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=1429004697-28320-3-git-send-email-hock.leong.kweh@intel.com \
    --to=hock.leong.kweh@intel.com \
    --cc=boon.leong.ong@intel.com \
    --cc=bp@alien8.de \
    --cc=gregkh@linuxfoundation.org \
    --cc=linux-efi@vger.kernel.org \
    --cc=linux-kernel@vger.kernel.org \
    --cc=luto@amacapital.net \
    --cc=matt@console-pimps.org \
    --cc=ming.lei@canonical.com \
    --cc=pjones@redhat.com \
    --cc=roy.franz@linaro.org \
    --cc=semen.protsenko@linaro.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
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.