mbox series

[v8,0/7] Add UEFI support for RISC-V

Message ID 20200917223716.2300238-1-atish.patra@wdc.com
Headers show
Series Add UEFI support for RISC-V | expand

Message

Atish Patra Sept. 17, 2020, 10:37 p.m. UTC
This series adds UEFI support for RISC-V.

Linux kernel: v5.9-rc5 
U-Boot: v2020.07 
OpenSBI: master

Patch 1-3 are generic riscv feature addition required for UEFI support.
Patch 4-5 adds the efi stub support for RISC-V which was reviewed few months back.
Patch 6 adds the runtime services for RISC-V.

The working set of patches can also be found in following git repo.
https://github.com/atishp04/linux/tree/uefi_riscv_5.10_v8

@Palmer: I have dropped the following 2 patches from last series (v7)
as this is already part of the shared efi-tree. I am assuming you are pulling
these two from there. The above github tree contains all the patches in order
as per Ard's suggestion.

87a1eeea8e7a include: pe.h: Add RISC-V related PE definition
76fdd4313434 efi: Rename arm-init to efi-init common for all arch

The patches have been verified on following platforms:
1. Qemu (both RV32 & RV64) for the following bootflow
   OpenSBI->U-Boot->Linux
   EDK2->Linux
2. HiFive unleashed using (RV64) for the following bootflow
   OpenSBI->U-Boot->Linux
   EDK2->Linux

Thanks Abner & Daniel for all work done for EDK2.
The EDK2 instructions are available here.
https://github.com/JohnAZoidberg/riscv-edk2-docker/

Note:
1. Currently, EDK2 RISC-V port doesn't support OVMF package. That's why
EFI_GENERIC_STUB_INITRD_CMDLINE_LOADER should be enabled to load initrd via
commandline until OVMF patches are available.

2. For RV32, maximum allocated memory should be 1G as RISC-V kernel can not map
beyond 1G of physical memory for RV32.

3. Runtime services have been verified with fwts on EDK2.

***********************************************************************
[root@fedora-riscv ~]# fwts uefirtvariable
Running 1 tests, results appended to results.log
Test: UEFI Runtime service variable interface tests.                        
  Test UEFI RT service get variable interface.            1 passed             
  Test UEFI RT service get next variable name interface.  4 passed             
  Test UEFI RT service set variable interface.            7 passed, 1 warning  
  Test UEFI RT service query variable info interface.     1 passed             
  Test UEFI RT service variable interface stress test.    2 passed             
  Test UEFI RT service set variable interface stress t..  4 passed             
  Test UEFI RT service query variable info interface s..  1 passed             
  Test UEFI RT service get variable interface, invalid..  5 passed             
  Test UEFI RT variable services supported status.        1 skipped 

Test           |Pass |Fail |Abort|Warn |Skip |Info |
uefirtvariable |   25|     |     |    1|    1|     |
Total:         |   25|    0|    0|    1|    1|    0|

***********************************************************************

Changes from v7->v8:
1. Rebased on latest efi series[1].
2. Fixed efi-header for 32 bit.
3. Included RISC-V tweaks from Ard[2].
4. Removed the 2 patches(pe.h & arm init) from v7 as it is going through efi tree.

[1] git://git.kernel.org/pub/scm/linux/kernel/git/efi/efi.git
[2] git://git.kernel.org/pub/scm/linux/kernel/git/ardb/linux.git

Changes from v6->v7:
1. Fixed build error reported on linux-next for patch2.

Changes from v5->v6:
1. Fixed the static declaration for pt_ops.
2. Added Reviewed/Acked-by.

Changes from v4->v5:
1. Late mappings allocations are now done through function pointers.
2. EFI run time services are verified using full linux boot and fwts using EDK2.

Changes from v3->v4:
1. Used pgd mapping to avoid copying DT to bss.

Changes from v2->v3:
1. Fixed few bugs in run time services page table mapping.
2. Dropped patch 1 as it is already taken into efi-tree.
3. Sent few generic mmu fixes as a separate series to ease the merge conflicts.

Changes from v1->v2:
1. Removed patch 1 as it is already taken into efi-tree.
2. Fixed compilation issues with patch 9.
3. Moved few function prototype declaration to header file to keep kbuild happy.

Changes from previous version:
1. Added full ioremap support.
2. Added efi runtime services support.
3. Fixes mm issues

Anup Patel (1):
RISC-V: Move DT mapping outof fixmap

Atish Patra (6):
RISC-V: Add early ioremap support
RISC-V: Implement late mapping page table allocation functions
RISC-V: Add PE/COFF header for EFI stub
RISC-V: Add EFI stub support.
RISC-V: Add EFI runtime services
RISC-V: Add page table dump support for uefi

arch/riscv/Kconfig                        |  25 +++
arch/riscv/Makefile                       |   1 +
arch/riscv/configs/defconfig              |   1 +
arch/riscv/include/asm/Kbuild             |   1 +
arch/riscv/include/asm/efi.h              |  55 +++++++
arch/riscv/include/asm/fixmap.h           |  16 +-
arch/riscv/include/asm/io.h               |   1 +
arch/riscv/include/asm/mmu.h              |   2 +
arch/riscv/include/asm/pgtable.h          |   5 +
arch/riscv/include/asm/sections.h         |  13 ++
arch/riscv/kernel/Makefile                |   2 +
arch/riscv/kernel/efi-header.S            | 111 +++++++++++++
arch/riscv/kernel/efi.c                   |  96 +++++++++++
arch/riscv/kernel/head.S                  |  17 +-
arch/riscv/kernel/head.h                  |   2 -
arch/riscv/kernel/image-vars.h            |  51 ++++++
arch/riscv/kernel/setup.c                 |  18 +-
arch/riscv/kernel/vmlinux.lds.S           |  23 ++-
arch/riscv/mm/init.c                      | 191 ++++++++++++++++------
arch/riscv/mm/ptdump.c                    |  48 +++++-
drivers/firmware/efi/Kconfig              |   3 +-
drivers/firmware/efi/Makefile             |   2 +
drivers/firmware/efi/libstub/Makefile     |  10 ++
drivers/firmware/efi/libstub/efi-stub.c   |  11 +-
drivers/firmware/efi/libstub/riscv-stub.c | 109 ++++++++++++
drivers/firmware/efi/riscv-runtime.c      | 143 ++++++++++++++++
26 files changed, 891 insertions(+), 66 deletions(-)
create mode 100644 arch/riscv/include/asm/efi.h
create mode 100644 arch/riscv/include/asm/sections.h
create mode 100644 arch/riscv/kernel/efi-header.S
create mode 100644 arch/riscv/kernel/efi.c
create mode 100644 arch/riscv/kernel/image-vars.h
create mode 100644 drivers/firmware/efi/libstub/riscv-stub.c
create mode 100644 drivers/firmware/efi/riscv-runtime.c

--
2.25.1

Comments

Palmer Dabbelt Oct. 2, 2020, 9:38 p.m. UTC | #1
On Thu, 17 Sep 2020 15:37:09 PDT (-0700), Atish Patra wrote:
> This series adds UEFI support for RISC-V.

Thanks, this is on for-next.
Greentime Hu Nov. 9, 2020, 7:44 a.m. UTC | #2
Atish Patra <atish.patra@wdc.com> 於 2020年9月18日 週五 上午6:37寫道:
>

> From: Anup Patel <anup.patel@wdc.com>

>

> Currently, RISC-V reserves 1MB of fixmap memory for device tree. However,

> it maps only single PMD (2MB) space for fixmap which leaves only < 1MB space

> left for other kernel features such as early ioremap which requires fixmap

> as well. The fixmap size can be increased by another 2MB but it brings

> additional complexity and changes the virtual memory layout as well.

> If we require some additional feature requiring fixmap again, it has to be

> moved again.

>

> Technically, DT doesn't need a fixmap as the memory occupied by the DT is

> only used during boot. That's why, We map device tree in early page table

> using two consecutive PGD mappings at lower addresses (< PAGE_OFFSET).

> This frees lot of space in fixmap and also makes maximum supported

> device tree size supported as PGDIR_SIZE. Thus, init memory section can be used

> for the same purpose as well. This simplifies fixmap implementation.

>

> Signed-off-by: Anup Patel <anup.patel@wdc.com>

> Signed-off-by: Atish Patra <atish.patra@wdc.com>

> Reviewed-by: Palmer Dabbelt <palmerdabbelt@google.com>

> Signed-off-by: Palmer Dabbelt <palmerdabbelt@google.com>

> ---

>  arch/riscv/include/asm/fixmap.h  |  3 ---

>  arch/riscv/include/asm/pgtable.h |  1 +

>  arch/riscv/kernel/head.S         |  1 -

>  arch/riscv/kernel/head.h         |  2 --

>  arch/riscv/kernel/setup.c        |  9 +++++++--

>  arch/riscv/mm/init.c             | 26 ++++++++++++--------------

>  6 files changed, 20 insertions(+), 22 deletions(-)

>

> diff --git a/arch/riscv/include/asm/fixmap.h b/arch/riscv/include/asm/fixmap.h

> index 1ff075a8dfc7..11613f38228a 100644

> --- a/arch/riscv/include/asm/fixmap.h

> +++ b/arch/riscv/include/asm/fixmap.h

> @@ -22,9 +22,6 @@

>   */

>  enum fixed_addresses {

>         FIX_HOLE,

> -#define FIX_FDT_SIZE   SZ_1M

> -       FIX_FDT_END,

> -       FIX_FDT = FIX_FDT_END + FIX_FDT_SIZE / PAGE_SIZE - 1,

>         FIX_PTE,

>         FIX_PMD,

>         FIX_TEXT_POKE1,

> diff --git a/arch/riscv/include/asm/pgtable.h b/arch/riscv/include/asm/pgtable.h

> index eaea1f717010..815f8c959dd4 100644

> --- a/arch/riscv/include/asm/pgtable.h

> +++ b/arch/riscv/include/asm/pgtable.h

> @@ -464,6 +464,7 @@ static inline void __kernel_map_pages(struct page *page, int numpages, int enabl

>  #define kern_addr_valid(addr)   (1) /* FIXME */

>

>  extern void *dtb_early_va;

> +extern uintptr_t dtb_early_pa;

>  void setup_bootmem(void);

>  void paging_init(void);

>

> diff --git a/arch/riscv/kernel/head.S b/arch/riscv/kernel/head.S

> index 0a4e81b8dc79..c6a37e8231a8 100644

> --- a/arch/riscv/kernel/head.S

> +++ b/arch/riscv/kernel/head.S

> @@ -259,7 +259,6 @@ clear_bss_done:

>  #endif

>         /* Start the kernel */

>         call soc_early_init

> -       call parse_dtb

>         tail start_kernel

>

>  .Lsecondary_start:

> diff --git a/arch/riscv/kernel/head.h b/arch/riscv/kernel/head.h

> index 105fb0496b24..b48dda3d04f6 100644

> --- a/arch/riscv/kernel/head.h

> +++ b/arch/riscv/kernel/head.h

> @@ -16,6 +16,4 @@ asmlinkage void __init setup_vm(uintptr_t dtb_pa);

>  extern void *__cpu_up_stack_pointer[];

>  extern void *__cpu_up_task_pointer[];

>

> -void __init parse_dtb(void);

> -

>  #endif /* __ASM_HEAD_H */

> diff --git a/arch/riscv/kernel/setup.c b/arch/riscv/kernel/setup.c

> index 2c6dd329312b..edea7ef88402 100644

> --- a/arch/riscv/kernel/setup.c

> +++ b/arch/riscv/kernel/setup.c

> @@ -48,8 +48,9 @@ atomic_t hart_lottery __section(.sdata);

>  unsigned long boot_cpu_hartid;

>  static DEFINE_PER_CPU(struct cpu, cpu_devices);

>

> -void __init parse_dtb(void)

> +static void __init parse_dtb(void)

>  {

> +       /* Early scan of device tree from init memory */

>         if (early_init_dt_scan(dtb_early_va))

>                 return;

>

> @@ -62,6 +63,7 @@ void __init parse_dtb(void)

>

>  void __init setup_arch(char **cmdline_p)

>  {

> +       parse_dtb();

>         init_mm.start_code = (unsigned long) _stext;

>         init_mm.end_code   = (unsigned long) _etext;

>         init_mm.end_data   = (unsigned long) _edata;

> @@ -76,7 +78,10 @@ void __init setup_arch(char **cmdline_p)

>  #if IS_ENABLED(CONFIG_BUILTIN_DTB)

>         unflatten_and_copy_device_tree();

>  #else

> -       unflatten_device_tree();

> +       if (early_init_dt_verify(__va(dtb_early_pa)))

> +               unflatten_device_tree();

> +       else

> +               pr_err("No DTB found in kernel mappings\n");

>  #endif

>

>  #ifdef CONFIG_SWIOTLB

> diff --git a/arch/riscv/mm/init.c b/arch/riscv/mm/init.c

> index 787c75f751a5..2b651f63f5c4 100644

> --- a/arch/riscv/mm/init.c

> +++ b/arch/riscv/mm/init.c

> @@ -28,7 +28,9 @@ unsigned long empty_zero_page[PAGE_SIZE / sizeof(unsigned long)]

>  EXPORT_SYMBOL(empty_zero_page);

>

>  extern char _start[];

> -void *dtb_early_va;

> +#define DTB_EARLY_BASE_VA      PGDIR_SIZE

> +void *dtb_early_va __initdata;

> +uintptr_t dtb_early_pa __initdata;

>

>  static void __init zone_sizes_init(void)

>  {

> @@ -141,8 +143,6 @@ static void __init setup_initrd(void)

>  }

>  #endif /* CONFIG_BLK_DEV_INITRD */

>

> -static phys_addr_t dtb_early_pa __initdata;

> -

>  void __init setup_bootmem(void)

>  {

>         struct memblock_region *reg;

> @@ -399,7 +399,7 @@ static uintptr_t __init best_map_size(phys_addr_t base, phys_addr_t size)

>

>  asmlinkage void __init setup_vm(uintptr_t dtb_pa)

>  {

> -       uintptr_t va, end_va;

> +       uintptr_t va, pa, end_va;

>         uintptr_t load_pa = (uintptr_t)(&_start);

>         uintptr_t load_sz = (uintptr_t)(&_end) - load_pa;

>         uintptr_t map_size = best_map_size(load_pa, MAX_EARLY_MAPPING_SIZE);

> @@ -448,16 +448,13 @@ asmlinkage void __init setup_vm(uintptr_t dtb_pa)

>                                    load_pa + (va - PAGE_OFFSET),

>                                    map_size, PAGE_KERNEL_EXEC);

>

> -       /* Create fixed mapping for early FDT parsing */

> -       end_va = __fix_to_virt(FIX_FDT) + FIX_FDT_SIZE;

> -       for (va = __fix_to_virt(FIX_FDT); va < end_va; va += PAGE_SIZE)

> -               create_pte_mapping(fixmap_pte, va,

> -                                  dtb_pa + (va - __fix_to_virt(FIX_FDT)),

> -                                  PAGE_SIZE, PAGE_KERNEL);

> -

> -       /* Save pointer to DTB for early FDT parsing */

> -       dtb_early_va = (void *)fix_to_virt(FIX_FDT) + (dtb_pa & ~PAGE_MASK);

> -       /* Save physical address for memblock reservation */

> +       /* Create two consecutive PGD mappings for FDT early scan */

> +       pa = dtb_pa & ~(PGDIR_SIZE - 1);

> +       create_pgd_mapping(early_pg_dir, DTB_EARLY_BASE_VA,

> +                          pa, PGDIR_SIZE, PAGE_KERNEL);

Hi Anup,

I hit a booting failure case in Unleashed board in v5.10-rc2.

After debugging, it looks like something wrong in this patch.
It will create 0x40000000 as a VA start address for this mapping in rv64 here.
#define DTB_EARLY_BASE_VA      PGDIR_SIZE

but using __va(dtb_early_pa) to get the virtual address?
if (early_init_dt_verify(__va(dtb_early_pa)))
              unflatten_device_tree();

Would you please to take a look at it? I am not sure if I
misunderstand something.
Thank you. :)
Anup Patel Nov. 9, 2020, 8:19 a.m. UTC | #3
On Mon, Nov 9, 2020 at 1:14 PM Greentime Hu <greentime.hu@sifive.com> wrote:
>

> Atish Patra <atish.patra@wdc.com> 於 2020年9月18日 週五 上午6:37寫道:

> >

> > From: Anup Patel <anup.patel@wdc.com>

> >

> > Currently, RISC-V reserves 1MB of fixmap memory for device tree. However,

> > it maps only single PMD (2MB) space for fixmap which leaves only < 1MB space

> > left for other kernel features such as early ioremap which requires fixmap

> > as well. The fixmap size can be increased by another 2MB but it brings

> > additional complexity and changes the virtual memory layout as well.

> > If we require some additional feature requiring fixmap again, it has to be

> > moved again.

> >

> > Technically, DT doesn't need a fixmap as the memory occupied by the DT is

> > only used during boot. That's why, We map device tree in early page table

> > using two consecutive PGD mappings at lower addresses (< PAGE_OFFSET).

> > This frees lot of space in fixmap and also makes maximum supported

> > device tree size supported as PGDIR_SIZE. Thus, init memory section can be used

> > for the same purpose as well. This simplifies fixmap implementation.

> >

> > Signed-off-by: Anup Patel <anup.patel@wdc.com>

> > Signed-off-by: Atish Patra <atish.patra@wdc.com>

> > Reviewed-by: Palmer Dabbelt <palmerdabbelt@google.com>

> > Signed-off-by: Palmer Dabbelt <palmerdabbelt@google.com>

> > ---

> >  arch/riscv/include/asm/fixmap.h  |  3 ---

> >  arch/riscv/include/asm/pgtable.h |  1 +

> >  arch/riscv/kernel/head.S         |  1 -

> >  arch/riscv/kernel/head.h         |  2 --

> >  arch/riscv/kernel/setup.c        |  9 +++++++--

> >  arch/riscv/mm/init.c             | 26 ++++++++++++--------------

> >  6 files changed, 20 insertions(+), 22 deletions(-)

> >

> > diff --git a/arch/riscv/include/asm/fixmap.h b/arch/riscv/include/asm/fixmap.h

> > index 1ff075a8dfc7..11613f38228a 100644

> > --- a/arch/riscv/include/asm/fixmap.h

> > +++ b/arch/riscv/include/asm/fixmap.h

> > @@ -22,9 +22,6 @@

> >   */

> >  enum fixed_addresses {

> >         FIX_HOLE,

> > -#define FIX_FDT_SIZE   SZ_1M

> > -       FIX_FDT_END,

> > -       FIX_FDT = FIX_FDT_END + FIX_FDT_SIZE / PAGE_SIZE - 1,

> >         FIX_PTE,

> >         FIX_PMD,

> >         FIX_TEXT_POKE1,

> > diff --git a/arch/riscv/include/asm/pgtable.h b/arch/riscv/include/asm/pgtable.h

> > index eaea1f717010..815f8c959dd4 100644

> > --- a/arch/riscv/include/asm/pgtable.h

> > +++ b/arch/riscv/include/asm/pgtable.h

> > @@ -464,6 +464,7 @@ static inline void __kernel_map_pages(struct page *page, int numpages, int enabl

> >  #define kern_addr_valid(addr)   (1) /* FIXME */

> >

> >  extern void *dtb_early_va;

> > +extern uintptr_t dtb_early_pa;

> >  void setup_bootmem(void);

> >  void paging_init(void);

> >

> > diff --git a/arch/riscv/kernel/head.S b/arch/riscv/kernel/head.S

> > index 0a4e81b8dc79..c6a37e8231a8 100644

> > --- a/arch/riscv/kernel/head.S

> > +++ b/arch/riscv/kernel/head.S

> > @@ -259,7 +259,6 @@ clear_bss_done:

> >  #endif

> >         /* Start the kernel */

> >         call soc_early_init

> > -       call parse_dtb

> >         tail start_kernel

> >

> >  .Lsecondary_start:

> > diff --git a/arch/riscv/kernel/head.h b/arch/riscv/kernel/head.h

> > index 105fb0496b24..b48dda3d04f6 100644

> > --- a/arch/riscv/kernel/head.h

> > +++ b/arch/riscv/kernel/head.h

> > @@ -16,6 +16,4 @@ asmlinkage void __init setup_vm(uintptr_t dtb_pa);

> >  extern void *__cpu_up_stack_pointer[];

> >  extern void *__cpu_up_task_pointer[];

> >

> > -void __init parse_dtb(void);

> > -

> >  #endif /* __ASM_HEAD_H */

> > diff --git a/arch/riscv/kernel/setup.c b/arch/riscv/kernel/setup.c

> > index 2c6dd329312b..edea7ef88402 100644

> > --- a/arch/riscv/kernel/setup.c

> > +++ b/arch/riscv/kernel/setup.c

> > @@ -48,8 +48,9 @@ atomic_t hart_lottery __section(.sdata);

> >  unsigned long boot_cpu_hartid;

> >  static DEFINE_PER_CPU(struct cpu, cpu_devices);

> >

> > -void __init parse_dtb(void)

> > +static void __init parse_dtb(void)

> >  {

> > +       /* Early scan of device tree from init memory */

> >         if (early_init_dt_scan(dtb_early_va))

> >                 return;

> >

> > @@ -62,6 +63,7 @@ void __init parse_dtb(void)

> >

> >  void __init setup_arch(char **cmdline_p)

> >  {

> > +       parse_dtb();

> >         init_mm.start_code = (unsigned long) _stext;

> >         init_mm.end_code   = (unsigned long) _etext;

> >         init_mm.end_data   = (unsigned long) _edata;

> > @@ -76,7 +78,10 @@ void __init setup_arch(char **cmdline_p)

> >  #if IS_ENABLED(CONFIG_BUILTIN_DTB)

> >         unflatten_and_copy_device_tree();

> >  #else

> > -       unflatten_device_tree();

> > +       if (early_init_dt_verify(__va(dtb_early_pa)))

> > +               unflatten_device_tree();

> > +       else

> > +               pr_err("No DTB found in kernel mappings\n");

> >  #endif

> >

> >  #ifdef CONFIG_SWIOTLB

> > diff --git a/arch/riscv/mm/init.c b/arch/riscv/mm/init.c

> > index 787c75f751a5..2b651f63f5c4 100644

> > --- a/arch/riscv/mm/init.c

> > +++ b/arch/riscv/mm/init.c

> > @@ -28,7 +28,9 @@ unsigned long empty_zero_page[PAGE_SIZE / sizeof(unsigned long)]

> >  EXPORT_SYMBOL(empty_zero_page);

> >

> >  extern char _start[];

> > -void *dtb_early_va;

> > +#define DTB_EARLY_BASE_VA      PGDIR_SIZE

> > +void *dtb_early_va __initdata;

> > +uintptr_t dtb_early_pa __initdata;

> >

> >  static void __init zone_sizes_init(void)

> >  {

> > @@ -141,8 +143,6 @@ static void __init setup_initrd(void)

> >  }

> >  #endif /* CONFIG_BLK_DEV_INITRD */

> >

> > -static phys_addr_t dtb_early_pa __initdata;

> > -

> >  void __init setup_bootmem(void)

> >  {

> >         struct memblock_region *reg;

> > @@ -399,7 +399,7 @@ static uintptr_t __init best_map_size(phys_addr_t base, phys_addr_t size)

> >

> >  asmlinkage void __init setup_vm(uintptr_t dtb_pa)

> >  {

> > -       uintptr_t va, end_va;

> > +       uintptr_t va, pa, end_va;

> >         uintptr_t load_pa = (uintptr_t)(&_start);

> >         uintptr_t load_sz = (uintptr_t)(&_end) - load_pa;

> >         uintptr_t map_size = best_map_size(load_pa, MAX_EARLY_MAPPING_SIZE);

> > @@ -448,16 +448,13 @@ asmlinkage void __init setup_vm(uintptr_t dtb_pa)

> >                                    load_pa + (va - PAGE_OFFSET),

> >                                    map_size, PAGE_KERNEL_EXEC);

> >

> > -       /* Create fixed mapping for early FDT parsing */

> > -       end_va = __fix_to_virt(FIX_FDT) + FIX_FDT_SIZE;

> > -       for (va = __fix_to_virt(FIX_FDT); va < end_va; va += PAGE_SIZE)

> > -               create_pte_mapping(fixmap_pte, va,

> > -                                  dtb_pa + (va - __fix_to_virt(FIX_FDT)),

> > -                                  PAGE_SIZE, PAGE_KERNEL);

> > -

> > -       /* Save pointer to DTB for early FDT parsing */

> > -       dtb_early_va = (void *)fix_to_virt(FIX_FDT) + (dtb_pa & ~PAGE_MASK);

> > -       /* Save physical address for memblock reservation */

> > +       /* Create two consecutive PGD mappings for FDT early scan */

> > +       pa = dtb_pa & ~(PGDIR_SIZE - 1);

> > +       create_pgd_mapping(early_pg_dir, DTB_EARLY_BASE_VA,

> > +                          pa, PGDIR_SIZE, PAGE_KERNEL);

> Hi Anup,

>

> I hit a booting failure case in Unleashed board in v5.10-rc2.

>

> After debugging, it looks like something wrong in this patch.

> It will create 0x40000000 as a VA start address for this mapping in rv64 here.

> #define DTB_EARLY_BASE_VA      PGDIR_SIZE

>

> but using __va(dtb_early_pa) to get the virtual address?

> if (early_init_dt_verify(__va(dtb_early_pa)))

>               unflatten_device_tree();

>

> Would you please to take a look at it? I am not sure if I

> misunderstand something.

> Thank you. :)


This has been already fixed in v5.10-rc3 by following patch:
https://lkml.org/lkml/2020/11/4/34

Please try v5.10-rc3 at your end.

Regards,
Anup