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

Re: [Xen-devel] [PATCH v7 2/2] xen/arm: consolidate make_timer_node and make_timer_domU_node



Hi Julien,

On Wed, Aug 7, 2019 at 4:05 PM Julien Grall <julien.grall@xxxxxxx> wrote:
>
>
> Hi,
> On 07/08/2019 11:10, Viktor Mitin wrote:
> > Functions make_timer_node and make_timer_domU_node are quite similar.
> > So it is better to consolidate them to avoid discrepancy.
> > The main difference between the functions is the timer interrupts used.
> >
> > Keep the domU version for the compatible as it is simpler:
> > do not copy platform's 'compatible' property into hwdom device tree,
> > instead set either arm,armv7-timer or arm,armv8-timer,
> > depending on the platform type.
>
> I am afraid this comment does not match the code below. The compatible is set
> based on the domain created not the platform.
>
> Also, I think it would be worth mentioning what's the implication of for dom0 
> as
> this change behavior.
>
> >
> > Keep the hw version for the clock as it is relevant for the both cases.
>
> I guess you mean "dom0"/"hwdom" version? But then it is not clear what "clock"
> mean here. Did you intend to refer to "timer frequency"?
>
> The code below looks good to me and v8 (actually v9 now...) for such series a
> bit too much... So let's discuss about the commit message here.
>
> I would suggest the following commit message:
>
> "
> xen/arm: domain_build: Consolidate make_timer_node() and 
> make_timer_domU_node()
>
> At the moment, the hwdom and domUs are creating the timer node differently.
>
> Technically the timer exposed the same way for any domain, the only difference
> should be the interrupts used. The two current other differences are:
>     - compatible: The hwdom DT will use the same as the one provided by the 
> host
> provided. The domUs DT will use "arm,armv7-timer" for 32-bit domain and
> "arm,armv8-timer" for 64-bit domain. The latter matches the behavior of libxl
> when guests are created from userspace.
>
>     - clock-frequency: The property is used on platform with broken firmware 
> to
> indicate the clock frequency. This should be used by all the domains, however
> this is not yet the case for domUs created by Xen.
>
> To avoid more discrepancy the two functions are now consolidated into one 
> place
> make_timer_node().
>
> For simplicity, the compatible will now be based on the bitness even for the
> hwdom. This means the compatible exposed for the hwdom may differ. This should
> only have an impact on 32-bit hwdom booting on Armv8 hardware.
> "

Fine with me.

Thanks

