public inbox for dri-devel@lists.freedesktop.org
 help / color / mirror / Atom feed
From: Sasha Levin <sashal@kernel.org>
To: patches@lists.linux.dev, stable@vger.kernel.org
Cc: Roman Li <Roman.Li@amd.com>,
	Dillon Varone <dillon.varone@amd.com>,
	Chuanyu Tseng <chuanyu.tseng@amd.com>,
	Alex Deucher <alexander.deucher@amd.com>,
	Sasha Levin <sashal@kernel.org>,
	harry.wentland@amd.com, sunpeng.li@amd.com,
	christian.koenig@amd.com, airlied@gmail.com, simona@ffwll.ch,
	amd-gfx@lists.freedesktop.org, dri-devel@lists.freedesktop.org,
	linux-kernel@vger.kernel.org
Subject: [PATCH AUTOSEL 7.0-6.12] drm/amd/display: Remove invalid DPSTREAMCLK mask usage
Date: Mon, 20 Apr 2026 09:21:26 -0400	[thread overview]
Message-ID: <20260420132314.1023554-292-sashal@kernel.org> (raw)
In-Reply-To: <20260420132314.1023554-1-sashal@kernel.org>

From: Roman Li <Roman.Li@amd.com>

[ Upstream commit 8de2559ec172b04301d6e53c4f30388e40fad08c ]

[Why]
The invalid register field access causes ASSERT(mask != 0) to fire
in set_reg_field_values() during display enable.

WARNING: at drivers/gpu/drm/amd/amdgpu/../display/dc/dc_helper.c:100
set_reg_field_values.isra.0+0xcf/0xf0 [amdgpu]
Call Trace:
 <TASK>
generic_reg_update_ex+0x66/0x1d0 [amdgpu]
dccg401_set_dpstreamclk+0xed/0x350 [amdgpu]
dcn401_enable_stream+0x165/0x370 [amdgpu]
link_set_dpms_on+0x6e9/0xe90 [amdgpu]
dce110_apply_single_controller_ctx_to_hw+0x343/0x530 [amdgpu]
dce110_apply_ctx_to_hw+0x1f6/0x2d0 [amdgpu]
dc_commit_state_no_check+0x49a/0xe20 [amdgpu]
dc_commit_streams+0x354/0x570 [amdgpu]
amdgpu_dm_atomic_commit_tail+0x6f8/0x3fc0 [amdgpu]

DCN4.x hardware does not have DPSTREAMCLK_GATE_DISABLE and
DPSTREAMCLK_ROOT_GATE_DISABLE fields in DCCG_GATE_DISABLE_CNTL3.
These global fields only exist in DCN3.1.x hardware.

[How]
Remove the call that tries to update non-existent fields in CNTL3.
DCN4.x uses per-instance fields in CNTL5 instead,
which are already correctly programmed in the switch cases above.

Reviewed-by: Dillon Varone <dillon.varone@amd.com>
Signed-off-by: Roman Li <Roman.Li@amd.com>
Signed-off-by: Chuanyu Tseng <chuanyu.tseng@amd.com>
Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
Signed-off-by: Sasha Levin <sashal@kernel.org>
---

LLM Generated explanations, may be completely bogus:

I now have all the evidence needed. Let me compile the complete
analysis.

---

## PHASE 1: COMMIT MESSAGE FORENSICS

**Step 1.1: Subject Line**
- Subsystem: `drm/amd/display` (AMD Display Core for DCN401 / RDNA 4)
- Action verb: "Remove" (removing invalid code that causes an assertion
  failure)
- Summary: Removes register field access to non-existent mask fields on
  DCN4.x hardware

**Step 1.2: Tags**
- `Reviewed-by: Dillon Varone <dillon.varone@amd.com>` - AMD display
  engineer reviewed
- `Signed-off-by: Roman Li` (author), `Chuanyu Tseng`, `Alex Deucher`
  (AMD drm subsystem maintainer)
- No Fixes: tag (expected for manual review candidates)
- No Cc: stable (expected)

**Step 1.3: Commit Body**
The commit includes a full stack trace showing a WARNING triggered from
`ASSERT(mask != 0)` in `set_reg_field_values()` during display enable.
The path is: `amdgpu_dm_atomic_commit_tail -> dc_commit_streams -> ...
-> dccg401_set_dpstreamclk -> generic_reg_update_ex ->
set_reg_field_values`. The bug is that DCN4.x code tries to write
`DPSTREAMCLK_GATE_DISABLE` and `DPSTREAMCLK_ROOT_GATE_DISABLE` fields in
`DCCG_GATE_DISABLE_CNTL3`, but those global fields only exist in
DCN3.1.x hardware.

**Step 1.4: Hidden Bug Fix?**
This is explicitly a bug fix, not disguised. The WARNING/ASSERT fires on
every display enable path.

Record: Clear bug fix. WARNING/ASSERT fires on the normal display enable
path for all DCN4.x hardware.

## PHASE 2: DIFF ANALYSIS

**Step 2.1: Inventory**
- Single file:
  `drivers/gpu/drm/amd/display/dc/dccg/dcn401/dcn401_dccg.c`
- 4 lines removed, 0 lines added
- Single function modified: `dccg401_enable_dpstreamclk`
- Classification: Single-file surgical fix

**Step 2.2: Code Flow Change**
Before: After the per-instance switch statement (which correctly
programs CNTL5), the function unconditionally tries to update
`DCCG_GATE_DISABLE_CNTL3` with `DPSTREAMCLK_GATE_DISABLE` and
`DPSTREAMCLK_ROOT_GATE_DISABLE`. Since these masks are 0, ASSERT fires.

After: The function ends after the per-instance switch cases, which
already correctly program the per-instance fields in CNTL5.

**Step 2.3: Bug Mechanism**
Category: Logic/correctness - writing to register fields that don't
exist on this hardware. The `FN()` macro expands to `(shift=0, mask=0)`
because `DCCG_MASK_SH_LIST_DCN401` in the header never initializes these
fields.

**Step 2.4: Fix Quality**
Absolutely minimal and obviously correct. The header file
`dcn401_dccg.h` lists all mask/shift entries for DCN401 and does NOT
include `DPSTREAMCLK_GATE_DISABLE` or `DPSTREAMCLK_ROOT_GATE_DISABLE`.
The per-instance equivalents in CNTL5 (e.g. `DPSTREAMCLK0_GATE_DISABLE`
through `DPSTREAMCLK3_GATE_DISABLE`) are already programmed in each
switch case. Zero regression risk.

## PHASE 3: GIT HISTORY INVESTIGATION

**Step 3.1: Blame**
All buggy lines trace to commit `70839da636050` "drm/amd/display: Add
new DCN401 sources" by Aurabindo Pillai (2024-04-19). The DCN401 code
was copied from DCN31 where these global CNTL3 fields are valid. The bug
has been present since DCN401's introduction.

**Step 3.2: Fixes Tag**
No Fixes: tag present. However, the implicit target is `70839da636050`
which first appeared in v6.11-rc1.

**Step 3.3: File History**
Recent changes to the file are mostly refactoring/restructuring. No
related DPSTREAMCLK fixes were found.

**Step 3.4: Author**
Roman Li is an AMD display team member with multiple commits to
drm/amd/display. Alex Deucher is the AMD drm subsystem maintainer who
signed off.

**Step 3.5: Dependencies**
None. This is a standalone 4-line removal. No prerequisites needed.

## PHASE 4: MAILING LIST AND EXTERNAL RESEARCH

**Step 4.1-4.5:**
b4 dig did not find a lore thread (AMD often submits through internal
processes to drm-next). Web search also did not surface a specific lore
discussion. This is typical for AMD display driver commits which go
through Alex Deucher's drm-next tree.

## PHASE 5: CODE SEMANTIC ANALYSIS

**Step 5.1: Functions Modified**
`dccg401_enable_dpstreamclk` - called from `dccg401_set_dpstreamclk`

**Step 5.2: Callers**
The call chain from the stack trace:
- `amdgpu_dm_atomic_commit_tail` -> `dc_commit_streams` -> ... ->
  `dcn401_enable_stream` -> `dccg401_set_dpstreamclk` ->
  `dccg401_enable_dpstreamclk`

This is the **main display enable path** - triggered every time a
display mode is committed on RDNA 4 hardware (mode set, resume from
suspend, hotplug, etc.).

**Step 5.3-5.4: Call Chain**
The buggy path is reachable from userspace via any DRM atomic commit
that enables a display stream (e.g., `xrandr`, Wayland compositor, KMS
modesetting). This is the most common display operation.

**Step 5.5: Similar Patterns**
DCN31 (`dcn31_dccg.c`) correctly uses these fields because
`DCCG_MASK_SH_LIST_DCN31` includes them. The bug is specific to DCN401
which copied the DCN31 code but doesn't have these hardware fields.

## PHASE 6: STABLE TREE ANALYSIS

**Step 6.1: Buggy Code in Stable Trees**
DCN401 was introduced in v6.11. Active stable trees 6.11.y, 6.12.y, and
7.0.y all contain this buggy code. (6.6.y and earlier do not have
DCN401.)

**Step 6.2: Backport Complications**
The fix is a simple 4-line removal. The surrounding code is identical in
all stable trees that have DCN401. Expected clean apply.

**Step 6.3: No Related Fix in Stable**
No previous DPSTREAMCLK fix for DCN401 exists in any stable tree.

## PHASE 7: SUBSYSTEM CONTEXT

**Step 7.1:** drm/amd/display - AMD GPU display driver. DCN401
corresponds to RDNA 4 (Radeon RX 9000 series), a current-generation
consumer/professional GPU.
Criticality: IMPORTANT - affects all RDNA 4 GPU owners using
DisplayPort.

**Step 7.2:** Active subsystem with frequent updates.

## PHASE 8: IMPACT AND RISK ASSESSMENT

**Step 8.1:** Affected users: All AMD RDNA 4 GPU users with DisplayPort
displays.

**Step 8.2:** Trigger: Every display enable (mode set, resume, hotplug).
Very common. Occurs on the normal code path, not an error path.

**Step 8.3:** Failure mode: `WARNING` fires on every display enable.
Severity: HIGH
- Produces kernel log warnings on every mode set
- Systems with `panic_on_warn=1` will CRASH
- Even without panic_on_warn, the WARNING indicates potentially
  undefined register writes

**Step 8.4:** Risk-Benefit:
- BENEFIT: Very high - eliminates WARNING on every display operation for
  all RDNA 4 DP users
- RISK: Extremely low - 4 lines removed, removing code that accesses
  non-existent register fields; per-instance fields in CNTL5 are already
  correctly programmed

## PHASE 9: FINAL SYNTHESIS

**Step 9.1: Evidence Compilation**

FOR backporting:
- Fixes a real bug with a full stack trace in the commit message
- WARNING fires on the normal display enable path for ALL RDNA 4 DP
  users
- Systems with panic_on_warn will crash
- Fix is 4 lines of pure removal - minimally invasive
- Obviously correct: header confirms fields don't exist in DCN401 mask
  list
- Per-instance CNTL5 fields already handle the functionality correctly
- Reviewed by AMD display engineer (Dillon Varone)
- Signed off by AMD drm maintainer (Alex Deucher)
- Bug has existed since DCN401 introduction (v6.11)

AGAINST backporting:
- None identified

**Step 9.2: Stable Rules Checklist**
1. Obviously correct? YES - verified by mask/shift header analysis
2. Fixes a real bug? YES - WARNING on every display enable
3. Important? YES - affects all RDNA 4 DP users, crash with
   panic_on_warn
4. Small and contained? YES - 4 lines removed in 1 file
5. No new features? YES - pure removal of invalid code
6. Applies to stable? YES - DCN401 exists in 6.11+, code is identical

**Step 9.3: Exception Categories**
Not an exception category - this is a straightforward bug fix.

**Step 9.4: Decision**
Clear YES. This is a textbook stable candidate.

## Verification

- [Phase 1] Parsed tags: Reviewed-by from AMD display engineer, SOBs
  from author + AMD maintainer
- [Phase 2] Diff analysis: 4 lines removed from
  `dccg401_enable_dpstreamclk()`, removing invalid CNTL3 register field
  access
- [Phase 3] git blame: All buggy lines from commit 70839da636050 "Add
  new DCN401 sources" (2024-04-19), first in v6.11-rc1
