]> xenbits.xensource.com Git - xen.git/commitdiff
xen/arm: Pass the timer "clock-frequency" to DOM0 in make_timer_node()
authorSuriyan Ramasami <suriyan.r@gmail.com>
Mon, 14 Apr 2014 08:14:00 +0000 (01:14 -0700)
committerIan Campbell <ian.campbell@citrix.com>
Wed, 16 Apr 2014 16:10:57 +0000 (17:10 +0100)
If the DT representing the ARM generic timer mentions a clock-frequency,
propragate it to the DT that is built for DOM0.

This is necessary as a workaround for boards (Odroid-XU) where CNTFRQ is not
set or returns a wrong value.

Ideally CNTFRQ should be set by the boot loader. The bootloader should respect
the ARM ARM (see B.8.1.1):
    "The CNTFRQ register is UNKNOWN at reset, and therefore the counter
    frequency must written to CNTFRQ as part of the system boot process."

For the Odroid-XU the SPL BL2 code is entered in NS HYP mode which prevents
the execution of the mcr call to set CNTFRQ.

Signed-off-by: Suriyan Ramasami <suriyan.r@gmail.com>
Reviewed-by: Julien Grall <julien.grall@linaro.org>
Acked-by: Ian Campbell <ian.campbell@citrix.com>
xen/arch/arm/domain_build.c

index df34c6dd6c3ad423f070b44036e52b3a295ffb75..187e07187f43e9d9f036bacb7b853c4c92981da0 100644 (file)
@@ -618,6 +618,8 @@ static int make_timer_node(const struct domain *d, void *fdt,
     int res;
     const struct dt_irq *irq;
     gic_interrupt_t intrs[3];
+    u32 clock_frequency;
+    bool_t clock_valid;
 
     DPRINT("Create timer node\n");
 
@@ -659,6 +661,15 @@ static int make_timer_node(const struct domain *d, void *fdt,
     if ( res )
         return res;
 
+    clock_valid = dt_property_read_u32(dev, "clock-frequency",
+                                       &clock_frequency);
+    if ( clock_valid )
+    {
+        res = fdt_property_cell(fdt, "clock-frequency", clock_frequency);
+        if ( res )
+            return res;
+    }
+
     res = fdt_end_node(fdt);
 
     return res;