> >
> > Suggested-by: Julien Grall <julien.grall@xxxxxxx>
> > Signed-off-by: Viktor Mitin <viktor_mitin@xxxxxxxx>
> > ---
> > v4 updates:
> >     updated "Keep the domU version for the compatible as it is simpler"
> >
> > v5 updates:
> >      - changed 'kept' to 'keep', etc.
> >      - removed empty line
> >      - updated indentation of parameters in functions calls
> >      - fixed NITs
> >      - updated commit message
> >
> > v6 updates:
> >       - move if out of outer "if"
> >      - add full stop at the end of the last sentence
> >      - minor rephrase of commit message
> >
> > v7 updates:
> >      - removed extra braces according to Coding style rule:
> >        Braces should be omitted for blocks with a single statement.
> > ---
> >   xen/arch/arm/domain_build.c | 96 ++++++++++++-------------------------
> >   1 file changed, 31 insertions(+), 65 deletions(-)
> >
> > diff --git a/xen/arch/arm/domain_build.c b/xen/arch/arm/domain_build.c
> > index 26cd0ae12c..4e51e22927 100644
> > --- a/xen/arch/arm/domain_build.c
> > +++ b/xen/arch/arm/domain_build.c
> > @@ -973,10 +973,8 @@ static int __init make_timer_node(const struct 
> > kernel_info *kinfo)
> >           { /* sentinel */ },
> >       };
> >       struct dt_device_node *dev;
> > -    u32 len;
> > -    const void *compatible;
> >       int res;
> > -    unsigned int irq;
> > +    unsigned int irq[MAX_TIMER_PPI];
> >       gic_interrupt_t intrs[3];
> >       u32 clock_frequency;
> >       bool clock_valid;
> > @@ -990,35 +988,43 @@ static int __init make_timer_node(const struct 
> > kernel_info *kinfo)
> >           return -FDT_ERR_XEN(ENOENT);
> >       }
> >
> > -    compatible = dt_get_property(dev, "compatible", &len);
> > -    if ( !compatible )
> > -    {
> > -        dprintk(XENLOG_ERR, "Can't find compatible property for timer 
> > node\n");
> > -        return -FDT_ERR_XEN(ENOENT);
> > -    }
> > -
> >       res = fdt_begin_node(fdt, "timer");
> >       if ( res )
> >           return res;
> >
> > -    res = fdt_property(fdt, "compatible", compatible, len);
> > +    if ( !is_64bit_domain(kinfo->d) )
> > +        res = fdt_property_string(fdt, "compatible", "arm,armv7-timer");
> > +    else
> > +        res = fdt_property_string(fdt, "compatible", "arm,armv8-timer");
> >       if ( res )
> >           return res;
> >
> > -    /* The timer IRQ is emulated by Xen. It always exposes an active-low
> > -     * level-sensitive interrupt */
> > -
> > -    irq = timer_get_irq(TIMER_PHYS_SECURE_PPI);
> > -    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);
> > -    dt_dprintk("  Non secure interrupt %u\n", irq);
> > -    set_interrupt(intrs[1], irq, 0xf, DT_IRQ_TYPE_LEVEL_LOW);
> > +    /*
> > +     * The timer IRQ is emulated by Xen.
> > +     * It always exposes an active-low level-sensitive interrupt.
> > +     */
> >
> > -    irq = timer_get_irq(TIMER_VIRT_PPI);
> > -    dt_dprintk("  Virt interrupt %u\n", irq);
> > -    set_interrupt(intrs[2], irq, 0xf, DT_IRQ_TYPE_LEVEL_LOW);
> > +    if ( is_hardware_domain(kinfo->d) )
> > +    {
> > +        irq[TIMER_PHYS_SECURE_PPI] = timer_get_irq(TIMER_PHYS_SECURE_PPI);
> > +        irq[TIMER_PHYS_NONSECURE_PPI] =
> > +                                    
> > timer_get_irq(TIMER_PHYS_NONSECURE_PPI);
> > +        irq[TIMER_VIRT_PPI] = timer_get_irq(TIMER_VIRT_PPI);
> > +    }
> > +    else
> > +    {
> > +        irq[TIMER_PHYS_SECURE_PPI] = GUEST_TIMER_PHYS_S_PPI;
> > +        irq[TIMER_PHYS_NONSECURE_PPI] = GUEST_TIMER_PHYS_NS_PPI;
> > +        irq[TIMER_VIRT_PPI] = GUEST_TIMER_VIRT_PPI;
> > +    }
> > +    dt_dprintk("  Secure interrupt %u\n", irq[TIMER_PHYS_SECURE_PPI]);
> > +    set_interrupt(intrs[0], irq[TIMER_PHYS_SECURE_PPI],
> > +                  0xf, DT_IRQ_TYPE_LEVEL_LOW);
> > +    dt_dprintk("  Non secure interrupt %u\n", 
> > irq[TIMER_PHYS_NONSECURE_PPI]);
> > +    set_interrupt(intrs[1], irq[TIMER_PHYS_NONSECURE_PPI],
> > +                  0xf, DT_IRQ_TYPE_LEVEL_LOW);
> > +    dt_dprintk("  Virt interrupt %u\n", irq[TIMER_VIRT_PPI]);
> > +    set_interrupt(intrs[2], irq[TIMER_VIRT_PPI], 0xf, 
> > DT_IRQ_TYPE_LEVEL_LOW);
> >
> >       res = fdt_property_interrupts(kinfo, intrs, 3);
> >       if ( res )
> > @@ -1603,46 +1609,6 @@ static int __init make_gic_domU_node(const struct 
> > domain *d, void *fdt)
> >       }
> >   }
> >
> > -static int __init make_timer_domU_node(const struct domain *d, void *fdt)
> > -{
> > -    int res;
> > -    gic_interrupt_t intrs[3];
> > -
> > -    res = fdt_begin_node(fdt, "timer");
> > -    if ( res )
> > -        return res;
> > -
> > -    if ( !is_64bit_domain(d) )
> > -    {
> > -        res = fdt_property_string(fdt, "compatible", "arm,armv7-timer");
> > -        if ( res )
> > -            return res;
> > -    }
> > -    else
> > -    {
> > -        res = fdt_property_string(fdt, "compatible", "arm,armv8-timer");
> > -        if ( res )
> > -            return res;
> > -    }
> > -
> > -    set_interrupt(intrs[0], GUEST_TIMER_PHYS_S_PPI, 0xf, 
> > DT_IRQ_TYPE_LEVEL_LOW);
> > -    set_interrupt(intrs[1], GUEST_TIMER_PHYS_NS_PPI, 0xf, 
> > DT_IRQ_TYPE_LEVEL_LOW);
> > -    set_interrupt(intrs[2], GUEST_TIMER_VIRT_PPI, 0xf, 
> > DT_IRQ_TYPE_LEVEL_LOW);
> > -
> > -    res = fdt_property(fdt, "interrupts", intrs, sizeof (intrs[0]) * 3);
> > -    if ( res )
> > -        return res;
> > -
> > -    res = fdt_property_cell(fdt, "interrupt-parent",
> > -                            GUEST_PHANDLE_GIC);
> > -    if (res)
> > -        return res;
> > -
> > -    res = fdt_end_node(fdt);
> > -
> > -    return res;
> > -}
> > -
> >   #ifdef CONFIG_SBSA_VUART_CONSOLE
> >   static int __init make_vpl011_uart_node(const struct domain *d, void *fdt)
> >   {
> > @@ -1748,7 +1714,7 @@ static int __init prepare_dtb_domU(struct domain *d, 
> > struct kernel_info *kinfo)
> >       if ( ret )
> >           goto err;
> >
> > -    ret = make_timer_domU_node(d, kinfo->fdt);
> > +    ret = make_timer_node(kinfo);
> >       if ( ret )
> >           goto err;
> >
> >
>
> --
> 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®.