- [Phase 3] git tag --contains: Confirmed DCN401 introduced in v6.11-rc1
- [Phase 5] Traced callers: `dccg401_set_dpstreamclk` ->
  `dccg401_enable_dpstreamclk` called from `dcn401_enable_stream` during
  every display enable
- [Phase 5] Verified mask list: `DCCG_MASK_SH_LIST_DCN401` in
  dcn401_dccg.h has per-instance DPSTREAMCLK[0-3] fields in CNTL5, but
  NO global DPSTREAMCLK_GATE_DISABLE/DPSTREAMCLK_ROOT_GATE_DISABLE in
  CNTL3
- [Phase 5] Verified assert: `dc_helper.c:100` has `ASSERT(mask != 0)`
  confirming the WARNING trigger
- [Phase 5] Verified DCN31 has the fields: `dcn31_dccg.h` lines 153-154
  include the global CNTL3 fields
- [Phase 6] dcn401_resource.c: Static const `dccg_mask` initialized with
  `DCCG_MASK_SH_LIST_DCN401(_MASK)` - confirmed fields are zero
- [Phase 6] DCN401 exists in stable trees v6.11+
- [Phase 4] b4 dig: No lore match found (typical for AMD drm-next
  submissions)
- UNVERIFIED: Exact lore discussion thread (b4 dig and web search
  failed; does not affect decision as the code analysis is conclusive)

**YES**

 drivers/gpu/drm/amd/display/dc/dccg/dcn401/dcn401_dccg.c | 4 ----
 1 file changed, 4 deletions(-)

diff --git a/drivers/gpu/drm/amd/display/dc/dccg/dcn401/dcn401_dccg.c b/drivers/gpu/drm/amd/display/dc/dccg/dcn401/dcn401_dccg.c
index a37f94dec6f2f..44c4a53f14ad8 100644
--- a/drivers/gpu/drm/amd/display/dc/dccg/dcn401/dcn401_dccg.c
+++ b/drivers/gpu/drm/amd/display/dc/dccg/dcn401/dcn401_dccg.c
@@ -526,10 +526,6 @@ static void dccg401_enable_dpstreamclk(struct dccg *dccg, int otg_inst, int dp_h
 		BREAK_TO_DEBUGGER();
 		return;
 	}
-	if (dccg->ctx->dc->debug.root_clock_optimization.bits.dpstream)
-		REG_UPDATE_2(DCCG_GATE_DISABLE_CNTL3,
-			DPSTREAMCLK_GATE_DISABLE, 1,
-			DPSTREAMCLK_ROOT_GATE_DISABLE, 1);
 }
 
 void dccg401_disable_dpstreamclk(struct dccg *dccg, int dp_hpo_inst)
-- 
2.53.0


  parent reply	other threads:[~2026-04-20 13:32 UTC|newest]

Thread overview: 52+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
     [not found] <20260420132314.1023554-1-sashal@kernel.org>
