All of lore.kernel.org
 help / color / mirror / Atom feed
From: Oded Gabbay <oded.gabbay@gmail.com>
To: linux-kernel@vger.kernel.org, oshpigelman@habana.ai,
	ttayar@habana.ai, gregkh@linuxfoundation.org
Subject: [PATCH 00/11] Adding GAUDI ASIC support to habanalabs driver
Date: Mon, 11 May 2020 14:32:21 +0300	[thread overview]
Message-ID: <20200511113232.5771-1-oded.gabbay@gmail.com> (raw)

This patch-set adds support for initializing and sending workloads to
habanalabs deep-learning training accelerator ASIC, called GAUDI.

The GAUDI ASIC is based on the same architecture as the GOYA ASIC and
therefore, the driver's common code is applicable to it with only a few
changes. Almost all of the code included in this patch-set is the
ASIC-depedent code which is different per ASIC.

Similar to GOYA, GAUDI includes a set of eight TPC cores, a GEMM engine and
DMA channels to move data between host and different memories of the ASIC.
Each engine has a hardware queue manager (QMAN) attached to it, which
exposes 4 streams to allow complex programs with control flows (in
GOYA you had 1 stream per QMAN).

Patches 1-4 are changes to the common code that are needed for GAUDI. patch
5 adds the registers header files. patch 6 adds the GAUDI definitions to
the uapi file. patches 7-10 adds the GAUDI code itself and patch 11 enables
the GAUDI code in the driver.

Thanks,
Oded

Oded Gabbay (7):
  habanalabs: set PM profile to auto only for goya
  habanalabs: support clock gating enable/disable
  habanalabs: add gaudi asic registers header files
  uapi: habanalabs: add gaudi defines
  habanalabs: add gaudi asic-dependent code
  habanalabs: add hwmgr module for gaudi
  habanalabs: enable gaudi code in driver

Omer Shpigelman (4):
  habanalabs: add dedicated define for hard reset
  habanalabs: get card type, location from F/W
  habanalabs: add gaudi security module
  habanalabs: add gaudi profiler module

 .../ABI/testing/debugfs-driver-habanalabs     |   10 +
 .../ABI/testing/sysfs-driver-habanalabs       |   17 +
 drivers/misc/habanalabs/Makefile              |    3 +
 drivers/misc/habanalabs/debugfs.c             |   61 +
 drivers/misc/habanalabs/device.c              |   13 +-
 drivers/misc/habanalabs/gaudi/Makefile        |    5 +
 drivers/misc/habanalabs/gaudi/gaudi.c         | 7430 ++++++++++++++
 drivers/misc/habanalabs/gaudi/gaudiP.h        |  259 +
 .../misc/habanalabs/gaudi/gaudi_coresight.c   |  885 ++
 drivers/misc/habanalabs/gaudi/gaudi_hwmgr.c   |  117 +
 .../misc/habanalabs/gaudi/gaudi_security.c    | 9114 +++++++++++++++++
 drivers/misc/habanalabs/goya/goya.c           |   12 +
 drivers/misc/habanalabs/habanalabs.h          |   32 +-
 drivers/misc/habanalabs/habanalabs_drv.c      |   13 +-
 drivers/misc/habanalabs/habanalabs_ioctl.c    |    2 +
 drivers/misc/habanalabs/include/armcp_if.h    |   22 +-
 .../include/gaudi/asic_reg/cpu_if_regs.h      |  174 +
 .../include/gaudi/asic_reg/dma0_core_masks.h  |  348 +
 .../include/gaudi/asic_reg/dma0_core_regs.h   |  156 +
 .../include/gaudi/asic_reg/dma0_qm_masks.h    |  800 ++
 .../include/gaudi/asic_reg/dma0_qm_regs.h     |  834 ++
 .../include/gaudi/asic_reg/dma1_core_regs.h   |  156 +
 .../include/gaudi/asic_reg/dma1_qm_regs.h     |  834 ++
 .../include/gaudi/asic_reg/dma2_core_regs.h   |  156 +
 .../include/gaudi/asic_reg/dma2_qm_regs.h     |  834 ++
 .../include/gaudi/asic_reg/dma3_core_regs.h   |  156 +
 .../include/gaudi/asic_reg/dma3_qm_regs.h     |  834 ++
 .../include/gaudi/asic_reg/dma4_core_regs.h   |  156 +
 .../include/gaudi/asic_reg/dma4_qm_regs.h     |  834 ++
 .../include/gaudi/asic_reg/dma5_core_regs.h   |  156 +
 .../include/gaudi/asic_reg/dma5_qm_regs.h     |  834 ++
 .../include/gaudi/asic_reg/dma6_core_regs.h   |  156 +
 .../include/gaudi/asic_reg/dma6_qm_regs.h     |  834 ++
 .../include/gaudi/asic_reg/dma7_core_regs.h   |  156 +
 .../include/gaudi/asic_reg/dma7_qm_regs.h     |  834 ++
 .../gaudi/asic_reg/dma_if_e_n_down_ch0_regs.h |  896 ++
 .../gaudi/asic_reg/dma_if_e_n_down_ch1_regs.h |  896 ++
 .../include/gaudi/asic_reg/dma_if_e_n_regs.h  |  860 ++
 .../gaudi/asic_reg/dma_if_e_s_down_ch0_regs.h |  896 ++
 .../gaudi/asic_reg/dma_if_e_s_down_ch1_regs.h |  896 ++
 .../include/gaudi/asic_reg/dma_if_e_s_regs.h  |  860 ++
 .../gaudi/asic_reg/dma_if_w_n_down_ch0_regs.h |  896 ++
 .../gaudi/asic_reg/dma_if_w_n_down_ch1_regs.h |  896 ++
 .../include/gaudi/asic_reg/dma_if_w_n_regs.h  |  860 ++
 .../gaudi/asic_reg/dma_if_w_s_down_ch0_regs.h |  896 ++
 .../gaudi/asic_reg/dma_if_w_s_down_ch1_regs.h |  896 ++
 .../include/gaudi/asic_reg/dma_if_w_s_regs.h  |  860 ++
 .../include/gaudi/asic_reg/gaudi_blocks.h     | 4974 +++++++++
 .../include/gaudi/asic_reg/gaudi_regs.h       |  299 +
 .../include/gaudi/asic_reg/mme0_ctrl_regs.h   | 1456 +++
 .../include/gaudi/asic_reg/mme0_qm_masks.h    |  800 ++
 .../include/gaudi/asic_reg/mme0_qm_regs.h     |  834 ++
 .../include/gaudi/asic_reg/mme1_ctrl_regs.h   | 1456 +++
 .../include/gaudi/asic_reg/mme2_ctrl_regs.h   | 1456 +++
 .../include/gaudi/asic_reg/mme2_qm_regs.h     |  834 ++
 .../include/gaudi/asic_reg/mme3_ctrl_regs.h   | 1456 +++
 .../include/gaudi/asic_reg/mmu_up_regs.h      |   72 +
 .../gaudi/asic_reg/nif_rtr_ctrl_0_regs.h      |  896 ++
 .../gaudi/asic_reg/nif_rtr_ctrl_1_regs.h      |  896 ++
 .../gaudi/asic_reg/nif_rtr_ctrl_2_regs.h      |  896 ++
 .../gaudi/asic_reg/nif_rtr_ctrl_3_regs.h      |  896 ++
 .../gaudi/asic_reg/nif_rtr_ctrl_4_regs.h      |  896 ++
 .../gaudi/asic_reg/nif_rtr_ctrl_5_regs.h      |  896 ++
 .../gaudi/asic_reg/nif_rtr_ctrl_6_regs.h      |  896 ++
 .../gaudi/asic_reg/nif_rtr_ctrl_7_regs.h      |  896 ++
 .../include/gaudi/asic_reg/psoc_etr_regs.h    |  114 +
 .../gaudi/asic_reg/psoc_global_conf_masks.h   |  502 +
 .../gaudi/asic_reg/psoc_global_conf_regs.h    | 1062 ++
 .../gaudi/asic_reg/psoc_hbm_pll_regs.h        |  114 +
 .../gaudi/asic_reg/psoc_pci_pll_regs.h        |  114 +
 .../gaudi/asic_reg/psoc_timestamp_regs.h      |   56 +
 .../gaudi/asic_reg/sif_rtr_ctrl_0_regs.h      |  896 ++
 .../gaudi/asic_reg/sif_rtr_ctrl_1_regs.h      |  896 ++
 .../gaudi/asic_reg/sif_rtr_ctrl_2_regs.h      |  896 ++
 .../gaudi/asic_reg/sif_rtr_ctrl_3_regs.h      |  896 ++
 .../gaudi/asic_reg/sif_rtr_ctrl_4_regs.h      |  896 ++
 .../gaudi/asic_reg/sif_rtr_ctrl_5_regs.h      |  896 ++
 .../gaudi/asic_reg/sif_rtr_ctrl_6_regs.h      |  896 ++
 .../gaudi/asic_reg/sif_rtr_ctrl_7_regs.h      |  896 ++
 .../include/gaudi/asic_reg/stlb_regs.h        |   82 +
 .../include/gaudi/asic_reg/tpc0_cfg_masks.h   | 2578 +++++
 .../include/gaudi/asic_reg/tpc0_cfg_regs.h    | 1226 +++
 .../include/gaudi/asic_reg/tpc0_qm_masks.h    |  800 ++
 .../include/gaudi/asic_reg/tpc0_qm_regs.h     |  834 ++
 .../include/gaudi/asic_reg/tpc1_cfg_regs.h    | 1226 +++
 .../include/gaudi/asic_reg/tpc1_qm_regs.h     |  834 ++
 .../include/gaudi/asic_reg/tpc2_cfg_regs.h    | 1226 +++
 .../include/gaudi/asic_reg/tpc2_qm_regs.h     |  834 ++
 .../include/gaudi/asic_reg/tpc3_cfg_regs.h    | 1226 +++
 .../include/gaudi/asic_reg/tpc3_qm_regs.h     |  834 ++
 .../include/gaudi/asic_reg/tpc4_cfg_regs.h    | 1226 +++
 .../include/gaudi/asic_reg/tpc4_qm_regs.h     |  834 ++
 .../include/gaudi/asic_reg/tpc5_cfg_regs.h    | 1226 +++
 .../include/gaudi/asic_reg/tpc5_qm_regs.h     |  834 ++
 .../include/gaudi/asic_reg/tpc6_cfg_regs.h    | 1226 +++
 .../include/gaudi/asic_reg/tpc6_qm_regs.h     |  834 ++
 .../include/gaudi/asic_reg/tpc7_cfg_regs.h    | 1226 +++
 .../include/gaudi/asic_reg/tpc7_qm_regs.h     |  834 ++
 drivers/misc/habanalabs/include/gaudi/gaudi.h |   59 +
 .../include/gaudi/gaudi_async_events.h        |  310 +
 .../include/gaudi/gaudi_async_ids_map.h       |  687 ++
 .../include/gaudi/gaudi_coresight.h           |  367 +
 .../habanalabs/include/gaudi/gaudi_fw_if.h    |   36 +
 .../habanalabs/include/gaudi/gaudi_masks.h    |  450 +
 .../habanalabs/include/gaudi/gaudi_packets.h  |  212 +
 .../habanalabs/include/gaudi/gaudi_reg_map.h  |   27 +
 .../include/hw_ip/mmu/mmu_general.h           |    2 +-
 .../habanalabs/include/hw_ip/mmu/mmu_v1_1.h   |   16 +
 drivers/misc/habanalabs/sysfs.c               |    8 +-
 include/uapi/misc/habanalabs.h                |  167 +-
 110 files changed, 90045 insertions(+), 16 deletions(-)
 create mode 100644 drivers/misc/habanalabs/gaudi/Makefile
 create mode 100644 drivers/misc/habanalabs/gaudi/gaudi.c
 create mode 100644 drivers/misc/habanalabs/gaudi/gaudiP.h
 create mode 100644 drivers/misc/habanalabs/gaudi/gaudi_coresight.c
 create mode 100644 drivers/misc/habanalabs/gaudi/gaudi_hwmgr.c
 create mode 100644 drivers/misc/habanalabs/gaudi/gaudi_security.c
 create mode 100644 drivers/misc/habanalabs/include/gaudi/asic_reg/cpu_if_regs.h
 create mode 100644 drivers/misc/habanalabs/include/gaudi/asic_reg/dma0_core_masks.h
 create mode 100644 drivers/misc/habanalabs/include/gaudi/asic_reg/dma0_core_regs.h
 create mode 100644 drivers/misc/habanalabs/include/gaudi/asic_reg/dma0_qm_masks.h
 create mode 100644 drivers/misc/habanalabs/include/gaudi/asic_reg/dma0_qm_regs.h
 create mode 100644 drivers/misc/habanalabs/include/gaudi/asic_reg/dma1_core_regs.h
 create mode 100644 drivers/misc/habanalabs/include/gaudi/asic_reg/dma1_qm_regs.h
 create mode 100644 drivers/misc/habanalabs/include/gaudi/asic_reg/dma2_core_regs.h
 create mode 100644 drivers/misc/habanalabs/include/gaudi/asic_reg/dma2_qm_regs.h
 create mode 100644 drivers/misc/habanalabs/include/gaudi/asic_reg/dma3_core_regs.h
 create mode 100644 drivers/misc/habanalabs/include/gaudi/asic_reg/dma3_qm_regs.h
 create mode 100644 drivers/misc/habanalabs/include/gaudi/asic_reg/dma4_core_regs.h
 create mode 100644 drivers/misc/habanalabs/include/gaudi/asic_reg/dma4_qm_regs.h
 create mode 100644 drivers/misc/habanalabs/include/gaudi/asic_reg/dma5_core_regs.h
 create mode 100644 drivers/misc/habanalabs/include/gaudi/asic_reg/dma5_qm_regs.h
 create mode 100644 drivers/misc/habanalabs/include/gaudi/asic_reg/dma6_core_regs.h
 create mode 100644 drivers/misc/habanalabs/include/gaudi/asic_reg/dma6_qm_regs.h
 create mode 100644 drivers/misc/habanalabs/include/gaudi/asic_reg/dma7_core_regs.h
 create mode 100644 drivers/misc/habanalabs/include/gaudi/asic_reg/dma7_qm_regs.h
 create mode 100644 drivers/misc/habanalabs/include/gaudi/asic_reg/dma_if_e_n_down_ch0_regs.h
 create mode 100644 drivers/misc/habanalabs/include/gaudi/asic_reg/dma_if_e_n_down_ch1_regs.h
 create mode 100644 drivers/misc/habanalabs/include/gaudi/asic_reg/dma_if_e_n_regs.h
 create mode 100644 drivers/misc/habanalabs/include/gaudi/asic_reg/dma_if_e_s_down_ch0_regs.h
 create mode 100644 drivers/misc/habanalabs/include/gaudi/asic_reg/dma_if_e_s_down_ch1_regs.h
 create mode 100644 drivers/misc/habanalabs/include/gaudi/asic_reg/dma_if_e_s_regs.h
 create mode 100644 drivers/misc/habanalabs/include/gaudi/asic_reg/dma_if_w_n_down_ch0_regs.h
 create mode 100644 drivers/misc/habanalabs/include/gaudi/asic_reg/dma_if_w_n_down_ch1_regs.h
 create mode 100644 drivers/misc/habanalabs/include/gaudi/asic_reg/dma_if_w_n_regs.h
 create mode 100644 drivers/misc/habanalabs/include/gaudi/asic_reg/dma_if_w_s_down_ch0_regs.h
 create mode 100644 drivers/misc/habanalabs/include/gaudi/asic_reg/dma_if_w_s_down_ch1_regs.h
 create mode 100644 drivers/misc/habanalabs/include/gaudi/asic_reg/dma_if_w_s_regs.h
 create mode 100644 drivers/misc/habanalabs/include/gaudi/asic_reg/gaudi_blocks.h
 create mode 100644 drivers/misc/habanalabs/include/gaudi/asic_reg/gaudi_regs.h
 create mode 100644 drivers/misc/habanalabs/include/gaudi/asic_reg/mme0_ctrl_regs.h
 create mode 100644 drivers/misc/habanalabs/include/gaudi/asic_reg/mme0_qm_masks.h
 create mode 100644 drivers/misc/habanalabs/include/gaudi/asic_reg/mme0_qm_regs.h
 create mode 100644 drivers/misc/habanalabs/include/gaudi/asic_reg/mme1_ctrl_regs.h
 create mode 100644 drivers/misc/habanalabs/include/gaudi/asic_reg/mme2_ctrl_regs.h
 create mode 100644 drivers/misc/habanalabs/include/gaudi/asic_reg/mme2_qm_regs.h
 create mode 100644 drivers/misc/habanalabs/include/gaudi/asic_reg/mme3_ctrl_regs.h
 create mode 100644 drivers/misc/habanalabs/include/gaudi/asic_reg/mmu_up_regs.h
 create mode 100644 drivers/misc/habanalabs/include/gaudi/asic_reg/nif_rtr_ctrl_0_regs.h
 create mode 100644 drivers/misc/habanalabs/include/gaudi/asic_reg/nif_rtr_ctrl_1_regs.h
 create mode 100644 drivers/misc/habanalabs/include/gaudi/asic_reg/nif_rtr_ctrl_2_regs.h
 create mode 100644 drivers/misc/habanalabs/include/gaudi/asic_reg/nif_rtr_ctrl_3_regs.h
 create mode 100644 drivers/misc/habanalabs/include/gaudi/asic_reg/nif_rtr_ctrl_4_regs.h
 create mode 100644 drivers/misc/habanalabs/include/gaudi/asic_reg/nif_rtr_ctrl_5_regs.h
 create mode 100644 drivers/misc/habanalabs/include/gaudi/asic_reg/nif_rtr_ctrl_6_regs.h
 create mode 100644 drivers/misc/habanalabs/include/gaudi/asic_reg/nif_rtr_ctrl_7_regs.h
 create mode 100644 drivers/misc/habanalabs/include/gaudi/asic_reg/psoc_etr_regs.h
 create mode 100644 drivers/misc/habanalabs/include/gaudi/asic_reg/psoc_global_conf_masks.h
 create mode 100644 drivers/misc/habanalabs/include/gaudi/asic_reg/psoc_global_conf_regs.h
 create mode 100644 drivers/misc/habanalabs/include/gaudi/asic_reg/psoc_hbm_pll_regs.h
 create mode 100644 drivers/misc/habanalabs/include/gaudi/asic_reg/psoc_pci_pll_regs.h
 create mode 100644 drivers/misc/habanalabs/include/gaudi/asic_reg/psoc_timestamp_regs.h
 create mode 100644 drivers/misc/habanalabs/include/gaudi/asic_reg/sif_rtr_ctrl_0_regs.h
 create mode 100644 drivers/misc/habanalabs/include/gaudi/asic_reg/sif_rtr_ctrl_1_regs.h
 create mode 100644 drivers/misc/habanalabs/include/gaudi/asic_reg/sif_rtr_ctrl_2_regs.h
 create mode 100644 drivers/misc/habanalabs/include/gaudi/asic_reg/sif_rtr_ctrl_3_regs.h
 create mode 100644 drivers/misc/habanalabs/include/gaudi/asic_reg/sif_rtr_ctrl_4_regs.h
 create mode 100644 drivers/misc/habanalabs/include/gaudi/asic_reg/sif_rtr_ctrl_5_regs.h
 create mode 100644 drivers/misc/habanalabs/include/gaudi/asic_reg/sif_rtr_ctrl_6_regs.h
 create mode 100644 drivers/misc/habanalabs/include/gaudi/asic_reg/sif_rtr_ctrl_7_regs.h
 create mode 100644 drivers/misc/habanalabs/include/gaudi/asic_reg/stlb_regs.h
 create mode 100644 drivers/misc/habanalabs/include/gaudi/asic_reg/tpc0_cfg_masks.h
 create mode 100644 drivers/misc/habanalabs/include/gaudi/asic_reg/tpc0_cfg_regs.h
 create mode 100644 drivers/misc/habanalabs/include/gaudi/asic_reg/tpc0_qm_masks.h
 create mode 100644 drivers/misc/habanalabs/include/gaudi/asic_reg/tpc0_qm_regs.h
 create mode 100644 drivers/misc/habanalabs/include/gaudi/asic_reg/tpc1_cfg_regs.h
 create mode 100644 drivers/misc/habanalabs/include/gaudi/asic_reg/tpc1_qm_regs.h
 create mode 100644 drivers/misc/habanalabs/include/gaudi/asic_reg/tpc2_cfg_regs.h
 create mode 100644 drivers/misc/habanalabs/include/gaudi/asic_reg/tpc2_qm_regs.h
 create mode 100644 drivers/misc/habanalabs/include/gaudi/asic_reg/tpc3_cfg_regs.h
 create mode 100644 drivers/misc/habanalabs/include/gaudi/asic_reg/tpc3_qm_regs.h
 create mode 100644 drivers/misc/habanalabs/include/gaudi/asic_reg/tpc4_cfg_regs.h
 create mode 100644 drivers/misc/habanalabs/include/gaudi/asic_reg/tpc4_qm_regs.h
 create mode 100644 drivers/misc/habanalabs/include/gaudi/asic_reg/tpc5_cfg_regs.h
 create mode 100644 drivers/misc/habanalabs/include/gaudi/asic_reg/tpc5_qm_regs.h
 create mode 100644 drivers/misc/habanalabs/include/gaudi/asic_reg/tpc6_cfg_regs.h
 create mode 100644 drivers/misc/habanalabs/include/gaudi/asic_reg/tpc6_qm_regs.h
 create mode 100644 drivers/misc/habanalabs/include/gaudi/asic_reg/tpc7_cfg_regs.h
 create mode 100644 drivers/misc/habanalabs/include/gaudi/asic_reg/tpc7_qm_regs.h
 create mode 100644 drivers/misc/habanalabs/include/gaudi/gaudi.h
 create mode 100644 drivers/misc/habanalabs/include/gaudi/gaudi_async_events.h
 create mode 100644 drivers/misc/habanalabs/include/gaudi/gaudi_async_ids_map.h
 create mode 100644 drivers/misc/habanalabs/include/gaudi/gaudi_coresight.h
 create mode 100644 drivers/misc/habanalabs/include/gaudi/gaudi_fw_if.h
 create mode 100644 drivers/misc/habanalabs/include/gaudi/gaudi_masks.h
 create mode 100644 drivers/misc/habanalabs/include/gaudi/gaudi_packets.h
 create mode 100644 drivers/misc/habanalabs/include/gaudi/gaudi_reg_map.h
 create mode 100644 drivers/misc/habanalabs/include/hw_ip/mmu/mmu_v1_1.h

-- 
2.17.1


             reply	other threads:[~2020-05-11 11:32 UTC|newest]

Thread overview: 11+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2020-05-11 11:32 Oded Gabbay [this message]
2020-05-11 11:32 ` [PATCH 01/11] habanalabs: add dedicated define for hard reset Oded Gabbay
2020-05-11 11:32 ` [PATCH 02/11] habanalabs: set PM profile to auto only for goya Oded Gabbay
2020-05-11 11:32 ` [PATCH 03/11] habanalabs: support clock gating enable/disable Oded Gabbay
2020-05-11 11:32 ` [PATCH 04/11] habanalabs: get card type, location from F/W Oded Gabbay
2020-05-11 11:32 ` [PATCH 06/11] uapi: habanalabs: add gaudi defines Oded Gabbay
2020-05-11 11:32 ` [PATCH 07/11] habanalabs: add gaudi asic-dependent code Oded Gabbay
2020-05-11 11:32 ` [PATCH 08/11] habanalabs: add hwmgr module for gaudi Oded Gabbay
2020-05-11 11:32 ` [PATCH 09/11] habanalabs: add gaudi security module Oded Gabbay
2020-05-11 11:32 ` [PATCH 10/11] habanalabs: add gaudi profiler module Oded Gabbay
2020-05-11 11:32 ` [PATCH 11/11] habanalabs: enable gaudi code in driver Oded Gabbay

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=20200511113232.5771-1-oded.gabbay@gmail.com \
    --to=oded.gabbay@gmail.com \
    --cc=gregkh@linuxfoundation.org \
    --cc=linux-kernel@vger.kernel.org \
    --cc=oshpigelman@habana.ai \
    --cc=ttayar@habana.ai \
    /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.