From: Laszlo Ersek <lersek@redhat.com>
To: Ard Biesheuvel <ard.biesheuvel@linaro.org>
Cc: Bhupesh Sharma <bhupesh.sharma@nxp.com>,
"edk2-devel@lists.01.org" <edk2-devel@ml01.01.org>,
Sakar Arora <sakar.arora@nxp.com>
Subject: Re: Exporting discontiguous System Memory to EFI STUB
Date: Wed, 21 Sep 2016 13:32:49 +0200 [thread overview]
Message-ID: <8af1b2c5-a748-3635-6f67-1bcf685d5bec@redhat.com> (raw)
In-Reply-To: <CAKv+Gu9Kvz695+D9K=DMRGqsbRbp4u3ps4a3S+MYa33GQ4a7bg@mail.gmail.com>
On 09/21/16 13:20, Ard Biesheuvel wrote:
> On 21 September 2016 at 12:17, Laszlo Ersek <lersek@redhat.com> wrote:
>> On 09/21/16 11:10, Bhupesh Sharma wrote:
>>> Thanks Ard, Laszlo.
>>>
>>> See replies in-line:
>>>
>>>> From: Ard Biesheuvel
>>>> Sent: Thursday, September 15, 2016 5:01 PM
>>>>
>>>> On 15 September 2016 at 10:01, Laszlo Ersek <lersek@redhat.com> wrote:
>>>>> On 09/15/16 10:45, Sakar Arora wrote:
>>>>>> Hi
>>>>>>
>>>>>> This is in aarch64 UEFI context.
>>>>>>
>>>>>> The efi stub code ignores any memory nodes in the device tree. It
>>>>>> only relies on the UEFI memory map for memory info.
>>>>>>
>>>>>> In such a scenario, how can one export discontiguous regions of
>>>>>> system memory to the efi stub? There seems to be only one way to
>>>>>> inform UEFI about system memory, via PcdSystemMemoryBase.
>>>>>>
>>>>>> Looking at the latest Arm Juno code, it seems like building a memory
>>>>>> resource descriptor hob, for the extra memory region, does the
>>>> trick.
>>>>>> Would that be the best way to go?
>>>>>>
>>>>>> Suggestions please.
>>>>>
>>>>> There are two ways.
>>>>>
>>>>> First, in the PEI phase, you can produce memory resource descriptor
>>>>> HOBs that will describe system memory areas. When the DXE core
>>>> starts,
>>>>> it will convert the suitable HOBs to EfiGcdMemoryTypeSystemMemory
>>>>> memory space. During DXE and BDS, boot/runtime code/data allocations
>>>>> will be satisfied from these. Then the UEFI memmap will reflect those
>>>>> allocations, and the system memory left unused, to the EFI stub.
>>>>>
>>>>> Second, you can add EfiGcdMemoryTypeSystemMemory memory space during
>>>>> and after the DXE phase, explicitly, using the DXE services. (IIRC,
>>>>> the PI spec says that memory space added this way may be picked by
>>>> the
>>>>> UEFI memory allocation system immediately; IOW, it may immediately
>>>>> become available to the pool and page allocation boot serivces, to
>>>>> allocate from. IIRC, in edk2 this actually happens.) The rest is the
>>>>> same as above, wrt. the UEFI memmap.
>>>>>
>>>>> You can see an example for the second method under
>>>>> "ArmVirtPkg/HighMemDxe". I think it might be particularly close to
>>>>> your use case, as it practically translates the memory nodes found in
>>>>> QEMU's
>>>>> (copied) DTB to EfiGcdMemoryTypeSystemMemory memory space.
>>>>>
>>>>> (Ard, when do you plan to port this driver to FDT_CLIENT_PROTOCOL?
>>>> :))
>>>>>
>>>>
>>>> Any day now :-)
>>>>
>>>> But seriously, I think this is orthogonal to the question, since I
>>>> don't expect that this platform uses DTB to describe the platform *to
>>>> UEFI*, and it would not run any of the runtime DT probing code.
>>>>
>>>> So in this particular case, it is simply a matter of adding the
>>>> additional memory at any point during the execution of UEFI that is
>>>> convenient, by using one of the two methods you describe.
>>>>
>>>
>>> Yes, this platform, which has been extensively discussion on Linux mailing-lists
>>> as well for discontiguous memory regions and their support in Linux (see [1]),
>>> doesn't use DTB to describe the platform *to UEFI*.
>>>
>>> However I have one generic question. At the moment we seem to use the PcdSystemMemoryBase
>>> and PcdSystemMemorySize PCDs to convey to the PEI and DXE phases about the UEFI system
>>> memory limits.
>>
>> No, that's incorrect. These PCDs don't capture the full picture about
>> the "UEFI system memory limits". They just describe one initial memory
>> range; the one that will serve as the permanent PEI RAM. (In the PEI
>> phase, one of the PEIMs discovers and installs the "permanent PEI RAM",
>> which is one contiguous range, to be used by the rest of the PEI phase.
>> A bit later, the PEI core, the PEIMs, the HOBs etc (IIRC) are migrated
>> from the temporary PEI RAM to this "installed" permanent PEI RAM.)
>>
>> However, starting with the DXE phase, disjoint ranges of RAM are
>> supported; they can be installed by either using the appropriate DXE
>> services within DXE, or by producing appropriate HOBs still in PEI.
>>
>>
>>>
>>> How can we represent two discontiguous DDR regions in UEFI and make
>>> the EDK2 code base use both - to create MMU mappings from?
>>
>> As I said, by producing the right HOBs in PEI or by calling the right
>> DXE services in DXE. The actual range locations (= the fields of the
>> HOBs or the arguments to the DXE services) depend on your platform.
>>
>> Regarding the MMU: I don't know. I had always believed that the DXE
>> services should cover the MMU setup transparently, when new system
>> memory ranges are added -- as long as they exist within the address
>> space pre-announced by the CPU HOB --, but I do recall from another
>> thread on the list that this wasn't the case on ARM. I don't know why.
>>
>
> I recently fixed a problem in the MMU code where the maximum size of
> the VA range which is programmed into the MMU registers was based on
> the initial memory size, and adding memory (or MMIO) ranges later
> would cause problems.
>
> WIth the latest EDK2, adding memory may be done at any time, and will
> be reflected in the 1:1 mapping in the MMU
Perfect, thank you!
Laszlo
next prev parent reply other threads:[~2016-09-21 11:32 UTC|newest]
Thread overview: 9+ messages / expand[flat|nested] mbox.gz Atom feed top
[not found] <VI1PR04MB2173B4CEB9AB3ED7B4DAEC93F8F00@VI1PR04MB2173.eurprd04.prod.outlook.com>
2016-09-15 8:45 ` Exporting discontiguous System Memory to EFI STUB Sakar Arora
2016-09-15 9:01 ` Laszlo Ersek
2016-09-15 11:31 ` Ard Biesheuvel
2016-09-21 9:10 ` Bhupesh Sharma
2016-09-21 11:17 ` Laszlo Ersek
2016-09-21 11:20 ` Ard Biesheuvel
2016-09-21 11:32 ` Laszlo Ersek [this message]
2016-09-21 11:32 ` Bhupesh Sharma
2016-09-21 11:36 ` Ard Biesheuvel
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=8af1b2c5-a748-3635-6f67-1bcf685d5bec@redhat.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