[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [PATCH v2 8/8] xen/riscv: introduce early_fdt_map()



On Mon, 2024-07-15 at 10:52 +0200, Jan Beulich wrote:
> On 12.07.2024 18:22, Oleksii Kurochko wrote:
> > --- a/xen/arch/riscv/include/asm/mm.h
> > +++ b/xen/arch/riscv/include/asm/mm.h
> > @@ -266,4 +266,6 @@ static inline unsigned int
> > arch_get_dma_bitsize(void)
> >  
> >  void setup_fixmap_mappings(void);
> >  
> > +void* early_fdt_map(paddr_t fdt_paddr);
> 
> Please can you take care to address comments on earlier versions
> before
> submitting a new one?
Sorry, missed that Nit comment where you suggested to switch
space/block and *.

> 
> > @@ -435,3 +438,55 @@ inline pte_t mfn_to_xen_entry(mfn_t mfn,
> > unsigned int attr)
> >  
> >      return mfn_to_pte(mfn);
> >  }
> > +
> > +void * __init early_fdt_map(paddr_t fdt_paddr)
> > +{
> > +    /* We are using 2MB superpage for mapping the FDT */
> > +    paddr_t base_paddr = fdt_paddr & XEN_PT_LEVEL_MAP_MASK(1);
> > +    paddr_t offset;
> > +    void *fdt_virt;
> > +    uint32_t size;
> > +    int rc;
> > +
> > +    /*
> > +     * Check whether the physical FDT address is set and meets the
> > minimum
> > +     * alignment requirement. Since we are relying on
> > MIN_FDT_ALIGN to be at
> > +     * least 8 bytes so that we always access the magic and size
> > fields
> > +     * of the FDT header after mapping the first chunk, double
> > check if
> > +     * that is indeed the case.
> > +     */
> > +    BUILD_BUG_ON(MIN_FDT_ALIGN < 8);
> > +    if ( !fdt_paddr || fdt_paddr % MIN_FDT_ALIGN )
> > +        return NULL;
> > +
> > +    /* The FDT is mapped using 2MB superpage */
> > +    BUILD_BUG_ON(BOOT_FDT_VIRT_START % SZ_2M);
> 
> May I suggest that you use MB(2) instead of SZ_2M (not just here)? I
> think
> I had voiced opposition to the introduction of xen/sizes.h about 10
> years
> back, yet sadly it still landed in the tree. I for one think that our
> KB(),
> MB(), and GB() constructs are superior, and (I hope) free of Misra
> issues
> (unlike SZ_2G).
> 
> > +    rc = map_pages_to_xen(BOOT_FDT_VIRT_START,
> > maddr_to_mfn(base_paddr),
> > +                          SZ_2M >> PAGE_SHIFT,
> > +                          PAGE_HYPERVISOR_RO | _PAGE_BLOCK);
> > +    if ( rc )
> > +        panic("Unable to map the device-tree.\n");
> > +
> > +    offset = fdt_paddr % XEN_PT_LEVEL_SIZE(1);
> > +    fdt_virt = (void *)BOOT_FDT_VIRT_START + offset;
> > +
> > +    if ( fdt_magic(fdt_virt) != FDT_MAGIC )
> > +        return NULL;
> > +
> > +    size = fdt_totalsize(fdt_virt);
> > +    if ( size > BOOT_FDT_VIRT_SIZE )
> > +        return NULL;
> > +
> > +    if ( (offset + size) > SZ_2M )
> > +    {
> > +        rc = map_pages_to_xen(BOOT_FDT_VIRT_START + SZ_2M,
> > +                              maddr_to_mfn(base_paddr + SZ_2M),
> > +                              SZ_2M >> PAGE_SHIFT,
> > +                              PAGE_HYPERVISOR_RO | _PAGE_BLOCK);
> > +        if ( rc )
> > +            panic("Unable to map the device-tree\n");
> > +    }
> 
> Why this two part mapping? And why are you mapping perhaps much more
> than "size"?
I wasn't able to find if RISC-V has a requirement for alignment of FDT
address so I decided to follow Arm where FDT is required to be placed
on a 8-byte boundary, so FDT can cross a 2MB boundary, so the second
2MB page should be mapped if the FDT is crossing the 2MB boundary.

> 
> > @@ -48,6 +49,14 @@ void __init noreturn start_xen(unsigned long
> > bootcpu_id,
> >  
> >      setup_fixmap_mappings();
> >  
> > +    device_tree_flattened = early_fdt_map(dtb_addr);
> > +    if ( device_tree_flattened )
> 
> Is this condition perhaps inverted?
Yes, you are right. It should be inverted.

Thanks.

~ Oleksii
> 
> > +        panic("Invalid device tree blob at physical address
> > %#lx.\n"
> > +              "The DTB must be 8-byte aligned and must not exceed
> > %lld "
> > +              "bytes in size.\n\n"
> > +              "Please check your bootloader.\n",
> > +              dtb_addr, BOOT_FDT_VIRT_SIZE);
> > +
> >      printk("All set up\n");
> >  
> >      for ( ;; )
> 




 


Rackspace

Lists.xenproject.org is hosted with RackSpace, monitoring our
servers 24x7x365 and backed by RackSpace's Fanatical Support®.