Lines Matching +full:en +full:- +full:us
14 * the Arm SSE-123 Example Subsystem Technical Reference Manual:
17 * The timer is based around a simple 64-bit incrementing counter
19 * Counter - CompareValue >= 0.
20 * The CompareValue is guest-writable, via CNTP_CVAL_HI/LO.
22 * TimerValue = CompareValue[31:0] - Counter[31:0]
24 * This part is similar to the generic timer in an Arm A-class CPU.
26 * The timer also has a separate auto-increment timer. When this
30 * Counter - AutoIncrValue >= 0
33 * When the auto-increment timer is enabled, interrupt generation
41 #include "hw/timer/sse-timer.h"
42 #include "hw/timer/sse-counter.h"
47 #include "hw/qdev-clock.h"
48 #include "hw/qdev-properties.h"
65 FIELD(CNTP_AIVAL_CTL, EN, 0, 1)
92 return (s->cntp_aival_ctl & R_CNTP_AIVAL_CTL_EN_MASK) != 0; in sse_is_autoinc()
97 return (s->cntp_ctl & R_CNTP_CTL_ENABLE_MASK) != 0; in sse_enabled()
103 return sse_counter_for_timestamp(s->counter, in sse_cntpct()
122 return s->cntp_aival_ctl & R_CNTP_AIVAL_CTL_CLR_MASK; in sse_timer_status()
124 return sse_cntpct(s) >= s->cntp_cval; in sse_timer_status()
130 bool irqstate = (!(s->cntp_ctl & R_CNTP_CTL_IMASK_MASK) && in sse_update_irq()
133 qemu_set_irq(s->irq, irqstate); in sse_update_irq()
139 uint64_t expiry = sse_counter_tick_to_time(s->counter, nexttick); in sse_set_timer()
142 timer_mod_ns(&s->timer, expiry); in sse_set_timer()
146 * signed 64-bit range of a QEMUTimer. Since timer_mod_ns() in sse_set_timer()
154 timer_del(&s->timer); in sse_set_timer()
168 timer_del(&s->timer); in sse_recalc_timer()
174 if (count >= s->cntp_cval) { in sse_recalc_timer()
184 nexttick = s->cntp_cval; in sse_recalc_timer()
192 /* Auto-increment the AIVAL, and set the timer accordingly */ in sse_autoinc()
193 s->cntp_aival = sse_cntpct(s) + s->cntp_aival_reload; in sse_autoinc()
194 sse_set_timer(s, s->cntp_aival); in sse_autoinc()
204 if (count >= s->cntp_aival) { in sse_timer_cb()
206 s->cntp_aival_ctl |= R_CNTP_AIVAL_CTL_CLR_MASK; in sse_timer_cb()
207 s->cntp_aival = count + s->cntp_aival_reload; in sse_timer_cb()
209 sse_set_timer(s, s->cntp_aival); in sse_timer_cb()
229 r = s->cntfrq; in sse_timer_read()
232 r = extract64(s->cntp_cval, 0, 32); in sse_timer_read()
235 r = extract64(s->cntp_cval, 32, 32); in sse_timer_read()
238 r = extract64(s->cntp_cval - sse_cntpct(s), 0, 32); in sse_timer_read()
241 r = s->cntp_ctl; in sse_timer_read()
247 r = extract64(s->cntp_aival, 0, 32); in sse_timer_read()
250 r = extract64(s->cntp_aival, 32, 32); in sse_timer_read()
253 r = s->cntp_aival_reload; in sse_timer_read()
260 r = s->cntp_aival_ctl; in sse_timer_read()
266 r = timer_id[(offset - A_PID4) / 4]; in sse_timer_read()
289 s->cntfrq = value; in sse_timer_write()
292 s->cntp_cval = deposit64(s->cntp_cval, 0, 32, value); in sse_timer_write()
296 s->cntp_cval = deposit64(s->cntp_cval, 32, 32, value); in sse_timer_write()
300 s->cntp_cval = sse_cntpct(s) + sextract64(value, 0, 32); in sse_timer_write()
305 uint32_t old_ctl = s->cntp_ctl; in sse_timer_write()
307 s->cntp_ctl = value; in sse_timer_write()
308 if ((old_ctl ^ s->cntp_ctl) & R_CNTP_CTL_ENABLE_MASK) { in sse_timer_write()
321 s->cntp_aival_reload = value; in sse_timer_write()
325 uint32_t old_ctl = s->cntp_aival_ctl; in sse_timer_write()
327 /* EN bit is writable; CLR bit is write-0-to-clear, write-1-ignored */ in sse_timer_write()
328 s->cntp_aival_ctl &= ~R_CNTP_AIVAL_CTL_EN_MASK; in sse_timer_write()
329 s->cntp_aival_ctl |= value & R_CNTP_AIVAL_CTL_EN_MASK; in sse_timer_write()
331 s->cntp_aival_ctl &= ~R_CNTP_AIVAL_CTL_CLR_MASK; in sse_timer_write()
333 if ((old_ctl ^ s->cntp_aival_ctl) & R_CNTP_AIVAL_CTL_EN_MASK) { in sse_timer_write()
334 /* Auto-increment toggled on/off */ in sse_timer_write()
378 timer_del(&s->timer); in sse_timer_reset()
379 s->cntfrq = 0; in sse_timer_reset()
380 s->cntp_ctl = 0; in sse_timer_reset()
381 s->cntp_cval = 0; in sse_timer_reset()
382 s->cntp_aival = 0; in sse_timer_reset()
383 s->cntp_aival_ctl = 0; in sse_timer_reset()
384 s->cntp_aival_reload = 0; in sse_timer_reset()
391 /* System counter told us we need to recalculate */ in sse_timer_counter_callback()
394 sse_set_timer(s, s->cntp_aival); in sse_timer_counter_callback()
406 memory_region_init_io(&s->iomem, obj, &sse_timer_ops, in sse_timer_init()
407 s, "sse-timer", 0x1000); in sse_timer_init()
408 sysbus_init_mmio(sbd, &s->iomem); in sse_timer_init()
409 sysbus_init_irq(sbd, &s->irq); in sse_timer_init()
416 if (!s->counter) { in sse_timer_realize()
421 s->counter_notifier.notify = sse_timer_counter_callback; in sse_timer_realize()
422 sse_counter_register_consumer(s->counter, &s->counter_notifier); in sse_timer_realize()
424 timer_init_ns(&s->timer, QEMU_CLOCK_VIRTUAL, sse_timer_cb, s); in sse_timer_realize()
428 .name = "sse-timer",
451 dc->realize = sse_timer_realize; in sse_timer_class_init()
452 dc->vmsd = &sse_timer_vmstate; in sse_timer_class_init()