Lines Matching +full:sparc +full:- +full:linux +full:- +full:user

2  * QEMU Sparc SLAVIO timer controller emulation
4 * Copyright (c) 2003-2005 Fabrice Bellard
29 #include "hw/qdev-properties.h"
41 * http://www.ibiblio.org/pub/historic-linux/early-ports/Sparc/NCR/NCR89C105.txt
43 * The 31-bit counter is incremented every 500ns by bit 9. Bits 8..0
46 * Per-CPU timers interrupt local CPU, system timer uses normal
94 #define LIMIT_TO_PERIODS(l) (((l) >> 9) - 1)
99 SLAVIO_TIMERState *s = tc->s; in slavio_timer_is_user()
100 unsigned int timer_index = tc->timer_index; in slavio_timer_is_user()
102 return timer_index != 0 && (s->cputimer_mode & (1 << (timer_index - 1))); in slavio_timer_is_user()
111 if (t->limit == 0) { /* free-run system or processor counter */ in slavio_timer_get_out()
114 limit = t->limit; in slavio_timer_get_out()
116 count = limit - PERIODS_TO_LIMIT(ptimer_get_count(t->timer)); in slavio_timer_get_out()
118 trace_slavio_timer_get_out(t->limit, t->counthigh, t->count); in slavio_timer_get_out()
119 t->count = count & TIMER_COUNT_MASK32; in slavio_timer_get_out()
120 t->counthigh = count >> 32; in slavio_timer_get_out()
127 SLAVIO_TIMERState *s = tc->s; in slavio_timer_irq()
128 CPUTimerState *t = &s->cputimer[tc->timer_index]; in slavio_timer_irq()
131 trace_slavio_timer_irq(t->counthigh, t->count); in slavio_timer_irq()
132 /* if limit is 0 (free-run), there will be no match */ in slavio_timer_irq()
133 if (t->limit != 0) { in slavio_timer_irq()
134 t->reached = TIMER_REACHED; in slavio_timer_irq()
136 /* there is no interrupt if user timer or free-run */ in slavio_timer_irq()
137 if (!slavio_timer_is_user(tc) && t->limit != 0) { in slavio_timer_irq()
138 qemu_irq_raise(t->irq); in slavio_timer_irq()
146 SLAVIO_TIMERState *s = tc->s; in slavio_timer_mem_readl()
148 unsigned int timer_index = tc->timer_index; in slavio_timer_mem_readl()
149 CPUTimerState *t = &s->cputimer[timer_index]; in slavio_timer_mem_readl()
155 // part of counter (user mode) in slavio_timer_mem_readl()
157 // read user timer MSW in slavio_timer_mem_readl()
159 ret = t->counthigh | t->reached; in slavio_timer_mem_readl()
163 qemu_irq_lower(t->irq); in slavio_timer_mem_readl()
164 t->reached = 0; in slavio_timer_mem_readl()
165 ret = t->limit & TIMER_LIMIT_MASK32; in slavio_timer_mem_readl()
170 // of counter (user mode) in slavio_timer_mem_readl()
172 if (slavio_timer_is_user(tc)) { // read user timer LSW in slavio_timer_mem_readl()
173 ret = t->count & TIMER_MAX_COUNT64; in slavio_timer_mem_readl()
175 ret = (t->count & TIMER_MAX_COUNT32) | in slavio_timer_mem_readl()
176 t->reached; in slavio_timer_mem_readl()
183 ret = t->run; in slavio_timer_mem_readl()
190 // read user/system mode in slavio_timer_mem_readl()
191 ret = s->cputimer_mode; in slavio_timer_mem_readl()
206 SLAVIO_TIMERState *s = tc->s; in slavio_timer_mem_writel()
208 unsigned int timer_index = tc->timer_index; in slavio_timer_mem_writel()
209 CPUTimerState *t = &s->cputimer[timer_index]; in slavio_timer_mem_writel()
215 ptimer_transaction_begin(t->timer); in slavio_timer_mem_writel()
219 // set user counter MSW, reset counter in slavio_timer_mem_writel()
220 t->limit = TIMER_MAX_COUNT64; in slavio_timer_mem_writel()
221 t->counthigh = val & (TIMER_MAX_COUNT64 >> 32); in slavio_timer_mem_writel()
222 t->reached = 0; in slavio_timer_mem_writel()
223 count = ((uint64_t)t->counthigh << 32) | t->count; in slavio_timer_mem_writel()
225 ptimer_set_count(t->timer, LIMIT_TO_PERIODS(t->limit - count)); in slavio_timer_mem_writel()
228 qemu_irq_lower(t->irq); in slavio_timer_mem_writel()
229 t->limit = val & TIMER_MAX_COUNT32; in slavio_timer_mem_writel()
230 if (t->limit == 0) { /* free-run */ in slavio_timer_mem_writel()
231 ptimer_set_limit(t->timer, in slavio_timer_mem_writel()
234 ptimer_set_limit(t->timer, LIMIT_TO_PERIODS(t->limit), 1); in slavio_timer_mem_writel()
237 ptimer_transaction_commit(t->timer); in slavio_timer_mem_writel()
243 // set user counter LSW, reset counter in slavio_timer_mem_writel()
244 t->limit = TIMER_MAX_COUNT64; in slavio_timer_mem_writel()
245 t->count = val & TIMER_MAX_COUNT64; in slavio_timer_mem_writel()
246 t->reached = 0; in slavio_timer_mem_writel()
247 count = ((uint64_t)t->counthigh) << 32 | t->count; in slavio_timer_mem_writel()
249 ptimer_transaction_begin(t->timer); in slavio_timer_mem_writel()
250 ptimer_set_count(t->timer, LIMIT_TO_PERIODS(t->limit - count)); in slavio_timer_mem_writel()
251 ptimer_transaction_commit(t->timer); in slavio_timer_mem_writel()
258 t->limit = val & TIMER_MAX_COUNT32; in slavio_timer_mem_writel()
259 ptimer_transaction_begin(t->timer); in slavio_timer_mem_writel()
260 if (t->limit == 0) { /* free-run */ in slavio_timer_mem_writel()
261 ptimer_set_limit(t->timer, LIMIT_TO_PERIODS(TIMER_MAX_COUNT32), 0); in slavio_timer_mem_writel()
263 ptimer_set_limit(t->timer, LIMIT_TO_PERIODS(t->limit), 0); in slavio_timer_mem_writel()
265 ptimer_transaction_commit(t->timer); in slavio_timer_mem_writel()
268 ptimer_transaction_begin(t->timer); in slavio_timer_mem_writel()
270 // start/stop user counter in slavio_timer_mem_writel()
273 ptimer_run(t->timer, 0); in slavio_timer_mem_writel()
276 ptimer_stop(t->timer); in slavio_timer_mem_writel()
279 t->run = val & 1; in slavio_timer_mem_writel()
280 ptimer_transaction_commit(t->timer); in slavio_timer_mem_writel()
286 for (i = 0; i < s->num_cpus; i++) { in slavio_timer_mem_writel()
288 CPUTimerState *curr_timer = &s->cputimer[i + 1]; in slavio_timer_mem_writel()
290 ptimer_transaction_begin(curr_timer->timer); in slavio_timer_mem_writel()
292 if ((val & processor) != (s->cputimer_mode & processor)) { in slavio_timer_mem_writel()
293 if (val & processor) { // counter -> user timer in slavio_timer_mem_writel()
294 qemu_irq_lower(curr_timer->irq); in slavio_timer_mem_writel()
296 if (!curr_timer->run) { in slavio_timer_mem_writel()
297 ptimer_stop(curr_timer->timer); in slavio_timer_mem_writel()
299 // user timer limit is always the same in slavio_timer_mem_writel()
300 curr_timer->limit = TIMER_MAX_COUNT64; in slavio_timer_mem_writel()
301 ptimer_set_limit(curr_timer->timer, in slavio_timer_mem_writel()
302 LIMIT_TO_PERIODS(curr_timer->limit), in slavio_timer_mem_writel()
304 // set this processors user timer bit in config in slavio_timer_mem_writel()
306 s->cputimer_mode |= processor; in slavio_timer_mem_writel()
308 } else { // user timer -> counter in slavio_timer_mem_writel()
310 ptimer_run(curr_timer->timer, 0); in slavio_timer_mem_writel()
311 // clear this processors user timer bit in config in slavio_timer_mem_writel()
313 s->cputimer_mode &= ~processor; in slavio_timer_mem_writel()
317 ptimer_transaction_commit(curr_timer->timer); in slavio_timer_mem_writel()
376 curr_timer = &s->cputimer[i]; in slavio_timer_reset()
377 curr_timer->limit = 0; in slavio_timer_reset()
378 curr_timer->count = 0; in slavio_timer_reset()
379 curr_timer->reached = 0; in slavio_timer_reset()
380 if (i <= s->num_cpus) { in slavio_timer_reset()
381 ptimer_transaction_begin(curr_timer->timer); in slavio_timer_reset()
382 ptimer_set_limit(curr_timer->timer, in slavio_timer_reset()
384 ptimer_run(curr_timer->timer, 0); in slavio_timer_reset()
385 curr_timer->run = 1; in slavio_timer_reset()
386 ptimer_transaction_commit(curr_timer->timer); in slavio_timer_reset()
389 s->cputimer_mode = 0; in slavio_timer_reset()
404 tc->s = s; in slavio_timer_init()
405 tc->timer_index = i; in slavio_timer_init()
407 s->cputimer[i].timer = ptimer_init(slavio_timer_irq, tc, in slavio_timer_init()
409 ptimer_transaction_begin(s->cputimer[i].timer); in slavio_timer_init()
410 ptimer_set_period(s->cputimer[i].timer, TIMER_PERIOD); in slavio_timer_init()
411 ptimer_transaction_commit(s->cputimer[i].timer); in slavio_timer_init()
414 snprintf(timer_name, sizeof(timer_name), "timer-%i", i); in slavio_timer_init()
415 memory_region_init_io(&tc->iomem, obj, &slavio_timer_mem_ops, tc, in slavio_timer_init()
417 sysbus_init_mmio(dev, &tc->iomem); in slavio_timer_init()
419 sysbus_init_irq(dev, &s->cputimer[i].irq); in slavio_timer_init()
432 dc->vmsd = &vmstate_slavio_timer; in slavio_timer_class_init()