public inbox for devel@edk2.groups.io
 help / color / mirror / Atom feed
From: "Chang, Abner via groups.io" <abner.chang=amd.com@groups.io>
To: Nickle Wang <nicklew@nvidia.com>,
	"devel@edk2.groups.io" <devel@edk2.groups.io>
Cc: Igor Kulchytskyy <igork@ami.com>, Nick Ramirez <nramirez@nvidia.com>
Subject: Re: [edk2-devel] [PATCH 1/6] RedfishPkg: introduce Redfish HTTP protocol
Date: Wed, 21 Feb 2024 01:42:19 +0000	[thread overview]
Message-ID: <LV8PR12MB945285F79A98460EC347A50BEA572@LV8PR12MB9452.namprd12.prod.outlook.com> (raw)
In-Reply-To: <20240220064112.28271-1-nicklew@nvidia.com>

[AMD Official Use Only - General]

As I already reviewed offline on Nickle's personal Git repo,
Reviewed-by: Abner Chang <abner.chang@amd.com>

> -----Original Message-----
> From: Nickle Wang <nicklew@nvidia.com>
> Sent: Tuesday, February 20, 2024 2:41 PM
> To: devel@edk2.groups.io
> Cc: Igor Kulchytskyy <igork@ami.com>; Chang, Abner
> <Abner.Chang@amd.com>; Nick Ramirez <nramirez@nvidia.com>
> Subject: [PATCH 1/6] RedfishPkg: introduce Redfish HTTP protocol
>
> Caution: This message originated from an External Source. Use proper caution
> when opening attachments, clicking links, or responding.
>
>
> Introduce Redfish HTTP protocol to improve Redfish performance
> and communication stability between BIOS and Redfish service.
> - Feature drivers often query same Redfish resource multiple
> times for different purpose. Implement HTTP cache mechanism to
> improve HTTP GET performance. "UseCache" parameter is provided
> if application likes to send HTTP GET request to Redfish service
> without using cache data.
> - This driver will retire stale cache data automatically when
> application modify Redfish resource at service side.
> - PCD PcdHttpCacheDisabled is used to disable cache mechanism in
> this driver for debugging purpose.
> - PCD PcdRedfishServiceContentEncoding is used to enable content
> encoding while sending data to Redfish service.
> - Redfish HTTP protocol also implement retry mechanism to retry
> HTTP request when BIOS receive unexpected response from Redfish service.
> This function helps BIOS Redfish to finish its job as much as possible.
> - PCDs are defined to control how many times BIOS will retry the
> request and how many time BIOS will wait between retries.
>
> Signed-off-by: Nickle Wang <nicklew@nvidia.com>
> Co-authored-by: Igor Kulchytskyy <igork@ami.com>
> Cc: Abner Chang <abner.chang@amd.com>
> Cc: Igor Kulchytskyy <igork@ami.com>
> Cc: Nick Ramirez <nramirez@nvidia.com>
> ---
>  RedfishPkg/RedfishPkg.dec                     |  24 +-
>  .../Protocol/EdkIIRedfishHttpProtocol.h       | 308 ++++++++++++++++++
>  RedfishPkg/Include/RedfishServiceData.h       |  43 +++
>  3 files changed, 374 insertions(+), 1 deletion(-)
>  create mode 100644
> RedfishPkg/Include/Protocol/EdkIIRedfishHttpProtocol.h
>  create mode 100644 RedfishPkg/Include/RedfishServiceData.h
>
> diff --git a/RedfishPkg/RedfishPkg.dec b/RedfishPkg/RedfishPkg.dec
> index 3ea9ff3ef7..9b424efdf3 100644
> --- a/RedfishPkg/RedfishPkg.dec
> +++ b/RedfishPkg/RedfishPkg.dec
> @@ -4,7 +4,7 @@
>  # Copyright (c) 2019, Intel Corporation. All rights reserved.<BR>
>  # (C) Copyright 2021 Hewlett Packard Enterprise Development LP<BR>
>  # Copyright (c) 2023, American Megatrends International LLC.
> -# Copyright (c) 2023, NVIDIA CORPORATION & AFFILIATES. All rights
> reserved.
> +# Copyright (c) 2023-2024, NVIDIA CORPORATION & AFFILIATES. All rights
> reserved.
>  #
>  # SPDX-License-Identifier: BSD-2-Clause-Patent
>  ##
> @@ -93,6 +93,9 @@
>    # Redfish Host Interface ready notification protocol
>    gEdkIIRedfishHostInterfaceReadyProtocolGuid = { 0xC3F6D062, 0x3D38,
> 0x4EA4, { 0x92, 0xB1, 0xE8, 0xF8, 0x02, 0x27, 0x63, 0xDF } }
>
> +  ## Include/Protocol/EdkIIRedfishHttpProtocol.h
> +  gEdkIIRedfishHttpProtocolGuid = { 0x58a0f47e, 0xf45f, 0x4d44, { 0x89,
> 0x5b, 0x2a, 0xfe, 0xb0, 0x80, 0x15, 0xe2 } }
> +
>  [Guids]
>    gEfiRedfishPkgTokenSpaceGuid      = { 0x4fdbccb7, 0xe829, 0x4b4c, { 0x88,
> 0x87, 0xb2, 0x3f, 0xd7, 0x25, 0x4b, 0x85 }}
>
> @@ -154,3 +157,22 @@
>    # set to EFI_REST_EX_PROTOCOL.
>    #
>
> gEfiRedfishPkgTokenSpaceGuid.PcdRedfishSendReceiveTimeout|5000|UINT3
> 2|0x00001009
> +  ## This is used to enable HTTP content encoding on Redfish communication.
> +
> gEfiRedfishPkgTokenSpaceGuid.PcdRedfishServiceContentEncoding|TRUE|BO
> OLEAN|0x0000100A
> +  #
> +  # Use below PCDs to control Redfhs HTTP protocol.
> +  #
> +  ## The number of retry when HTTP GET request failed. If the value is 0, there
> is no retry enabled.
> +  gEfiRedfishPkgTokenSpaceGuid.PcdHttpGetRetry|0|UINT16|0x0000100B
> +  ## The number of retry when HTTP PUT request failed. If the value is 0,
> there is no retry enabled.
> +  gEfiRedfishPkgTokenSpaceGuid.PcdHttpPutRetry|0|UINT16|0x0000100C
> +  ## The number of retry when HTTP PATCH request failed. If the value is 0,
> there is no retry enabled.
> +
> gEfiRedfishPkgTokenSpaceGuid.PcdHttpPatchRetry|0|UINT16|0x0000100D
> +  ## The number of retry when HTTP POST request failed. If the value is 0,
> there is no retry enabled.
> +  gEfiRedfishPkgTokenSpaceGuid.PcdHttpPostRetry|0|UINT16|0x0000100E
> +  ## The number of retry when HTTP DELETE request failed. If the value is 0,
> there is no retry enabled.
> +
> gEfiRedfishPkgTokenSpaceGuid.PcdHttpDeleteRetry|0|UINT16|0x0000100F
> +  ## The number of second to wait before driver retry HTTP request. If the
> value is 0, there is no wait before next retry.
> +
> gEfiRedfishPkgTokenSpaceGuid.PcdHttpRetryWaitInSecond|1|UINT16|0x000
> 01010
> +  ## This is used to disable Redfish HTTP cache function and every request will
> be sent to Redfish service.
> +
> gEfiRedfishPkgTokenSpaceGuid.PcdHttpCacheDisabled|FALSE|BOOLEAN|0x0
> 0001011
> diff --git a/RedfishPkg/Include/Protocol/EdkIIRedfishHttpProtocol.h
> b/RedfishPkg/Include/Protocol/EdkIIRedfishHttpProtocol.h
> new file mode 100644
> index 0000000000..fef365730d
> --- /dev/null
> +++ b/RedfishPkg/Include/Protocol/EdkIIRedfishHttpProtocol.h
> @@ -0,0 +1,308 @@
> +/** @file
> +  This file defines the EDKII_REDFISH_HTTP_PROTOCOL interface.
> +
> +  Copyright (c) 2023-2024, NVIDIA CORPORATION & AFFILIATES. All rights
> reserved.
> +
> +  SPDX-License-Identifier: BSD-2-Clause-Patent
> +
> +**/
> +
> +#ifndef EDKII_REDFISH_HTTP_PROTOCOL_H_
> +#define EDKII_REDFISH_HTTP_PROTOCOL_H_
> +
> +#include <RedfishServiceData.h>
> +#include <Library/JsonLib.h>
> +#include <Protocol/EdkIIRedfishConfigHandler.h>
> +
> +typedef struct _EDKII_REDFISH_HTTP_PROTOCOL
> EDKII_REDFISH_HTTP_PROTOCOL;
> +
> +/**
> +  This function create Redfish service. It's caller's responsibility to free
> returned
> +  Redfish service by calling FreeService ().
> +
> +  @param[in]  This                       Pointer to EDKII_REDFISH_HTTP_PROTOCOL
> instance.
> +  @param[in]  RedfishConfigServiceInfo   Redfish config service information.
> +
> +  @retval     REDFISH_SERVICE  Redfish service is created.
> +  @retval     NULL             Errors occur.
> +
> +**/
> +typedef
> +REDFISH_SERVICE
> +(EFIAPI *REDFISH_HTTP_CREATE_SERVICE)(
> +  IN  EDKII_REDFISH_HTTP_PROTOCOL         *This,
> +  IN  REDFISH_CONFIG_SERVICE_INFORMATION  *RedfishConfigServiceInfo
> +  );
> +
> +/**
> +  This function free resources in Redfish service. RedfishService is no longer
> available
> +  after this function returns successfully.
> +
> +  @param[in]  This            Pointer to EDKII_REDFISH_HTTP_PROTOCOL
> instance.
> +  @param[in]  RedfishService  Pointer to Redfish service to be released.
> +
> +  @retval     EFI_SUCCESS     Resrouce is released successfully.
> +  @retval     Others          Errors occur.
> +
> +**/
> +typedef
> +EFI_STATUS
> +(EFIAPI *REDFISH_HTTP_FREE_SERVICE)(
> +  IN  EDKII_REDFISH_HTTP_PROTOCOL         *This,
> +  IN  REDFISH_SERVICE                     RedfishService
> +  );
> +
> +/**
> +  This function returns JSON value in given RedfishPayload. Returned JSON
> value
> +  is a reference to the JSON value in RedfishPayload. Any modification to
> returned
> +  JSON value will change JSON value in RedfishPayload.
> +
> +  @param[in]  This            Pointer to EDKII_REDFISH_HTTP_PROTOCOL
> instance.
> +  @param[in]  RedfishPayload  Pointer to Redfish payload.
> +
> +  @retval     EDKII_JSON_VALUE   JSON value is returned.
> +  @retval     NULL               Errors occur.
> +
> +**/
> +typedef
> +EDKII_JSON_VALUE
> +(EFIAPI *REDFISH_HTTP_JSON_IN_PAYLOAD)(
> +  IN  EDKII_REDFISH_HTTP_PROTOCOL         *This,
> +  IN  REDFISH_PAYLOAD                     RedfishPayload
> +  );
> +
> +/**
> +  This function free resources in Request. Request is no longer available
> +  after this function returns successfully.
> +
> +  @param[in]  This         Pointer to EDKII_REDFISH_HTTP_PROTOCOL instance.
> +  @param[in]  Request      HTTP request to be released.
> +
> +  @retval     EFI_SUCCESS     Resrouce is released successfully.
> +  @retval     Others          Errors occur.
> +
> +**/
> +typedef
> +EFI_STATUS
> +(EFIAPI *REDFISH_HTTP_FREE_REQUEST)(
> +  IN  EDKII_REDFISH_HTTP_PROTOCOL *This,
> +  IN  REDFISH_REQUEST             *Request
> +  );
> +
> +/**
> +  This function free resources in Response. Response is no longer available
> +  after this function returns successfully.
> +
> +  @param[in]  This         Pointer to EDKII_REDFISH_HTTP_PROTOCOL instance.
> +  @param[in]  Response     HTTP response to be released.
> +
> +  @retval     EFI_SUCCESS     Resrouce is released successfully.
> +  @retval     Others          Errors occur.
> +
> +**/
> +typedef
> +EFI_STATUS
> +(EFIAPI *REDFISH_HTTP_FREE_RESPONSE)(
> +  IN  EDKII_REDFISH_HTTP_PROTOCOL *This,
> +  IN  REDFISH_RESPONSE            *Response
> +  );
> +
> +/**
> +  This function expire the cached response of given URI.
> +
> +  @param[in]  This         Pointer to EDKII_REDFISH_HTTP_PROTOCOL instance.
> +  @param[in]  Uri          Target response of URI.
> +
> +  @retval     EFI_SUCCESS     Target response is expired successfully.
> +  @retval     Others          Errors occur.
> +
> +**/
> +typedef
> +EFI_STATUS
> +(EFIAPI *REDFISH_HTTP_EXPIRE_RESPONSE)(
> +  IN  EDKII_REDFISH_HTTP_PROTOCOL *This,
> +  IN  EFI_STRING                  Uri
> +  );
> +
> +/**
> +  Perform HTTP GET to Get redfish resource from given resource URI with
> +  cache mechanism supported. It's caller's responsibility to free Response
> +  by calling FreeResponse ().
> +
> +  @param[in]  This          Pointer to EDKII_REDFISH_HTTP_PROTOCOL instance.
> +  @param[in]  Service       Redfish service instance to perform HTTP GET.
> +  @param[in]  Uri           Target resource URI.
> +  @param[in]  Request       Additional request context. This is optional.
> +  @param[out] Response      HTTP response from redfish service.
> +  @param[in]  UseCache      If it is TRUE, this function will search for
> +                            cache first. If it is FALSE, this function
> +                            will query Redfish URI directly.
> +
> +  @retval     EFI_SUCCESS     Resrouce is returned successfully.
> +  @retval     Others          Errors occur.
> +
> +**/
> +typedef
> +EFI_STATUS
> +(EFIAPI *REDFISH_HTTP_GET_RESOURCE)(
> +  IN  EDKII_REDFISH_HTTP_PROTOCOL *This,
> +  IN  REDFISH_SERVICE             Service,
> +  IN  EFI_STRING                  Uri,
> +  IN  REDFISH_REQUEST             *Request OPTIONAL,
> +  OUT REDFISH_RESPONSE            *Response,
> +  IN  BOOLEAN                     UseCache
> +  );
> +
> +/**
> +  Perform HTTP PATCH to send redfish resource to given resource URI.
> +  It's caller's responsibility to free Response by calling FreeResponse ().
> +
> +  @param[in]  This          Pointer to EDKII_REDFISH_HTTP_PROTOCOL instance.
> +  @param[in]  Service       Redfish service instance to perform HTTP PATCH.
> +  @param[in]  Uri           Target resource URI.
> +  @param[in]  Content       Data to patch.
> +  @param[in]  ContentSize   Size of the Content to be send to Redfish service.
> +                            This is optional. When ContentSize is 0, ContentSize
> +                            is the size of Content.
> +  @param[in]  ContentType   Type of the Content to be send to Redfish
> service.
> +                            This is optional. When ContentType is NULL, content
> +                            type HTTP_CONTENT_TYPE_APP_JSON will be used.
> +  @param[out] Response      HTTP response from redfish service.
> +
> +  @retval     EFI_SUCCESS     Resrouce is returned successfully.
> +  @retval     Others          Errors occur.
> +
> +**/
> +typedef
> +EFI_STATUS
> +(EFIAPI *REDFISH_HTTP_PATCH_RESOURCE)(
> +  IN  EDKII_REDFISH_HTTP_PROTOCOL  *This,
> +  IN  REDFISH_SERVICE              Service,
> +  IN  EFI_STRING                   Uri,
> +  IN  CHAR8                        *Content,
> +  IN  UINTN                        ContentSize OPTIONAL,
> +  IN  CHAR8                        *ContentType OPTIONAL,
> +  OUT REDFISH_RESPONSE             *Response
> +  );
> +
> +/**
> +  Perform HTTP PUT to send redfish resource to given resource URI.
> +  It's caller's responsibility to free Response by calling FreeResponse ().
> +
> +  @param[in]  This          Pointer to EDKII_REDFISH_HTTP_PROTOCOL instance.
> +  @param[in]  Service       Redfish service instance to perform HTTP PUT.
> +  @param[in]  Uri           Target resource URI.
> +  @param[in]  Content       Data to put.
> +  @param[in]  ContentSize   Size of the Content to be send to Redfish service.
> +                            This is optional. When ContentSize is 0, ContentSize
> +                            is the size of Content.
> +  @param[in]  ContentType   Type of the Content to be send to Redfish
> service.
> +                            This is optional. When ContentType is NULL, content
> +                            type HTTP_CONTENT_TYPE_APP_JSON will be used.
> +  @param[out] Response      HTTP response from redfish service.
> +
> +  @retval     EFI_SUCCESS     Resrouce is returned successfully.
> +  @retval     Others          Errors occur.
> +
> +**/
> +typedef
> +EFI_STATUS
> +(EFIAPI *REDFISH_HTTP_PUT_RESOURCE)(
> +  IN  EDKII_REDFISH_HTTP_PROTOCOL  *This,
> +  IN  REDFISH_SERVICE              Service,
> +  IN  EFI_STRING                   Uri,
> +  IN  CHAR8                        *Content,
> +  IN  UINTN                        ContentSize OPTIONAL,
> +  IN  CHAR8                        *ContentType OPTIONAL,
> +  OUT REDFISH_RESPONSE             *Response
> +  );
> +
> +/**
> +  Perform HTTP POST to send redfish resource to given resource URI.
> +  It's caller's responsibility to free Response by calling FreeResponse ().
> +
> +  @param[in]  This          Pointer to EDKII_REDFISH_HTTP_PROTOCOL instance.
> +  @param[in]  Service       Redfish service instance to perform HTTP POST.
> +  @param[in]  Uri           Target resource URI.
> +  @param[in]  Content       Data to post.
> +  @param[in]  ContentSize   Size of the Content to be send to Redfish service.
> +                            This is optional. When ContentSize is 0, ContentSize
> +                            is the size of Content.
> +  @param[in]  ContentType   Type of the Content to be send to Redfish
> service.
> +                            This is optional. When ContentType is NULL, content
> +                            type HTTP_CONTENT_TYPE_APP_JSON will be used.
> +  @param[out] Response      HTTP response from redfish service.
> +
> +  @retval     EFI_SUCCESS     Resrouce is returned successfully.
> +  @retval     Others          Errors occur.
> +
> +**/
> +typedef
> +EFI_STATUS
> +(EFIAPI *REDFISH_HTTP_POST_RESOURCE)(
> +  IN  EDKII_REDFISH_HTTP_PROTOCOL  *This,
> +  IN  REDFISH_SERVICE              Service,
> +  IN  EFI_STRING                   Uri,
> +  IN  CHAR8                        *Content,
> +  IN  UINTN                        ContentSize OPTIONAL,
> +  IN  CHAR8                        *ContentType OPTIONAL,
> +  OUT REDFISH_RESPONSE             *Response
> +  );
> +
> +/**
> +  Perform HTTP DELETE to delete redfish resource on given resource URI.
> +  It's caller's responsibility to free Response by calling FreeResponse ().
> +
> +  @param[in]  This          Pointer to EDKII_REDFISH_HTTP_PROTOCOL instance.
> +  @param[in]  Service       Redfish service instance to perform HTTP DELETE.
> +  @param[in]  Uri           Target resource URI.
> +  @param[in]  Content       JSON represented properties to be deleted. This is
> +                            optional.
> +  @param[in]  ContentSize   Size of the Content to be send to Redfish service.
> +                            This is optional. When ContentSize is 0, ContentSize
> +                            is the size of Content if Content is not NULL.
> +  @param[in]  ContentType   Type of the Content to be send to Redfish
> service.
> +                            This is optional. When Content is not NULL and
> +                            ContentType is NULL, content type
> HTTP_CONTENT_TYPE_APP_JSON
> +                            will be used.
> +  @param[out] Response      HTTP response from redfish service.
> +
> +  @retval     EFI_SUCCESS     Resrouce is returned successfully.
> +  @retval     Others          Errors occur.
> +
> +**/
> +typedef
> +EFI_STATUS
> +(EFIAPI *REDFISH_HTTP_DELETE_RESOURCE)(
> +  IN  EDKII_REDFISH_HTTP_PROTOCOL  *This,
> +  IN  REDFISH_SERVICE              Service,
> +  IN  EFI_STRING                   Uri,
> +  IN  CHAR8                        *Content OPTIONAL,
> +  IN  UINTN                        ContentSize OPTIONAL,
> +  IN  CHAR8                        *ContentType OPTIONAL,
> +  OUT REDFISH_RESPONSE             *Response
> +  );
> +
> +///
> +/// Definition of _EDKII_REDFISH_HTTP_PROTOCOL.
> +///
> +struct _EDKII_REDFISH_HTTP_PROTOCOL {
> +  UINT32                          Version;
> +  REDFISH_HTTP_CREATE_SERVICE     CreateService;
> +  REDFISH_HTTP_FREE_SERVICE       FreeService;
> +  REDFISH_HTTP_JSON_IN_PAYLOAD    JsonInPayload;
> +  REDFISH_HTTP_GET_RESOURCE       GetResource;
> +  REDFISH_HTTP_PATCH_RESOURCE     PatchResource;
> +  REDFISH_HTTP_PUT_RESOURCE       PutResource;
> +  REDFISH_HTTP_POST_RESOURCE      PostResource;
> +  REDFISH_HTTP_DELETE_RESOURCE    DeleteResource;
> +  REDFISH_HTTP_FREE_REQUEST       FreeRequest;
> +  REDFISH_HTTP_FREE_RESPONSE      FreeResponse;
> +  REDFISH_HTTP_EXPIRE_RESPONSE    ExpireResponse;
> +};
> +
> +#define EDKII_REDFISH_HTTP_PROTOCOL_REVISION  0x00001000
> +
> +extern EFI_GUID  gEdkIIRedfishHttpProtocolGuid;
> +
> +#endif
> diff --git a/RedfishPkg/Include/RedfishServiceData.h
> b/RedfishPkg/Include/RedfishServiceData.h
> new file mode 100644
> index 0000000000..bcaa12ba27
> --- /dev/null
> +++ b/RedfishPkg/Include/RedfishServiceData.h
> @@ -0,0 +1,43 @@
> +/** @file
> +  This header file defines Redfish service and Redfish data structures that
> +  are used to communicate with Redfish Ex Protocol.
> +
> +  Copyright (c) 2019, Intel Corporation. All rights reserved.<BR>
> +  (C) Copyright 2021 Hewlett Packard Enterprise Development LP<BR>
> +  Copyright (c) 2023-2024, NVIDIA CORPORATION & AFFILIATES. All rights
> reserved.
> +
> +    SPDX-License-Identifier: BSD-2-Clause-Patent
> +
> +**/
> +
> +#ifndef REDFISH_SERVICE_DATA_H_
> +#define REDFISH_SERVICE_DATA_H_
> +
> +#include <Uefi.h>
> +#include <Protocol/Http.h>
> +
> +typedef  VOID  *REDFISH_SERVICE;
> +typedef  VOID  *REDFISH_PAYLOAD;
> +
> +///
> +/// REDFISH_REQUEST definition.
> +///
> +typedef struct {
> +  UINTN              HeaderCount;
> +  EFI_HTTP_HEADER    *Headers;
> +  CHAR8              *Content;
> +  CHAR8              *ContentType;
> +  UINTN              ContentLength;
> +} REDFISH_REQUEST;
> +
> +///
> +/// REDFISH_REQUEST definition.
> +///
> +typedef struct {
> +  EFI_HTTP_STATUS_CODE    *StatusCode;
> +  UINTN                   HeaderCount;
> +  EFI_HTTP_HEADER         *Headers;
> +  REDFISH_PAYLOAD         Payload;
> +} REDFISH_RESPONSE;
> +
> +#endif
> --
> 2.34.1



-=-=-=-=-=-=-=-=-=-=-=-
Groups.io Links: You receive all messages sent to this group.
View/Reply Online (#115690): https://edk2.groups.io/g/devel/message/115690
Mute This Topic: https://groups.io/mt/104463402/7686176
Group Owner: devel+owner@edk2.groups.io
Unsubscribe: https://edk2.groups.io/g/devel/unsub [rebecca@openfw.io]
-=-=-=-=-=-=-=-=-=-=-=-



      reply	other threads:[~2024-02-21  1:42 UTC|newest]

Thread overview: 2+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2024-02-20  6:41 [edk2-devel] [PATCH 1/6] RedfishPkg: introduce Redfish HTTP protocol Nickle Wang via groups.io
2024-02-21  1:42 ` Chang, Abner via groups.io [this message]

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-list 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=LV8PR12MB945285F79A98460EC347A50BEA572@LV8PR12MB9452.namprd12.prod.outlook.com \
    --to=devel@edk2.groups.io \
    /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