hi Simon,

On Sat, 13 Jul 2024 at 20:46, Simon Glass <s...@chromium.org> wrote:
>
> Hi Sughosh,
>
> On Thu, 4 Jul 2024 at 08:38, Sughosh Ganu <sughosh.g...@linaro.org> wrote:
> >
> > Mark the EFI runtime memory region as reserved memory during board
> > init so that it does not get allocated by the LMB module on subsequent
> > memory requests.
> >
> > Signed-off-by: Sughosh Ganu <sughosh.g...@linaro.org>
> > ---
> > Changes since V1: New patch
> >
> >  lib/lmb.c | 41 ++++++++++++++++++++---------------------
> >  1 file changed, 20 insertions(+), 21 deletions(-)
>
> I see again that this is getting circular. Can you look at what is
> actually allocated by EFI on init (i.e. before anything is booted)?

This code is simply ensuring that the EFI runtime regions are marked
as reserved by the LMB module to prevent that region from being
allocated. Do you have any other way by which this can be communicated
to the LMB module ?

-sughosh

>
> >
> > diff --git a/lib/lmb.c b/lib/lmb.c
> > index 387ec2ac65..6018f1de31 100644
> > --- a/lib/lmb.c
> > +++ b/lib/lmb.c
> > @@ -19,6 +19,7 @@
> >  #include <asm/global_data.h>
> >  #include <asm/sections.h>
> >  #include <linux/kernel.h>
> > +#include <linux/sizes.h>
> >
> >  DECLARE_GLOBAL_DATA_PTR;
> >
> > @@ -212,33 +213,31 @@ void arch_lmb_reserve_generic(ulong sp, ulong end, 
> > ulong align)
> >  /**
> >   * efi_lmb_reserve() - add reservations for EFI memory
> >   *
> > - * Add reservations for all EFI memory areas that are not
> > - * EFI_CONVENTIONAL_MEMORY.
> > + * Add reservations for EFI runtime services memory
> >   *
> > - * Return:     0 on success, 1 on failure
> > + * Return: None
> >   */
> > -static __maybe_unused int efi_lmb_reserve(void)
> > +static __maybe_unused void efi_lmb_reserve(void)
> >  {
> > -       struct efi_mem_desc *memmap = NULL, *map;
> > -       efi_uintn_t i, map_size = 0;
> > -       efi_status_t ret;
> > +       phys_addr_t runtime_start, runtime_end;
> > +       unsigned long runtime_mask = EFI_PAGE_MASK;
> >
> > -       ret = efi_get_memory_map_alloc(&map_size, &memmap);
> > -       if (ret != EFI_SUCCESS)
> > -               return 1;
> > +#if defined(__aarch64__)
> > +       /*
> > +        * Runtime Services must be 64KiB aligned according to the
> > +        * "AArch64 Platforms" section in the UEFI spec (2.7+).
> > +        */
> >
> > -       for (i = 0, map = memmap; i < map_size / sizeof(*map); ++map, ++i) {
> > -               if (map->type != EFI_CONVENTIONAL_MEMORY) {
> > -                       lmb_reserve_flags(map_to_sysmem((void *)(uintptr_t)
> > -                                                       
> > map->physical_start),
> > -                                         map->num_pages * EFI_PAGE_SIZE,
> > -                                         map->type == 
> > EFI_RESERVED_MEMORY_TYPE
> > -                                             ? LMB_NOMAP : LMB_NONE);
> > -               }
> > -       }
> > -       efi_free_pool(memmap);
> > +       runtime_mask = SZ_64K - 1;
> > +#endif
> >
> > -       return 0;
> > +       /* Reserve the EFI runtime services memory */
> > +       runtime_start = (uintptr_t)__efi_runtime_start & ~runtime_mask;
> > +       runtime_end = (uintptr_t)__efi_runtime_stop;
> > +       runtime_end = (runtime_end + runtime_mask) & ~runtime_mask;
> > +
> > +       lmb_reserve_flags(runtime_start, runtime_end - runtime_start,
> > +                         LMB_NOOVERWRITE | LMB_NONOTIFY);
> >  }
> >
> >  static void lmb_reserve_common(void *fdt_blob)
> > --
> > 2.34.1
> >
>
> Regards,
> Simon

Reply via email to