Nate,
I remember that I've agreed with current implementation.

I agree with you the library helps caller in a certain way. But another problem 
we need to solve is how to simplify platform DSC with so many library 
instances. I don't strongly prefer to merge the two library instances for this 
specific case. But we need to keep in mind that any addition of library APIs, 
library instances is actually a burden to platform developers because they need 
to make choices. (This is why I like iPhone over Android because Android opens 
so many settings to end-users.)

Thanks,
Ray

> -----Original Message-----
> From: Desimone, Nathaniel L <nathaniel.l.desim...@intel.com>
> Sent: Thursday, October 17, 2019 3:27 PM
> To: devel@edk2.groups.io; Ni, Ray <ray...@intel.com>; Kubacki, Michael A
> <michael.a.kuba...@intel.com>
> Cc: Chaganty, Rangasai V <rangasai.v.chaga...@intel.com>
> Subject: RE: [edk2-devel] [edk2-platforms][PATCH V1 1/1]
> IntelSiliconPkg/BootMediaLib: Reduce library API
> 
> Hi Ray,
> 
> This really comes down to a philosophical question of how much do we wish
> to shield the user of the BootMediaLib against the nuances of the library's
> underlying implementation.
> 
> The primary function of BootMediaLib is retrieval of state. All of the 
> functions
> in BootMediaLib are accessors: BootMediaIsSpi(), GetBootMediaType(), etc.
> Since the purpose of the library is the manipulation of stateful data, it
> generally is assumed by most programmers that the data accessors
> themselves are stateless. In simpler words, most programmers expect to be
> able to call the BootMediaIsSpi() function without having to consider what
> the current environmental context is of the system.
> 
> In your proposal, the programmer must consider if they are writing PEI, DXE,
> SMM, and RuntimeDXE code when using the BootMediaLib. I consider it very
> confusing if I was required to call BootMediaIsSpi() everywhere in PEI, while
> at the same time I was required to only call BootMediaIsSpi() from the entry
> point for SMM or RuntimeDXE drivers. Michael's solution abstracts away this
> complexity and allows a single programming model to be used everywhere.
> 
> I agree with Michael that encapsulation of the environmental state is
> desirable especially for code that is used in the implementation of UEFI
> variable services. And I recommend that the code be merged as-is.
> 
> Regards,
> Nate
> 
> -----Original Message-----
> From: devel@edk2.groups.io <devel@edk2.groups.io> On Behalf Of Ni, Ray
> Sent: Tuesday, October 15, 2019 11:30 PM
> To: Kubacki, Michael A <michael.a.kuba...@intel.com>;
> devel@edk2.groups.io
> Cc: Chaganty, Rangasai V <rangasai.v.chaga...@intel.com>
> Subject: Re: [edk2-devel] [edk2-platforms][PATCH V1 1/1]
> IntelSiliconPkg/BootMediaLib: Reduce library API
> 
> > My concerns with that approach:
> >
> > 1. In general, I believe it is better if the library reads the value
> > once and caches it. The firmware boot media is fixed after power-on by
> > nature and in some platforms, boot media information may be provided
> > to the IBB in a temporary SRAM (or other volatile memory) early in the
> > boot flow that is temporary (e.g. not accessible after main memory
> > initialization). Here the HOB to global variable transition in DXE,
> > Runtime DXE, SMM is a transparent mechanism to the library consumers
> > to get the boot media information regardless of early boot memory
> properties.
> 
> I just feel that having two library instances increases the complexity.
> There were already arguments around EDKII like there are so many instances
> for a library class and people don't know which one is being used.
> But if you insist, I am ok with that. Removing unnecessary APIs resolved most
> of my concerns.
> 
> >
> > 2. Forcing library consumers to cache puts unnecessary burden on a
> > large number of library consumers to:
> >   1.a. Understand the library implementation (lack of encapsulation).
> 
> In fact the value of single library instance I can see is caller doesn't need 
> to
> dig into the details of the library implementation. All they need to know is
> the library gets the info from HOB every time the API is called.
> With the two lib instances, consumers need to be aware of the different
> implementations.
> I am not using this to support my point. Just providing my thought.
> 
> >   1.b. Understand the nuances of their driver type in relation to the
> > library implementation.
> 
> I think having a single instance avoids DSC writers to supply two instances 
> for
> different modules. Might be different from what you think๐Ÿ˜Š
> 
> 
> >   1.c. Perform this evaluation every time the library is used.
> 
> Agree.
> 
> >   1.d. Implement overhead to manage the data in a global variable when
> > this could automatically be linked by the library.
> Some callers may not be aware of the lib implementation details. So they
> may still choose to cache to global variables.
> Some callers may use it only once. Having a lib global variable is also a 
> waste.
> 
> >
> > 3. If the HOB is used, it blurs the implementation between the HOB
> > producer phase (PEI) and HOB consumer phase (DXE).
> 
> Don't understand.
> 
> >
> > We have many libraries with phase-specific instances. When it reduces
> > programming mistakes and eases integration I believe this is
> > beneficial. In this case, I feel the net result for library consumers
> > is better if they simply manage the instance in the DSC as opposed to
> > modifying source in drivers on a case-by-case basis dependent on the
> library implementation.
> 
> If a single instance can support the real needs I tend to use single 
> instances.
> It makes the code logic easy to trace. I like the multiple instances idea but
> want to avoid over-using them.
> 
> Again I am just providing what I think. They are not here to support my point.
> I am ok with current implementation. ๐Ÿ˜Š
> 
> >
> > Thanks,
> > Michael
> >
> > > -----Original Message-----
> > > From: Ni, Ray <ray...@intel.com>
> > > Sent: Monday, October 14, 2019 9:59 PM
> > > To: Kubacki, Michael A <michael.a.kuba...@intel.com>;
> > > devel@edk2.groups.io
> > > Cc: Chaganty, Rangasai V <rangasai.v.chaga...@intel.com>
> > > Subject: RE: [edk2-platforms][PATCH V1 1/1]
> IntelSiliconPkg/BootMediaLib:
> > > Reduce library API
> > >
> > > Mike,
> > > I don't think the library needs to cache the boot media type for RT
> > > and
> > SMM.
> > > RT and SMM modules can have a module local variable to cache the
> > > boot media type.
> > > It simplifies the implementation of this library and also the
> > > platform DSC because there is no need to choose different library
> > > instances for different modules.
> > >
> > > In another word, I think you can keep the PEI version as a base
> > > library instances and all modules can use that instance.
> > >
> > > Thanks,
> > > Ray
> > >
> > > > -----Original Message-----
> > > > From: Kubacki, Michael A <michael.a.kuba...@intel.com>
> > > > Sent: Tuesday, October 15, 2019 10:22 AM
> > > > To: Ni, Ray <ray...@intel.com>; devel@edk2.groups.io
> > > > Cc: Chaganty, Rangasai V <rangasai.v.chaga...@intel.com>
> > > > Subject: RE: [edk2-platforms][PATCH V1 1/1]
> > IntelSiliconPkg/BootMediaLib:
> > > > Reduce library API
> > > >
> > > > The two library instances work within the constraints of PEI, DXE,
> > > > Runtime DXE, and SMM.
> > > >
> > > > I cannot find how a single instance can support all these
> > > > environments (in as clean a manner) as is done with the two instances.
> > > >
> > > > Relevant constraints:
> > > > * PEI: Cannot write to global variable
> > > > * Runtime DXE / SMM: Boot Services are not available outside
> > > > module entry point
> > > >
> > > > Solution:
> > > > * PEI instance: Always retrieve the value from a HOB (use heap for
> R/W).
> > > > * DXE, Runtime DXE, SMM instance: Retrieve the value from the HOB
> > > > in the entry point
> > > > (constructor) when the driver is dispatched and Boot Services are
> > > > available and store the value in a global variable so it can be
> > > > accessed in Runtime DXE and SMM.
> > > >
> > > > Two separate instances resolve these requirements quite naturally.
> > > >
> > > > How would you propose meeting the same level of support with one
> > > > instance?
> > > >
> > > > Thanks,
> > > > Michael
> > > >
> > > > > -----Original Message-----
> > > > > From: Ni, Ray <ray...@intel.com>
> > > > > Sent: Monday, October 14, 2019 6:30 PM
> > > > > To: Kubacki, Michael A <michael.a.kuba...@intel.com>;
> > > > > devel@edk2.groups.io
> > > > > Cc: Chaganty, Rangasai V <rangasai.v.chaga...@intel.com>
> > > > > Subject: RE: [edk2-platforms][PATCH V1 1/1]
> > > IntelSiliconPkg/BootMediaLib:
> > > > > Reduce library API
> > > > >
> > > > > Reviewed-by: Ray Ni <ray...@intel.com>
> > > > >
> > > > > Mike,
> > > > > Thanks for reducing the API.
> > > > >
> > > > > For the other comments I raised (single library instance usable
> > > > > for PEI and DXE), do you have any comments?
> > > > >
> > > > >
> > > > > > -----Original Message-----
> > > > > > From: Kubacki, Michael A <michael.a.kuba...@intel.com>
> > > > > > Sent: Tuesday, October 15, 2019 5:26 AM
> > > > > > To: devel@edk2.groups.io
> > > > > > Cc: Chaganty, Rangasai V <rangasai.v.chaga...@intel.com>; Ni,
> > > > > > Ray <ray...@intel.com>
> > > > > > Subject: [edk2-platforms][PATCH V1 1/1]
> > IntelSiliconPkg/BootMediaLib:
> > > > > > Reduce library API
> > > > > >
> > > > > > Removes the following functions from FirmwareBootMediaLib.h:
> > > > > >  * FirmwareBootMediaIsSpi ()
> > > > > >  * FirmwareBootMediaIsUfs ()
> > > > > >  * FirmwareBootMediaIsEmmc ()
> > > > > >  * FirmwareBootMediaIsNvme ()
> > > > > >
> > > > > > It is preferred to have a single method to retrieve the
> > > > > > firmware boot
> > > > > media.
> > > > > > To reduce overall maintenance effort over time, the
> > > > > > FirmwareBootMediaIsXxx () pattern is removed in favor of
> > > > > > returning the firmware boot media type via
> > GetFirmwareBootMediaType ().
> > > > > >
> > > > > > Cc: Sai Chaganty <rangasai.v.chaga...@intel.com>
> > > > > > Cc: Ray Ni <ray...@intel.com>
> > > > > > Signed-off-by: Michael Kubacki <michael.a.kuba...@intel.com>
> > > > > > ---
> > > > > >
> > > > > >
> > > > >
> > > >
> > >
> >
> Silicon/Intel/IntelSiliconPkg/Library/PeiDxeSmmBootMediaLib/DxeSmmFirm
> > > > > > wareBootMediaLib.inf |   1 -
> > > > > >
> > > > > >
> > > > > Silicon/Intel/IntelSiliconPkg/Library/PeiDxeSmmBootMediaLib/PeiF
> > > > > ir
> > > > > mw
> > > > > ar
> > > > > eB
> > > > > > ootMediaLib.inf    |   1 -
> > > > > >
> > > > > > Silicon/Intel/IntelSiliconPkg/Include/Library/FirmwareBootMedi
> > > > > > aL
> > > > > > ib
> > > > > > .h
> > > > > > |  48 ---------
> > > > > >
> > > > > >
> > > > > Silicon/Intel/IntelSiliconPkg/Library/PeiDxeSmmBootMediaLib/Firm
> > > > > wa
> > > > > re
> > > > > Bo
> > > > > o
> > > > > > tMediaLib.c         | 109 --------------------
> > > > > >  4 files changed, 159 deletions(-)
> > > > > >
> > > > > > diff --git
> > > > > >
> > > > >
> > > >
> > >
> >
> a/Silicon/Intel/IntelSiliconPkg/Library/PeiDxeSmmBootMediaLib/DxeSmmFi
> > > > > > r
> > > > > > mwareBootMediaLib.inf
> > > > > >
> > > > >
> > > >
> > >
> >
> b/Silicon/Intel/IntelSiliconPkg/Library/PeiDxeSmmBootMediaLib/DxeSmmFi
> > > > > > r
> > > > > > mwareBootMediaLib.inf
> > > > > > index 83ed5f04af..7e10b5f7a7 100644
> > > > > > ---
> > > > > >
> > > > >
> > > >
> > >
> >
> a/Silicon/Intel/IntelSiliconPkg/Library/PeiDxeSmmBootMediaLib/DxeSmmFi
> > > > > > r
> > > > > > mwareBootMediaLib.inf
> > > > > > +++
> > > > > >
> > > >
> > b/Silicon/Intel/IntelSiliconPkg/Library/PeiDxeSmmBootMediaLib/DxeSmm
> > > > > > +++ FirmwareBootMediaLib.inf
> > > > > > @@ -27,7 +27,6 @@
> > > > > >  #
> > > > > >
> > > > > >  [Sources]
> > > > > > -  FirmwareBootMediaLib.c
> > > > > >    DxeSmmFirmwareBootMediaLib.c
> > > > > >
> > > > > >  [Packages]
> > > > > > diff --git
> > > > > > a/Silicon/Intel/IntelSiliconPkg/Library/PeiDxeSmmBootMediaLib/
> > > > > > Pe
> > > > > > iF
> > > > > > ir
> > > > > > mw
> > > > > > ar
> > > > > > eBootMediaLib.inf
> > > > > > b/Silicon/Intel/IntelSiliconPkg/Library/PeiDxeSmmBootMediaLib/
> > > > > > Pe
> > > > > > iF
> > > > > > ir
> > > > > > mw
> > > > > > ar
> > > > > > eBootMediaLib.inf
> > > > > > index 063c4027d3..ff1da31387 100644
> > > > > > ---
> > > > > > a/Silicon/Intel/IntelSiliconPkg/Library/PeiDxeSmmBootMediaLib/
> > > > > > Pe
> > > > > > iF
> > > > > > ir
> > > > > > mw
> > > > > > ar
> > > > > > eBootMediaLib.inf
> > > > > > +++ b/Silicon/Intel/IntelSiliconPkg/Library/PeiDxeSmmBootMedia
> > > > > > +++ Li
> > > > > > +++ b/
> > > > > > +++ Pe
> > > > > > +++ iF
> > > > > > +++ ir
> > > > > > +++ mwareBootMediaLib.inf
> > > > > > @@ -22,7 +22,6 @@
> > > > > >    LIBRARY_CLASS        = FirmwareBootMediaLib
> > > > > >
> > > > > >  [Sources]
> > > > > > -  FirmwareBootMediaLib.c
> > > > > >    PeiFirmwareBootMediaLib.c
> > > > > >
> > > > > >  [Packages]
> > > > > > diff --git
> > > > > > a/Silicon/Intel/IntelSiliconPkg/Include/Library/FirmwareBootMe
> > > > > > di
> > > > > > aL
> > > > > > ib
> > > > > > .h
> > > > > > b/Silicon/Intel/IntelSiliconPkg/Include/Library/FirmwareBootMe
> > > > > > di
> > > > > > aL
> > > > > > ib
> > > > > > .h
> > > > > > index aca9593a84..b36ebacf30 100644
> > > > > > ---
> > > > > > a/Silicon/Intel/IntelSiliconPkg/Include/Library/FirmwareBootMe
> > > > > > di
> > > > > > aL
> > > > > > ib
> > > > > > .h
> > > > > > +++ b/Silicon/Intel/IntelSiliconPkg/Include/Library/FirmwareBo
> > > > > > +++ ot
> > > > > > +++ Me
> > > > > > +++ di
> > > > > > +++ aL
> > > > > > +++ ib
> > > > > > +++ .h
> > > > > > @@ -55,52 +55,4 @@ FirmwareBootMediaIsKnown (
> > > > > >    VOID
> > > > > >    );
> > > > > >
> > > > > > -/**
> > > > > > -  Determines if the platform firmware is booting from SPI.
> > > > > > -
> > > > > > -  @retval TRUE        Platform firmware is booting from SPI
> > > > > > -  @retval FALSE       Platform firmware is booting from a non-SPI
> > device
> > > or
> > > > > the
> > > > > > boot media is unknown
> > > > > > -**/
> > > > > > -BOOLEAN
> > > > > > -EFIAPI
> > > > > > -FirmwareBootMediaIsSpi (
> > > > > > -  VOID
> > > > > > -  );
> > > > > > -
> > > > > > -/**
> > > > > > -  Determines if the platform firmware is booting from UFS.
> > > > > > -
> > > > > > -  @retval TRUE        Platform firmware is booting from UFS
> > > > > > -  @retval FALSE       Platform firmware is booting from a non-UFS
> > device
> > > > or
> > > > > > the boot media is unknown
> > > > > > -**/
> > > > > > -BOOLEAN
> > > > > > -EFIAPI
> > > > > > -FirmwareBootMediaIsUfs (
> > > > > > -  VOID
> > > > > > -  );
> > > > > > -
> > > > > > -/**
> > > > > > -  Determines if the platform firmware is booting from eMMC.
> > > > > > -
> > > > > > -  @retval TRUE        Platform firmware is booting from eMMC
> > > > > > -  @retval FALSE       Platform firmware is booting from a non-eMMC
> > > > device
> > > > > or
> > > > > > the boot media is unknown
> > > > > > -**/
> > > > > > -BOOLEAN
> > > > > > -EFIAPI
> > > > > > -FirmwareBootMediaIsEmmc (
> > > > > > -  VOID
> > > > > > -  );
> > > > > > -
> > > > > > -/**
> > > > > > -  Determines if the platform firmware is booting from NVMe.
> > > > > > -
> > > > > > -  @retval TRUE        Platform firmware is booting from NVMe.
> > > > > > -  @retval FALSE       Platform firmware is booting from a non-NVMe
> > > > device
> > > > > or
> > > > > > the boot media is unknown
> > > > > > -**/
> > > > > > -BOOLEAN
> > > > > > -EFIAPI
> > > > > > -FirmwareBootMediaIsNvme (
> > > > > > -  VOID
> > > > > > -  );
> > > > > > -
> > > > > >  #endif
> > > > > > diff --git
> > > > > > a/Silicon/Intel/IntelSiliconPkg/Library/PeiDxeSmmBootMediaLib/
> > > > > > Fi
> > > > > > rm
> > > > > > wa
> > > > > > re
> > > > > > B
> > > > > > ootMediaLib.c
> > > > > > b/Silicon/Intel/IntelSiliconPkg/Library/PeiDxeSmmBootMediaLib/
> > > > > > Fi
> > > > > > rm
> > > > > > wa
> > > > > > re
> > > > > > B
> > > > > > ootMediaLib.c
> > > > > > deleted file mode 100644
> > > > > > index 11a14d172d..0000000000
> > > > > > ---
> > > > > > a/Silicon/Intel/IntelSiliconPkg/Library/PeiDxeSmmBootMediaLib/
> > > > > > Fi
> > > > > > rm
> > > > > > wa
> > > > > > re
> > > > > > B
> > > > > > ootMediaLib.c
> > > > > > +++ /dev/null
> > > > > > @@ -1,109 +0,0 @@
> > > > > > -/** @file
> > > > > > -  This library identifies the firmware boot media device.
> > > > > > -
> > > > > > -  The firmware boot media device is used to make system
> > > > > > initialization decisions in the boot flow dependent
> > > > > > -  upon firmware boot media. Note that the firmware boot media
> > > > > > is the storage media that the boot firmware is stored on.
> > > > > > -  It is not the OS storage media which may be stored upon a
> > > > > > different
> > > > > > non- volatile storage device.
> > > > > > -
> > > > > > -  This file contains library implementation common to all boot
> phases.
> > > > > > -
> > > > > > -Copyright (c) 2019, Intel Corporation. All rights
> > > > > > reserved.<BR>
> > > > > > -SPDX-License-Identifier: BSD-2-Clause-Patent
> > > > > > -
> > > > > > -**/
> > > > > > -
> > > > > > -#include <Library/BaseLib.h>
> > > > > > -#include <Library/DebugLib.h> -#include
> > > > > > <Library/FirmwareBootMediaLib.h>
> > > > > > -
> > > > > > -/**
> > > > > > -  Determines if the platform firmware is booting from SPI.
> > > > > > -
> > > > > > -  @retval TRUE        Platform firmware is booting from SPI
> > > > > > -  @retval FALSE       Platform firmware is booting from a non-SPI
> > device
> > > or
> > > > > the
> > > > > > boot media is unknown
> > > > > > -**/
> > > > > > -BOOLEAN
> > > > > > -EFIAPI
> > > > > > -FirmwareBootMediaIsSpi (
> > > > > > -  VOID
> > > > > > -  )
> > > > > > -{
> > > > > > -  EFI_STATUS          Status;
> > > > > > -  FW_BOOT_MEDIA_TYPE  BootMedia;
> > > > > > -
> > > > > > -  Status = GetFirmwareBootMediaType (&BootMedia);
> > > > > > -  if (EFI_ERROR (Status) || BootMedia != FwBootMediaSpi) {
> > > > > > -    return FALSE;
> > > > > > -  } else {
> > > > > > -    return TRUE;
> > > > > > -  }
> > > > > > -}
> > > > > > -
> > > > > > -/**
> > > > > > -  Determines if the platform firmware is booting from UFS.
> > > > > > -
> > > > > > -  @retval TRUE        Platform firmware is booting from UFS
> > > > > > -  @retval FALSE       Platform firmware is booting from a non-UFS
> > device
> > > > or
> > > > > > the boot media is unknown
> > > > > > -**/
> > > > > > -BOOLEAN
> > > > > > -EFIAPI
> > > > > > -FirmwareBootMediaIsUfs (
> > > > > > -  VOID
> > > > > > -  )
> > > > > > -{
> > > > > > -  EFI_STATUS          Status;
> > > > > > -  FW_BOOT_MEDIA_TYPE  BootMedia;
> > > > > > -
> > > > > > -  Status = GetFirmwareBootMediaType (&BootMedia);
> > > > > > -  if (EFI_ERROR (Status) || BootMedia != FwBootMediaUfs) {
> > > > > > -    return FALSE;
> > > > > > -  } else {
> > > > > > -    return TRUE;
> > > > > > -  }
> > > > > > -}
> > > > > > -
> > > > > > -/**
> > > > > > -  Determines if the platform firmware is booting from eMMC.
> > > > > > -
> > > > > > -  @retval TRUE        Platform firmware is booting from eMMC
> > > > > > -  @retval FALSE       Platform firmware is booting from a non-eMMC
> > > > device
> > > > > or
> > > > > > the boot media is unknown
> > > > > > -**/
> > > > > > -BOOLEAN
> > > > > > -EFIAPI
> > > > > > -FirmwareBootMediaIsEmmc (
> > > > > > -  VOID
> > > > > > -  )
> > > > > > -{
> > > > > > -  EFI_STATUS          Status;
> > > > > > -  FW_BOOT_MEDIA_TYPE  BootMedia;
> > > > > > -
> > > > > > -  Status = GetFirmwareBootMediaType (&BootMedia);
> > > > > > -  if (EFI_ERROR (Status) || BootMedia != FwBootMediaEmmc) {
> > > > > > -    return FALSE;
> > > > > > -  } else {
> > > > > > -    return TRUE;
> > > > > > -  }
> > > > > > -}
> > > > > > -
> > > > > > -/**
> > > > > > -  Determines if the platform firmware is booting from NVMe.
> > > > > > -
> > > > > > -  @retval TRUE        Platform firmware is booting from NVMe.
> > > > > > -  @retval FALSE       Platform firmware is booting from a non-NVMe
> > > > device
> > > > > or
> > > > > > the boot media is unknown
> > > > > > -**/
> > > > > > -BOOLEAN
> > > > > > -EFIAPI
> > > > > > -FirmwareBootMediaIsNvme (
> > > > > > -  VOID
> > > > > > -  )
> > > > > > -{
> > > > > > -  EFI_STATUS          Status;
> > > > > > -  FW_BOOT_MEDIA_TYPE  BootMedia;
> > > > > > -
> > > > > > -  Status = GetFirmwareBootMediaType (&BootMedia);
> > > > > > -  if (EFI_ERROR (Status) || BootMedia != FwBootMediaNvme) {
> > > > > > -    return FALSE;
> > > > > > -  } else {
> > > > > > -    return TRUE;
> > > > > > -  }
> > > > > > -}
> > > > > > --
> > > > > > 2.16.2.windows.1
> > > > >
> > > >
> > >
> >
> 
> 
> 


-=-=-=-=-=-=-=-=-=-=-=-
Groups.io Links: You receive all messages sent to this group.

View/Reply Online (#49172): https://edk2.groups.io/g/devel/message/49172
Mute This Topic: https://groups.io/mt/34538841/21656
Group Owner: devel+ow...@edk2.groups.io
Unsubscribe: https://edk2.groups.io/g/devel/unsub  [arch...@mail-archive.com]
-=-=-=-=-=-=-=-=-=-=-=-

Reply via email to