From: "Javeed, Ashraf" <ashraf.javeed@intel.com>
To: "Ni, Ray" <ray.ni@intel.com>,
"devel@edk2.groups.io" <devel@edk2.groups.io>
Cc: "Wang, Jian J" <jian.j.wang@intel.com>, "Wu, Hao A" <hao.a.wu@intel.com>
Subject: Re: [edk2-devel] [edk2-staging/UEFI_PCI_ENHANCE-2 PATCH 05/12] PciBusDxe: Setup sub-phases for PCI feature enumeration
Date: Tue, 21 Apr 2020 06:22:16 +0000 [thread overview]
Message-ID: <95C5C2B113DE604FB208120C742E9824579F8A16@BGSMSX101.gar.corp.intel.com> (raw)
In-Reply-To: <95C5C2B113DE604FB208120C742E9824579F89F7@BGSMSX101.gar.corp.intel.com>
About the "AtomicOp", I want to retract about the check for the Routing Capability to set the platform policy about the blocking the AtomicOp requests. The implementation seems good.
Thanks
Ashraf
> -----Original Message-----
> From: Javeed, Ashraf
> Sent: Tuesday, April 21, 2020 11:33 AM
> To: Ni, Ray <ray.ni@intel.com>; devel@edk2.groups.io
> Cc: Wang, Jian J <jian.j.wang@intel.com>; Wu, Hao A
> <hao.a.wu@intel.com>
> Subject: RE: [edk2-devel] [edk2-staging/UEFI_PCI_ENHANCE-2 PATCH
> 05/12] PciBusDxe: Setup sub-phases for PCI feature enumeration
>
> About the "CompletionTimeout ", I want to retract about the AUTO option;
> the implementation is good and device initialization should be skipped for
> this option.
>
> Regards
> Ashraf
>
> > -----Original Message-----
> > From: Javeed, Ashraf <ashraf.javeed@intel.com>
> > Sent: Monday, April 20, 2020 6:53 PM
> > To: Ni, Ray <ray.ni@intel.com>; devel@edk2.groups.io
> > Cc: Wang, Jian J <jian.j.wang@intel.com>; Wu, Hao A
> > <hao.a.wu@intel.com>; Javeed, Ashraf <ashraf.javeed@intel.com>
> > Subject: RE: [edk2-devel] [edk2-staging/UEFI_PCI_ENHANCE-2 PATCH
> > 05/12] PciBusDxe: Setup sub-phases for PCI feature enumeration
> >
> > Ray,
> > Sorry for late response as I got into other priorities. Let's try to
> > finish this ASAP.
> > Certainly the implementation of yours has reduced the code size in
> > great deal by deprecating the EFI encodings for the PCIe features, and
> > using the actual HW values along with the global definition of AUTO
> > and NOT_APPLICABLE (as an alias to DO_NOT_TOUCH). I am concerned
> that
> > lot of explanation in the text of the PCI Express Protocol has to be
> > provided about the rules that platform FW developer has to follow
> > w.r.t. AUTO and DO_NOT_TOUCH in the GetDevicePolicy(); that needs to
> > be published in the PI Specification. I shall take your implementation
> > and add the other 3 PCIe features that I had implemented (ExtendedTag,
> > Aspm,
> > CommonClockConfiguration) into this scheme, and also provide how
> these
> > global options rules can be defined for the other non-implemented PCIe
> > features.
> > However, I have other suggestions/corrections for the present 7 PCIe
> > features implementation, which I want to discuss by highlighting the
> > platform policy of AUTO and DO_NOT_DISTURB.
> >
> > (1) MaxPayloadSize:- This feature requires aligning all the PCI
> > devices in the hierarchy to have a common value. (The device policy by
> > platform shall be used to align with all the devices in hierarchy
> > based on their capability, thus value less than capability shall
> > result in all devices in hierarchy supporting that value in capability to be
> programmed).
> > (a) AUTO: The DeviceCapability.MaxPayloadSize value is considered
> > while scan all the nodes in the hierarchy
> > (b) DO_NOT_TOUCH: Should be considered as invalid value to skip
> for
> > this feature. Two options in this scenario...
> > (i) The PciBusDxe shall use this option to force the HW
> default
> > value of 128B
> > (ii) Behave same as AUTO.
> > I vote for option (i) above.
> >
> > (2) MaxReadReqSize:- Does not need all the devices in hierarchy to be
> > align to common value. However, the spec imposes that for an
> > isochronous configured device its memory read request should be equal
> > to MayPayloadSize; thus I accept your implementation since determining
> > whether that device in Isochronous mode is beyond the scope of
> PciBusDxe
> > (a) AUTO: MaxReadReqSize = MaxPayloadSize; shall cover the device
> > configured in Isochronous case.
> > (b) DO_NOT_TOUCH: skip programming the DeviceControl register
> of the
> > device
> >
> > (3) RelaxOrdering:- Specific to device to enable or disable; does not
> > require any coherency with all the devices in the hierarchy
> > (a) AUTO: device initialization is skipped
> > (b) DO_NOT_TOUCH: device initialization is skipped
> >
> > (4) NoSnoop:- Specific to device to enable or disable; does not
> > require any coherency with all the devices in the hierarchy
> > (a) AUTO: device initialization is skipped
> > (b) DO_NOT_TOUCH: device initialization is skipped
> >
> > (5) CompletionTimeout:- The range and detection mechanism disable can
> > be set specifically for any device; does not require to be aligned
> > with all devices in the hierarchy
> > (a) AUTO: your implementation ignores it (same as do not touch); I
> > propose that platform can provide this option to set the
> > DeviceControl2.CompletionTimeoutValue as per its high range value of
> > DeviceCapability2.CompletionTimeoutRangesSupported, ignoring the
> > CompletionTimeoutDisableSupported. For example; if the
> > DeviceCapability2 supports Ranges A, B, C and D; than its
> > DeviceControl2.CompletionTimeoutValue can be programmed to 1110b
> (17s
> > to 64s) for higher subrange.
> > (b) DO_NOT_TOUCH: device initialization is skipped
> > Your implementation about the device policy from platform appears
> OK
> > to me.
> >
> > (6) Ltr: As per PCIe specification, the LTR capability is provided for
> > all the PCI devices, disabled by default, and if LTR needs to be
> > enabled for Endpoint device than all the in-between component from
> > Root Port to Endpoint needs to be enabled, and it is not required that
> > all Endpoints have to be LTR enabled.
> > (a) AUTO: as per your implementation, this option is ignored as
> > invalid, and overwritten with its child device and if no valid for
> > child device than device initialization is skipped
> > (b) DO_NOT_TOUCH: as per your implementation, this option is
> ignored
> > as invalid. and overwritten with its child device and if no valid for
> > child device than device initialization is skipped
> > Why does your implementation consider changing only the parent
> N as
> > per its child N+1, and not vice versa? If platform only updates the
> > Root port (RP) and not the Endpoint device than this implementation
> > only programs the RP, right?
> > In real scenario, the platform FW does not provide the policy for
> > PCIe Endpoint devices mounted on the PCIe slots since those policies
> > are statically defined to the fixed components of the chip. Thus,
> > platform expects enabling the PCIe Root Port LTR mechanism, in hope
> > that its valid PCIe Endpoint device gets enabled if all the devices
> > are capable of LTR mechanism.
> > I propose, even if platform provides one device to be LTR enable in
> > the path from Root Port to Endpoint device, than PciBusDxe can enable
> > all the devices in the path if all are LTR capable. This shall be also
> > for Switch with multiple downstream ports with each port connected to
> > independent Endpoint devices, if platform provide LTR enable to Root
> > Port than enable for each path of devices if the downstream port's
> > Endpoint device is LTR capable. If any one downstream port's Endpoint
> > device is not capable than it need not set for that device.
> >
> > (7) AtomicOp: As per PCIe specification, the DeviceControl2 register
> > provides the AtomicOp Requester Enable bit (6) and blocking of
> > AtomicOp request bit (7) for the Port device.
> > The AtomicOp requester capability determination is out of scope,
> > hence it can be just relied on platform policy request. However, the
> > blocking AtomicOp request on the port device depends on the Device
> > Routing capability bit defined in the DeviceCapability2 register.
> > (a) AUTO: device initialization is skipped
> > (b) DO_NOT_TOUCH: device initialization is skipped
> > I think the change required in this implementation is the check for
> > the Routing Capability to enable the blocking of AtomicOp request for
> > the port device; do you agree?
> >
> > Thanks
> > Ashraf
> >
> > > -----Original Message-----
> > > From: Ni, Ray <ray.ni@intel.com>
> > > Sent: Tuesday, March 17, 2020 9:07 PM
> > > To: Javeed, Ashraf <ashraf.javeed@intel.com>; devel@edk2.groups.io
> > > Cc: Wang, Jian J <jian.j.wang@intel.com>; Wu, Hao A
> > > <hao.a.wu@intel.com>
> > > Subject: RE: [edk2-devel] [edk2-staging/UEFI_PCI_ENHANCE-2 PATCH
> > > 05/12] PciBusDxe: Setup sub-phases for PCI feature enumeration
> > >
> > > Ashraf,
> > > Thank you for the prompt response!
> > >
> > > My response in below.
> > > (I removed some earlier conversations, but the context is still
> > > kept.)
> > >
> > > > > I take it as an agree of using the global AUTO. Thanks for that.
> > > > Please note that there is another request of "Do not touch", and I
> > > > am still contemplating whether both AUTO and DO_NOT_TOUCH
> > options
> > > could
> > > > be applicable to all the PCIe features or not. It could be
> > > > possible to take
> > > AUTO for some of them and DO_NOT_TOUCH for others. Need to
> > consider
> > > each PCIe feature separately for both these options.
> > >
> > >
> > > I think we are basically aligned on this.
> > > I agree that each PCIe feature should have clear statement about how
> > > to interpret AUTO and DO_NOT_TOUCH.
> > > DO_NOT_TOUCH in my code change is NOT_APPLICABLE.
> > > If you check some of the features I already implemented, the
> > > comments say clearly what AUTO and NOT_APPLICABLE mean for that
> > > specific
> > feature.
> > > Looking forward to your comments on how to interpret AUTO and
> > > NOT_APPLICABLE for each PCIe feature.
> > >
> > > > > Supposing a root bridge contains 1 RCiEP and two root ports, the
> > > > > implementation ensures there will be 3 separate contexts for each.
> > > > > As you can see, every time the code starts enumeration from a
> > > > > RCiEP or a root port, a new Context[] is setup. Context[i] is
> > > > > associated with the
> > > feature _i_.
> > > > >
> > > > I realize now, that there are 3 nested for-loops in the
> > > > EnumerateRootBridgePcieFeatures(), the first one enables the
> > > > processing of first level nodes of the Root Bridge instance, and
> > > > in this way
> > > the context[i] used for each node will be valid as it covers each
> > > node's hierarchy.
> > >
> > > I think we are aligned on this.
> > >
> > > > >
> > > > > The level N and N+1 is needed for AtomicOp or Ltr feature (which
> > > > > I need to go back to check the code).
> > > > > I want to avoid the individual feature scan/program routine
> > > > > checks device's parent/children.
> > > > > I understand that in PCIE spec, a switch consists of an upstream
> > > > > port and several downstream ports.
> > > > > It means a switch populates a bridge which connects to the
> > > > > upstream and several bridges under the upstream bridge which
> > > > > connect to the downstream.
> > > > > But from software perspective, I don't think we should care
> > > > > about
> > that.
> > > > > Maybe I am wrong. Can you please give a real example that
> > > > > treating in my way would cause some issues?
> > > > >
> > > > Let just say we have PCIe switch connected to Root Port on a host,
> > > > and it has 2 downstream ports, each connected to one Endpoint
> > > > device
> > each.
> > > > Platform has selected to enable LTR for second downstream port's
> > > > endpoint device, not both. As per your code logic of LTR, where
> > > > you use the N and N+1 to compare between the parent and child,
> > > > will not be
> > > applicable if you use the same condition to check downstream port
> > > (N+1), and its parent upstream port, because N would be the Endpoint
> > > device of first downstream port of the PCIe switch and not its
> > > upstream
> > port.
> > > > Root Port -> 1|0|0
> > > > Switch upstream port -> 2|0|0 (M-1)
> > > > Switch downstream ports -> 3|0|0,(M) 5|0|0 (N
> > (=M+2))
> > > > Endpoint devices -> 4|0|0 (M+1) 6|0|0 (N+1
> > (=M+3))
> > > > The level+1 logic when the EnumeratePcieDevices() is called
> > > > recursively, will result in one value greater than the Endpoint
> > > > device for
> > > the second downstream port.
> > >
> > > The level value in my code will be:
> > > Root Port -> 1|0|0 (level 0)
> > > Switch upstream port -> 2|0|0 (level 1)
> > > Switch downstream ports -> 3|0|0,(level 2) 5|0|0,(level
> 2)
> > > Endpoint devices -> 4|0|0,(level 3) 6|0|0,(level
> 3)
> > >
> > > Level of device 5|0|0 is still 2, not 4.
> > >
> > > I also did the unit test to ensure the LTR feature logic is good.
> > >
> > > For below device hierarchy with LTR enabled in 5/0/0 and 11/0/0,
> > > disabled in 9/0/0 The LTR setting for upstream bridges should be as
> > following:
> > > 0/4/0[LTR:1]
> > > 2/0/0[1] | 2/1/0[1] | 2/2/0[0]
> > > 3/0/0[1] | 7/0/0[1]
> > > 4/0/0[1] | 8/0/0[1]
> > > 5/0/0[1] | 9/0/0[0] 9/1/0[1]
> > > 10/0/0[1]
> > > 11/0/0[1]
> > >
> > > The unit test code is in commit "Test case for LTR".
> > >
> > > >
> > > > > >
> > > > > > I liked the Pre & Post order flag that is used to processing
> > > > > > parent-to-child
> > > > > vs. child-to-parent nodes.
> > > > >
> > > > > Actually I didn't have this flag in the first version of my code
> > > > > change. But later I found it's needed for some features like LTR
> > > > > which needs to be programmed from rootbridge to endpoint
> > according
> > > to spec.
> > > > >
> > > > >
> > > > > > You are calling the first
> > > > > > and last features as fakes, when you actually parse all the
> > > > > > nodes for the GetDevicePolicy() and NotifyDeviceState(); to me
> > > > > > it is actually an un-named phase where all the nodes are
> > > > > > queried or informed to the
> > > > > platform; that seems fine to save the NULL on the
> > > > > mPcieFeatures[]
> > > table.
> > > > >
> > > > > Yes I put GetDevicePolicy() and NotifyDeviceState() in the
> > > > > feature array in my first version of code. And later I called
> > > > > the two separately for better code readability. But it was my
> > > > > fault that I didn't update the commit message. It caused confusion
> to you.
> > > > >
> > > > > >
> > > > > > Thanks
> > > > > > Ashraf
> > > > > >
> > > > > > > -----Original Message-----
> > > > > > > From: Ni, Ray <ray.ni@intel.com>
> > > > > > > Sent: Thursday, March 5, 2020 7:43 PM
> > > > > > > To: devel@edk2.groups.io; Ni, Ray <ray.ni@intel.com>;
> > > > > > > Javeed, Ashraf <ashraf.javeed@intel.com>
> > > > > > > Cc: Wang, Jian J <jian.j.wang@intel.com>; Wu, Hao A
> > > > > > > <hao.a.wu@intel.com>
> > > > > > > Subject: RE: [edk2-devel] [edk2-staging/UEFI_PCI_ENHANCE-2
> > > PATCH
> > > > > > > 05/12] PciBusDxe: Setup sub-phases for PCI feature
> > > > > > > enumeration
> > > > > > >
> > > > > > > Ashraf,
> > > > > > > I think it might be better to describe my review comments
> > > > > > > with code implementation.
> > > > > > > Can you please check this branch where I did some
> > > > > > > modification based on your code?
> > > > > > > https://github.com/niruiyu/edk2/tree/pci/pcie2
> > > > > > >
> > > > > > > Let's firstly align on the feature initialization framework
> > > > > implementation.
> > > > > > > To be specific, this commit:
> > > > > > > MdeModulePkg/PciBus: Add the framework to init PCIE features
> > > > > > >
> > > > >
> > >
> >
> https://github.com/niruiyu/edk2/commit/9fb9a3dcef06de98a76825e2fc0
> > > > > > > 7167446ee6fd9
> > > > > > >
> > > > > > > Thanks,
> > > > > > > Ray
> > > > > > >
> > > > > > > > -----Original Message-----
> > > > > > > > From: devel@edk2.groups.io <devel@edk2.groups.io> On
> > > > > > > > Behalf
> > > Of
> > > > > Ni,
> > > > > > > Ray
> > > > > > > > Sent: Thursday, December 19, 2019 1:49 PM
> > > > > > > > To: Javeed, Ashraf <ashraf.javeed@intel.com>;
> > > > > > > > devel@edk2.groups.io
> > > > > > > > Cc: Wang, Jian J <jian.j.wang@intel.com>; Wu, Hao A
> > > > > > > > <hao.a.wu@intel.com>
> > > > > > > > Subject: Re: [edk2-devel] [edk2-staging/UEFI_PCI_ENHANCE-2
> > > > > > > > PATCH 05/12]
> > > > > > > > PciBusDxe: Setup sub-phases for PCI feature enumeration
> > > > > > > >
> > > > > > > > After I reviewed the patch of enabling MaxPayloadSize,
> > > > > > > > MaxReadReqSize and more PCIE features, I can now
> > > > > > > > understand the phases more than earlier.
> > > > > > > >
> > > > > > > > Your patch proposed five phases:
> > > > > > > > //
> > > > > > > > // initial phase in configuring the other PCI features
> > > > > > > > to record the
> > > > > > > primary
> > > > > > > > // root ports
> > > > > > > > //
> > > > > > > > PciFeatureRootBridgeScan,
> > > > > > > > //
> > > > > > > > // get the PCI device-specific platform policies and
> > > > > > > > align with device
> > > > > > > capabilities
> > > > > > > > //
> > > > > > > > PciFeatureGetDevicePolicy,
> > > > > > > > //
> > > > > > > > // align all PCI nodes in the PCI heirarchical tree
> > > > > > > > //
> > > > > > > > PciFeatureSetupPhase,
> > > > > > > > //
> > > > > > > > // finally override to complete configuration of the PCI
> feature
> > > > > > > > //
> > > > > > > > PciFeatureConfigurationPhase,
> > > > > > > > //
> > > > > > > > // PCI feature configuration complete
> > > > > > > > //
> > > > > > > > PciFeatureConfigurationComplete
> > > > > > > >
> > > > > > > >
> > > > > > > > I have several comments to the five phases.
> > > > > > > > 1. Scan phase is not do the scanning but creates a list to
> > > > > > > > hold all root ports under the root bridge.
> > > > > > > > 2. Root ports collection is not required by all of the
> > > > > > > > features, only by MPS and MRRS.
> > > > > > > > But the collection always happens even when platform
> > > > > > > > doesn't require PciBus to initialize MPS or MRRS.
> > > > > > > > 3. GetDevicePolicy phase is not just call the
> > > > > > > > GetDevicePolicy for each device. It also reads the PCIE
> > > > > > > > configuration space to get the device's feature related
> > > > > > > > capabilities, for some of the
> > > features.
> > > > > > > >
> > > > > > > > With that, I propose to define 4 phases:
> > > > > > > > 1. Initialize phase
> > > > > > > > This phase is similar to your Scan phase.
> > > > > > > > For some features, this phase does nothing.
> > > > > > > > For MPS and MRRS, this phase creates a list holding all
> > > > > > > > root
> > ports.
> > > > > > > >
> > > > > > > > 2. Scan phase
> > > > > > > > This phase is similar to your GetDevicePolicy phase.
> > > > > > > > For some features, this phase needs nothing do to.
> > > > > > > > For MPS and MRRS, this phase scan all devices and get the
> > > > > > > > aligned value of MPS or MRRS.
> > > > > > > >
> > > > > > > > 3. Program phase or Configuration phase This phase is
> > > > > > > > similar to your Configuration phase.
> > > > > > > > The Setup phase can be merged to this phase.
> > > > > > > >
> > > > > > > > 4. Finalize phase.
> > > > > > > > This phase is similar to your ConfigurationComplete phase.
> > > > > > > > This phase frees the resources occupied/allocated in
> > > > > > > > Initialize
> > > phase.
> > > > > > > > For some of the features, this phase may do nothing.
> > > > > > > >
> > > > > > > > Each feature needs to provide function pointers for each
> > > > > > > > phase and NULL means the feature doesn't need to do
> > > > > > > > anything in the specific phase.
> > > > > > > > With that, we can define a structure:
> > > > > > > > Typedef struct {
> > > > > > > > BOOLEAN Enable;
> > > > > > > > PCIE_FEATURE_INITILAIZE Initialize;
> > > > > > > > PCIE_FEATURE_SCAN Scan;
> > > > > > > > PCIE_FEATURE_PROGRAM Program;
> > > > > > > > PCIE_FEATURE_FINALIZE Finalize; } PCIE_FEATURE_ENTRY;
> > > > > > > >
> > > > > > > > With that, we can define a module level global variable:
> > > > > > > > PCIE_FEATURE_ENTRY mPcieFeatures[] = {
> > > > > > > > { TRUE, MaxPayloadInitialize, MaxPayloadScan,
> > > > > > > > MaxPayloadProgram, MaxPayloadFinalize},
> > > > > > > > { TRUE, MaxReadRequestInitialize, MaxReadRequestScan,
> > > > > > > > MaxReadRequestProgram, MaxReadRequestFinalize},
> > > > > > > > { TRUE, NULL, NULL, RelaxOrderProgram, NULL},
> > > > > > > > { TRUE, NULL, CompletionTimeoutScan,
> > > > > > > > CompletionTimeoutProgram,
> > > > > > > NULL },
> > > > > > > > ...
> > > > > > > > };
> > > > > > > >
> > > > > > > > PCIE_FEATURE_ENTRY.Enable can be set to FALSE according to
> > > > > > > > the platform policy.
> > > > > > > >
> > > > > > > > The enable of PCIE features can be written as a feature
> > > > > > > > agnostic for-
> > > > > loop.
> > > > > > > > This can make the new feature enabling code easy to add
> > > > > > > > and
> > > review.
> > > > > > > >
> > > > > > > >
> > > > > > > > > -----Original Message-----
> > > > > > > > > From: Javeed, Ashraf <ashraf.javeed@intel.com>
> > > > > > > > > Sent: Wednesday, December 18, 2019 3:14 PM
> > > > > > > > > To: Ni, Ray <ray.ni@intel.com>; devel@edk2.groups.io
> > > > > > > > > Cc: Wang, Jian J <jian.j.wang@intel.com>; Wu, Hao A
> > > > > > > > > <hao.a.wu@intel.com>
> > > > > > > > > Subject: RE: [edk2-devel]
> > > > > > > > > [edk2-staging/UEFI_PCI_ENHANCE-2
> > > > > PATCH
> > > > > > > > > 05/12]
> > > > > > > > > PciBusDxe: Setup sub-phases for PCI feature enumeration
> > > > > > > > >
> > > > > > > > > Thanks for the review, Ray!
> > > > > > > > > My response in line
> > > > > > > > >
> > > > > > > > > > -----Original Message-----
> > > > > > > > > > From: Ni, Ray <ray.ni@intel.com>
> > > > > > > > > > Sent: Tuesday, December 17, 2019 5:26 PM
> > > > > > > > > > To: Javeed, Ashraf <ashraf.javeed@intel.com>;
> > > > > > > > > > devel@edk2.groups.io
> > > > > > > > > > Cc: Wang, Jian J <jian.j.wang@intel.com>; Wu, Hao A
> > > > > > > > > > <hao.a.wu@intel.com>
> > > > > > > > > > Subject: RE: [edk2-devel]
> > > > > > > > > > [edk2-staging/UEFI_PCI_ENHANCE-2 PATCH
> > > > > > > > > 05/12]
> > > > > > > > > > PciBusDxe: Setup sub-phases for PCI feature
> > > > > > > > > > enumeration
> > > > > > > > > >
> > > > > > > > > > Please check comments below.
> > > > > > > > > > I may have more comments regarding to the four phases
> > > > > > > > > > after I finish
> > > > > > > > > review of
> > > > > > > > > > further patches.
> > > > > > > > > >
> > > > > > > > > > Besides the comments below, I have a general comments
> > > > > > > > > > to the debug
> > > > > > > > > > message: can you please review the existing debug
> > > > > > > > > > message in the PciBus
> > > > > > > > > driver
> > > > > > > > > > and make sure your newly added debug message aligns to
> > > > > > > > > > existing
> > > > > > > style.
> > > > > > > > > And try
> > > > > > > > > > to use less lines of debug messages with still enough
> > > > > > > > > > debug
> > > > > > > information.
> > > > > > > > > Ok, will look into that.
> > > > > > > > >
> > > > > > > > > >
> > > > > > > > > > > > +PRIMARY_ROOT_PORT_NODE
> > > > > > > *mPrimaryRootPortList;
> > > > > > > > > > > > +
> > > > > > > > > > > > +/**
> > > > > > > > > > > > + A global pointer to
> > > > > > > > > PCI_FEATURE_CONFIGURATION_COMPLETION_LIST,
> > > > > > > > > > > > which
> > > > > > > > > > > > +stores all
> > > > > > > > > > > > + the PCI Root Bridge instances that are
> > > > > > > > > > > > +enumerated for the other PCI features,
> > > > > > > > > > > > + like MaxPayloadSize & MaxReadReqSize; during
> > > > > > > > > > > > +the the
> > > > > > > > > > > > +Start() interface of the
> > > > > > > > > > > > + driver binding protocol. The records pointed by
> > > > > > > > > > > > +this pointer would be destroyed
> > > > > > > > > > > > + when the DXE core invokes the Stop() interface.
> > > > > > > > > > > > +**/
> > > > > > > > > > > > +PCI_FEATURE_CONFIGURATION_COMPLETION_LIST
> > > > > > > > > > > > *mPciFeaturesConfigurationCompletionList = NULL;
> > > > > > > > > >
> > > > > > > > > > 1. Please follow existing linked list usage style. The
> > > > > > > > > > first node in the list is an empty header node.
> > > > > > > > > >
> > > > > > > > > > LIST_ENTRY mPrimaryRootPortList;
> > > > > > > > > > LIST_ENTRY mPciFeaturesConfigurationCompletionList;
> > > > > > > > > >
> > > > > > > > > Ok, will make the change when I incorporate the ECR 0.75
> > > > > > > > > or greater
> > > > > > > version.
> > > > > > > > >
> > > > > > > > > > > > +BOOLEAN
> > > > > > > > > > > > +CheckPciFeatureConfigurationRecordExist (
> > > > > > > > > > > > + IN PCI_IO_DEVICE *RootBridge,
> > > > > > > > > > > > + OUT
> > PCI_FEATURE_CONFIGURATION_COMPLETION_LIST
> > > > > > > > > > > > +**PciFeatureConfigRecord
> > > > > > > > > > > > + )
> > > > > > > > > >
> > > > > > > > > > 2. Is this function to check whether the PCIE features
> > > > > > > > > > under a root bridge is already initialized?
> > > > > > > > > > Can you use the existing variable gFullEnumeration?
> > > > > > > > > > The variable is set to TRUE when the enumeration is
> > > > > > > > > > done to a host bridge
> > > > > > > > > in the
> > > > > > > > > > first time.
> > > > > > > > > > By using gFullEnumeration, the entire function is not
> needed.
> > > > > > > > > >
> > > > > > > > > Ok, will look into this.
> > > > > > > > >
> > > > > > > > > > > > +EFI_STATUS
> > > > > AddRootBridgeInPciFeaturesConfigCompletionList (
> > > > > > > > > > > > + IN PCI_IO_DEVICE *RootBridge,
> > > > > > > > > > > > + IN BOOLEAN ReEnumerationRequired
> > > > > > > > > > > > + )
> > > > > > > > > >
> > > > > > > > > > 3. Same question as #2. I think by using
> > > > > > > > > > gFullEnumeration, this function is
> > > > > > > > > not
> > > > > > > > > > needed.
> > > > > > > > > >
> > > > > > > > > OK
> > > > > > > > >
> > > > > > > > > >
> > > > > > > > > > > > +BOOLEAN
> > > > > > > > > > > > +IsPciRootPortEmpty (
> > > > > > > > > > > > + IN PCI_IO_DEVICE *PciDevice
> > > > > > > > > > > > + )
> > > > > > > > > >
> > > > > > > > > > 4. Please use IsListEmpty() directly from callers and
> > > > > > > > > > remove this
> > > > > > > function.
> > > > > > > > > >
> > > > > > > > > Will consider this.
> > > > > > > > >
> > > > > > > > > > > > +**/
> > > > > > > > > > > > +EFI_STATUS
> > > > > > > > > > > > +EnumerateOtherPciFeatures (
> > > > > > > > > >
> > > > > > > > > > 5. Can it be "EnumeratePcieFeatures"?
> > > > > > > > > >
> > > > > > > > > Yes, with the change to ECR 0.75, this routine name
> > > > > > > > > shall be
> > > > > changed.
> > > > > > > > >
> > > > > > > > > > > > + IN PCI_IO_DEVICE *RootBridge
> > > > > > > > > > > > + )
> > > > > > > > > > > > +{
> > > > > > > > > > > > + EFI_STATUS Status;
> > > > > > > > > > > > + UINTN OtherPciFeatureConfigPhase;
> > > > > > > > > > > > +
> > > > > > > > > > > > + //
> > > > > > > > > > > > + // check on PCI features configuration is
> > > > > > > > > > > > + complete and re-enumeration is required // if
> > > > > > > > > > > > + (!CheckPciFeaturesConfigurationRequired
> > > > > > > > > > > > + (RootBridge)) {
> > > > > > > > > > > > + return EFI_ALREADY_STARTED; }
> > > > > > > > > > > > +
> > > > > > > > > > > > + CHAR16 *Str;
> > > > > > > > > > > > + Str = ConvertDevicePathToText (
> > > > > > > > > > > > + DevicePathFromHandle (RootBridge->Handle),
> > > > > > > > > > > > + FALSE,
> > > > > > > > > > > > + FALSE
> > > > > > > > > > > > + );
> > > > > > > > > > > > + DEBUG ((DEBUG_INFO, "Enumerating PCI features
> > > > > > > > > > > > + for Root Bridge %s\n", Str != NULL ? Str :
> > > > > > > > > > > > + L""));
> > > > > > > > > >
> > > > > > > > > > 6. Please use DEBUG_CODE macro to include
> > > > > > > > > > ConvertDevicePathToText()
> > > > > > > > > and
> > > > > > > > > > DEBUG().
> > > > > > > > > > Please remember to call FreePool().
> > > > > > > > > >
> > > > > > > > > Ok, will can under DEBUG_CODE, and free pool is called
> > > > > > > > > in the end
> > > > > > > > >
> > > > > > > > > > > > +
> > > > > > > > > > > > + for ( OtherPciFeatureConfigPhase =
> > > > > PciFeatureRootBridgeScan
> > > > > > > > > > > > + ; OtherPciFeatureConfigPhase <=
> > > > > > > > > PciFeatureConfigurationComplete
> > > > > > > > > > > > + ; OtherPciFeatureConfigPhase++
> > > > > > > > > > > > + ) {
> > > > > > > > > > > > + switch (OtherPciFeatureConfigPhase){
> > > > > > > > > > > > + case PciFeatureRootBridgeScan:
> > > > > > > > > > > > + SetupPciFeaturesConfigurationDefaults ();
> > > > > > > > > > > > + //
> > > > > > > > > > > > + //first scan the entire root bridge
> > > > > > > > > > > > + heirarchy for the primary PCI root
> > > > > > > > > > > ports
> > > > > > > > > > > > + //
> > > > > > > > > > > > + RecordPciRootPortBridges (RootBridge);
> > > > > > > > > >
> > > > > > > > > > 7. How about "RecordPciRootPorts (RootBridge)"? The
> > > "Bridges"
> > > > > > > > > > suffix is a
> > > > > > > > > bit
> > > > > > > > > > confusing.
> > > > > > > > > >
> > > > > > > > > Fine, will change.
> > > > > > > > >
> > > > > > > > > > > > + case PciFeatureGetDevicePolicy:
> > > > > > > > > > > > + case PciFeatureSetupPhase:
> > > > > > > > > >
> > > > > > > > > > 8. In SetupPciFeatures(), why do you need to call
> > DeviceExist()?
> > > > > > > > > > Did you see any case that a device is detected in the
> > > > > > > > > > beginning of PciBus
> > > > > > > > > scan
> > > > > > > > > > but is hidden when calling SetupPciFeatures()?
> > > > > > > > > >
> > > > > > > > > Yes, that is the case; device detected during the
> > > > > > > > > beginning of PciBus scan appears to be hidden by the
> > > > > > > > > platform drivers, since numerous legacy callbacks are
> > > > > > > > > initiated at different phase of PCI enumeration to the
> > > > > > > > > PCI Host Bridge, and
> > > PciPlatform drivers.
> > > > > > > > > This can be avoided if the PciBus driver is enhanced to
> > > > > > > > > check for PCI device existence before the publication of
> > > > > > > > > the PCI IO Protocol, and removal of the PCI_IO_DEVICE
> > > > > > > > > instance from the
> > > > > linked list.
> > > > > > > > >
> > > > > > > > > > 9. In GetPciFeaturesConfigurationTable() when checking
> > > > > > > > > > whether a PCI
> > > > > > > > > device
> > > > > > > > > > belongs to a root port, we can use below simpler logic:
> > > > > > > > > > SizeOfPciDevicePath = GetDevicePathSize (PciDevicePath);
> > > > > > > > > > SizeOfRootPortDevicePath = GetDevicePathSize
> > > (RootPortPath);
> > > > > > > > > > if ((SizeOfRootPortDevicePath < SizeOfPciDevicePath) &&
> > > > > > > > > > CompareMem (PciDevicePath, RootPortPath,
> > > > > > > > > SizeOfRootPortDevicePath -
> > > > > > > > > > END_DEVICE_PATH_LENGTH) == 0)) {
> > > > > > > > > > // PCI device belongs to the root port.
> > > > > > > > > > }
> > > > > > > > > >
> > > > > > > > > Ok.
> > > > > > > > >
> > > > > > > > > > > > + Status = ProgramPciFeatures (RootBridge);
> > > > > > > > > > 10. ProgramPcieFeatures()?
> > > > > > > > > >
> > > > > > > > > OK
> > > > > > > > >
> > > > > > > > > > > > +
> > > > > > > > > > > > + if (Str != NULL) {
> > > > > > > > > > > > + FreePool (Str); }
> > > > > > > > > >
> > > > > > > > > > 11. OK the Str is freed here because Str is needed for
> > > > > > > > > > other debug
> > > > > > > > > messages
> > > > > > > > > > inside the function.
> > > > > > > > > >
> > > > > > > > > Yes
> > > > > > > > >
> > > > > > > > > > > > + //
> > > > > > > > > > > > + // mark this root bridge as PCI features
> > > > > > > > > > > > +configuration complete, and no new
> > > > > > > > > > > > + // enumeration is required
> > > > > > > > > > > > + //
> > > > > > > > > > > > + AddRootBridgeInPciFeaturesConfigCompletionList
> > > > > > > > > > > > +(RootBridge, FALSE);
> > > > > > > > > >
> > > > > > > > > > 12. Not needed.
> > > > > > > > > >
> > > > > > > > > ok, after incorporating the logic of gFullEnumeration it
> > > > > > > > > won't be required
> > > > > > > > >
> > > > > > > > > > > > +_PRIMARY_ROOT_PORT_NODE {
> > > > > > > > > >
> > > > > > > > > > > > + //
> > > > > > > > > > > > + // Signature header
> > > > > > > > > > > > + //
> > > > > > > > > > > > + UINT32 Signature;
> > > > > > > > > > > > + //
> > > > > > > > > > > > + // linked list pointers to next node
> > > > > > > > > > > > + //
> > > > > > > > > > > > + LIST_ENTRY NeighborRootPort;
> > > > > > > > > > > > + //
> > > > > > > > > > > > + // pointer to PCI_IO_DEVICE of the primary PCI
> > > > > > > > > > > > +Controller device
> > > > > > > > > > > > + //
> > > > > > > > > > > > + EFI_DEVICE_PATH_PROTOCOL
> > > > > *RootPortDevicePath;
> > > > > > > > > > > > + //
> > > > > > > > > > > > + // pointer to the corresponding PCI feature
> > > > > > > > > > > > +configuration Table node
> > > > > > > > > > > > + // all the child PCI devices of the controller
> > > > > > > > > > > > +are aligned based on this table
> > > > > > > > > > > > + //
> > > > > > > > > > > > + OTHER_PCI_FEATURES_CONFIGURATION_TABLE
> > > > > > > > > > > > *OtherPciFeaturesConfigurationTable;
> > > > > > > > > > > > +};
> > > > > > > > > >
> > > > > > > > > > 13. Can you add the
> > > > > OTHER_PCI_FEATURES_CONFIGURATION_TABLE
> > > > > > > field
> > > > > > > > > to
> > > > > > > > > > PCI_IO_DEVICE structure?
> > > > > > > > > > So this structure PRIMARY_ROOT_PORT_NODE is not
> > needed.
> > > > > > > > > >
> > > > > > > > > I think it is better to maintain separately as this
> > > > > > > > > configuration table is confined to a group of PCI
> > > > > > > > > devices and for the RCiEP it is not applicable hence not
> required.
> > > > > > > > > Moreover, I am maintaining a variable for each PCIe
> > > > > > > > > feature in the PCI_IO_DEVICE; perhaps I can
> > > > > > > consider having just pointer of it....
> > > > > > > > >
> > > > > > > > > > > > +struct
> > > _PCI_FEATURE_CONFIGURATION_COMPLETION_LIST {
> > > > > > > > > > 14. This structure is not needed if using gFullEnumeration.
> > > > > > > > > Yes.
> > > > > > > >
> > > > > > > >
next prev parent reply other threads:[~2020-04-21 6:22 UTC|newest]
Thread overview: 51+ messages / expand[flat|nested] mbox.gz Atom feed top
2019-11-01 15:09 [edk2-staging/UEFI_PCI_ENHANCE-2 PATCH 00/12] New PCI features - MPS, MRRS, RO, NS, CTO Javeed, Ashraf
2019-11-01 15:09 ` [edk2-staging/UEFI_PCI_ENHANCE-2 PATCH 01/12] MdeModulePkg/PciBusDxe:New PCI features separation with PCD Javeed, Ashraf
2019-11-01 15:09 ` [edk2-staging/UEFI_PCI_ENHANCE-2 PATCH 02/12] PciBusDxe: Reorganize the PCI Platform Protocol usage code Javeed, Ashraf
2019-11-01 15:09 ` [edk2-staging/UEFI_PCI_ENHANCE-2 PATCH 03/12] PciBusDxe: Separation of the PCI device registration and start Javeed, Ashraf
2019-11-01 15:09 ` [edk2-staging/UEFI_PCI_ENHANCE-2 PATCH 04/12] PciBusDxe: Inclusion of new PCI Platform Protocol 2 Javeed, Ashraf
2019-11-01 15:09 ` [edk2-staging/UEFI_PCI_ENHANCE-2 PATCH 05/12] PciBusDxe: Setup sub-phases for PCI feature enumeration Javeed, Ashraf
2019-11-01 15:09 ` [edk2-staging/UEFI_PCI_ENHANCE-2 PATCH 06/12] PciBusDxe: Integration of setup " Javeed, Ashraf
2019-11-01 15:09 ` [edk2-staging/UEFI_PCI_ENHANCE-2 PATCH 07/12] PciBusDxe: Record the PCI-Express Capability Structure Javeed, Ashraf
2019-11-01 15:09 ` [edk2-staging/UEFI_PCI_ENHANCE-2 PATCH 08/12] PciBusDxe: New PCI feature Max_Payload_Size Javeed, Ashraf
2019-11-01 15:09 ` [edk2-staging/UEFI_PCI_ENHANCE-2 PATCH 09/12] PciBusDxe: New PCI feature Max_Read_Req_Size Javeed, Ashraf
2019-11-01 15:09 ` [edk2-staging/UEFI_PCI_ENHANCE-2 PATCH 10/12] PciBusDxe: New PCI feature Relax Ordering Javeed, Ashraf
2019-11-01 15:09 ` [edk2-staging/UEFI_PCI_ENHANCE-2 PATCH 11/12] PciBusDxe: New PCI feature No-Snoop Javeed, Ashraf
2019-11-01 15:09 ` [edk2-staging/UEFI_PCI_ENHANCE-2 PATCH 12/12] PciBusDxe: New PCI feature Completion Timeout Javeed, Ashraf
[not found] ` <15D3127A726D26A6.7420@groups.io>
2019-11-13 3:22 ` [edk2-devel] [edk2-staging/UEFI_PCI_ENHANCE-2 PATCH 01/12] MdeModulePkg/PciBusDxe:New PCI features separation with PCD Javeed, Ashraf
2019-12-16 12:46 ` Ni, Ray
[not found] ` <15D3127AABF5037C.32624@groups.io>
2019-11-13 3:23 ` [edk2-devel] [edk2-staging/UEFI_PCI_ENHANCE-2 PATCH 02/12] PciBusDxe: Reorganize the PCI Platform Protocol usage code Javeed, Ashraf
2019-12-16 12:46 ` Ni, Ray
[not found] ` <15D3127A98E21087.7420@groups.io>
2019-11-13 3:25 ` [edk2-devel] [edk2-staging/UEFI_PCI_ENHANCE-2 PATCH 03/12] PciBusDxe: Separation of the PCI device registration and start Javeed, Ashraf
2019-12-17 1:38 ` Ni, Ray
2019-12-17 3:19 ` Javeed, Ashraf
2019-12-19 1:34 ` Ni, Ray
2019-12-19 4:12 ` Javeed, Ashraf
[not found] ` <15D3127AAE5DC481.32624@groups.io>
2019-11-13 3:26 ` [edk2-devel] [edk2-staging/UEFI_PCI_ENHANCE-2 PATCH 04/12] PciBusDxe: Inclusion of new PCI Platform Protocol 2 Javeed, Ashraf
[not found] ` <15D3127B934F51D3.12315@groups.io>
2019-11-13 3:27 ` [edk2-devel] [edk2-staging/UEFI_PCI_ENHANCE-2 PATCH 05/12] PciBusDxe: Setup sub-phases for PCI feature enumeration Javeed, Ashraf
2019-12-17 11:56 ` Ni, Ray
2019-12-18 7:14 ` Javeed, Ashraf
2019-12-19 5:48 ` Ni, Ray
[not found] ` <15E1AFB3EABD031C.30484@groups.io>
2020-03-05 14:12 ` Ni, Ray
2020-03-16 9:33 ` Javeed, Ashraf
2020-03-16 14:00 ` Ni, Ray
2020-03-17 7:20 ` Javeed, Ashraf
2020-03-17 15:36 ` Ni, Ray
2020-04-20 13:22 ` Javeed, Ashraf
2020-04-21 6:03 ` Javeed, Ashraf
2020-04-21 6:22 ` Javeed, Ashraf [this message]
2020-05-08 8:26 ` Ni, Ray
[not found] ` <15D3127BE430E7DA.31784@groups.io>
2019-11-13 3:28 ` [edk2-devel] [edk2-staging/UEFI_PCI_ENHANCE-2 PATCH 06/12] PciBusDxe: Integration of setup " Javeed, Ashraf
2019-12-17 11:59 ` Ni, Ray
2019-12-18 7:15 ` Javeed, Ashraf
[not found] ` <15D3127C6DFCD4A7.12315@groups.io>
2019-11-13 3:29 ` [edk2-devel] [edk2-staging/UEFI_PCI_ENHANCE-2 PATCH 07/12] PciBusDxe: Record the PCI-Express Capability Structure Javeed, Ashraf
2019-12-17 12:03 ` Ni, Ray
2019-12-18 7:32 ` Javeed, Ashraf
[not found] ` <15D3127D273722D4.32624@groups.io>
2019-11-13 3:30 ` [edk2-devel] [edk2-staging/UEFI_PCI_ENHANCE-2 PATCH 08/12] PciBusDxe: New PCI feature Max_Payload_Size Javeed, Ashraf
2019-12-18 8:38 ` Ni, Ray
2019-12-18 9:10 ` Ni, Ray
2019-12-18 14:35 ` Javeed, Ashraf
2019-12-19 2:14 ` Ni, Ray
[not found] ` <15D3127DA6E2D860.7420@groups.io>
2019-11-13 3:31 ` [edk2-devel] [edk2-staging/UEFI_PCI_ENHANCE-2 PATCH 09/12] PciBusDxe: New PCI feature Max_Read_Req_Size Javeed, Ashraf
[not found] ` <15D3127E471DF360.32624@groups.io>
2019-11-13 3:32 ` [edk2-devel] [edk2-staging/UEFI_PCI_ENHANCE-2 PATCH 10/12] PciBusDxe: New PCI feature Relax Ordering Javeed, Ashraf
[not found] ` <15D3127EB6ED8506.12315@groups.io>
2019-11-13 3:33 ` [edk2-devel] [edk2-staging/UEFI_PCI_ENHANCE-2 PATCH 11/12] PciBusDxe: New PCI feature No-Snoop Javeed, Ashraf
[not found] ` <15D3127F5541064B.31784@groups.io>
2019-11-13 3:34 ` [edk2-devel] [edk2-staging/UEFI_PCI_ENHANCE-2 PATCH 12/12] PciBusDxe: New PCI feature Completion Timeout Javeed, Ashraf
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=95C5C2B113DE604FB208120C742E9824579F8A16@BGSMSX101.gar.corp.intel.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