On 3 December 2015 at 12:52, Laszlo Ersek <ler...@redhat.com> wrote: > Ard, > > On 11/30/15 18:48, Laszlo Ersek wrote: >> On 11/30/15 12:48, Ard Biesheuvel wrote: >>> On 30 November 2015 at 12:09, Laszlo Ersek <ler...@redhat.com> wrote: >>>> On 11/30/15 11:03, Ard Biesheuvel wrote: >>> [...] >>>>> >>>>> Couldn't we simply add EFI_RESOURCE_SYSTEM_MEMORY resource descriptor >>>>> HOBs the first time we enumerate the nodes? >>>> >>>> I didn't suggest it for two reasons. >>>> >>>> (1) I recalled that last time we had had a very long discussion about how >>>> the DXE core selects the initial range for memory allocations (for its own >>>> purposes, primarily). I had trouble remembering all the details now. So >>>> there were three options for me: >>>> >>>> - recommend the HOBs, and hope for the best, i.e., hope whatever the DXE >>>> core picks will be good for us >>>> >>>> - recommend the HOBs, and actually review what the DXE core does (it was >>>> modified a little bit last time) >>>> >>>> - recommend a single HOB (which implies the DXE core gets initialized >>>> exactly the same as before, no thinking or code browsing needed), and >>>> delay the installation of the addtional ranges until later. >>>> >>>> I picked the last option for simplicity. >>>> >>>> (2) The other reason is that I don't think that the HOB approach would >>>> solve the question of caching attributes. I don't think the DXE core tries >>>> to set any attributes on its own when the GCD is primed from the HOBs. >>>> >>>> Remember we have >>>> >>>> InitializeMemory() >>>> [ArmPlatformPkg/MemoryInitPei/MemoryInitPeim.c] >>>> ArmPlatformInitializeSystemMemory() >>>> [ArmVirtPkg/Library/ArmVirtPlatformLib/Virt.c] >>>> PcdSet64 (PcdSystemMemorySize, ...) >>>> MemoryPeim() >>>> [ArmVirtPkg/Library/ArmVirtMemoryInitPeiLib/ArmVirtMemoryInitPeiLib.c] >>>> PcdGet64 (PcdSystemMemorySize) >>>> BuildResourceDescriptorHob() >>>> InitMmu() >>>> [ArmVirtPkg/Library/ArmVirtMemoryInitPeiLib/ArmVirtMemoryInitPeiLib.c] >>>> ArmPlatformGetVirtualMemoryMap() >>>> [ArmVirtPkg/Library/ArmVirtPlatformLib/VirtMem.c] >>>> PcdGet64 (PcdSystemMemorySize) >>>> ArmConfigureMmu() >>>> [ArmPkg/Library/ArmLib/AArch64/AArch64Mmu.c] >>>> >>>> In other words, all of the following happens in the memory init PEIM >>>> (which comes from ArmPlatformPkg, but it's plugged chock full of our >>>> ArmVirtPkg library instances): >>>> - the in-DRAM DTB is initially parsed for the memory node >>>> - the size PCD is set >>>> - the base PCD is verified >>>> - a memory descriptor HOB is built, dependent on the PCDs >>>> - a virtual memory map is built, with caching attributes, dependent on the >>>> PCDs >>>> - the MMU is configured >>>> >>>> Therefore we have a nice fast caching setting for the "base" memory node >>>> only because you cover it explicitly in ArmPlatformGetVirtualMemoryMap() >>>> -- dependent on the PCDs --, not because the DXE core covers it when it >>>> processes the HOBs. So if you want to process several memory nodes *for >>>> real* in the the memory init PEIM, then not only do you have to create the >>>> HOBs there, but also extend the virtual memory map for the MMU similarly. >>>> And a fixed count of PCDs won't be enough to carry the information from >>>> the DTB to ArmPlatformGetVirtualMemoryMap() -- some loop would have to >>>> exist that connects the DTB with the virtual memory map. >>>> >>>> This is what I meant in my original response by "having more flexibility >>>> in DXE". >>>> >>> >>> Yes, that does sound like a lot of work for little gain. But I am not >>> too crazy about adding more 'A PRIORI' modules, to avoid ending up in >>> dependency hell later. >> >> I agree. >> >> Unfortunately, the only other possibility I can see is a separate driver >> that has a DepEx on the CPU architectural protocol, iterates over the >> FDT again, and installs the memory ranges (including setting the caching). >> >> (I also thought about delaying this logic within VirtFdtDxe: set up a >> protocol notify callback on the CPU arch protocol, and do the same thing >> in the callback. Unfortunately, this is exactly what the DXE core does >> too, and the ordering between protocol notify callbacks is not >> specified. So if ours ran first, there would be trouble.) >> >> Take your pick. If you opt for the separate driver / DepEx approach, I >> can certainly agree with that as well. It would take a bit more >> boilerplate (separate directory, separate INF file), but it would be >> very clean, as far as dispatch order and driver responsibility go. > > What would be your preference here? > > Personally I'm leaning towards a separate driver, not dissimilar to > VirtFdtDxe, that goes over the DTB, hunting for the memory nodes only, > adding them and setting the caching attributes as well. (So it would > have the depex.) > > We can think of this driver as a "memory controller driver", except the > only thing it'd have to do is look at the DTB. >
Yes, that would be my preference, especially since you can choose not to include it in your firmware. -- Ard. _______________________________________________ edk2-devel mailing list edk2-devel@lists.01.org https://lists.01.org/mailman/listinfo/edk2-devel