2026-04-20 13:16 ` [PATCH AUTOSEL 7.0-6.12] drm/amdgpu: fix DF NULL pointer issue for soc24 Sasha Levin
2026-04-20 13:16 ` [PATCH AUTOSEL 7.0-6.18] drm/ttm: Avoid invoking the OOM killer when reading back swapped content Sasha Levin
2026-04-20 13:16 ` [PATCH AUTOSEL 6.18] drm/vc4: Release runtime PM reference after binding V3D Sasha Levin
2026-04-20 13:16 ` [PATCH AUTOSEL 7.0-6.19] drm/xe/vf: Wait for all fixups before using default LRCs Sasha Levin
2026-04-20 13:16 ` [PATCH AUTOSEL 7.0-6.12] drm/amd/display: remove duplicate format modifier Sasha Levin
2026-04-20 13:17 ` [PATCH AUTOSEL 7.0] drm/amdgpu/userq: unlock cancel_delayed_work_sync for hang_detect_work Sasha Levin
2026-04-20 13:17 ` [PATCH AUTOSEL 7.0-6.1] drm/amd/display: Merge pipes for validate Sasha Levin
2026-04-20 13:17 ` [PATCH AUTOSEL 6.18] drm/xe: Fix bug in idledly unit conversion Sasha Levin
2026-04-20 13:17 ` [PATCH AUTOSEL 7.0] drm/xe: Skip adding PRL entry to NULL VMA Sasha Levin
2026-04-20 13:17 ` [PATCH AUTOSEL 6.18] drm/vc4: Fix a memory leak in hang state error path Sasha Levin
2026-04-20 13:17 ` [PATCH AUTOSEL 6.18] drm/vc4: Protect madv read in vc4_gem_object_mmap() with madv_lock Sasha Levin
2026-04-20 13:17 ` [PATCH AUTOSEL 7.0-6.12] drm/amd/display: Fix cursor pos at overlay plane edges on DCN4 Sasha Levin
2026-04-20 13:18 ` [PATCH AUTOSEL 7.0-6.1] drm/msm/dpu: fix vblank IRQ registration before atomic_mode_set Sasha Levin
2026-04-20 13:18 ` [PATCH AUTOSEL 6.18] drm/amdgpu: Handle GPU page faults correctly on non-4K page systems Sasha Levin
2026-04-20 13:18 ` [PATCH AUTOSEL 7.0-5.10] drm/amd/display: bios_parser: fix GPIO I2C line off-by-one Sasha Levin
2026-04-20 13:18 ` [PATCH AUTOSEL 7.0] drm/amdgpu: Handle IH v7_1 reg offset differences Sasha Levin
2026-04-20 13:18 ` [PATCH AUTOSEL 7.0-6.18] drm/amdgpu/vcn4.0.3: gate per-queue reset by PSP SOS program version Sasha Levin
2026-04-20 13:18 ` [PATCH AUTOSEL 7.0-6.18] drm/imx: parallel-display: add DRM_DISPLAY_HELPER for DRM_IMX_PARALLEL_DISPLAY Sasha Levin
2026-04-20 13:18 ` [PATCH AUTOSEL 7.0-6.18] drm/amdgpu: fix amdgpu_userq_evict Sasha Levin
2026-04-20 13:18 ` [PATCH AUTOSEL 7.0-5.10] drm/amdgpu: validate fence_count in wait_fences ioctl Sasha Levin
2026-04-20 13:18 ` [PATCH AUTOSEL 7.0-6.6] drm/amdgpu: fix shift-out-of-bounds when updating umc active mask Sasha Levin
2026-04-20 13:18 ` [PATCH AUTOSEL 7.0] drm/amdgpu/userq: remove queue from doorbell xa during clean up Sasha Levin
2026-04-20 13:18 ` [PATCH AUTOSEL 7.0] drm/amdkfd: fix kernel crash on releasing NULL sysfs entry Sasha Levin
2026-04-20 13:18 ` [PATCH AUTOSEL 7.0-6.18] drm/xe/guc: Add Wa_14025883347 for GuC DMA failure on reset Sasha Levin
2026-04-20 13:18 ` [PATCH AUTOSEL 7.0-6.18] drm/amdgpu: clear related counter after RAS eeprom reset Sasha Levin
2026-04-20 13:19 ` [PATCH AUTOSEL 7.0-6.19] drm/amd/display: Restore full update for tiling change to linear Sasha Levin
2026-04-20 13:19 ` [PATCH AUTOSEL 7.0] drm/amdgpu: fix array out of bounds accesses for mes sw_fini Sasha Levin
2026-04-20 13:19 ` [PATCH AUTOSEL 7.0-6.12] drm/amd/display: Exit IPS w/ DC helper for all dc_set_power_state cases Sasha Levin
2026-04-20 13:19 ` [PATCH AUTOSEL 7.0-6.18] drm/amdgpu: fix syncobj leak for amdgpu_gem_va_ioctl() Sasha Levin
2026-04-20 13:19 ` [PATCH AUTOSEL 7.0-6.18] drm/amdgpu: Check for multiplication overflow in checkpoint stack size Sasha Levin
2026-04-20 13:19 ` [PATCH AUTOSEL 7.0-6.18] drm/prime: Limit scatter list size with dedicated DMA device Sasha Levin
2026-04-20 13:20 ` [PATCH AUTOSEL 7.0-6.19] drm/amd/display: Clamp dc_cursor_position x_hotspot to prevent integer overflow Sasha Levin
2026-04-20 13:20 ` [PATCH AUTOSEL 7.0] drm/amdgpu/userq: defer queue publication until create completes Sasha Levin
2026-04-20 13:20 ` [PATCH AUTOSEL 7.0-6.18] drm/amdgpu/userq: fix dma_fence refcount underflow in userq path Sasha Levin
2026-04-20 13:20 ` [PATCH AUTOSEL 7.0-6.12] drm/amdgpu: guard atom_context in devcoredump VBIOS dump Sasha Levin
2026-04-20 13:20 ` [PATCH AUTOSEL 7.0-6.18] drm/amd/display: Avoid turning off the PHY when OTG is running for DVI Sasha Levin
2026-04-20 13:20 ` [PATCH AUTOSEL 7.0] drm/amdgpu: Revert setting up Retry based Thrashing on GFX 12.1 Sasha Levin
2026-04-20 13:20 ` [PATCH AUTOSEL 7.0] drm/amd/pm: Avoid overflow when sorting pp_feature list Sasha Levin
2026-04-20 13:20 ` [PATCH AUTOSEL 7.0-6.19] drm/amd/display: Fix number of opp Sasha Levin
2026-04-20 13:20 ` [PATCH AUTOSEL 7.0-6.19] drm/panel-edp: Change BOE NV140WUM-N64 timings Sasha Levin
2026-04-20 13:21 ` [PATCH AUTOSEL 7.0] drm/amd/display: Fix HWSS v3 fast path determination Sasha Levin
2026-04-20 13:21 ` [PATCH AUTOSEL 7.0-5.10] drm/mediatek: mtk_dsi: enable hs clock during pre-enable Sasha Levin
2026-04-20 13:21 ` [PATCH AUTOSEL 6.18] drm/vc4: Fix memory leak of BO array in hang state Sasha Levin
2026-04-20 13:21 ` Sasha Levin [this message]
2026-04-20 13:21 ` [PATCH AUTOSEL 7.0-6.18] drm/panel-edp: Add CMN N116BCL-EAK (C2) Sasha Levin
2026-04-20 13:21 ` [PATCH AUTOSEL 7.0] drm/amdgpu: Add default reset method for soc_v1_0 Sasha Levin
2026-04-20 13:21 ` [PATCH AUTOSEL 7.0] drm/amdgpu/userq: cleanup amdgpu_userq_get/put where not needed Sasha Levin
2026-04-20 13:21 ` [PATCH AUTOSEL 7.0-6.18] drm/amdgpu: fix some more bug in amdgpu_gem_va_ioctl Sasha Levin
2026-04-20 13:21 ` [PATCH AUTOSEL 7.0-5.10] fbdev: omap2: fix inconsistent lock returns in omapfb_mmap Sasha Levin
2026-04-20 13:21 ` [PATCH AUTOSEL 7.0-6.18] drm: gpu: msm: forbid mem reclaim from reset Sasha Levin
2026-04-20 13:21 ` [PATCH AUTOSEL 7.0-6.18] drm/panel-edp: Add AUO B116XAT04.1 (HW: 1A) Sasha Levin
2026-04-20 13:22 ` [PATCH AUTOSEL 7.0-6.6] drm/gem-dma: set VM_DONTDUMP for mmap Sasha Levin

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=20260420132314.1023554-292-sashal@kernel.org \
    --to=sashal@kernel.org \
    --cc=Roman.Li@amd.com \
    --cc=airlied@gmail.com \
    --cc=alexander.deucher@amd.com \
    --cc=amd-gfx@lists.freedesktop.org \
    --cc=christian.koenig@amd.com \
    --cc=chuanyu.tseng@amd.com \
    --cc=dillon.varone@amd.com \
    --cc=dri-devel@lists.freedesktop.org \
    --cc=harry.wentland@amd.com \
    --cc=linux-kernel@vger.kernel.org \
    --cc=patches@lists.linux.dev \
    --cc=simona@ffwll.ch \
    --cc=stable@vger.kernel.org \
    --cc=sunpeng.li@amd.com \
    /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