On Mon, Oct 6, 2014 at 8:42 AM, Gabriel L. Somlo <gso...@gmail.com> wrote:
> Hi Jordan,
>
> On Sat, Oct 04, 2014 at 07:35:25PM -0700, Jordan Justen wrote:
>> > On Wed, Oct 01, 2014 at 12:31:58AM +0200, Laszlo Ersek wrote:
>> >> On 09/30/14 23:42, Jordan Justen wrote:
>> >> > BaseTimerLib:
>> >> >  * Reads host bridge ID (duplicate code)
>> >> >  * Used for Sec, PeiCore, Pei drivers and DxeCore
>> >> > DxeTimerLib:
>> >> >  * Reads dynamic PCD in constructor
>> >> >  * Used for everything else
>> >>
>> >> I'm fine with your proposal. The tradeoff is of course DxeCore, and that
>> >> this way the common bits of AcpiTimerLib.c will have to be split out
>> >> into a third .c file, potentially requiring some refactoring. Example:
>> >> OvmfPkg/Library/QemuFwCfgLib.
>> >>
>> >> [...]
>> >>
>> >> Let's go with BaseTimerLib / DxeTimerLib.
>>
>> [...]
>>
>> Can you make three versions?
>> OvmfPkg/Library/AcpiTimerLib/BaseRomAcpiTimerLib.inf
>> OvmfPkg/Library/AcpiTimerLib/BaseAcpiTimerLib.inf
>> OvmfPkg/Library/AcpiTimerLib/DxeAcpiTimerLib.inf
>>
>> Set BaseAcpiTimerLib.inf as default under:
>> [LibraryClasses]
>>
>> Use BaseRomAcpiTimerLib.inf for:
>> [LibraryClasses.common.SEC]
>>
>> Use DxeAcpiTimerLib.inf version for these:
>> [LibraryClasses.common.UEFI_DRIVER]
>> [LibraryClasses.common.DXE_DRIVER]
>> [LibraryClasses.common.UEFI_APPLICATION]
>>
>> BaseRomAcpiTimerLib.inf
>>  * Shares a common file with BaseAcpiTimerLib.inf for reading the host
>> bus to determine the system type.
>>  * Reads host bus every time, and doesn't set any global variables
>>
>> BaseAcpiTimerLib.inf
>>  * Shares a common file with BaseAcpiTimerLib.inf for reading the host
>> bus to determine the system type.
>>  * Sets a global module variable that allows the library to not have
>> to read the host bus id every time.
>>
>> DxeAcpiTimerLib.inf
>>  * Read the PCD once and save it in a global module variable
>>
>> PlatformPei should also read the host bus id, and set a PCD to allow
>> DxeAcpiTimerLib.inf to work.
>
> My plan was to tackle splitting out AcpiTimerLib first, then learn
> about and understand how PCDs work in practice :)
>
> The first bit (how to create multiple instances of a library, and
> connect instances to various stages like PEIM, DXE_CORE, etc) is done,
> and I'm wondering whether the second bit (using PCDs) is actually worth
> the complexity of adding a *third* version of AcpiTimerLib.
>
> Right now, BaseAcpiTimerLib and DxeAcpiTimerLib share everything
> except for the constructor and the GetTimerTick method.
>
> The "Base" version queries the host bridge indiscriminately, both in
> the constructor and in the GetTimerTick function. In my tests, the
> GetTimerTick function never did get called (maybe because I'm not
> using SEC and/or the debugger?)
>
> The "Dxe" version queries the host bridge in the constructor, and
> computes the IO address of the ACPI timer; In the GetTimerTick method,
> we just do an IoRead32 on the cached ACPI timer IO address.
>
> So, to decide how I feel about further splitting out DxeAcpiTimerLib
> into a version which does use PCDs and another version which does not,
> I added some DEBUG statements to track every time the host bridge
> gets queried right now, and here's what I got:
>
>
>     PlatformPei:MiscInitialization()
>     Base:AcpiTimerLibConstructor()      (PEIM)
>     Dxe:AcpiTimerLibConstructor()       (DXE_CORE)
>     Dxe:AcpiTimerLibConstructor()       (DXE_RUNTIME_DRIVER)
>     Dxe:AcpiTimerLibConstructor()       (DXE_DRIVER)
>     Dxe:AcpiTimerLibConstructor()       (DXE_RUNTIME_DRIVER)
>     Dxe:AcpiTimerLibConstructor()       (DXE_DRIVER)
>     Dxe:AcpiTimerLibConstructor()       (DXE_RUNTIME_DRIVER)
>     Dxe:AcpiTimerLibConstructor()       (DXE_DRIVER)
>     Dxe:AcpiTimerLibConstructor()       (DXE_RUNTIME_DRIVER)
>     Dxe:AcpiTimerLibConstructor()       (DXE_DRIVER)
>     Dxe:AcpiTimerLibConstructor()       (UEFI_DRIVER)
>     Dxe:AcpiTimerLibConstructor()       (UEFI_DRIVER)
>     Dxe:AcpiTimerLibConstructor()       (UEFI_DRIVER)
>     Dxe:AcpiTimerLibConstructor()       (UEFI_DRIVER)
>     Dxe:AcpiTimerLibConstructor()       (DXE_DRIVER)
>     Dxe:AcpiTimerLibConstructor()       (UEFI_DRIVER)
>     BdsPlatform:PciInitialization()
>     BdsPlatform:AcpiInitialization()
>     Dxe:AcpiTimerLibConstructor()       (DXE_DRIVER)
>
>
> I guess adding PCDs would save us from querying the host bridge about
> half the time, at the expense of adding a third version of
> AcpiTimerLib. I'm inclined to think the added complexity isn't worth
> it, but then again I'm new at this and I may be missing some other
> set of criteria which would make the whole thing worth it regardless.

Regarding IS_Q35_HOSTBRIDGE (or, is it IS_PLATFORM_Q35 now?), I see
these negatives:
 * Doesn't look like EDK II code
 * Reads PCI registers inside a macro
 * It seems very focused: "Is this Q35?"

Laszlo had another suggestion, but it add a new library interface. So,
it seems about as complex as my suggestion.

This idea may add another library implementation, but I think it will
also gain the feature of being able to read the 'platform type' via
PCD. (For example, in the Platform BDS library, or the ACPI platform
driver, etc...)

-Jordan

> I could also just post my current patch set so we can all be on the
> same page when deciding how to proceed.
>
> Let me know what you all think. Thanks,
> --Gabriel

------------------------------------------------------------------------------
Meet PCI DSS 3.0 Compliance Requirements with EventLog Analyzer
Achieve PCI DSS 3.0 Compliant Status with Out-of-the-box PCI DSS Reports
Are you Audit-Ready for PCI DSS 3.0 Compliance? Download White paper
Comply to PCI DSS 3.0 Requirement 10 and 11.5 with EventLog Analyzer
http://pubads.g.doubleclick.net/gampad/clk?id=154622311&iu=/4140/ostg.clktrk
_______________________________________________
edk2-devel mailing list
edk2-devel@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/edk2-devel

Reply via email to