All of lore.kernel.org
 help / color / mirror / Atom feed
From: Bjorn Helgaas <bjorn.helgaas@hp.com>
To: ACPI List <acpi-devel@lists.sourceforge.net>,
	linux-ia64 <linux-ia64@vger.kernel.org>
Subject: [PATCH] ACPI: implement UUID-labelled vendor-defined resources
Date: Fri, 18 Mar 2005 13:19:50 -0700	[thread overview]
Message-ID: <1111177190.13286.48.camel@eeyore> (raw)

ACPI 3.0 includes UUID-labelled vendor-defined resources (section 6.4.3.2),
so move the code that supports this from arch/ia64 into ACPI proper.

When the code was under arch/ia64, we used EFI GUID stuff, but this time I
defined acpi_uuid equivalents to avoid the need to depend on EFI.

Len, Tony, this touches both acpi and ia64.  Let me know if this is
a problem.

This patch may be used under either the GPL or the BSD license.

Signed-off-by: Bjorn Helgaas <bjorn.helgaas@hp.com>

===== arch/ia64/kernel/acpi-ext.c 1.5 vs edited =====
--- 1.5/arch/ia64/kernel/acpi-ext.c	2004-10-05 12:19:50 -06:00
+++ edited/arch/ia64/kernel/acpi-ext.c	2005-03-18 11:29:18 -07:00
@@ -12,89 +12,35 @@
 #include <linux/module.h>
 #include <linux/types.h>
 #include <linux/acpi.h>
-#include <linux/efi.h>
 
 #include <asm/acpi-ext.h>
 
-struct acpi_vendor_descriptor {
-	u8				guid_id;
-	efi_guid_t			guid;
-};
-
-struct acpi_vendor_info {
-	struct acpi_vendor_descriptor	*descriptor;
-	u8				*data;
-	u32				length;
-};
-
-acpi_status
-acpi_vendor_resource_match(struct acpi_resource *resource, void *context)
-{
-	struct acpi_vendor_info *info = (struct acpi_vendor_info *) context;
-	struct acpi_resource_vendor *vendor;
-	struct acpi_vendor_descriptor *descriptor;
-	u32 length;
-
-	if (resource->id != ACPI_RSTYPE_VENDOR)
-		return AE_OK;
-
-	vendor = (struct acpi_resource_vendor *) &resource->data;
-	descriptor = (struct acpi_vendor_descriptor *) vendor->reserved;
-	if (vendor->length <= sizeof(*info->descriptor) ||
-	    descriptor->guid_id != info->descriptor->guid_id ||
-	    efi_guidcmp(descriptor->guid, info->descriptor->guid))
-		return AE_OK;
-
-	length = vendor->length - sizeof(struct acpi_vendor_descriptor);
-	info->data = acpi_os_allocate(length);
-	if (!info->data)
-		return AE_NO_MEMORY;
-
-	memcpy(info->data, vendor->reserved + sizeof(struct acpi_vendor_descriptor), length);
-	info->length = length;
-	return AE_CTRL_TERMINATE;
-}
-
-acpi_status
-acpi_find_vendor_resource(acpi_handle obj, struct acpi_vendor_descriptor *id,
-		u8 **data, u32 *length)
-{
-	struct acpi_vendor_info info;
-
-	info.descriptor = id;
-	info.data = NULL;
-
-	acpi_walk_resources(obj, METHOD_NAME__CRS, acpi_vendor_resource_match, &info);
-	if (!info.data)
-		return AE_NOT_FOUND;
-
-	*data = info.data;
-	*length = info.length;
-	return AE_OK;
-}
-
 struct acpi_vendor_descriptor hp_ccsr_descriptor = {
-	.guid_id = 2,
-	.guid    = EFI_GUID(0x69e9adf9, 0x924f, 0xab5f, 0xf6, 0x4a, 0x24, 0xd2, 0x01, 0x37, 0x0e, 0xad)
+	.uuid_subtype = 2,
+	.uuid    = ACPI_UUID(0x69e9adf9, 0x924f, 0xab5f, 0xf6, 0x4a, 0x24, 0xd2, 0x01, 0x37, 0x0e, 0xad)
 };
 
 acpi_status
 hp_acpi_csr_space(acpi_handle obj, u64 *csr_base, u64 *csr_length)
 {
-	acpi_status status;
-	u8 *data;
+	acpi_status status = AE_OK;
+	u8 *data = NULL;
 	u32 length;
 
-	status = acpi_find_vendor_resource(obj, &hp_ccsr_descriptor, &data, &length);
+	status = acpi_find_vendor_resource(obj, &hp_ccsr_descriptor, &data,
+		&length);
 
-	if (ACPI_FAILURE(status) || length != 16)
-		return AE_NOT_FOUND;
+	if (ACPI_FAILURE(status) || length != 16) {
+		status = AE_NOT_FOUND;
+		goto out;
+	}
 
 	memcpy(csr_base, data, sizeof(*csr_base));
 	memcpy(csr_length, data + 8, sizeof(*csr_length));
-	acpi_os_free(data);
 
-	return AE_OK;
+out:
+	acpi_os_free(data);
+	return status;
 }
 
 EXPORT_SYMBOL(hp_acpi_csr_space);
