[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
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |