All of lore.kernel.org
 help / color / mirror / Atom feed
From: Antheas Kapenekakis <lkml@antheas.dev>
To: Mario.Limonciello@amd.com
Cc: W_Armin@gmx.de, sashal@kernel.org, Shyam-Sundar.S-k@amd.com,
	derekjohn.clark@gmail.com, denis.benato@linux.dev, i@rong.moe,
	linux-kernel@vger.kernel.org,
	platform-driver-x86@vger.kernel.org,
	Antheas Kapenekakis <lkml@antheas.dev>
Subject: [RFC v4 4/4] platform/x86/amd: dptc: Add device entries for handheld PCs
Date: Mon,  9 Mar 2026 21:51:25 +0100	[thread overview]
Message-ID: <20260309205125.293148-5-lkml@antheas.dev> (raw)
In-Reply-To: <20260309205125.293148-1-lkml@antheas.dev>

Add limit tables and DMI entries for AMD APU-based handheld devices:

 - 15W class: AYANEO AIR
 - 18W class: AYANEO AIR Plus/Pro
 - 25W class: AYANEO AIR 1S, NEXT/KUN
 - 28W class: GPD Win Mini/4/Max 2, GPD Duo, GPD Pocket 4, AYANEO 2,
               OrangePi NEO-01, SuiPlay0X1
 - 30W class: AYANEO FLIP/GEEK/SLIDE/3, AOKZOE A1/A1X/A2,
               OneXPlayer F1Pro/2/X1/G1, AYN Loki Max, Zeenix Pro

Also add SoC strings for Ryzen AI, Ryzen 8000/7040/6000/5000
families, extending support beyond the initial AI MAX series.

Assisted-by: Claude:claude-opus-4-6
Signed-off-by: Antheas Kapenekakis <lkml@antheas.dev>
---
 drivers/platform/x86/amd/dptc.c | 420 ++++++++++++++++++++++++++++++++
 1 file changed, 420 insertions(+)

diff --git a/drivers/platform/x86/amd/dptc.c b/drivers/platform/x86/amd/dptc.c
index f4db95affb1b..b2820f8652f1 100644
--- a/drivers/platform/x86/amd/dptc.c
+++ b/drivers/platform/x86/amd/dptc.c
@@ -86,6 +86,81 @@ static const struct dptc_param_desc dptc_params[DPTC_NUM_PARAMS] = {
 				 1, ALIB_ID_TEMP_TARGET },
 };
 
+/* 15W class: AYANEO AIR (Ryzen 5 5560U) */
+static const struct dptc_device_limits limits_15w = {
+	.params = {
+		[DPTC_PPT_PL1_SPL]  = {  1,  5, 10, 15,  18 },
+		[DPTC_PPT_PL2_SPPT] = {  1,  5, 10, 15,  18 },
+		[DPTC_PPT_PL3_FPPT] = {  1,  5, 12, 18,  22 },
+		[DPTC_CPU_TEMP]     = { 60, 70, 85, 90, 100 },
+	},
+	.profiles = {
+		[PLATFORM_PROFILE_LOW_POWER]   = { .vals = {  5,  5,  8, 0 } },
+		[PLATFORM_PROFILE_BALANCED]    = { .vals = { 10, 12, 15, 0 } },
+		[PLATFORM_PROFILE_PERFORMANCE] = { .vals = { 15, 15, 18, 0 } },
+	},
+};
+
+/* 18W class: AYANEO AIR Plus/Pro (Ryzen 5 5560U, Ryzen 7 5825U) */
+static const struct dptc_device_limits limits_18w = {
+	.params = {
+		[DPTC_PPT_PL1_SPL]  = {  1,  5, 15, 18,  22 },
+		[DPTC_PPT_PL2_SPPT] = {  1,  5, 15, 18,  22 },
+		[DPTC_PPT_PL3_FPPT] = {  1,  5, 15, 20,  25 },
+		[DPTC_CPU_TEMP]     = { 60, 70, 85, 90, 100 },
+	},
+	.profiles = {
+		[PLATFORM_PROFILE_LOW_POWER]   = { .vals = {  5,  5,  8, 0 } },
+		[PLATFORM_PROFILE_BALANCED]    = { .vals = { 12, 14, 15, 0 } },
+		[PLATFORM_PROFILE_PERFORMANCE] = { .vals = { 18, 18, 20, 0 } },
+	},
+};
+
+/* 25W class: Ryzen 5000 handhelds (AYANEO NEXT, KUN) */
+static const struct dptc_device_limits limits_25w = {
+	.params = {
+		[DPTC_PPT_PL1_SPL]  = {  1,  4, 15, 25,  32 },
+		[DPTC_PPT_PL2_SPPT] = {  1,  4, 20, 27,  35 },
+		[DPTC_PPT_PL3_FPPT] = {  1,  4, 25, 30,  37 },
+		[DPTC_CPU_TEMP]     = { 60, 70, 85, 90, 100 },
+	},
+	.profiles = {
+		[PLATFORM_PROFILE_LOW_POWER]   = { .vals = {  8,  8, 12, 0 } },
+		[PLATFORM_PROFILE_BALANCED]    = { .vals = { 15, 17, 20, 0 } },
+		[PLATFORM_PROFILE_PERFORMANCE] = { .vals = { 25, 27, 30, 0 } },
+	},
+};
+
+/* 28W class: GPD Win series, AYANEO 2, OrangePi NEO-01 */
+static const struct dptc_device_limits limits_28w = {
+	.params = {
+		[DPTC_PPT_PL1_SPL]  = {  1,  4, 15, 28,  32 },
+		[DPTC_PPT_PL2_SPPT] = {  1,  4, 20, 30,  35 },
+		[DPTC_PPT_PL3_FPPT] = {  1,  4, 25, 32,  37 },
+		[DPTC_CPU_TEMP]     = { 60, 70, 85, 90, 100 },
+	},
+	.profiles = {
+		[PLATFORM_PROFILE_LOW_POWER]   = { .vals = {  8,  8, 12, 0 } },
+		[PLATFORM_PROFILE_BALANCED]    = { .vals = { 15, 17, 22, 0 } },
+		[PLATFORM_PROFILE_PERFORMANCE] = { .vals = { 25, 28, 32, 0 } },
+	},
+};
+
+/* 30W class: OneXPlayer, AYANEO FLIP/GEEK/SLIDE/3, AOKZOE */
+static const struct dptc_device_limits limits_30w = {
+	.params = {
+		[DPTC_PPT_PL1_SPL]  = {  1,  4, 15, 30,  40 },
+		[DPTC_PPT_PL2_SPPT] = {  1,  4, 20, 32,  43 },
+		[DPTC_PPT_PL3_FPPT] = {  1,  4, 25, 41,  50 },
+		[DPTC_CPU_TEMP]     = { 60, 70, 85, 90, 100 },
+	},
+	.profiles = {
+		[PLATFORM_PROFILE_LOW_POWER]   = { .vals = {  8,  8, 12, 0 } },
+		[PLATFORM_PROFILE_BALANCED]    = { .vals = { 15, 17, 25, 0 } },
+		[PLATFORM_PROFILE_PERFORMANCE] = { .vals = { 25, 28, 41, 0 } },
+	},
+};
+
 /* AI MAX Handheld class: GPD Win 5 */
 static const struct dptc_device_limits limits_maxhh = {
 	.params = {
@@ -107,11 +182,56 @@ static const char * const dptc_soc_table[] = {
 	"AMD RYZEN AI MAX+ 395",
 	"AMD RYZEN AI MAX+ 385",
 	"AMD RYZEN AI MAX 380",
+	/* Ryzen AI */
+	"AMD Ryzen AI 9 HX 370",
+	/* Ryzen 8000 */
+	"AMD Ryzen 7 8840U",
+	/* Ryzen 7040 */
+	"AMD Ryzen 7 7840U",
+	/* Ryzen 6000 */
+	"AMD Ryzen 7 6800U",
+	"AMD Ryzen 7 6600U",
+	/* Ryzen 5000 */
+	"AMD Ryzen 7 5800U",
+	"AMD Ryzen 7 5700U",
+	"AMD Ryzen 5 5560U",
 	NULL,
 };
 
 static const struct dmi_system_id dptc_dmi_table[] = {
 	/* GPD */
+	{
+		.ident = "GPD Win Mini",
+		.matches = {
+			DMI_MATCH(DMI_SYS_VENDOR, "GPD"),
+			DMI_MATCH(DMI_PRODUCT_NAME, "G1617-01"),
+		},
+		.driver_data = (void *)&limits_28w,
+	},
+	{
+		.ident = "GPD Win Mini 2024",
+		.matches = {
+			DMI_MATCH(DMI_SYS_VENDOR, "GPD"),
+			DMI_MATCH(DMI_PRODUCT_NAME, "G1617-02"),
+		},
+		.driver_data = (void *)&limits_28w,
+	},
+	{
+		.ident = "GPD Win Mini 2024",
+		.matches = {
+			DMI_MATCH(DMI_SYS_VENDOR, "GPD"),
+			DMI_MATCH(DMI_PRODUCT_NAME, "G1617-02-L"),
+		},
+		.driver_data = (void *)&limits_28w,
+	},
+	{
+		.ident = "GPD Win 4",
+		.matches = {
+			DMI_MATCH(DMI_SYS_VENDOR, "GPD"),
+			DMI_MATCH(DMI_PRODUCT_NAME, "G1618-04"),
+		},
+		.driver_data = (void *)&limits_28w,
+	},
 	{
 		.ident = "GPD Win 5",
 		.matches = {
@@ -120,6 +240,306 @@ static const struct dmi_system_id dptc_dmi_table[] = {
 		},
 		.driver_data = (void *)&limits_maxhh,
 	},
+	{
+		.ident = "GPD Win Max 2",
+		.matches = {
+			DMI_MATCH(DMI_SYS_VENDOR, "GPD"),
+			DMI_MATCH(DMI_PRODUCT_NAME, "G1619-04"),
+		},
+		.driver_data = (void *)&limits_28w,
+	},
+	{
+		.ident = "GPD Win Max 2 2024",
+		.matches = {
+			DMI_MATCH(DMI_SYS_VENDOR, "GPD"),
+			DMI_MATCH(DMI_PRODUCT_NAME, "G1619-05"),
+		},
+		.driver_data = (void *)&limits_28w,
+	},
+	{
+		.ident = "GPD Duo",
+		.matches = {
+			DMI_MATCH(DMI_SYS_VENDOR, "GPD"),
+			DMI_MATCH(DMI_PRODUCT_NAME, "G1622-01"),
+		},
+		.driver_data = (void *)&limits_28w,
+	},
+	{
+		.ident = "GPD Duo",
+		.matches = {
+			DMI_MATCH(DMI_SYS_VENDOR, "GPD"),
+			DMI_MATCH(DMI_PRODUCT_NAME, "G1622-01-L"),
+		},
+		.driver_data = (void *)&limits_28w,
+	},
+	{
+		.ident = "GPD Pocket 4",
+		.matches = {
+			DMI_MATCH(DMI_SYS_VENDOR, "GPD"),
+			DMI_MATCH(DMI_PRODUCT_NAME, "G1628-04"),
+		},
+		.driver_data = (void *)&limits_28w,
+	},
+	{
+		.ident = "GPD Pocket 4",
+		.matches = {
+			DMI_MATCH(DMI_SYS_VENDOR, "GPD"),
+			DMI_MATCH(DMI_PRODUCT_NAME, "G1628-04-L"),
+		},
+		.driver_data = (void *)&limits_28w,
+	},
+	/* OrangePi */
+	{
+		.ident = "OrangePi NEO-01",
+		.matches = {
+			DMI_MATCH(DMI_BOARD_VENDOR, "OrangePi"),
+			DMI_EXACT_MATCH(DMI_BOARD_NAME, "NEO-01"),
+		},
+		.driver_data = (void *)&limits_28w,
+	},
+	/* AYN */
+	{
+		.ident = "AYN Loki Max",
+		.matches = {
+			DMI_EXACT_MATCH(DMI_SYS_VENDOR, "ayn"),
+			DMI_EXACT_MATCH(DMI_PRODUCT_NAME, "Loki Max"),
+		},
+		.driver_data = (void *)&limits_30w,
+	},
+	/* Tectoy (Zeenix Pro = Loki Max) */
+	{
+		.ident = "Zeenix Pro",
+		.matches = {
+			DMI_EXACT_MATCH(DMI_SYS_VENDOR, "Tectoy"),
+			DMI_EXACT_MATCH(DMI_PRODUCT_NAME, "Zeenix Pro"),
+		},
+		.driver_data = (void *)&limits_30w,
+	},
+	/* AOKZOE */
+	{
+		.ident = "AOKZOE A1 AR07",
+		.matches = {
+			DMI_MATCH(DMI_BOARD_VENDOR, "AOKZOE"),
+			DMI_EXACT_MATCH(DMI_BOARD_NAME, "AOKZOE A1 AR07"),
+		},
+		.driver_data = (void *)&limits_30w,
+	},
+	{
+		.ident = "AOKZOE A1 Pro",
+		.matches = {
+			DMI_MATCH(DMI_BOARD_VENDOR, "AOKZOE"),
+			DMI_EXACT_MATCH(DMI_BOARD_NAME, "AOKZOE A1 Pro"),
+		},
+		.driver_data = (void *)&limits_30w,
+	},
+	{
+		.ident = "AOKZOE A1X",
+		.matches = {
+			DMI_MATCH(DMI_BOARD_VENDOR, "AOKZOE"),
+			DMI_EXACT_MATCH(DMI_BOARD_NAME, "AOKZOE A1X"),
+		},
+		.driver_data = (void *)&limits_30w,
+	},
+	{
+		.ident = "AOKZOE A2 Pro",
+		.matches = {
+			DMI_MATCH(DMI_BOARD_VENDOR, "AOKZOE"),
+			DMI_EXACT_MATCH(DMI_BOARD_NAME, "AOKZOE A2 Pro"),
+		},
+		.driver_data = (void *)&limits_30w,
+	},
+	/* OneXPlayer (Intel variants filtered by SoC table) */
+	{
+		.ident = "ONEXPLAYER F1Pro",
+		.matches = {
+			DMI_MATCH(DMI_BOARD_VENDOR, "ONE-NETBOOK"),
+			DMI_EXACT_MATCH(DMI_BOARD_NAME, "ONEXPLAYER F1Pro"),
+		},
+		.driver_data = (void *)&limits_30w,
+	},
+	{
+		.ident = "ONEXPLAYER F1 EVA-02",
+		.matches = {
+			DMI_MATCH(DMI_BOARD_VENDOR, "ONE-NETBOOK"),
+			DMI_EXACT_MATCH(DMI_BOARD_NAME, "ONEXPLAYER F1 EVA-02"),
+		},
+		.driver_data = (void *)&limits_30w,
+	},
+	{
+		.ident = "ONEXPLAYER 2",
+		.matches = {
+			DMI_MATCH(DMI_BOARD_VENDOR, "ONE-NETBOOK"),
+			DMI_MATCH(DMI_BOARD_NAME, "ONEXPLAYER 2"),
+		},
+		.driver_data = (void *)&limits_30w,
+	},
+	{
+		.ident = "ONEXPLAYER X1 A",
+		.matches = {
+			DMI_MATCH(DMI_BOARD_VENDOR, "ONE-NETBOOK"),
+			DMI_EXACT_MATCH(DMI_BOARD_NAME, "ONEXPLAYER X1 A"),
+		},
+		.driver_data = (void *)&limits_30w,
+	},
+	{
+		.ident = "ONEXPLAYER X1z",
+		.matches = {
+			DMI_MATCH(DMI_BOARD_VENDOR, "ONE-NETBOOK"),
+			DMI_EXACT_MATCH(DMI_BOARD_NAME, "ONEXPLAYER X1z"),
+		},
+		.driver_data = (void *)&limits_30w,
+	},
+	{
+		.ident = "ONEXPLAYER X1Pro",
+		.matches = {
+			DMI_MATCH(DMI_BOARD_VENDOR, "ONE-NETBOOK"),
+			DMI_EXACT_MATCH(DMI_BOARD_NAME, "ONEXPLAYER X1Pro"),
+		},
+		.driver_data = (void *)&limits_30w,
+	},
+	{
+		.ident = "ONEXPLAYER G1 A",
+		.matches = {
+			DMI_MATCH(DMI_BOARD_VENDOR, "ONE-NETBOOK"),
+			DMI_EXACT_MATCH(DMI_BOARD_NAME, "ONEXPLAYER G1 A"),
+		},
+		.driver_data = (void *)&limits_30w,
+	},
+	/* AYANEO - 15W */
+	{
+		.ident = "AYANEO AIR",
+		.matches = {
+			DMI_MATCH(DMI_BOARD_VENDOR, "AYANEO"),
+			DMI_EXACT_MATCH(DMI_BOARD_NAME, "AIR"),
+		},
+		.driver_data = (void *)&limits_15w,
+	},
+	/* AYANEO - 18W */
+	{
+		.ident = "AYANEO AIR Plus",
+		.matches = {
+			DMI_MATCH(DMI_BOARD_VENDOR, "AYANEO"),
+			DMI_EXACT_MATCH(DMI_BOARD_NAME, "AIR Plus"),
+		},
+		.driver_data = (void *)&limits_18w,
+	},
+	{
+		.ident = "AYANEO AIR Pro",
+		.matches = {
+			DMI_MATCH(DMI_BOARD_VENDOR, "AYANEO"),
+			DMI_EXACT_MATCH(DMI_BOARD_NAME, "AIR Pro"),
+		},
+		.driver_data = (void *)&limits_18w,
+	},
+	/* AYANEO - 25W */
+	{
+		.ident = "AYANEO AIR 1S",
+		.matches = {
+			DMI_MATCH(DMI_BOARD_VENDOR, "AYANEO"),
+			DMI_MATCH(DMI_BOARD_NAME, "AIR 1S"),
+		},
+		.driver_data = (void *)&limits_25w,
+	},
+	{
+		.ident = "AYANEO NEXT Advance",
+		.matches = {
+			DMI_MATCH(DMI_BOARD_VENDOR, "AYANEO"),
+			DMI_EXACT_MATCH(DMI_BOARD_NAME, "NEXT Advance"),
+		},
+		.driver_data = (void *)&limits_25w,
+	},
+	{
+		.ident = "AYANEO NEXT Lite",
+		.matches = {
+			DMI_MATCH(DMI_BOARD_VENDOR, "AYANEO"),
+			DMI_EXACT_MATCH(DMI_BOARD_NAME, "NEXT Lite"),
+		},
+		.driver_data = (void *)&limits_25w,
+	},
+	{
+		.ident = "AYANEO NEXT Pro",
+		.matches = {
+			DMI_MATCH(DMI_BOARD_VENDOR, "AYANEO"),
+			DMI_EXACT_MATCH(DMI_BOARD_NAME, "NEXT Pro"),
+		},
+		.driver_data = (void *)&limits_25w,
+	},
+	{
+		.ident = "AYANEO NEXT",
+		.matches = {
+			DMI_MATCH(DMI_BOARD_VENDOR, "AYANEO"),
+			DMI_EXACT_MATCH(DMI_BOARD_NAME, "NEXT"),
+		},
+		.driver_data = (void *)&limits_25w,
+	},
+	{
+		.ident = "AYANEO KUN",
+		.matches = {
+			DMI_MATCH(DMI_BOARD_VENDOR, "AYANEO"),
+			DMI_EXACT_MATCH(DMI_BOARD_NAME, "KUN"),
+		},
+		.driver_data = (void *)&limits_25w,
+	},
+	{
+		.ident = "AYANEO KUN",
+		.matches = {
+			DMI_MATCH(DMI_BOARD_VENDOR, "AYANEO"),
+			DMI_EXACT_MATCH(DMI_BOARD_NAME, "AYANEO KUN"),
+		},
+		.driver_data = (void *)&limits_25w,
+	},
+	/* AYANEO - 28W */
+	{
+		.ident = "AYANEO 2",
+		.matches = {
+			DMI_MATCH(DMI_BOARD_VENDOR, "AYANEO"),
+			DMI_MATCH(DMI_BOARD_NAME, "AYANEO 2"),
+		},
+		.driver_data = (void *)&limits_28w,
+	},
+	{
+		.ident = "SuiPlay0X1",
+		.matches = {
+			DMI_MATCH(DMI_SYS_VENDOR, "Mysten Labs, Inc."),
+			DMI_MATCH(DMI_PRODUCT_NAME, "SuiPlay0X1"),
+		},
+		.driver_data = (void *)&limits_28w,
+	},
+	/* AYANEO - 30W */
+	{
+		/* DMI_MATCH catches all FLIP variants (DS, KB, 1S DS, 1S KB) */
+		.ident = "AYANEO FLIP",
+		.matches = {
+			DMI_MATCH(DMI_BOARD_VENDOR, "AYANEO"),
+			DMI_MATCH(DMI_BOARD_NAME, "FLIP"),
+		},
+		.driver_data = (void *)&limits_30w,
+	},
+	{
+		/* DMI_MATCH catches GEEK and GEEK 1S */
+		.ident = "AYANEO GEEK",
+		.matches = {
+			DMI_MATCH(DMI_BOARD_VENDOR, "AYANEO"),
+			DMI_MATCH(DMI_BOARD_NAME, "GEEK"),
+		},
+		.driver_data = (void *)&limits_30w,
+	},
+	{
+		.ident = "AYANEO SLIDE",
+		.matches = {
+			DMI_MATCH(DMI_BOARD_VENDOR, "AYANEO"),
+			DMI_EXACT_MATCH(DMI_BOARD_NAME, "SLIDE"),
+		},
+		.driver_data = (void *)&limits_30w,
+	},
+	{
+		.ident = "AYANEO 3",
+		.matches = {
+			DMI_MATCH(DMI_BOARD_VENDOR, "AYANEO"),
+			DMI_EXACT_MATCH(DMI_BOARD_NAME, "AYANEO 3"),
+		},
+		.driver_data = (void *)&limits_30w,
+	},
 	{ }
 };
 MODULE_DEVICE_TABLE(dmi, dptc_dmi_table);
-- 
2.52.0



  parent reply	other threads:[~2026-03-09 20:52 UTC|newest]

Thread overview: 21+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2026-03-09 20:51 [RFC v4 0/4] platform/x86/amd: Add AMD DPTCi driver for TDP control in devices without vendor-specific controls Antheas Kapenekakis
2026-03-09 20:51 ` [RFC v4 1/4] Documentation: firmware-attributes: generalize save_settings entry Antheas Kapenekakis
2026-03-09 20:51 ` [RFC v4 2/4] platform/x86/amd: dptc: Add AMD DPTCi driver Antheas Kapenekakis
2026-03-10  4:01   ` Mario Limonciello
2026-03-10  8:02     ` Antheas Kapenekakis
2026-03-10 16:26       ` Mario Limonciello
2026-03-11 19:09         ` Antheas Kapenekakis
2026-03-12 13:24           ` Mario Limonciello
2026-03-12 13:47             ` Antheas Kapenekakis
2026-03-12 16:05               ` Mario Limonciello
2026-03-12 16:19                 ` Antheas Kapenekakis
2026-03-09 20:51 ` [RFC v4 3/4] platform/x86/amd: dptc: Add platform profile support Antheas Kapenekakis
2026-03-10  4:07   ` Mario Limonciello
2026-03-09 20:51 ` Antheas Kapenekakis [this message]
2026-03-10  4:11   ` [RFC v4 4/4] platform/x86/amd: dptc: Add device entries for handheld PCs Mario Limonciello
2026-03-10  8:13     ` Antheas Kapenekakis
2026-03-10 16:35       ` Mario Limonciello
2026-03-11 19:13         ` Antheas Kapenekakis
2026-03-12 13:26           ` Mario Limonciello
2026-03-10  2:43 ` [RFC v4 0/4] platform/x86/amd: Add AMD DPTCi driver for TDP control in devices without vendor-specific controls Mario Limonciello
2026-03-10  7:59   ` Antheas Kapenekakis

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=20260309205125.293148-5-lkml@antheas.dev \
    --to=lkml@antheas.dev \
    --cc=Mario.Limonciello@amd.com \
    --cc=Shyam-Sundar.S-k@amd.com \
    --cc=W_Armin@gmx.de \
    --cc=denis.benato@linux.dev \
    --cc=derekjohn.clark@gmail.com \
    --cc=i@rong.moe \
    --cc=linux-kernel@vger.kernel.org \
    --cc=platform-driver-x86@vger.kernel.org \
    --cc=sashal@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.