|
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [Xen-devel] [PATCH v5 2/2] xen/arm: consolidate make_timer_node and make_timer_domU_node
Viktor Mitin writes:
> 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.
> Mean 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.
It is hard to parse the last sentence. What about "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." ?
> Keep the hw version for the clock as it is relevant for the both cases.
>
> The new function has changed prototype due to fdt_property_interrupts
> make_timer_node(const struct kernel_info *kinfo)
>
> 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
> ---
> xen/arch/arm/domain_build.c | 106 +++++++++++++-----------------------
> 1 file changed, 39 insertions(+), 67 deletions(-)
>
> diff --git a/xen/arch/arm/domain_build.c b/xen/arch/arm/domain_build.c
> index bc7d17dd2c..58542130ca 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];
As I said in the previous version, you are wasting stack space
there. Also, this is misleading. When I see array of 4 items, I expect
that all 4 items will be used. But you are using only 3, so it leads to
two conclusions: either you made a mistake, or I don't understand what
it happening. Either option is bad.
> gic_interrupt_t intrs[3];
> u32 clock_frequency;
> bool clock_valid;
> @@ -990,35 +988,49 @@ 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 ( 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);
> + if ( !is_64bit_domain(kinfo->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;
> + }
Both cases bear the same piece of code:
if ( res )
return res;
You can move it out of outer "if". This will make code shorter and
simpler.
>
> - 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
> + */
Missing full stop at the end of the last sentence.
>
> - 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);
Why are you using plain indexes for intrs[] and enums for irq[]?
>
> res = fdt_property_interrupts(kinfo, intrs, 3);
> if ( res )
> @@ -1603,46 +1615,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 +1720,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;
--
Volodymyr Babchuk at EPAM
_______________________________________________
Xen-devel mailing list
Xen-devel@xxxxxxxxxxxxxxxxxxxx
https://lists.xenproject.org/mailman/listinfo/xen-devel
|
![]() |
Lists.xenproject.org is hosted with RackSpace, monitoring our |