diff mbox

[edk2,v1,06/21] ArmVirtualizationPkg: add padding to FDT allocation

Message ID 1422025390-8036-7-git-send-email-ard.biesheuvel@linaro.org
State New
Headers show

Commit Message

Ard Biesheuvel Jan. 23, 2015, 3:02 p.m. UTC
Our primary user QEMU/mach-virt presents us with a FDT blob padded
to 64 KB with plenty of room to set additional properties. However,
in the general case, we should only add properties after making sure
there is enough room available.

Contributed-under: TianoCore Contribution Agreement 1.0
Signed-off-by: Ard Biesheuvel <ard.biesheuvel@linaro.org>
---
 .../Library/PlatformPeiLib/PlatformPeiLib.c             | 17 +++++++++++++----
 1 file changed, 13 insertions(+), 4 deletions(-)

Comments

Ard Biesheuvel Jan. 26, 2015, 11:48 a.m. UTC | #1
On 26 January 2015 at 11:47, Olivier Martin <olivier.martin@arm.com> wrote:
> I am a bit lost with this patch. I am looking for the definition of
> FDT_PADDING. I cannot find it in the previous patches and in subversion.

It is in the first hunk of *this* patch

> And it looks like it is going to be removed later on as I cannot find it
> anymore in the HEAD of your branch
> https://git.linaro.org/people/ard.biesheuvel/uefi-next.git/shortlog/refs/hea
> ds/linaro-topic-xen.
>
>> -----Original Message-----
>> From: Ard Biesheuvel [mailto:ard.biesheuvel@linaro.org]
>> Sent: 23 January 2015 15:03
>> To: edk2-devel@lists.sourceforge.net; lersek@redhat.com; Olivier
>> Martin; roy.franz@linaro.org; leif.lindholm@linaro.org;
>> stefano.stabellini@eu.citrix.com; Ian.Campbell@citrix.com;
>> anthony.perard@citrix.com; christoffer.dall@linaro.org; xen-
>> devel@lists.xen.org; ilias.biris@linaro.org
>> Cc: Ard Biesheuvel
>> Subject: [PATCH v1 06/21] ArmVirtualizationPkg: add padding to FDT
>> allocation
>>
>> Our primary user QEMU/mach-virt presents us with a FDT blob padded
>> to 64 KB with plenty of room to set additional properties. However,
>> in the general case, we should only add properties after making sure
>> there is enough room available.
>>
>> Contributed-under: TianoCore Contribution Agreement 1.0
>> Signed-off-by: Ard Biesheuvel <ard.biesheuvel@linaro.org>
>> ---
>>  .../Library/PlatformPeiLib/PlatformPeiLib.c             | 17
>> +++++++++++++----
>>  1 file changed, 13 insertions(+), 4 deletions(-)
>>
>> diff --git
>> a/ArmPlatformPkg/ArmVirtualizationPkg/Library/PlatformPeiLib/PlatformPe
>> iLib.c
>> b/ArmPlatformPkg/ArmVirtualizationPkg/Library/PlatformPeiLib/PlatformPe
>> iLib.c
>> index f2404f89d152..540474608deb 100644
>> ---
>> a/ArmPlatformPkg/ArmVirtualizationPkg/Library/PlatformPeiLib/PlatformPe
>> iLib.c
>> +++
>> b/ArmPlatformPkg/ArmVirtualizationPkg/Library/PlatformPeiLib/PlatformPe
>> iLib.c
>> @@ -24,6 +24,15 @@
>>  #include <Guid/EarlyPL011BaseAddress.h>
>>  #include <Guid/FdtHob.h>
>>
>> +//
>> +// We may want to apply some changes to the device tree before passing
>> it
>> +// to the OS: for instance, if we find a PL031 RTC node and attach our
>> +// runtime driver to it, we should disable it in the device tree by
>> setting
>> +// its status property to "disabled". Add some padding to make sure
>> this is
>> +// possible.
>> +//
>> +#define FDT_PADDING   256


here ^^^


>> +
>>  EFI_STATUS
>>  EFIAPI
>>  PlatformPeim (
>> @@ -32,7 +41,7 @@ PlatformPeim (
>>  {
>>    VOID               *Base;
>>    VOID               *NewBase;
>> -  UINTN              FdtSize;
>> +  UINTN              FdtPages;
>>    UINTN              *FdtHobData;
>>    UINT64             *UartHobData;
>>    INT32              Node, Prev;
>> @@ -46,10 +55,10 @@ PlatformPeim (
>>    Base = (VOID*)(UINTN)PcdGet64 (PcdDeviceTreeInitialBaseAddress);
>>    ASSERT (Base != NULL && fdt_check_header (Base) == 0);
>>
>> -  FdtSize = fdt_totalsize (Base);
>> -  NewBase = AllocatePages (EFI_SIZE_TO_PAGES (FdtSize));
>> +  FdtPages = EFI_SIZE_TO_PAGES (fdt_totalsize (Base) + FDT_PADDING);
>> +  NewBase = AllocatePages (FdtPages);
>>    ASSERT (NewBase != NULL);
>> -  CopyMem (NewBase, Base, FdtSize);
>> +  fdt_open_into (Base, NewBase, EFI_PAGES_TO_SIZE (FdtPages));
>>
>>    FdtHobData = BuildGuidHob (&gFdtHobGuid, sizeof *FdtHobData);
>>    ASSERT (FdtHobData != NULL);
>> --
>> 1.8.3.2
>>
>
>
>
>

------------------------------------------------------------------------------
Dive into the World of Parallel Programming. The Go Parallel Website,
sponsored by Intel and developed in partnership with Slashdot Media, is your
hub for all things parallel software development, from weekly thought
leadership blogs to news, videos, case studies, tutorials and more. Take a
look and join the conversation now. http://goparallel.sourceforge.net/
diff mbox

Patch

diff --git a/ArmPlatformPkg/ArmVirtualizationPkg/Library/PlatformPeiLib/PlatformPeiLib.c b/ArmPlatformPkg/ArmVirtualizationPkg/Library/PlatformPeiLib/PlatformPeiLib.c
index f2404f89d152..540474608deb 100644
--- a/ArmPlatformPkg/ArmVirtualizationPkg/Library/PlatformPeiLib/PlatformPeiLib.c
+++ b/ArmPlatformPkg/ArmVirtualizationPkg/Library/PlatformPeiLib/PlatformPeiLib.c
@@ -24,6 +24,15 @@ 
 #include <Guid/EarlyPL011BaseAddress.h>
 #include <Guid/FdtHob.h>
 
+//
+// We may want to apply some changes to the device tree before passing it
+// to the OS: for instance, if we find a PL031 RTC node and attach our
+// runtime driver to it, we should disable it in the device tree by setting
+// its status property to "disabled". Add some padding to make sure this is
+// possible.
+//
+#define FDT_PADDING   256
+
 EFI_STATUS
 EFIAPI
 PlatformPeim (
@@ -32,7 +41,7 @@  PlatformPeim (
 {
   VOID               *Base;
   VOID               *NewBase;
-  UINTN              FdtSize;
+  UINTN              FdtPages;
   UINTN              *FdtHobData;
   UINT64             *UartHobData;
   INT32              Node, Prev;
@@ -46,10 +55,10 @@  PlatformPeim (
   Base = (VOID*)(UINTN)PcdGet64 (PcdDeviceTreeInitialBaseAddress);
   ASSERT (Base != NULL && fdt_check_header (Base) == 0);
 
-  FdtSize = fdt_totalsize (Base);
-  NewBase = AllocatePages (EFI_SIZE_TO_PAGES (FdtSize));
+  FdtPages = EFI_SIZE_TO_PAGES (fdt_totalsize (Base) + FDT_PADDING);
+  NewBase = AllocatePages (FdtPages);
   ASSERT (NewBase != NULL);
-  CopyMem (NewBase, Base, FdtSize);
+  fdt_open_into (Base, NewBase, EFI_PAGES_TO_SIZE (FdtPages));
 
   FdtHobData = BuildGuidHob (&gFdtHobGuid, sizeof *FdtHobData);
   ASSERT (FdtHobData != NULL);