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

Re: [Minios-devel] [UNIKRAFT RFC PATCH] plat/common:Add helper to simplify accessing fdt for arm



Hi,

> -----Original Message-----
> From: Jianyong Wu (Arm Technology China)
> Sent: Thursday, November 15, 2018 11:37 AM
> To: Julien Grall <julien.grall@xxxxxxx>; minios-devel@xxxxxxxxxxxxxxxxxxxx;
> simon.kuenzer@xxxxxxxxx
> Cc: Kaly Xin (Arm Technology China) <Kaly.Xin@xxxxxxx>; nd
> <nd@xxxxxxx>; Wei Chen (Arm Technology China) <Wei.Chen@xxxxxxx>
> Subject: RE: [Minios-devel] [UNIKRAFT RFC PATCH] plat/common:Add helper
> to simplify accessing fdt for arm
> 
> Hi,
> 
> > -----Original Message-----
> > From: Julien Grall <julien.grall@xxxxxxx>
> > Sent: Monday, November 12, 2018 7:26 PM
> > To: Jianyong Wu (Arm Technology China) <Jianyong.Wu@xxxxxxx>;
> minios-
> > devel@xxxxxxxxxxxxxxxxxxxx; simon.kuenzer@xxxxxxxxx
> > Cc: Kaly Xin (Arm Technology China) <Kaly.Xin@xxxxxxx>; nd
> > <nd@xxxxxxx>; Wei Chen (Arm Technology China) <Wei.Chen@xxxxxxx>
> > Subject: Re: [Minios-devel] [UNIKRAFT RFC PATCH] plat/common:Add
> > helper to simplify accessing fdt for arm
> >
> > Hi,
> >
> > On 11/9/18 8:54 AM, Jianyong Wu wrote:
> > > Wrap some reading ops on dtb like reading property and address
> > > conversion op to simplify acquiring device address for arm.
> > >
> > > Signed-off-by: Wei Chen <wei.chen@xxxxxxx>
> > > Signed-off-by: Jianyong Wu <jianyong.wu@xxxxxxx>
> > > ---
> > >   plat/common/arm/fdt.c         | 113
> > ++++++++++++++++++++++++++++++++++++++++++
> > >   plat/common/include/arm/fdt.h |  52 +++++++++++++++++++
> > >   plat/kvm/Makefile.uk          |   1 +
> > >   3 files changed, 166 insertions(+)
> > >   create mode 100644 plat/common/arm/fdt.c
> > >   create mode 100644 plat/common/include/arm/fdt.h
> > >
> > > diff --git a/plat/common/arm/fdt.c b/plat/common/arm/fdt.c new file
> > > mode 100644 index 0000000..1087063
> > > --- /dev/null
> > > +++ b/plat/common/arm/fdt.c
> > > @@ -0,0 +1,113 @@
> > > +/* SPDX-License-Identifier: ISC */
> > > +/*
> > > + * Authors: Wei Chen <Wei.Chen@xxxxxxx>
> > > + * Authors: Jianyong Wu <Jianyong.Wu@xxxxxxx>
> > > + *
> > > + * Copyright (c) 2018 Arm Ltd.
> > > + *
> > > + * Permission to use, copy, modify, and/or distribute this software
> > > + * for any purpose with or without fee is hereby granted, provided
> > > + * that the above copyright notice and this permission notice
> > > +appear
> > > + * in all copies.
> > > + *
> > > + * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS
> ALL
> > > + * WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL
> > IMPLIED
> > > + * WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT
> SHALL
> > THE
> > > + * AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR
> > > + * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER
> > RESULTING FROM
> > > +LOSS
> > > + * OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT,
> > > + * NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN
> > > + * CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
> > > + */
> > > +#include <libfdt.h>
> > > +#include <kvm/console.h>
> > > +#include <uk/assert.h>
> > > +#include <kvm-arm/mm.h>
> > > +#include <arm/cpu.h>
> > > +#include <arm/fdt.h>
> > > +#include <uk/arch/limits.h>
> > > +
> > > +void *_libkvmplat_dtb;
> > > +void *_libkvmplat_pagetable;
> > > +void *_libkvmplat_heap_start;
> > > +void *_libkvmplat_stack_top;
> > > +void *_libkvmplat_mem_end;
> >
> > Can you explain why all the variables but _libkvmplat_dtb belongs to that
> file?
> 
> Ok, I will move those variables to another file.
> >
> > > +
> > > +/*
> > > + * uk_dtb_find_device find device offset in dtb by
> > > + * searching device list
> > > + */
> > > +int uk_dtb_find_device(void *dtb, const char *device_list[],
> > AFAICT, the dtb is always to be _libkvmplat_dtb. So how about remove
> > the parameter dtb and directly use _libkvmplat_dtb in the code?
> 
> Dtb is short and is spread everywhere, so just keep it unchanged.
> 
> >
> > > + uint32_t size)
> > > +{
> > > +        uint32_t idx;
> > > +        int device = -1;
> > > +
> > > +        for (idx = 0;
> > > +                idx < size / sizeof(device_list[0]);
> > > +                idx++) {
> > > +                device = fdt_node_offset_by_compatible(dtb, -1,
> > > +                                        device_list[idx]);
> > > +                if (device >= 0)
> > > +                        break;
> > > +        }
> > > +
> > > +        return device;
> > > +}
> > > +
> > > +/*
> > > + * uk_dtb_read_region read cell size of device address
> > > + * and its length in dtb by input device offset.
> > > + */
> > > +uint32_t uk_dtb_read_region(void *dtb, int device,
> >
> > Same question here.
> >
> > > + uint32_t *nsize, fdt32_t **regs)
> > > +{
> > > +        int  prop_len, prop_min_len;
> > > + uint32_t naddr;
> >
> > The indentation of the code looks strange. You seem to mix hard tab
> > and soft tab. Please use what Unikraft usually use.
> >
> Ok, I will fix it.
> 
> > > +
> > > + UK_ASSERT(device != -1);
> > > +        naddr = fdt_address_cells(dtb, device);
> > > +        UK_ASSERT(naddr < FDT_MAX_NCELLS);
> > > +
> > > +        *nsize = fdt_size_cells(dtb, device);
> > > +        UK_ASSERT(*nsize < FDT_MAX_NCELLS);
> > > +
> > > +        *regs = fdt_getprop(dtb, device, "reg", &prop_len);
> > > +        prop_min_len = (int)sizeof(fdt32_t) * (naddr + *nsize);
> > > +        UK_ASSERT(*regs != NULL && prop_len >= prop_min_len);
> >
> > This assert is not very useful for "regs" property describing more
> > than
> > 1 regions. I think it would make sense to move the check in the
> > uk_dtb_read_term to check if the region requested by the caller is correct.
> 
> Ok, I will check reg in uk_dtb_read_term.

But, how to check reg in uk_dtb_read_term? I have an idea that check *(reg + 
index*(naddr+nsize) *4)
Does that make sence?
> 
> >
> > > + return naddr;
> > > +}
> > > +
> > > +/*
> > > + * this read reg part in device property and output
> > > + * address and size of term specified by index.
> > > + */
> > > +uint64_t uk_dtb_read_term(fdt32_t *regs, uint32_t index,
> > > + uint32_t naddr, uint32_t nsize, uint64_t *size)
> > > +{
> > > + uint64_t addr, term_size;
> > > +
> > > + term_size = nsize + naddr;
> > > + index = index * term_size;
> > > + addr = uk_dtb_read_number(regs + index, naddr);
> > > +
> > > + *size = uk_dtb_read_number(regs + index + naddr, nsize);
> >
> > Sorry, I realized I forgot to mention about bus earlier on. A device
> > may be under a bus and therefore the "regs" would need to be
> > translated to the parent bus. You can have a look at 2.3.8 in [1].
> >
> > At the moment, the code is probably OK with the current usage, so this
> > could be implemented when it is necessary. Although, this may require
> > some changes in the interface.
> >
> > At the moment, the code is probably OK with the current usage.
> > Although, I would keep that in mind as the interface is likely to be
> > changed if the interface is part of a stable ABI.
> >
> It's really large effort to do this check, I will keep in mind and add it if
> necessary.
> 
> Bests
> Jianyong wu
> 
> > Cheers,
> >
> > [1]
> > https://github.com/devicetree-org/devicetree-
> > specification/releases/tag/v0.2
> >
> > --
> > Julien Grall
_______________________________________________
Minios-devel mailing list
Minios-devel@xxxxxxxxxxxxxxxxxxxx
https://lists.xenproject.org/mailman/listinfo/minios-devel

 


Rackspace

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