Lines Matching +full:armv7 +full:- +full:timer

1 // SPDX-License-Identifier: GPL-2.0-only
28 #include <linux/arm-smccc.h>
70 [ARCH_TIMER_PHYS_SECURE_PPI] = "sec-phys",
73 [ARCH_TIMER_HYP_PPI] = "hyp-phys",
74 [ARCH_TIMER_HYP_VIRT_PPI] = "hyp-virt",
99 * Architected system timer support.
107 struct arch_timer *timer = to_arch_timer(clk); in arch_timer_reg_write() local
110 writel_relaxed(val, timer->base + CNTP_CTL); in arch_timer_reg_write()
113 writel_relaxed(val, timer->base + CNTP_TVAL); in arch_timer_reg_write()
117 struct arch_timer *timer = to_arch_timer(clk); in arch_timer_reg_write() local
120 writel_relaxed(val, timer->base + CNTV_CTL); in arch_timer_reg_write()
123 writel_relaxed(val, timer->base + CNTV_TVAL); in arch_timer_reg_write()
138 struct arch_timer *timer = to_arch_timer(clk); in arch_timer_reg_read() local
141 val = readl_relaxed(timer->base + CNTP_CTL); in arch_timer_reg_read()
144 val = readl_relaxed(timer->base + CNTP_TVAL); in arch_timer_reg_read()
148 struct arch_timer *timer = to_arch_timer(clk); in arch_timer_reg_read() local
151 val = readl_relaxed(timer->base + CNTV_CTL); in arch_timer_reg_read()
154 val = readl_relaxed(timer->base + CNTV_TVAL); in arch_timer_reg_read()
235 _retries--; \
281 _retries--; \
282 } while (unlikely((_new - _old) >> 5) && _retries); \
356 * (7ff -> 000 -> 800) and forward (7ff -> fff -> 800), ignore register values
366 _retries--; \
385 return read_sysreg(cntp_cval_el0) - sun50i_a64_read_cntpct_el0(); in sun50i_a64_read_cntp_tval_el0()
390 return read_sysreg(cntv_cval_el0) - sun50i_a64_read_cntvct_el0(); in sun50i_a64_read_cntv_tval_el0()
439 .id = "fsl,erratum-a008585",
452 .id = "hisilicon,erratum-161010101",
485 .id = "allwinner,erratum-unknown1",
514 return of_property_read_bool(np, wa->id); in arch_timer_check_dt_erratum()
521 return this_cpu_has_cap((uintptr_t)wa->id); in arch_timer_check_local_cap_erratum()
530 const struct ate_acpi_oem_info *info = wa->id; in arch_timer_check_acpi_oem_erratum()
535 if (!memcmp(info->oem_id, table->oem_id, ACPI_OEM_ID_SIZE) && in arch_timer_check_acpi_oem_erratum()
536 !memcmp(info->oem_table_id, table->oem_table_id, ACPI_OEM_TABLE_ID_SIZE) && in arch_timer_check_acpi_oem_erratum()
537 info->oem_revision == table->oem_revision) in arch_timer_check_acpi_oem_erratum()
577 if (wa->read_cntvct_el0 || wa->read_cntpct_el0) in arch_timer_enable_workaround()
582 * out-of-line counter accessor. We may change our mind pretty in arch_timer_enable_workaround()
583 * late in the game (with a per-CPU erratum, for example), so in arch_timer_enable_workaround()
586 if (wa->read_cntvct_el0) { in arch_timer_enable_workaround()
589 } else if (wa->disable_compat_vdso && vdso_default != VDSO_CLOCKMODE_NONE) { in arch_timer_enable_workaround()
625 wa->desc, __wa->desc); in arch_timer_check_ool_workaround()
632 local ? "local" : "global", wa->desc); in arch_timer_check_ool_workaround()
659 evt->event_handler(evt); in timer_handler()
768 clk->features = CLOCK_EVT_FEAT_ONESHOT; in __arch_timer_setup()
771 typeof(clk->set_next_event) sne; in __arch_timer_setup()
776 clk->features |= CLOCK_EVT_FEAT_C3STOP; in __arch_timer_setup()
777 clk->name = "arch_sys_timer"; in __arch_timer_setup()
778 clk->rating = 450; in __arch_timer_setup()
779 clk->cpumask = cpumask_of(smp_processor_id()); in __arch_timer_setup()
780 clk->irq = arch_timer_ppi[arch_timer_uses_ppi]; in __arch_timer_setup()
783 clk->set_state_shutdown = arch_timer_shutdown_virt; in __arch_timer_setup()
784 clk->set_state_oneshot_stopped = arch_timer_shutdown_virt; in __arch_timer_setup()
790 clk->set_state_shutdown = arch_timer_shutdown_phys; in __arch_timer_setup()
791 clk->set_state_oneshot_stopped = arch_timer_shutdown_phys; in __arch_timer_setup()
798 clk->set_next_event = sne; in __arch_timer_setup()
800 clk->features |= CLOCK_EVT_FEAT_DYNIRQ; in __arch_timer_setup()
801 clk->name = "arch_mem_timer"; in __arch_timer_setup()
802 clk->rating = 400; in __arch_timer_setup()
803 clk->cpumask = cpu_possible_mask; in __arch_timer_setup()
805 clk->set_state_shutdown = arch_timer_shutdown_virt_mem; in __arch_timer_setup()
806 clk->set_state_oneshot_stopped = arch_timer_shutdown_virt_mem; in __arch_timer_setup()
807 clk->set_next_event = in __arch_timer_setup()
810 clk->set_state_shutdown = arch_timer_shutdown_phys_mem; in __arch_timer_setup()
811 clk->set_state_oneshot_stopped = arch_timer_shutdown_phys_mem; in __arch_timer_setup()
812 clk->set_next_event = in __arch_timer_setup()
817 clk->set_state_shutdown(clk); in __arch_timer_setup()
849 lsb = fls(evt_stream_div) - 1; in arch_timer_configure_evtstream()
850 if (lsb > 0 && (evt_stream_div & BIT(lsb - 1))) in arch_timer_configure_evtstream()
927 return -EINVAL; in validate_timer_rate()
929 /* Arch timer frequency < 1MHz can cause trouble */ in validate_timer_rate()
936 * For historical reasons, when probing with DT we use whichever (non-zero)
938 * probed has a clock-frequency property, this overrides the HW register.
946 if (of_property_read_u32(np, "clock-frequency", &arch_timer_rate)) in arch_timer_of_configure_rate()
949 /* Check the timer frequency. */ in arch_timer_of_configure_rate()
956 pr_info("%s%s%s timer(s) running at %lu.%02luMHz (%s%s%s).\n", in arch_timer_banner()
1049 pr_debug("disable IRQ%d cpu #%d\n", clk->irq, smp_processor_id()); in arch_timer_stop()
1055 clk->set_state_shutdown(clk); in arch_timer_stop()
1118 err = -ENOMEM; in arch_timer_register()
1158 /* Register and immediately configure the timer on the boot CPU */ in arch_timer_register()
1189 return -ENOMEM; in arch_timer_mem_register()
1191 t->base = base; in arch_timer_mem_register()
1192 t->evt.irq = irq; in arch_timer_mem_register()
1193 __arch_timer_setup(ARCH_TIMER_TYPE_MEM, &t->evt); in arch_timer_mem_register()
1200 ret = request_irq(irq, func, IRQF_TIMER, "arch_mem_timer", &t->evt); in arch_timer_mem_register()
1202 pr_err("Failed to request mem timer irq\n"); in arch_timer_mem_register()
1210 { .compatible = "arm,armv7-timer", },
1211 { .compatible = "arm,armv8-timer", },
1216 { .compatible = "arm,armv7-timer-mem", },
1226 /* We have two timers, and both device-tree nodes are probed. */ in arch_timer_needs_of_probing()
1231 * Only one type of timer is probed, in arch_timer_needs_of_probing()
1232 * check if we have another type of timer node in device-tree. in arch_timer_needs_of_probing()
1255 * arch_timer_select_ppi() - Select suitable PPI for the current system.
1257 * If HYP mode is available, we know that the physical timer
1259 * that a guest can use the virtual timer instead.
1266 * If no interrupt provided for virtual timer, we'll have to
1267 * stick to the physical timer. It'd better be accessible...
1306 has_names = of_property_read_bool(np, "interrupt-names"); in arch_timer_of_init()
1322 arch_timer_c3stop = !of_property_read_bool(np, "always-on"); in arch_timer_of_init()
1328 * If we cannot rely on firmware initializing the timer registers then in arch_timer_of_init()
1332 of_property_read_bool(np, "arm,cpu-registers-not-fw-configured")) in arch_timer_of_init()
1339 return -EINVAL; in arch_timer_of_init()
1344 "arm,no-tick-in-suspend"); in arch_timer_of_init()
1355 TIMER_OF_DECLARE(armv7_arch_timer, "arm,armv7-timer", arch_timer_of_init);
1356 TIMER_OF_DECLARE(armv8_arch_timer, "arm,armv8-timer", arch_timer_of_init);
1364 base = ioremap(frame->cntbase, frame->size); in arch_timer_mem_frame_get_cntfrq()
1366 pr_err("Unable to map frame @ %pa\n", &frame->cntbase); in arch_timer_mem_frame_get_cntfrq()
1385 cntctlbase = ioremap(timer_mem->cntctlbase, timer_mem->size); in arch_timer_mem_find_best_frame()
1388 &timer_mem->cntctlbase); in arch_timer_mem_find_best_frame()
1402 frame = &timer_mem->frame[i]; in arch_timer_mem_find_best_frame()
1403 if (!frame->valid) in arch_timer_mem_find_best_frame()
1435 irq = frame->virt_irq; in arch_timer_mem_frame_register()
1437 irq = frame->phys_irq; in arch_timer_mem_frame_register()
1442 return -EINVAL; in arch_timer_mem_frame_register()
1445 if (!request_mem_region(frame->cntbase, frame->size, in arch_timer_mem_frame_register()
1447 return -EBUSY; in arch_timer_mem_frame_register()
1449 base = ioremap(frame->cntbase, frame->size); in arch_timer_mem_frame_register()
1452 return -ENXIO; in arch_timer_mem_frame_register()
1473 int ret = -EINVAL; in arch_timer_mem_of_init()
1478 return -ENOMEM; in arch_timer_mem_of_init()
1482 timer_mem->cntctlbase = res.start; in arch_timer_mem_of_init()
1483 timer_mem->size = resource_size(&res); in arch_timer_mem_of_init()
1489 if (of_property_read_u32(frame_node, "frame-number", &n)) { in arch_timer_mem_of_init()
1490 pr_err(FW_BUG "Missing frame-number.\n"); in arch_timer_mem_of_init()
1495 pr_err(FW_BUG "Wrong frame-number, only 0-%u are permitted.\n", in arch_timer_mem_of_init()
1496 ARCH_TIMER_MEM_MAX_FRAMES - 1); in arch_timer_mem_of_init()
1500 frame = &timer_mem->frame[n]; in arch_timer_mem_of_init()
1502 if (frame->valid) { in arch_timer_mem_of_init()
1503 pr_err(FW_BUG "Duplicated frame-number.\n"); in arch_timer_mem_of_init()
1512 frame->cntbase = res.start; in arch_timer_mem_of_init()
1513 frame->size = resource_size(&res); in arch_timer_mem_of_init()
1515 frame->virt_irq = irq_of_parse_and_map(frame_node, in arch_timer_mem_of_init()
1517 frame->phys_irq = irq_of_parse_and_map(frame_node, in arch_timer_mem_of_init()
1520 frame->valid = true; in arch_timer_mem_of_init()
1525 pr_err("Unable to find a suitable frame in timer @ %pa\n", in arch_timer_mem_of_init()
1526 &timer_mem->cntctlbase); in arch_timer_mem_of_init()
1527 ret = -EINVAL; in arch_timer_mem_of_init()
1541 TIMER_OF_DECLARE(armv7_arch_timer_mem, "arm,armv7-timer-mem",
1553 frame = &timer_mem->frame[i]; in arch_timer_mem_verify_cntfrq()
1555 if (!frame->valid) in arch_timer_mem_verify_cntfrq()
1563 &frame->cntbase, in arch_timer_mem_verify_cntfrq()
1566 return -EINVAL; in arch_timer_mem_verify_cntfrq()
1574 struct arch_timer_mem *timers, *timer; in arch_timer_mem_acpi_init() local
1581 return -ENOMEM; in arch_timer_mem_acpi_init()
1589 * in a timer expose the combination of feature we want. in arch_timer_mem_acpi_init()
1592 timer = &timers[i]; in arch_timer_mem_acpi_init()
1594 frame = arch_timer_mem_find_best_frame(timer); in arch_timer_mem_acpi_init()
1598 ret = arch_timer_mem_verify_cntfrq(timer); in arch_timer_mem_acpi_init()
1609 pr_err("Unable to find a suitable frame in timer @ %pa\n", in arch_timer_mem_acpi_init()
1610 &timer->cntctlbase); in arch_timer_mem_acpi_init()
1620 /* Initialize per-processor generic timer and memory-mapped timer(if present) */
1627 return -EINVAL; in arch_timer_acpi_init()
1661 return -EINVAL; in arch_timer_acpi_init()
1664 /* Always-on capability */ in arch_timer_acpi_init()
1676 pr_err("Failed to initialize memory-mapped timer.\n"); in arch_timer_acpi_init()
1691 return -EOPNOTSUPP; in kvm_arch_ptp_get_crosststamp()
1702 return -EOPNOTSUPP; in kvm_arch_ptp_get_crosststamp()