/* Set up the timer on the boot CPU (early init function) */ void __init preinit_xen_time(void) { static const struct dt_device_match timer_ids[] __initconst = { DT_MATCH_TIMER, { /* sentinel */ }, }; int res; u32 rate; timer = dt_find_matching_node(NULL, timer_ids); if ( !timer ) panic("Unable to find a compatible timer in the device tree"); dt_device_set_used_by(timer, DOMID_XEN); res = platform_init_time(); if ( res ) panic("Timer: Cannot initialize platform timer"); res = dt_property_read_u32(timer, "clock-frequency", &rate); if ( res ) cpu_khz = rate / 1000; else cpu_khz = READ_SYSREG32(CNTFRQ_EL0) / 1000; boot_count = READ_SYSREG64(CNTPCT_EL0); }
static int exynos5_get_pmu_baseandsize(u64 *power_base_addr, u64 *size) { struct dt_device_node *node; int rc; static const struct dt_device_match exynos_dt_pmu_matches[] = { DT_MATCH_COMPATIBLE("samsung,exynos5250-pmu"), DT_MATCH_COMPATIBLE("samsung,exynos5410-pmu"), DT_MATCH_COMPATIBLE("samsung,exynos5420-pmu"), { /*sentinel*/ }, }; node = dt_find_matching_node(NULL, exynos_dt_pmu_matches); if ( !node ) { dprintk(XENLOG_ERR, "samsung,exynos5XXX-pmu missing in DT\n"); return -ENXIO; } rc = dt_device_get_address(node, 0, power_base_addr, size); if ( rc ) { dprintk(XENLOG_ERR, "Error in \"samsung,exynos5XXX-pmu\"\n"); return -ENXIO; } dprintk(XENLOG_DEBUG, "power_base_addr: %016llx size: %016llx\n", *power_base_addr, *size); return 0; }
/* Set up the timer on the boot CPU */ int __init init_xen_time(void) { static const struct dt_device_match timer_ids[] __initconst = { DT_MATCH_TIMER, { /* sentinel */ }, }; struct dt_device_node *dev; int res; unsigned int i; u32 rate; dev = dt_find_matching_node(NULL, timer_ids); if ( !dev ) panic("Unable to find a compatible timer in the device tree"); dt_device_set_used_by(dev, DOMID_XEN); /* Retrieve all IRQs for the timer */ for ( i = TIMER_PHYS_SECURE_PPI; i < MAX_TIMER_PPI; i++ ) { res = platform_get_irq(dev, i); if ( res < 0 ) panic("Timer: Unable to retrieve IRQ %u from the device tree", i); timer_irq[i] = res; } printk("Generic Timer IRQ: phys=%u hyp=%u virt=%u\n", timer_irq[TIMER_PHYS_NONSECURE_PPI], timer_irq[TIMER_HYP_PPI], timer_irq[TIMER_VIRT_PPI]); res = platform_init_time(); if ( res ) panic("Timer: Cannot initialize platform timer"); /* Check that this CPU supports the Generic Timer interface */ if ( !cpu_has_gentimer ) panic("CPU does not support the Generic Timer v1 interface"); res = dt_property_read_u32(dev, "clock-frequency", &rate); if ( res ) cpu_khz = rate / 1000; else cpu_khz = READ_SYSREG32(CNTFRQ_EL0) / 1000; boot_count = READ_SYSREG64(CNTPCT_EL0); printk("Using generic timer at %lu KHz\n", cpu_khz); return 0; }
/* Set up the timer on the boot CPU (early init function) */ static void __init preinit_dt_xen_time(void) { static const struct dt_device_match timer_ids[] __initconst = { DT_MATCH_TIMER, { /* sentinel */ }, }; int res; u32 rate; timer = dt_find_matching_node(NULL, timer_ids); if ( !timer ) panic("Unable to find a compatible timer in the device tree"); dt_device_set_used_by(timer, DOMID_XEN); res = dt_property_read_u32(timer, "clock-frequency", &rate); if ( res ) { cpu_khz = rate / 1000; timer_dt_clock_frequency = rate; } }
int __init psci_init_0_2(void) { static const struct dt_device_match psci_ids[] __initconst = { DT_MATCH_COMPATIBLE("arm,psci-0.2"), DT_MATCH_COMPATIBLE("arm,psci-1.0"), { /* sentinel */ }, }; int ret; const struct dt_device_node *psci; psci = dt_find_matching_node(NULL, psci_ids); if ( !psci ) return -EOPNOTSUPP; ret = psci_is_smc_method(psci); if ( ret ) return -EINVAL; psci_ver = call_smc(PSCI_0_2_FN_PSCI_VERSION, 0, 0, 0); /* For the moment, we only support PSCI 0.2 and PSCI 1.x */ if ( psci_ver != PSCI_VERSION(0, 2) && PSCI_VERSION_MAJOR(psci_ver != 1) ) { printk("Error: Unrecognized PSCI version %u.%u\n", PSCI_VERSION_MAJOR(psci_ver), PSCI_VERSION_MINOR(psci_ver)); return -EOPNOTSUPP; } psci_cpu_on_nr = PSCI_0_2_FN_NATIVE(CPU_ON); printk(XENLOG_INFO "Using PSCI-%u.%u for SMP bringup\n", PSCI_VERSION_MAJOR(psci_ver), PSCI_VERSION_MINOR(psci_ver)); return 0; }