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

Re: [Xen-devel] [PATCH] xen/arm: merge make_timer_node and make_timer_domU_node



Hi Julien,

On Mon, Jul 15, 2019 at 9:01 PM Julien Grall <julien.grall@xxxxxxx> wrote:
>
> Hi Viktor,
>
> On 20/06/2019 11:38, Viktor Mitin wrote:
> > Functions make_timer_node and make_timer_domU_node are quite similar.
> > The only difference between Dom0 and DomU timer DT node
> > is the timer interrupts used.  All the rest code should be the same.
>
> This is a bit confusing to read. First you say there are only "one difference"
> but then the second part leads to think there are more difference.
>
> The commit message should describe what are the differences and which version
> you are keeping.
>
Ok, will change it in the next version of the patch.

> > So it is better to merge them to avoid discrepancy.
> >
> > Tested dom0 boot with rcar h3 sk board.
> How about domU support? Also, do you have the clock-frequency property in your
> DT timer node?

Both Dom0 and DomU (dom0less) support has been tested.
There are no the clock-frequency property in your DT timer node.
Is it possible to test it anyway somehow?

>
> >
> > Suggested-by: Julien Grall <julien.grall@xxxxxxx>
> > Signed-off-by: Viktor Mitin <viktor_mitin@xxxxxxxx>
> > ---
> >   xen/arch/arm/domain_build.c | 66 ++++++++++++-------------------------
> >   1 file changed, 21 insertions(+), 45 deletions(-)
> >
> > diff --git a/xen/arch/arm/domain_build.c b/xen/arch/arm/domain_build.c
> > index 7fb828cae2..610dd3e8e7 100644
> > --- a/xen/arch/arm/domain_build.c
> > +++ b/xen/arch/arm/domain_build.c
> > @@ -976,6 +976,8 @@ static int __init make_timer_node(const struct domain 
> > *d, void *fdt)
> >       gic_interrupt_t intrs[3];
> >       u32 clock_frequency;
> >       bool clock_valid;
> > +    bool d0 = is_hardware_domain(d);
>
> Please avoid to use the term "d0"/"dom0" whenever it is possible. While in
> practice the hardware domain is always dom0 on Arm, I want to avoid the 
> mixing.

Ok, will use "if ( is_hardware_domain(...) )" approach you mentioned below.

> > +    uint32_t ip_val;
> >
> >       dt_dprintk("Create timer node\n");
>
> I am not sure where to comment, but the compatible will be different for DomU
> now. I would actually prefer if we keep the domU version for the compatible as
> it is simpler.

Ok, let's keep domU version for the compatible.

>
> >
> > @@ -1004,22 +1006,36 @@ static int __init make_timer_node(const struct 
> > domain *d, void *fdt)
> >       /* The timer IRQ is emulated by Xen. It always exposes an active-low
> >        * level-sensitive interrupt */
> >
> > -    irq = timer_get_irq(TIMER_PHYS_SECURE_PPI);
> > +    irq = d0
> > +        ? timer_get_irq(TIMER_PHYS_SECURE_PPI)
> > +        : GUEST_TIMER_PHYS_S_PPI;
>
> Rather than using ternary everywhere, how about introducing an array where the
> value will be stored.
>
> So the code would look like:
>
> if ( is_hardware_domain(...) )
> {
>    timer_irq[...] = ...;
>    timer_irq[...] = ...;
> }
> else
> {
> }
>
> [....]
>
> set_interrupt(timer_irq[...]);
>
> Have a look at time.c as we define handy value (enum timer_ppi and 
> MAX_TIMER_PPI).

Ok, will use this approach.

> >       dt_dprintk("  Secure interrupt %u\n", irq);
> >       set_interrupt(intrs[0], irq, 0xf, DT_IRQ_TYPE_LEVEL_LOW);
> >
> > -    irq = timer_get_irq(TIMER_PHYS_NONSECURE_PPI);
> > +    irq = d0
> > +        ? timer_get_irq(TIMER_PHYS_NONSECURE_PPI)
> > +        : GUEST_TIMER_PHYS_NS_PPI;
> >       dt_dprintk("  Non secure interrupt %u\n", irq);
> >       set_interrupt(intrs[1], irq, 0xf, DT_IRQ_TYPE_LEVEL_LOW);
> >
> > -    irq = timer_get_irq(TIMER_VIRT_PPI);
> > +    irq = d0
> > +        ? timer_get_irq(TIMER_VIRT_PPI)
> > +        : GUEST_TIMER_VIRT_PPI;
> >       dt_dprintk("  Virt interrupt %u\n", irq);
> >       set_interrupt(intrs[2], irq, 0xf, DT_IRQ_TYPE_LEVEL_LOW);
> >
> > -    res = fdt_property_interrupts(fdt, intrs, 3);
> > +    res = fdt_property(fdt, "interrupts", intrs, sizeof (intrs[0]) * 3);
> >       if ( res )
> >           return res;
> >
> > +    ip_val = d0
> > +           ? dt_interrupt_controller->phandle
> > +           : GUEST_PHANDLE_GIC;
> > +
> > +    res = fdt_property_cell(fdt, "interrupt-parent", ip_val);
>
> I would actually prefer if we extend fdt_property_interrupts to deal with 
> other
> domain than the hwdom. This would avoid the function.

Do you mean adding one more parameter, for example interrupt_parent_val?

static int __init fdt_property_interrupts(void *fdt, gic_interrupt_t
*intr,
                                          unsigned num_irq, dt_phandle
interrupt_parent_val)

>
> > +    if (res)
>
> NIT: Coding style
>
> if ( ... )

You are right, will fix this NIT as well.

Thanks

> Cheers,
>
> --
> Julien Grall

_______________________________________________
Xen-devel mailing list
Xen-devel@xxxxxxxxxxxxxxxxxxxx
https://lists.xenproject.org/mailman/listinfo/xen-devel

 


Rackspace

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