===== drivers/acpi/resources/rsxface.c 1.22 vs edited =====
--- 1.22/drivers/acpi/resources/rsxface.c	2005-01-20 22:17:54 -07:00
+++ edited/drivers/acpi/resources/rsxface.c	2005-03-18 12:24:34 -07:00
@@ -435,3 +435,90 @@
 }
 EXPORT_SYMBOL(acpi_resource_to_address64);
 
+static inline int
+acpi_uuidcmp (struct acpi_uuid left, struct acpi_uuid right)
+{
+	return memcmp(&left, &right, sizeof(left));
+}
+
+static acpi_status
+acpi_vendor_resource_match(struct acpi_resource *resource, void *context)
+{
+	struct acpi_vendor_info *info = (struct acpi_vendor_info *) context;
+	struct acpi_resource_vendor *vendor;
+	struct acpi_vendor_descriptor *descriptor;
+	u32 length;
+
+	if (resource->id != ACPI_RSTYPE_VENDOR)
+		return AE_OK;
+
+	vendor = (struct acpi_resource_vendor *) &resource->data;
+	descriptor = (struct acpi_vendor_descriptor *) vendor->reserved;
+	if (vendor->length <= sizeof(*info->descriptor) ||
+	    descriptor->uuid_subtype != info->descriptor->uuid_subtype ||
+	    acpi_uuidcmp(descriptor->uuid, info->descriptor->uuid))
+		return AE_OK;
+
+	length = vendor->length - sizeof(struct acpi_vendor_descriptor);
+	info->data = acpi_os_allocate(length);
+	if (!info->data)
+		return AE_NO_MEMORY;
+
+	memcpy(info->data, vendor->reserved + sizeof(struct acpi_vendor_descriptor), length);
+	info->length = length;
+	return AE_CTRL_TERMINATE;
+}
+
+/*******************************************************************************
+ *
+ * FUNCTION:    acpi_find_vendor_resource
+ *
+ * PARAMETERS:  device_handle   - a handle to the device object for the
+ *                                device we are querying
+ *              id              - a pointer to the acpi_vendor_descriptor
+ *                                for the UUID-identified vendor-defined
+ *                                resource we want
+ *              data            - a pointer to a pointer where the address
+ *                                of the vendor data will be stored
+ *              length          - a pointer to an integer where the length
+ *                                of the vendor data will be stored
+ *
+ * RETURN:      Status
+ *
+ * DESCRIPTION: This function walks the current resources for the specified
+ *              device and looks for a vendor-defined resource that matches
+ *              the supplied UUID and subtype.
+ *
+ *              If the desired resource is found, a buffer is allocated for
+ *              the vendor-defined data (excluding the UUID and other headers),
+ *              and the address and size of the buffer are returned in *data
+ *              and *length.  The caller is responsible for deallocating
+ *              the buffer with acpi_os_free().
+ *
+ *              If the function fails, AE_NOT_FOUND will be returned and
+ *              the values of *data and *length are unchanged.
+ *
+ ******************************************************************************/
+
+acpi_status
+acpi_find_vendor_resource(
+	acpi_handle			device_handle,
+	struct acpi_vendor_descriptor	*id,
+	u8				**data,
+	u32				*length)
+{
+	struct acpi_vendor_info info;
+
+	info.descriptor = id;
+	info.data = NULL;
+
+	acpi_walk_resources(device_handle, METHOD_NAME__CRS,
+		acpi_vendor_resource_match, &info);
+	if (!info.data)
+		return AE_NOT_FOUND;
+
+	*data = info.data;
+	*length = info.length;
+	return AE_OK;
+}
+EXPORT_SYMBOL(acpi_find_vendor_resource);
===== include/acpi/acpixf.h 1.31 vs edited =====
--- 1.31/include/acpi/acpixf.h	2005-01-20 22:17:55 -07:00
+++ edited/include/acpi/acpixf.h	2005-03-18 12:09:12 -07:00
@@ -425,10 +425,10 @@
 
 acpi_status
 acpi_walk_resources (
-	acpi_handle                             device_handle,
-	char                                    *path,
+	acpi_handle                     device_handle,
+	char                            *path,
 	ACPI_WALK_RESOURCE_CALLBACK     user_function,
-	void                                    *context);
+	void                            *context);
 
 acpi_status
 acpi_set_current_resources (
@@ -443,7 +443,14 @@
 acpi_status
 acpi_resource_to_address64 (
 	struct acpi_resource            *resource,
-	struct acpi_resource_address64 *out);
+	struct acpi_resource_address64  *out);
+
+acpi_status
+acpi_find_vendor_resource (
+	acpi_handle                     device_handle,
+	struct acpi_vendor_descriptor   *id,
+	u8                              **data,
+	u32                             *length);
 
 /*
  * Hardware (ACPI device) interfaces
===== include/acpi/actypes.h 1.41 vs edited =====
--- 1.41/include/acpi/actypes.h	2005-01-20 22:17:55 -07:00
+++ edited/include/acpi/actypes.h	2005-03-18 11:23:21 -07:00
@@ -1045,6 +1045,16 @@
 #define ACPI_PRODUCER                   (u8) 0x00
 #define ACPI_CONSUMER                   (u8) 0x01
 
+struct acpi_uuid {
+	u8                              b[16];
+};
+
+#define ACPI_UUID(a,b,c,d0,d1,d2,d3,d4,d5,d6,d7) \
+((struct acpi_uuid) \
+{{ (a) & 0xff, ((a) >> 8) & 0xff, ((a) >> 16) & 0xff, ((a) >> 24) & 0xff, \
+  (b) & 0xff, ((b) >> 8) & 0xff, \
+  (c) & 0xff, ((c) >> 8) & 0xff, \
+  (d0), (d1), (d2), (d3), (d4), (d5), (d6), (d7) }})
 
 /*
  *  Structures used to describe device resources
@@ -1097,6 +1107,18 @@
 {
 	u32                                 length;
 	u8                                  reserved[1];
+};
+
+struct acpi_vendor_descriptor
+{
+	u8                                  uuid_subtype;
+	struct acpi_uuid                    uuid;
+};
+
+struct acpi_vendor_info {
+	struct acpi_vendor_descriptor       *descriptor;
+	u8                                  *data;
+	u32                                 length;
 };
 
 struct acpi_resource_end_tag



WARNING: multiple messages have this Message-ID (diff)
From: Bjorn Helgaas <bjorn.helgaas@hp.com>
To: ACPI List <acpi-devel@lists.sourceforge.net>,
	linux-ia64 <linux-ia64@vger.kernel.org>
Subject: [PATCH] ACPI: implement UUID-labelled vendor-defined resources
Date: Fri, 18 Mar 2005 20:19:50 +0000	[thread overview]
Message-ID: <1111177190.13286.48.camel@eeyore> (raw)

ACPI 3.0 includes UUID-labelled vendor-defined resources (section 6.4.3.2),
so move the code that supports this from arch/ia64 into ACPI proper.

When the code was under arch/ia64, we used EFI GUID stuff, but this time I
defined acpi_uuid equivalents to avoid the need to depend on EFI.

Len, Tony, this touches both acpi and ia64.  Let me know if this is
a problem.

This patch may be used under either the GPL or the BSD license.

Signed-off-by: Bjorn Helgaas <bjorn.helgaas@hp.com>

=== arch/ia64/kernel/acpi-ext.c 1.5 vs edited ==--- 1.5/arch/ia64/kernel/acpi-ext.c	2004-10-05 12:19:50 -06:00
+++ edited/arch/ia64/kernel/acpi-ext.c	2005-03-18 11:29:18 -07:00
@@ -12,89 +12,35 @@
 #include <linux/module.h>
 #include <linux/types.h>
 #include <linux/acpi.h>
-#include <linux/efi.h>
 
 #include <asm/acpi-ext.h>
 
-struct acpi_vendor_descriptor {
-	u8				guid_id;
-	efi_guid_t			guid;
-};
-
-struct acpi_vendor_info {
-	struct acpi_vendor_descriptor	*descriptor;
-	u8				*data;
-	u32				length;
-};
-
-acpi_status
-acpi_vendor_resource_match(struct acpi_resource *resource, void *context)
-{
-	struct acpi_vendor_info *info = (struct acpi_vendor_info *) context;
-	struct acpi_resource_vendor *vendor;
-	struct acpi_vendor_descriptor *descriptor;
-	u32 length;
-
-	if (resource->id != ACPI_RSTYPE_VENDOR)
-		return AE_OK;
-
-	vendor = (struct acpi_resource_vendor *) &resource->data;
-	descriptor = (struct acpi_vendor_descriptor *) vendor->reserved;
-	if (vendor->length <= sizeof(*info->descriptor) ||
-	    descriptor->guid_id != info->descriptor->guid_id ||
-	    efi_guidcmp(descriptor->guid, info->descriptor->guid))
-		return AE_OK;
-
-	length = vendor->length - sizeof(struct acpi_vendor_descriptor);
-	info->data = acpi_os_allocate(length);
-	if (!info->data)
-		return AE_NO_MEMORY;
-
-	memcpy(info->data, vendor->reserved + sizeof(struct acpi_vendor_descriptor), length);
-	info->length = length;
-	return AE_CTRL_TERMINATE;
-}
-
-acpi_status
-acpi_find_vendor_resource(acpi_handle obj, struct acpi_vendor_descriptor *id,
-		u8 **data, u32 *length)
-{
-	struct acpi_vendor_info info;
-
-	info.descriptor = id;
-	info.data = NULL;
-
-	acpi_walk_resources(obj, METHOD_NAME__CRS, acpi_vendor_resource_match, &info);
-	if (!info.data)
-		return AE_NOT_FOUND;
-
-	*data = info.data;
-	*length = info.length;
-	return AE_OK;
-}
-
 struct acpi_vendor_descriptor hp_ccsr_descriptor = {
-	.guid_id = 2,
-	.guid    = EFI_GUID(0x69e9adf9, 0x924f, 0xab5f, 0xf6, 0x4a, 0x24, 0xd2, 0x01, 0x37, 0x0e, 0xad)
+	.uuid_subtype = 2,
+	.uuid    = ACPI_UUID(0x69e9adf9, 0x924f, 0xab5f, 0xf6, 0x4a, 0x24, 0xd2, 0x01, 0x37, 0x0e, 0xad)
 };
 
 acpi_status
 hp_acpi_csr_space(acpi_handle obj, u64 *csr_base, u64 *csr_length)
 {
-	acpi_status status;
-	u8 *data;
+	acpi_status status = AE_OK;
+	u8 *data = NULL;
 	u32 length;
 
-	status = acpi_find_vendor_resource(obj, &hp_ccsr_descriptor, &data, &length);
+	status = acpi_find_vendor_resource(obj, &hp_ccsr_descriptor, &data,
+		&length);
 
-	if (ACPI_FAILURE(status) || length != 16)
-		return AE_NOT_FOUND;
+	if (ACPI_FAILURE(status) || length != 16) {
+		status = AE_NOT_FOUND;
+		goto out;
+	}
 
 	memcpy(csr_base, data, sizeof(*csr_base));
 	memcpy(csr_length, data + 8, sizeof(*csr_length));
-	acpi_os_free(data);
 
-	return AE_OK;
+out:
+	acpi_os_free(data);
+	return status;
 }
 
 EXPORT_SYMBOL(hp_acpi_csr_space);
=== drivers/acpi/resources/rsxface.c 1.22 vs edited ==--- 1.22/drivers/acpi/resources/rsxface.c	2005-01-20 22:17:54 -07:00
+++ edited/drivers/acpi/resources/rsxface.c	2005-03-18 12:24:34 -07:00
@@ -435,3 +435,90 @@
 }
 EXPORT_SYMBOL(acpi_resource_to_address64);
 
+static inline int
+acpi_uuidcmp (struct acpi_uuid left, struct acpi_uuid right)
+{
+	return memcmp(&left, &right, sizeof(left));
+}
+
+static acpi_status
+acpi_vendor_resource_match(struct acpi_resource *resource, void *context)
+{
+	struct acpi_vendor_info *info = (struct acpi_vendor_info *) context;
+	struct acpi_resource_vendor *vendor;
+	struct acpi_vendor_descriptor *descriptor;
+	u32 length;
+
+	if (resource->id != ACPI_RSTYPE_VENDOR)
+		return AE_OK;
+
+	vendor = (struct acpi_resource_vendor *) &resource->data;
+	descriptor = (struct acpi_vendor_descriptor *) vendor->reserved;
+	if (vendor->length <= sizeof(*info->descriptor) ||
+	    descriptor->uuid_subtype != info->descriptor->uuid_subtype ||
+	    acpi_uuidcmp(descriptor->uuid, info->descriptor->uuid))
+		return AE_OK;
+
+	length = vendor->length - sizeof(struct acpi_vendor_descriptor);
+	info->data = acpi_os_allocate(length);
+	if (!info->data)
+		return AE_NO_MEMORY;
+
+	memcpy(info->data, vendor->reserved + sizeof(struct acpi_vendor_descriptor), length);
+	info->length = length;
+	return AE_CTRL_TERMINATE;
+}
+
+/*******************************************************************************
+ *
+ * FUNCTION:    acpi_find_vendor_resource
+ *
+ * PARAMETERS:  device_handle   - a handle to the device object for the
+ *                                device we are querying
+ *              id              - a pointer to the acpi_vendor_descriptor
+ *                                for the UUID-identified vendor-defined
+ *                                resource we want
+ *              data            - a pointer to a pointer where the address
+ *                                of the vendor data will be stored
+ *              length          - a pointer to an integer where the length
+ *                                of the vendor data will be stored
+ *
+ * RETURN:      Status
+ *
+ * DESCRIPTION: This function walks the current resources for the specified
+ *              device and looks for a vendor-defined resource that matches
+ *              the supplied UUID and subtype.
+ *
+ *              If the desired resource is found, a buffer is allocated for
+ *              the vendor-defined data (excluding the UUID and other headers),
+ *              and the address and size of the buffer are returned in *data
+ *              and *length.  The caller is responsible for deallocating
+ *              the buffer with acpi_os_free().
+ *
+ *              If the function fails, AE_NOT_FOUND will be returned and
+ *              the values of *data and *length are unchanged.
+ *
+ ******************************************************************************/
+
+acpi_status
+acpi_find_vendor_resource(
+	acpi_handle			device_handle,
+	struct acpi_vendor_descriptor	*id,
+	u8				**data,
+	u32				*length)
+{
+	struct acpi_vendor_info info;
+
+	info.descriptor = id;
+	info.data = NULL;
+
+	acpi_walk_resources(device_handle, METHOD_NAME__CRS,
+		acpi_vendor_resource_match, &info);
+	if (!info.data)
+		return AE_NOT_FOUND;
+
+	*data = info.data;
+	*length = info.length;
+	return AE_OK;
+}
+EXPORT_SYMBOL(acpi_find_vendor_resource);
=== include/acpi/acpixf.h 1.31 vs edited ==--- 1.31/include/acpi/acpixf.h	2005-01-20 22:17:55 -07:00
+++ edited/include/acpi/acpixf.h	2005-03-18 12:09:12 -07:00
@@ -425,10 +425,10 @@
 
 acpi_status
 acpi_walk_resources (
-	acpi_handle                             device_handle,
-	char                                    *path,
+	acpi_handle                     device_handle,
+	char                            *path,
 	ACPI_WALK_RESOURCE_CALLBACK     user_function,
-	void                                    *context);
+	void                            *context);
 
 acpi_status
 acpi_set_current_resources (
@@ -443,7 +443,14 @@
 acpi_status
 acpi_resource_to_address64 (
 	struct acpi_resource            *resource,
-	struct acpi_resource_address64 *out);
+	struct acpi_resource_address64  *out);
+
+acpi_status
+acpi_find_vendor_resource (
+	acpi_handle                     device_handle,
+	struct acpi_vendor_descriptor   *id,
+	u8                              **data,
+	u32                             *length);
 
 /*
  * Hardware (ACPI device) interfaces
=== include/acpi/actypes.h 1.41 vs edited ==--- 1.41/include/acpi/actypes.h	2005-01-20 22:17:55 -07:00
+++ edited/include/acpi/actypes.h	2005-03-18 11:23:21 -07:00
@@ -1045,6 +1045,16 @@
 #define ACPI_PRODUCER                   (u8) 0x00
 #define ACPI_CONSUMER                   (u8) 0x01
 
+struct acpi_uuid {
+	u8                              b[16];
+};
+
+#define ACPI_UUID(a,b,c,d0,d1,d2,d3,d4,d5,d6,d7) \
+((struct acpi_uuid) \
+{{ (a) & 0xff, ((a) >> 8) & 0xff, ((a) >> 16) & 0xff, ((a) >> 24) & 0xff, \
+  (b) & 0xff, ((b) >> 8) & 0xff, \
+  (c) & 0xff, ((c) >> 8) & 0xff, \
+  (d0), (d1), (d2), (d3), (d4), (d5), (d6), (d7) }})
 
 /*
  *  Structures used to describe device resources
@@ -1097,6 +1107,18 @@
 {
 	u32                                 length;
 	u8                                  reserved[1];
+};
+
+struct acpi_vendor_descriptor
+{
+	u8                                  uuid_subtype;
+	struct acpi_uuid                    uuid;
+};
+
+struct acpi_vendor_info {
+	struct acpi_vendor_descriptor       *descriptor;
+	u8                                  *data;
+	u32                                 length;
 };
 
 struct acpi_resource_end_tag



             reply	other threads:[~2005-03-18 20:19 UTC|newest]

Thread overview: 19+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2005-03-18 20:19 Bjorn Helgaas [this message]
2005-03-18 20:19 ` [PATCH] ACPI: implement UUID-labelled vendor-defined resources Bjorn Helgaas
2005-06-21 20:21 ` Bjorn Helgaas
2005-06-21 20:21   ` [ACPI] " Bjorn Helgaas
  -- strict thread matches above, loose matches on Subject: below --
2005-09-16 17:41 Bjorn Helgaas
2005-09-16 17:41 ` Bjorn Helgaas
2005-09-16 21:56 [ACPI] " Moore, Robert
2005-09-16 21:56 ` Moore, Robert
2005-09-19 15:31 ` Bjorn Helgaas
2005-09-19 15:31   ` Bjorn Helgaas
     [not found]   ` <200509190931.20643.bjorn.helgaas-VXdhtT5mjnY@public.gmane.org>
2005-09-20 23:09     ` Bjorn Helgaas
2005-09-20 23:09       ` [ACPI] " Bjorn Helgaas
     [not found] ` <971FCB6690CD0E4898387DBF7552B90E02C0B5F2-sBd4vmA9Se5Qxe9IK+vIArfspsVTdybXVpNB7YpNyf8@public.gmane.org>
2005-09-19 15:52   ` Christoph Hellwig
2005-09-19 15:52     ` [ACPI] " Christoph Hellwig
     [not found]     ` <20050919155203.GA24346-wEGCiKHe2LqWVfeAwA7xHQ@public.gmane.org>
2005-09-22 17:48       ` Pavel Machek
2005-09-22 17:48         ` [ACPI] " Pavel Machek
2005-10-11 17:31   ` Bjorn Helgaas
2005-09-20 23:16 Moore, Robert
2005-09-20 23:16 ` [ACPI] " Moore, Robert

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=1111177190.13286.48.camel@eeyore \
    --to=bjorn.helgaas@hp.com \
    --cc=acpi-devel@lists.sourceforge.net \
    --cc=linux-ia64@vger.kernel.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.