From: Hans de Goede <hdegoede@redhat.com>
To: "Rafael J. Wysocki" <rjw@rjwysocki.net>,
Darren Hart <dvhart@infradead.org>
Cc: "Aaron Lu" <aaron.lu@intel.com>,
"Ben Skeggs" <bskeggs@redhat.com>, "Lee Chun-Yi" <jlee@suse.com>,
"Peter Feuerer" <peter@piie.net>,
"Corentin Chary" <corentin.chary@gmail.com>,
"Cezary Jackiewicz" <cezary.jackiewicz@gmail.com>,
"Matthew Garrett" <mjg59@srcf.ucam.org>,
"Pali Rohár" <pali.rohar@gmail.com>,
"Jonathan Woithe" <jwoithe@just42.net>,
"Ike Panhc" <ike.pan@canonical.com>,
"Anisse Astier" <anisse@astier.eu>,
"Henrique de Moraes Holschuh" <ibm-acpi@hmh.eng.br>,
"Azael Avalos" <coproscefalo@gmail.com>,
linux-acpi@vger.kernel.org, platform-driver-x86@vger.kernel.org,
acpi4asus-user@lists.sourceforge.net,
ibm-acpi-devel@lists.sourceforge.net,
"Hans de Goede" <hdegoede@redhat.com>
Subject: [PATCH v3 13/35] acpi-video: Port to new backlight interface selection API
Date: Tue, 16 Jun 2015 16:27:51 +0200 [thread overview]
Message-ID: <1434464893-3529-14-git-send-email-hdegoede@redhat.com> (raw)
In-Reply-To: <1434464893-3529-1-git-send-email-hdegoede@redhat.com>
Most of the patch is moving the dmi quirks for forcing use of the
acpi-video / the native backlight interface to video_detect.c.
What remains is a nice cleanup.
Signed-off-by: Hans de Goede <hdegoede@redhat.com>
---
drivers/acpi/acpi_video.c | 172 ++------------------------------------------
drivers/acpi/video_detect.c | 130 +++++++++++++++++++++++++++++++++
include/acpi/video.h | 2 -
3 files changed, 137 insertions(+), 167 deletions(-)
diff --git a/drivers/acpi/acpi_video.c b/drivers/acpi/acpi_video.c
index db4f353..bba0d87 100644
--- a/drivers/acpi/acpi_video.c
+++ b/drivers/acpi/acpi_video.c
@@ -78,20 +78,6 @@ module_param(brightness_switch_enabled, bool, 0644);
static bool allow_duplicates;
module_param(allow_duplicates, bool, 0644);
-/*
- * For Windows 8 systems: used to decide if video module
- * should skip registering backlight interface of its own.
- */
-enum {
- NATIVE_BACKLIGHT_NOT_SET = -1,
- NATIVE_BACKLIGHT_OFF,
- NATIVE_BACKLIGHT_ON,
-};
-
-static int use_native_backlight_param = NATIVE_BACKLIGHT_NOT_SET;
-module_param_named(use_native_backlight, use_native_backlight_param, int, 0444);
-static int use_native_backlight_dmi = NATIVE_BACKLIGHT_NOT_SET;
-
static int disable_backlight_sysfs_if = -1;
module_param(disable_backlight_sysfs_if, int, 0444);
@@ -244,24 +230,6 @@ static int acpi_video_get_next_level(struct acpi_video_device *device,
u32 level_current, u32 event);
static void acpi_video_switch_brightness(struct work_struct *work);
-static bool acpi_video_use_native_backlight(void)
-{
- if (use_native_backlight_param != NATIVE_BACKLIGHT_NOT_SET)
- return use_native_backlight_param;
- else if (use_native_backlight_dmi != NATIVE_BACKLIGHT_NOT_SET)
- return use_native_backlight_dmi;
- return acpi_osi_is_win8();
-}
-
-bool acpi_video_verify_backlight_support(void)
-{
- if (acpi_video_use_native_backlight() &&
- backlight_device_registered(BACKLIGHT_RAW))
- return false;
- return acpi_video_backlight_support();
-}
-EXPORT_SYMBOL_GPL(acpi_video_verify_backlight_support);
-
/* backlight device sysfs support */
static int acpi_video_get_brightness(struct backlight_device *bd)
{
@@ -422,18 +390,6 @@ static int __init video_set_bqc_offset(const struct dmi_system_id *d)
return 0;
}
-static int __init video_disable_native_backlight(const struct dmi_system_id *d)
-{
- use_native_backlight_dmi = NATIVE_BACKLIGHT_OFF;
- return 0;
-}
-
-static int __init video_enable_native_backlight(const struct dmi_system_id *d)
-{
- use_native_backlight_dmi = NATIVE_BACKLIGHT_ON;
- return 0;
-}
-
static int __init video_disable_backlight_sysfs_if(
const struct dmi_system_id *d)
{
@@ -488,123 +444,6 @@ static struct dmi_system_id video_dmi_table[] __initdata = {
},
/*
- * These models have a working acpi_video backlight control, and using
- * native backlight causes a regression where backlight does not work
- * when userspace is not handling brightness key events. Disable
- * native_backlight on these to fix this:
- * https://bugzilla.kernel.org/show_bug.cgi?id=81691
- */
- {
- .callback = video_disable_native_backlight,
- .ident = "ThinkPad T420",
- .matches = {
- DMI_MATCH(DMI_SYS_VENDOR, "LENOVO"),
- DMI_MATCH(DMI_PRODUCT_VERSION, "ThinkPad T420"),
- },
- },
- {
- .callback = video_disable_native_backlight,
- .ident = "ThinkPad T520",
- .matches = {
- DMI_MATCH(DMI_SYS_VENDOR, "LENOVO"),
- DMI_MATCH(DMI_PRODUCT_VERSION, "ThinkPad T520"),
- },
- },
- {
- .callback = video_disable_native_backlight,
- .ident = "ThinkPad X201s",
- .matches = {
- DMI_MATCH(DMI_SYS_VENDOR, "LENOVO"),
- DMI_MATCH(DMI_PRODUCT_VERSION, "ThinkPad X201s"),
- },
- },
-
- /* The native backlight controls do not work on some older machines */
- {
- /* https://bugs.freedesktop.org/show_bug.cgi?id=81515 */
- .callback = video_disable_native_backlight,
- .ident = "HP ENVY 15 Notebook",
- .matches = {
- DMI_MATCH(DMI_SYS_VENDOR, "Hewlett-Packard"),
- DMI_MATCH(DMI_PRODUCT_NAME, "HP ENVY 15 Notebook PC"),
- },
- },
-
- {
- .callback = video_disable_native_backlight,
- .ident = "SAMSUNG 870Z5E/880Z5E/680Z5E",
- .matches = {
- DMI_MATCH(DMI_SYS_VENDOR, "SAMSUNG ELECTRONICS CO., LTD."),
- DMI_MATCH(DMI_PRODUCT_NAME, "870Z5E/880Z5E/680Z5E"),
- },
- },
- {
- .callback = video_disable_native_backlight,
- .ident = "SAMSUNG 370R4E/370R4V/370R5E/3570RE/370R5V",
- .matches = {
- DMI_MATCH(DMI_SYS_VENDOR, "SAMSUNG ELECTRONICS CO., LTD."),
- DMI_MATCH(DMI_PRODUCT_NAME, "370R4E/370R4V/370R5E/3570RE/370R5V"),
- },
- },
- {
- /* https://bugzilla.redhat.com/show_bug.cgi?id=1186097 */
- .callback = video_disable_native_backlight,
- .ident = "SAMSUNG 3570R/370R/470R/450R/510R/4450RV",
- .matches = {
- DMI_MATCH(DMI_SYS_VENDOR, "SAMSUNG ELECTRONICS CO., LTD."),
- DMI_MATCH(DMI_PRODUCT_NAME, "3570R/370R/470R/450R/510R/4450RV"),
- },
- },
- {
- /* https://bugzilla.redhat.com/show_bug.cgi?id=1094948 */
- .callback = video_disable_native_backlight,
- .ident = "SAMSUNG 730U3E/740U3E",
- .matches = {
- DMI_MATCH(DMI_SYS_VENDOR, "SAMSUNG ELECTRONICS CO., LTD."),
- DMI_MATCH(DMI_PRODUCT_NAME, "730U3E/740U3E"),
- },
- },
- {
- /* https://bugs.freedesktop.org/show_bug.cgi?id=87286 */
- .callback = video_disable_native_backlight,
- .ident = "SAMSUNG 900X3C/900X3D/900X3E/900X4C/900X4D",
- .matches = {
- DMI_MATCH(DMI_SYS_VENDOR, "SAMSUNG ELECTRONICS CO., LTD."),
- DMI_MATCH(DMI_PRODUCT_NAME, "900X3C/900X3D/900X3E/900X4C/900X4D"),
- },
- },
-
- {
- /* https://bugzilla.redhat.com/show_bug.cgi?id=1163574 */
- .callback = video_disable_native_backlight,
- .ident = "Dell XPS15 L521X",
- .matches = {
- DMI_MATCH(DMI_SYS_VENDOR, "Dell Inc."),
- DMI_MATCH(DMI_PRODUCT_NAME, "XPS L521X"),
- },
- },
-
- /* Non win8 machines which need native backlight nevertheless */
- {
- /* https://bugzilla.redhat.com/show_bug.cgi?id=1187004 */
- .callback = video_enable_native_backlight,
- .ident = "Lenovo Ideapad Z570",
- .matches = {
- DMI_MATCH(DMI_SYS_VENDOR, "LENOVO"),
- DMI_MATCH(DMI_PRODUCT_NAME, "102434U"),
- },
- },
- {
- /* https://bugzilla.redhat.com/show_bug.cgi?id=1217249 */
- .callback = video_enable_native_backlight,
- .ident = "Apple MacBook Pro 12,1",
- .matches = {
- DMI_MATCH(DMI_SYS_VENDOR, "Apple Inc."),
- DMI_MATCH(DMI_PRODUCT_NAME, "MacBookPro12,1"),
- },
- },
-
- /*
* Some machines have a broken acpi-video interface for brightness
* control, but still need an acpi_video_device_lcd_set_level() call
* on resume to turn the backlight power on. We Enable backlight
@@ -1831,7 +1670,7 @@ static int acpi_video_bus_register_backlight(struct acpi_video_bus *video)
acpi_video_run_bcl_for_osi(video);
- if (!acpi_video_verify_backlight_support())
+ if (acpi_video_get_backlight_type() != acpi_backlight_video)
return 0;
mutex_lock(&video->device_list_lock);
@@ -1980,20 +1819,23 @@ static int acpi_video_backlight_notify(struct notifier_block *nb,
{
struct backlight_device *backlight = bd;
struct acpi_video_bus *video;
+ enum acpi_backlight_type type;
- /* acpi_video_verify_backlight_support only cares about raw devices */
+ /* A raw bl (un)registering may change native <-> video */
if (backlight->props.type != BACKLIGHT_RAW)
return NOTIFY_DONE;
video = container_of(nb, struct acpi_video_bus, backlight_nb);
+ type = acpi_video_get_backlight_type();
switch (val) {
case BACKLIGHT_REGISTERED:
- if (!acpi_video_verify_backlight_support())
+ if (type != acpi_backlight_video)
acpi_video_bus_unregister_backlight(video);
break;
case BACKLIGHT_UNREGISTERED:
- acpi_video_bus_register_backlight(video);
+ if (type == acpi_backlight_video)
+ acpi_video_bus_register_backlight(video);
break;
}
diff --git a/drivers/acpi/video_detect.c b/drivers/acpi/video_detect.c
index d00c0f4..d024ea0 100644
--- a/drivers/acpi/video_detect.c
+++ b/drivers/acpi/video_detect.c
@@ -84,6 +84,18 @@ static int video_detect_force_vendor(const struct dmi_system_id *d)
return 0;
}
+static int video_detect_force_video(const struct dmi_system_id *d)
+{
+ acpi_backlight_dmi = acpi_backlight_video;
+ return 0;
+}
+
+static int video_detect_force_native(const struct dmi_system_id *d)
+{
+ acpi_backlight_dmi = acpi_backlight_native;
+ return 0;
+}
+
static const struct dmi_system_id video_detect_dmi_table[] = {
/* On Samsung X360, the BIOS will set a flag (VDRV) if generic
* ACPI backlight device is used. This flag will definitively break
@@ -124,6 +136,124 @@ static const struct dmi_system_id video_detect_dmi_table[] = {
DMI_MATCH(DMI_PRODUCT_NAME, "Inspiron 5737"),
},
},
+
+ /*
+ * These models have a working acpi_video backlight control, and using
+ * native backlight causes a regression where backlight does not work
+ * when userspace is not handling brightness key events. Disable
+ * native_backlight on these to fix this:
+ * https://bugzilla.kernel.org/show_bug.cgi?id=81691
+ */
+ {
+ .callback = video_detect_force_video,
+ .ident = "ThinkPad T420",
+ .matches = {
+ DMI_MATCH(DMI_SYS_VENDOR, "LENOVO"),
+ DMI_MATCH(DMI_PRODUCT_VERSION, "ThinkPad T420"),
+ },
+ },
+ {
+ .callback = video_detect_force_video,
+ .ident = "ThinkPad T520",
+ .matches = {
+ DMI_MATCH(DMI_SYS_VENDOR, "LENOVO"),
+ DMI_MATCH(DMI_PRODUCT_VERSION, "ThinkPad T520"),
+ },
+ },
+ {
+ .callback = video_detect_force_video,
+ .ident = "ThinkPad X201s",
+ .matches = {
+ DMI_MATCH(DMI_SYS_VENDOR, "LENOVO"),
+ DMI_MATCH(DMI_PRODUCT_VERSION, "ThinkPad X201s"),
+ },
+ },
+
+ /* The native backlight controls do not work on some older machines */
+ {
+ /* https://bugs.freedesktop.org/show_bug.cgi?id=81515 */
+ .callback = video_detect_force_video,
+ .ident = "HP ENVY 15 Notebook",
+ .matches = {
+ DMI_MATCH(DMI_SYS_VENDOR, "Hewlett-Packard"),
+ DMI_MATCH(DMI_PRODUCT_NAME, "HP ENVY 15 Notebook PC"),
+ },
+ },
+ {
+ .callback = video_detect_force_video,
+ .ident = "SAMSUNG 870Z5E/880Z5E/680Z5E",
+ .matches = {
+ DMI_MATCH(DMI_SYS_VENDOR, "SAMSUNG ELECTRONICS CO., LTD."),
+ DMI_MATCH(DMI_PRODUCT_NAME, "870Z5E/880Z5E/680Z5E"),
+ },
+ },
+ {
+ .callback = video_detect_force_video,
+ .ident = "SAMSUNG 370R4E/370R4V/370R5E/3570RE/370R5V",
+ .matches = {
+ DMI_MATCH(DMI_SYS_VENDOR, "SAMSUNG ELECTRONICS CO., LTD."),
+ DMI_MATCH(DMI_PRODUCT_NAME,
+ "370R4E/370R4V/370R5E/3570RE/370R5V"),
+ },
+ },
+ {
+ /* https://bugzilla.redhat.com/show_bug.cgi?id=1186097 */
+ .callback = video_detect_force_video,
+ .ident = "SAMSUNG 3570R/370R/470R/450R/510R/4450RV",
+ .matches = {
+ DMI_MATCH(DMI_SYS_VENDOR, "SAMSUNG ELECTRONICS CO., LTD."),
+ DMI_MATCH(DMI_PRODUCT_NAME,
+ "3570R/370R/470R/450R/510R/4450RV"),
+ },
+ },
+ {
+ /* https://bugzilla.redhat.com/show_bug.cgi?id=1094948 */
+ .callback = video_detect_force_video,
+ .ident = "SAMSUNG 730U3E/740U3E",
+ .matches = {
+ DMI_MATCH(DMI_SYS_VENDOR, "SAMSUNG ELECTRONICS CO., LTD."),
+ DMI_MATCH(DMI_PRODUCT_NAME, "730U3E/740U3E"),
+ },
+ },
+ {
+ /* https://bugs.freedesktop.org/show_bug.cgi?id=87286 */
+ .callback = video_detect_force_video,
+ .ident = "SAMSUNG 900X3C/900X3D/900X3E/900X4C/900X4D",
+ .matches = {
+ DMI_MATCH(DMI_SYS_VENDOR, "SAMSUNG ELECTRONICS CO., LTD."),
+ DMI_MATCH(DMI_PRODUCT_NAME,
+ "900X3C/900X3D/900X3E/900X4C/900X4D"),
+ },
+ },
+ {
+ /* https://bugzilla.redhat.com/show_bug.cgi?id=1163574 */
+ .callback = video_detect_force_video,
+ .ident = "Dell XPS15 L521X",
+ .matches = {
+ DMI_MATCH(DMI_SYS_VENDOR, "Dell Inc."),
+ DMI_MATCH(DMI_PRODUCT_NAME, "XPS L521X"),
+ },
+ },
+
+ /* Non win8 machines which need native backlight nevertheless */
+ {
+ /* https://bugzilla.redhat.com/show_bug.cgi?id=1187004 */
+ .callback = video_detect_force_native,
+ .ident = "Lenovo Ideapad Z570",
+ .matches = {
+ DMI_MATCH(DMI_SYS_VENDOR, "LENOVO"),
+ DMI_MATCH(DMI_PRODUCT_NAME, "102434U"),
+ },
+ },
+ {
+ /* https://bugzilla.redhat.com/show_bug.cgi?id=1217249 */
+ .callback = video_detect_force_native,
+ .ident = "Apple MacBook Pro 12,1",
+ .matches = {
+ DMI_MATCH(DMI_SYS_VENDOR, "Apple Inc."),
+ DMI_MATCH(DMI_PRODUCT_NAME, "MacBookPro12,1"),
+ },
+ },
{ },
};
diff --git a/include/acpi/video.h b/include/acpi/video.h
index 01b5cc7..47c7ad6 100644
--- a/include/acpi/video.h
+++ b/include/acpi/video.h
@@ -30,7 +30,6 @@ extern void acpi_video_unregister(void);
extern void acpi_video_unregister_backlight(void);
extern int acpi_video_get_edid(struct acpi_device *device, int type,
int device_id, void **edid);
-extern bool acpi_video_verify_backlight_support(void);
extern enum acpi_backlight_type acpi_video_get_backlight_type(void);
extern void acpi_video_set_dmi_backlight_type(enum acpi_backlight_type type);
#else
@@ -42,7 +41,6 @@ static inline int acpi_video_get_edid(struct acpi_device *device, int type,
{
return -ENODEV;
}
-static inline bool acpi_video_verify_backlight_support(void) { return false; }
static inline enum acpi_backlight_type acpi_video_get_backlight_type(void)
{
return acpi_backlight_vendor;
--
2.3.6
next prev parent reply other threads:[~2015-06-16 14:27 UTC|newest]
Thread overview: 37+ messages / expand[flat|nested] mbox.gz Atom feed top
2015-06-16 14:27 [PATCH v3 00/35] acpi-video: Rewrite backlight interface selection logic Hans de Goede
2015-06-16 14:27 ` [PATCH v3 01/35] apple_gmux: Use acpi_video_unregister_backlight instead of acpi_video_unregister Hans de Goede
2015-06-16 14:27 ` [PATCH v3 02/35] asus-wmi: " Hans de Goede
2015-06-16 14:27 ` [PATCH v3 03/35] samsung-laptop: " Hans de Goede
2015-06-16 14:27 ` [PATCH v3 04/35] apple-gmux: Stop using acpi_video_dmi_demote_vendor() Hans de Goede
2015-06-16 14:27 ` [PATCH v3 05/35] acpi-video-detect: Remove the unused acpi_video_dmi_demote_vendor() function Hans de Goede
2015-06-16 14:27 ` [PATCH v3 06/35] acpi-video-detect: Make acpi_video_get_capabilities a private function Hans de Goede
2015-06-16 14:27 ` [PATCH v3 07/35] acpi-video-detect: Move acpi_is_video_device() to acpi/scan.c Hans de Goede
2015-06-16 14:27 ` [PATCH v3 08/35] acpi-video-detect: Move acpi_osi_is_win8 to osl.c Hans de Goede
2015-06-16 14:27 ` [PATCH v3 09/35] acpi-video-detect: video: Make video_detect code part of the video module Hans de Goede
2015-06-16 14:27 ` [PATCH v3 10/35] acpi-video-detect: Rewrite backlight interface selection logic Hans de Goede
2015-06-16 14:27 ` [PATCH v3 11/35] acpi-video-detect: Unregister acpi_video backlight when dmi quirks are added Hans de Goede
2015-06-16 14:27 ` [PATCH v3 12/35] drm: i915: Port to new backlight interface selection API Hans de Goede
2015-06-16 14:27 ` Hans de Goede [this message]
2015-06-16 14:27 ` [PATCH v3 14/35] acpi-video: Move backlight notifier to video_detect.c Hans de Goede
2015-06-16 14:27 ` [PATCH v3 15/35] acpi-video: Move dmi_check_system from module_init to acpi_video_register Hans de Goede
2015-06-16 14:27 ` [PATCH v3 16/35] acpi-video: Fix acpi_video _register vs _unregister_backlight race Hans de Goede
2015-06-16 14:27 ` [PATCH v3 17/35] acer-wmi: Port to new backlight interface selection API Hans de Goede
2015-06-16 14:27 ` [PATCH v3 18/35] apple-gmux: " Hans de Goede
2015-06-16 14:27 ` [PATCH v3 19/35] asus-laptop: " Hans de Goede
2015-06-16 14:27 ` [PATCH v3 20/35] asus-wmi: " Hans de Goede
2015-06-16 14:27 ` [PATCH v3 21/35] compal-laptop: " Hans de Goede
2015-06-16 14:28 ` [PATCH v3 22/35] dell-laptop: " Hans de Goede
2015-06-16 14:28 ` [PATCH v3 23/35] dell-wmi: " Hans de Goede
2015-06-16 14:28 ` [PATCH v3 24/35] eeepc-laptop: " Hans de Goede
2015-06-16 14:28 ` [PATCH v3 25/35] fujitsu-laptop: " Hans de Goede
2015-06-16 14:28 ` [PATCH v3 26/35] ideapad-laptop: " Hans de Goede
2015-06-16 14:28 ` [PATCH v3 27/35] intel-oaktrail: " Hans de Goede
2015-06-16 14:28 ` [PATCH v3 28/35] msi-laptop: " Hans de Goede
2015-06-18 5:59 ` joeyli
2015-06-16 14:28 ` [PATCH v3 29/35] msi-wmi: " Hans de Goede
2015-06-16 14:28 ` [PATCH v3 30/35] samsung-laptop: " Hans de Goede
[not found] ` <1434464893-3529-1-git-send-email-hdegoede-H+wXaHxf7aLQT0dZR+AlfA@public.gmane.org>
2015-06-16 14:28 ` [PATCH v3 31/35] sony-laptop: " Hans de Goede
2015-06-16 14:28 ` [PATCH v3 32/35] thinkpad-acpi: " Hans de Goede
2015-06-16 14:28 ` [PATCH v3 33/35] toshiba-acpi: " Hans de Goede
2015-06-16 14:28 ` [PATCH v3 34/35] acpi-video-detect: Remove old API Hans de Goede
2015-06-16 14:28 ` [PATCH v3 35/35] acpi-video: Make acpi_video_unregister_backlight() private Hans de Goede
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=1434464893-3529-14-git-send-email-hdegoede@redhat.com \
--to=hdegoede@redhat.com \
--cc=aaron.lu@intel.com \
--cc=acpi4asus-user@lists.sourceforge.net \
--cc=anisse@astier.eu \
--cc=bskeggs@redhat.com \
--cc=cezary.jackiewicz@gmail.com \
--cc=coproscefalo@gmail.com \
--cc=corentin.chary@gmail.com \
--cc=dvhart@infradead.org \
--cc=ibm-acpi-devel@lists.sourceforge.net \
--cc=ibm-acpi@hmh.eng.br \
--cc=ike.pan@canonical.com \
--cc=jlee@suse.com \
--cc=jwoithe@just42.net \
--cc=linux-acpi@vger.kernel.org \
--cc=mjg59@srcf.ucam.org \
--cc=pali.rohar@gmail.com \
--cc=peter@piie.net \
--cc=platform-driver-x86@vger.kernel.org \
--cc=rjw@rjwysocki.net \
/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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox