From: Bhanuprakash Modem <bhanuprakash.modem@intel.com>
To: igt-dev@lists.freedesktop.org, mchehab@kernel.org
Subject: [igt-dev] [i-g-t V2 43/81] tests/kms_cursor_legacy: Document each subtest for testplan
Date: Wed, 17 May 2023 12:02:45 +0530 [thread overview]
Message-ID: <20230517063323.4146387-44-bhanuprakash.modem@intel.com> (raw)
In-Reply-To: <20230517063323.4146387-1-bhanuprakash.modem@intel.com>
Add documentation for all kms tests which is used by IGT testplan
documentation.
Signed-off-by: Bhanuprakash Modem <bhanuprakash.modem@intel.com>
---
tests/kms_cursor_legacy.c | 217 +++++++++++++++++++++++++++++++++++++-
1 file changed, 216 insertions(+), 1 deletion(-)
diff --git a/tests/kms_cursor_legacy.c b/tests/kms_cursor_legacy.c
index f7a6202cf..7a077a381 100644
--- a/tests/kms_cursor_legacy.c
+++ b/tests/kms_cursor_legacy.c
@@ -23,8 +23,9 @@
*/
/**
- * TEST: Stress legacy cursor ioctl
+ * TEST: kms cursor legacy
* Category: Display
+ * Description: Stress legacy cursor ioctl
*/
#include <sched.h>
@@ -77,6 +78,28 @@ static void override_output_modes(igt_display_t *display,
igt_output_set_pipe(output2, PIPE_NONE);
}
+/**
+ * SUBTEST: %s-%s
+ * Description: Test checks how many cursor updates we can fit between vblanks
+ * on single/all pipes with different modes, priority and number
+ * of processes
+ * Driver requirement: any
+ * Functionality: cursor
+ * Mega feature: General Display Features
+ * Run type: FULL
+ * Test category: functionality test
+ *
+ * arg[1]:
+ *
+ * @single: Single
+ * @torture: Torture
+ * @forked: Forked
+ *
+ * arg[2]:
+ *
+ * @bo: BO
+ * @move: Move
+ */
static void stress(igt_display_t *display,
enum pipe pipe, int num_children, unsigned mode,
int timeout)
@@ -544,11 +567,20 @@ enum basic_flip_cursor {
/**
* SUBTEST: basic-busy-flip-before-cursor-%s
* Description: Cursor test with %arg[1] mode
+ * Driver requirement: any
* Test category: functionality test
* Run type: BAT
* Functionality: cursor
* Mega feature: General Display Features
*
+ * SUBTEST: basic-busy-flip-before-cursor-varying-size
+ * Description: Change the size of cursor b/w 64*64 to maxw x maxh.
+ * Driver requirement: any
+ * Functionality: cursor
+ * Mega feature: General Display Features
+ * Run type: FULL
+ * Test category: functionality test
+ *
* arg[1]:
*
* @atomic: atomic
@@ -558,6 +590,7 @@ enum basic_flip_cursor {
/**
* SUBTEST: basic-flip-after-cursor-%s
* Description: Cursor test with %arg[1]
+ * Driver requirement: any
* Test category: functionality test
* Run type: BAT
* Functionality: cursor
@@ -565,6 +598,7 @@ enum basic_flip_cursor {
*
* SUBTEST: basic-flip-before-cursor-%s
* Description: Cursor test with %arg[1]
+ * Driver requirement: any
* Test category: functionality test
* Run type: BAT
* Functionality: cursor
@@ -576,6 +610,53 @@ enum basic_flip_cursor {
* @legacy: legacy mode
* @varying-size: varying size
*/
+
+/**
+ * SUBTEST: %s-flip-before-cursor-%s
+ * Description: Adds variety of tests:
+ * - varying-size: change the size of cursor b/w 64*64 to maxw x maxh.\n
+ * - atomic-transition: alternates between a full screen sprite plane
+ * and full screen primary plane.\n"
+ * - toggle: which toggles cursor visibility and make sure cursor moves
+ * between updates.
+ * Driver requirement: any
+ * Functionality: cursor
+ * Mega feature: General Display Features
+ * Run type: FULL
+ * Test category: functionality test
+ *
+ * arg[1]:
+ *
+ * @short:
+ * @short-busy:
+ *
+ * arg[2]:
+ *
+ * @atomic-transitions:
+ * @atomic-transitions-varying-size:
+ * @toggle:
+ */
+
+/**
+ * SUBTEST: short-flip-after-cursor-%s
+ * Description: Adds variety of tests:
+ * - varying-size: change the size of cursor b/w 64*64 to maxw x maxh.\n
+ * - atomic-transition: alternates between a full screen sprite plane
+ * and full screen primary plane.\n"
+ * - toggle: which toggles cursor visibility and make sure cursor moves
+ * between updates.
+ * Driver requirement: any
+ * Functionality: cursor
+ * Mega feature: General Display Features
+ * Run type: FULL
+ * Test category: functionality test
+ *
+ * arg[1]:
+ *
+ * @atomic-transitions:
+ * @atomic-transitions-varying-size:
+ * @toggle:
+ */
static void basic_flip_cursor(igt_display_t *display,
enum flip_test mode,
enum basic_flip_cursor order,
@@ -894,6 +975,25 @@ static void flip_vs_cursor(igt_display_t *display, enum flip_test mode, int nloo
igt_remove_fb(display->drm_fd, &cursor_fb2);
}
+/**
+ * SUBTEST: long-nonblocking-modeset-vs-cursor-atomic
+ * Description: Test checks how many cursor updates we can fit between vblanks
+ * on all pipes with different modes, priority and number of processes
+ * Driver requirement: any
+ * Functionality: cursor
+ * Mega feature: General Display Features
+ * Run type: FULL
+ * Test category: functionality test
+ *
+ * SUBTEST: nonblocking-modeset-vs-cursor-atomic
+ * Description: Test checks how many cursor updates we can fit between vblanks
+ * on all pipes with different modes, priority and number of processes
+ * Driver requirement: any
+ * Functionality: cursor
+ * Mega feature: General Display Features
+ * Run type: FULL
+ * Test category: functionality test
+ */
static void nonblocking_modeset_vs_cursor(igt_display_t *display, int loops)
{
struct igt_fb fb_info, cursor_fb;
@@ -993,6 +1093,44 @@ static void wait_for_modeset(igt_display_t *display, unsigned flags, int timeout
igt_reset_timeout();
}
+/**
+ * SUBTEST: 2x-%s-%s
+ * Description: This test executes flips on both CRTCs while running cursor
+ * updates in parallel
+ * Driver requirement: any
+ * Functionality: cursor
+ * Mega feature: General Display Features
+ * Run type: FULL
+ * Test category: functionality test
+ *
+ * arg[1]:
+ *
+ * @flip-vs-cursor:
+ * @flip-vs-cursor:
+ * @long-flip-vs-cursor:
+ * @long-flip-vs-cursor:
+ *
+ * arg[2]:
+ *
+ * @atomic:
+ * @legacy:
+ */
+
+/**
+ * SUBTEST: 2x-%s-atomic
+ * Description: This test executes flips on both CRTCs while running cursor
+ * updates in parallel
+ * Driver requirement: any
+ * Functionality: cursor
+ * Mega feature: General Display Features
+ * Run type: FULL
+ * Test category: functionality test
+ *
+ * arg[1]:
+ *
+ * @long-nonblocking-modeset-vs-cursor:
+ * @nonblocking-modeset-vs-cursor:
+ */
static void two_screens_flip_vs_cursor(igt_display_t *display, int nloops, bool modeset, bool atomic)
{
struct drm_mode_cursor arg1[2], arg2[2];
@@ -1180,6 +1318,34 @@ done:
munmap((void *)shared, PAGE_SIZE);
}
+/**
+ * SUBTEST: %s-%s
+ * Description: The essence of the basic test is that neither the cursor nor the
+ * nonblocking flip stall the application of the next
+ * Driver requirement: any
+ * Functionality: cursor
+ * Mega feature: General Display Features
+ * Run type: FULL
+ * Test category: functionality test
+ *
+ * arg[1]:
+ *
+ * @cursor-vs-flip:
+ * @cursorA-vs-flipA:
+ * @cursorA-vs-flipB:
+ * @cursorB-vs-flipA:
+ * @cursorB-vs-flipB:
+ * @flip-vs-cursor:
+ *
+ * arg[2]:
+ *
+ * @atomic:
+ * @atomic-transitions:
+ * @atomic-transitions-varying-size:
+ * @legacy:
+ * @toggle:
+ * @varying-size:
+ */
static void cursor_vs_flip(igt_display_t *display, enum flip_test mode, int nloops)
{
struct drm_mode_cursor arg[2];
@@ -1292,6 +1458,27 @@ static void cursor_vs_flip(igt_display_t *display, enum flip_test mode, int nloo
igt_remove_fb(display->drm_fd, &cursor_fb2);
}
+/**
+ * SUBTEST: 2x-%s-%s
+ * Description: This test executes flips on both CRTCs while running cursor updates in parallel
+ * Driver requirement: any
+ * Functionality: cursor
+ * Mega feature: General Display Features
+ * Run type: FULL
+ * Test category: functionality test
+ *
+ * arg[1]:
+ *
+ * @cursor-vs-flip:
+ * @cursor-vs-flip:
+ * @long-cursor-vs-flip:
+ * @long-cursor-vs-flip:
+ *
+ * arg[2]:
+ *
+ * @atomic:
+ * @legacy:
+ */
static void two_screens_cursor_vs_flip(igt_display_t *display, int nloops, bool atomic)
{
struct drm_mode_cursor arg[2][2];
@@ -1420,6 +1607,20 @@ static void two_screens_cursor_vs_flip(igt_display_t *display, int nloops, bool
munmap((void *)shared, PAGE_SIZE);
}
+/**
+ * SUBTEST: flip-vs-cursor-crc-%s
+ * Description: this test perform a page flip followed by a cursor update
+ * Driver requirement: any
+ * Functionality: cursor
+ * Mega feature: General Display Features
+ * Run type: FULL
+ * Test category: functionality test
+ *
+ * arg[1]:
+ *
+ * @atomic:
+ * @legacy:
+ */
static void flip_vs_cursor_crc(igt_display_t *display, bool atomic)
{
struct drm_mode_cursor arg[2];
@@ -1492,6 +1693,20 @@ static void flip_vs_cursor_crc(igt_display_t *display, bool atomic)
igt_remove_fb(display->drm_fd, &cursor_fb);
}
+/**
+ * SUBTEST: flip-vs-cursor-busy-crc-%s
+ * Description: this test perform a busy bo update followed by a cursor update
+ * Driver requirement: i915
+ * Functionality: cursor
+ * Mega feature: General Display Features
+ * Run type: FULL
+ * Test category: functionality test
+ *
+ * arg[1]:
+ *
+ * @atomic:
+ * @legacy:
+ */
static void flip_vs_cursor_busy_crc(igt_display_t *display, bool atomic)
{
struct drm_mode_cursor arg[2];
--
2.40.0
next prev parent reply other threads:[~2023-05-17 6:39 UTC|newest]
Thread overview: 94+ messages / expand[flat|nested] mbox.gz Atom feed top
2023-05-17 6:32 [igt-dev] [i-g-t V2 00/81] Document KMS tests Bhanuprakash Modem
2023-05-17 6:32 ` [igt-dev] [i-g-t V2 01/81] tests/chamelium: Move chamelium helpers to lib Bhanuprakash Modem
2023-05-17 9:03 ` Kamil Konieczny
2023-05-17 14:03 ` Modem, Bhanuprakash
2023-05-17 6:32 ` [igt-dev] [i-g-t V2 02/81] tests/dsc: Move dsc " Bhanuprakash Modem
2023-05-17 6:32 ` [igt-dev] [i-g-t V2 03/81] tests/color: Move color " Bhanuprakash Modem
2023-05-17 6:32 ` [igt-dev] [i-g-t V2 04/81] testplan/kms: Include testdisplay to kms testplan config Bhanuprakash Modem
2023-05-17 6:32 ` [igt-dev] [i-g-t V2 05/81] testplan/kms: Add support to differentiate b/w drivers Bhanuprakash Modem
2023-05-17 6:32 ` [igt-dev] [i-g-t V2 06/81] tests/chamelium/kms_chamelium_audio: Document each subtest for testplan Bhanuprakash Modem
2023-05-17 6:32 ` [igt-dev] [i-g-t V2 07/81] tests/chamelium/kms_chamelium_color: " Bhanuprakash Modem
2023-05-17 6:32 ` [igt-dev] [i-g-t V2 08/81] tests/chamelium/kms_chamelium_edid: " Bhanuprakash Modem
2023-05-17 6:32 ` [igt-dev] [i-g-t V2 09/81] tests/chamelium/kms_chamelium_frames: " Bhanuprakash Modem
2023-05-17 6:32 ` [igt-dev] [i-g-t V2 10/81] tests/chamelium/kms_chamelium_hpd: " Bhanuprakash Modem
2023-05-17 6:32 ` [igt-dev] [i-g-t V2 11/81] tests/i915/kms_big_fb: " Bhanuprakash Modem
2023-05-17 6:32 ` [igt-dev] [i-g-t V2 12/81] tests/i915/kms_big_joiner: " Bhanuprakash Modem
2023-05-17 6:32 ` [igt-dev] [i-g-t V2 13/81] tests/i915/kms_busy: " Bhanuprakash Modem
2023-05-17 6:32 ` [igt-dev] [i-g-t V2 14/81] tests/i915/kms_ccs: " Bhanuprakash Modem
2023-05-17 6:32 ` [igt-dev] [i-g-t V2 15/81] tests/i915/kms_cdclk: " Bhanuprakash Modem
2023-05-17 6:32 ` [igt-dev] [i-g-t V2 16/81] tests/i915/kms_draw_crc: " Bhanuprakash Modem
2023-05-17 6:32 ` [igt-dev] [i-g-t V2 17/81] tests/i915/kms_dsc: " Bhanuprakash Modem
2023-05-17 6:32 ` [igt-dev] [i-g-t V2 18/81] tests/i915/kms_fbcon_fbt: " Bhanuprakash Modem
2023-05-17 6:32 ` [igt-dev] [i-g-t V2 19/81] tests/i915/kms_fence_pin_leak: " Bhanuprakash Modem
2023-05-17 6:32 ` [igt-dev] [i-g-t V2 20/81] tests/i915/kms_flip_scaled_crc: " Bhanuprakash Modem
2023-05-17 6:32 ` [igt-dev] [i-g-t V2 21/81] tests/i915/kms_flip_tiling: " Bhanuprakash Modem
2023-05-17 6:32 ` [igt-dev] [i-g-t V2 22/81] tests/i915/kms_frontbuffer_tracking: " Bhanuprakash Modem
2023-05-17 6:32 ` [igt-dev] [i-g-t V2 23/81] tests/i915/kms_legacy_colorkey: " Bhanuprakash Modem
2023-05-17 6:32 ` [igt-dev] [i-g-t V2 24/81] tests/i915/kms_mmap_write_crc: " Bhanuprakash Modem
2023-05-17 6:32 ` [igt-dev] [i-g-t V2 25/81] tests/i915/kms_pipe_b_c_ivb: " Bhanuprakash Modem
2023-05-17 6:32 ` [igt-dev] [i-g-t V2 26/81] tests/i915/kms_psr: " Bhanuprakash Modem
2023-05-17 6:32 ` [igt-dev] [i-g-t V2 27/81] tests/i915/kms_psr2_sf: " Bhanuprakash Modem
2023-05-17 6:32 ` [igt-dev] [i-g-t V2 28/81] tests/i915/kms_psr2_su: " Bhanuprakash Modem
2023-05-17 6:32 ` [igt-dev] [i-g-t V2 29/81] tests/i915/kms_psr_stress_test: " Bhanuprakash Modem
2023-05-17 6:32 ` [igt-dev] [i-g-t V2 30/81] tests/i915/kms_pwrite_crc: " Bhanuprakash Modem
2023-05-17 6:32 ` [igt-dev] [i-g-t V2 31/81] tests/kms_3d: " Bhanuprakash Modem
2023-05-17 6:32 ` [igt-dev] [i-g-t V2 32/81] tests/kms_addfb_basic: " Bhanuprakash Modem
2023-05-17 6:32 ` [igt-dev] [i-g-t V2 33/81] tests/kms_async_flips: " Bhanuprakash Modem
2023-05-17 6:32 ` [igt-dev] [i-g-t V2 34/81] tests/kms_atomic: " Bhanuprakash Modem
2023-05-17 6:32 ` [igt-dev] [i-g-t V2 35/81] tests/kms_atomic_interruptible: " Bhanuprakash Modem
2023-05-17 6:32 ` [igt-dev] [i-g-t V2 36/81] tests/kms_atomic_transition: " Bhanuprakash Modem
2023-05-17 6:32 ` [igt-dev] [i-g-t V2 37/81] tests/kms_bw: " Bhanuprakash Modem
2023-05-17 6:32 ` [igt-dev] [i-g-t V2 38/81] tests/kms_color: " Bhanuprakash Modem
2023-05-17 6:32 ` [igt-dev] [i-g-t V2 39/81] tests/kms_concurrent: " Bhanuprakash Modem
2023-05-17 6:32 ` [igt-dev] [i-g-t V2 40/81] tests/kms_content_protection: " Bhanuprakash Modem
2023-05-17 6:32 ` [igt-dev] [i-g-t V2 41/81] tests/kms_cursor_crc: " Bhanuprakash Modem
2023-05-17 6:32 ` [igt-dev] [i-g-t V2 42/81] tests/kms_cursor_edge_walk: " Bhanuprakash Modem
2023-05-17 6:32 ` Bhanuprakash Modem [this message]
2023-05-17 6:32 ` [igt-dev] [i-g-t V2 44/81] tests/kms_display_modes: " Bhanuprakash Modem
2023-05-17 6:32 ` [igt-dev] [i-g-t V2 45/81] tests/kms_dither: " Bhanuprakash Modem
2023-05-17 6:32 ` [igt-dev] [i-g-t V2 46/81] tests/kms_dp_aux_dev: " Bhanuprakash Modem
2023-05-17 6:32 ` [igt-dev] [i-g-t V2 47/81] tests/kms_dp_tiled_display: " Bhanuprakash Modem
2023-05-17 6:32 ` [igt-dev] [i-g-t V2 48/81] tests/kms_flip: " Bhanuprakash Modem
2023-05-17 6:32 ` [igt-dev] [i-g-t V2 49/81] tests/kms_flip_event_leak: " Bhanuprakash Modem
2023-05-17 6:32 ` [igt-dev] [i-g-t V2 50/81] tests/kms_force_connector_basic: " Bhanuprakash Modem
2023-05-17 6:32 ` [igt-dev] [i-g-t V2 51/81] tests/kms_getfb: " Bhanuprakash Modem
2023-05-17 6:32 ` [igt-dev] [i-g-t V2 52/81] tests/kms_hdmi_inject: " Bhanuprakash Modem
2023-05-17 6:32 ` [igt-dev] [i-g-t V2 53/81] tests/kms_hdr: " Bhanuprakash Modem
2023-05-17 6:32 ` [igt-dev] [i-g-t V2 54/81] tests/kms_invalid_mode: " Bhanuprakash Modem
2023-05-17 6:32 ` [igt-dev] [i-g-t V2 55/81] tests/kms_lease: " Bhanuprakash Modem
2023-05-17 6:32 ` [igt-dev] [i-g-t V2 56/81] tests/kms_multipipe_modeset: " Bhanuprakash Modem
2023-05-17 6:32 ` [igt-dev] [i-g-t V2 57/81] tests/kms_panel_fitting: " Bhanuprakash Modem
2023-05-17 6:33 ` [igt-dev] [i-g-t V2 58/81] tests/kms_pipe_crc_basic: " Bhanuprakash Modem
2023-05-17 6:33 ` [igt-dev] [i-g-t V2 59/81] tests/kms_plane: " Bhanuprakash Modem
2023-05-17 6:33 ` [igt-dev] [i-g-t V2 60/81] tests/kms_plane_alpha_blend: " Bhanuprakash Modem
2023-05-17 6:33 ` [igt-dev] [i-g-t V2 61/81] tests/kms_plane_cursor: " Bhanuprakash Modem
2023-05-17 6:33 ` [igt-dev] [i-g-t V2 62/81] tests/kms_plane_lowres: " Bhanuprakash Modem
2023-05-17 6:33 ` [igt-dev] [i-g-t V2 63/81] tests/kms_plane_multiple: " Bhanuprakash Modem
2023-05-17 6:33 ` [igt-dev] [i-g-t V2 64/81] tests/kms_plane_scaling: " Bhanuprakash Modem
2023-05-17 6:33 ` [igt-dev] [i-g-t V2 65/81] tests/kms_prime: " Bhanuprakash Modem
2023-05-17 6:33 ` [igt-dev] [i-g-t V2 66/81] tests/kms_prop_blob: " Bhanuprakash Modem
2023-05-17 6:33 ` [igt-dev] [i-g-t V2 67/81] tests/kms_properties: " Bhanuprakash Modem
2023-05-17 6:33 ` [igt-dev] [i-g-t V2 68/81] tests/kms_rmfb: " Bhanuprakash Modem
2023-05-17 6:33 ` [igt-dev] [i-g-t V2 69/81] tests/kms_rotation_crc: " Bhanuprakash Modem
2023-05-17 6:33 ` [igt-dev] [i-g-t V2 70/81] tests/kms_scaling_modes: " Bhanuprakash Modem
2023-05-17 6:33 ` [igt-dev] [i-g-t V2 71/81] tests/kms_selftest: " Bhanuprakash Modem
2023-05-17 6:33 ` [igt-dev] [i-g-t V2 72/81] tests/kms_sequence: " Bhanuprakash Modem
2023-05-17 6:33 ` [igt-dev] [i-g-t V2 73/81] tests/kms_setmode: " Bhanuprakash Modem
2023-05-17 6:33 ` [igt-dev] [i-g-t V2 74/81] tests/kms_sysfs_edid_timing: " Bhanuprakash Modem
2023-05-17 6:33 ` [igt-dev] [i-g-t V2 75/81] tests/kms_tv_load_detect: " Bhanuprakash Modem
2023-05-17 6:33 ` [igt-dev] [i-g-t V2 76/81] tests/kms_universal_plane: " Bhanuprakash Modem
2023-05-17 6:33 ` [igt-dev] [i-g-t V2 77/81] tests/kms_vblank: " Bhanuprakash Modem
2023-05-17 6:33 ` [igt-dev] [i-g-t V2 78/81] tests/kms_vrr: " Bhanuprakash Modem
2023-05-17 6:33 ` [igt-dev] [i-g-t V2 79/81] tests/kms_writeback: " Bhanuprakash Modem
2023-05-17 6:33 ` [igt-dev] [i-g-t V2 80/81] tests/testdisplay: " Bhanuprakash Modem
2023-05-17 6:33 ` [igt-dev] [i-g-t V2 81/81] testplan/kms: Make documentation is mandatory for all kms subtests Bhanuprakash Modem
2023-05-17 15:51 ` [igt-dev] [i-g-t V4 " Bhanuprakash Modem
2023-08-14 9:57 ` Mauro Carvalho Chehab
2023-05-17 7:20 ` [igt-dev] ✗ GitLab.Pipeline: warning for Document KMS tests (rev8) Patchwork
2023-05-17 7:46 ` [igt-dev] ✓ Fi.CI.BAT: success " Patchwork
2023-05-17 10:36 ` [igt-dev] [i-g-t V2 00/81] Document KMS tests Kamil Konieczny
2023-05-17 14:00 ` Modem, Bhanuprakash
2023-05-17 16:47 ` [igt-dev] ✓ Fi.CI.IGT: success for Document KMS tests (rev8) Patchwork
2023-05-17 16:57 ` [igt-dev] ✗ GitLab.Pipeline: warning for Document KMS tests (rev9) Patchwork
2023-05-17 17:17 ` [igt-dev] ✓ Fi.CI.BAT: success " Patchwork
2023-05-18 5:51 ` [igt-dev] ✗ Fi.CI.IGT: failure " Patchwork
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=20230517063323.4146387-44-bhanuprakash.modem@intel.com \
--to=bhanuprakash.modem@intel.com \
--cc=igt-dev@lists.freedesktop.org \
--cc=mchehab@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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox