Commit 85e3023e2f081b9302ca5ea0705212d7e49e00dd
1 parent
14e51cc7
Remove unused timers
git-svn-id: svn://svn.savannah.nongnu.org/qemu/trunk@3862 c046a42c-6fe2-441c-8c8c-71466251a162
Showing
1 changed file
with
40 additions
and
27 deletions
hw/slavio_timer.c
@@ -104,7 +104,11 @@ static void slavio_timer_get_out(SLAVIO_TIMERState *s) | @@ -104,7 +104,11 @@ static void slavio_timer_get_out(SLAVIO_TIMERState *s) | ||
104 | else | 104 | else |
105 | limit = s->limit; | 105 | limit = s->limit; |
106 | 106 | ||
107 | - count = limit - PERIODS_TO_LIMIT(ptimer_get_count(s->timer)); | 107 | + if (s->timer) |
108 | + count = limit - PERIODS_TO_LIMIT(ptimer_get_count(s->timer)); | ||
109 | + else | ||
110 | + count = 0; | ||
111 | + | ||
108 | DPRINTF("get_out: limit %" PRIx64 " count %x%08x\n", s->limit, | 112 | DPRINTF("get_out: limit %" PRIx64 " count %x%08x\n", s->limit, |
109 | s->counthigh, s->count); | 113 | s->counthigh, s->count); |
110 | s->count = count & TIMER_COUNT_MASK32; | 114 | s->count = count & TIMER_COUNT_MASK32; |
@@ -190,15 +194,18 @@ static void slavio_timer_mem_writel(void *opaque, target_phys_addr_t addr, | @@ -190,15 +194,18 @@ static void slavio_timer_mem_writel(void *opaque, target_phys_addr_t addr, | ||
190 | qemu_irq_lower(s->irq); | 194 | qemu_irq_lower(s->irq); |
191 | s->limit = TIMER_MAX_COUNT64; | 195 | s->limit = TIMER_MAX_COUNT64; |
192 | DPRINTF("processor %d user timer reset\n", s->slave_index); | 196 | DPRINTF("processor %d user timer reset\n", s->slave_index); |
193 | - ptimer_set_limit(s->timer, LIMIT_TO_PERIODS(s->limit), 1); | 197 | + if (s->timer) |
198 | + ptimer_set_limit(s->timer, LIMIT_TO_PERIODS(s->limit), 1); | ||
194 | } else { | 199 | } else { |
195 | // set limit, reset counter | 200 | // set limit, reset counter |
196 | qemu_irq_lower(s->irq); | 201 | qemu_irq_lower(s->irq); |
197 | s->limit = val & TIMER_MAX_COUNT32; | 202 | s->limit = val & TIMER_MAX_COUNT32; |
198 | - if (s->limit == 0) /* free-run */ | ||
199 | - ptimer_set_limit(s->timer, LIMIT_TO_PERIODS(TIMER_MAX_COUNT32), 1); | ||
200 | - else | ||
201 | - ptimer_set_limit(s->timer, LIMIT_TO_PERIODS(s->limit), 1); | 203 | + if (s->timer) { |
204 | + if (s->limit == 0) /* free-run */ | ||
205 | + ptimer_set_limit(s->timer, LIMIT_TO_PERIODS(TIMER_MAX_COUNT32), 1); | ||
206 | + else | ||
207 | + ptimer_set_limit(s->timer, LIMIT_TO_PERIODS(s->limit), 1); | ||
208 | + } | ||
202 | } | 209 | } |
203 | break; | 210 | break; |
204 | case TIMER_COUNTER: | 211 | case TIMER_COUNTER: |
@@ -207,28 +214,33 @@ static void slavio_timer_mem_writel(void *opaque, target_phys_addr_t addr, | @@ -207,28 +214,33 @@ static void slavio_timer_mem_writel(void *opaque, target_phys_addr_t addr, | ||
207 | qemu_irq_lower(s->irq); | 214 | qemu_irq_lower(s->irq); |
208 | s->limit = TIMER_MAX_COUNT64; | 215 | s->limit = TIMER_MAX_COUNT64; |
209 | DPRINTF("processor %d user timer reset\n", s->slave_index); | 216 | DPRINTF("processor %d user timer reset\n", s->slave_index); |
210 | - ptimer_set_limit(s->timer, LIMIT_TO_PERIODS(s->limit), 1); | 217 | + if (s->timer) |
218 | + ptimer_set_limit(s->timer, LIMIT_TO_PERIODS(s->limit), 1); | ||
211 | } else | 219 | } else |
212 | DPRINTF("not user timer\n"); | 220 | DPRINTF("not user timer\n"); |
213 | break; | 221 | break; |
214 | case TIMER_COUNTER_NORST: | 222 | case TIMER_COUNTER_NORST: |
215 | // set limit without resetting counter | 223 | // set limit without resetting counter |
216 | s->limit = val & TIMER_MAX_COUNT32; | 224 | s->limit = val & TIMER_MAX_COUNT32; |
217 | - if (s->limit == 0) /* free-run */ | ||
218 | - ptimer_set_limit(s->timer, LIMIT_TO_PERIODS(TIMER_MAX_COUNT32), 0); | ||
219 | - else | ||
220 | - ptimer_set_limit(s->timer, LIMIT_TO_PERIODS(s->limit), 0); | 225 | + if (s->timer) { |
226 | + if (s->limit == 0) /* free-run */ | ||
227 | + ptimer_set_limit(s->timer, LIMIT_TO_PERIODS(TIMER_MAX_COUNT32), 0); | ||
228 | + else | ||
229 | + ptimer_set_limit(s->timer, LIMIT_TO_PERIODS(s->limit), 0); | ||
230 | + } | ||
221 | break; | 231 | break; |
222 | case TIMER_STATUS: | 232 | case TIMER_STATUS: |
223 | if (slavio_timer_is_user(s)) { | 233 | if (slavio_timer_is_user(s)) { |
224 | // start/stop user counter | 234 | // start/stop user counter |
225 | if ((val & 1) && !s->running) { | 235 | if ((val & 1) && !s->running) { |
226 | DPRINTF("processor %d user timer started\n", s->slave_index); | 236 | DPRINTF("processor %d user timer started\n", s->slave_index); |
227 | - ptimer_run(s->timer, 0); | 237 | + if (s->timer) |
238 | + ptimer_run(s->timer, 0); | ||
228 | s->running = 1; | 239 | s->running = 1; |
229 | } else if (!(val & 1) && s->running) { | 240 | } else if (!(val & 1) && s->running) { |
230 | DPRINTF("processor %d user timer stopped\n", s->slave_index); | 241 | DPRINTF("processor %d user timer stopped\n", s->slave_index); |
231 | - ptimer_stop(s->timer); | 242 | + if (s->timer) |
243 | + ptimer_stop(s->timer); | ||
232 | s->running = 0; | 244 | s->running = 0; |
233 | } | 245 | } |
234 | } | 246 | } |
@@ -280,29 +292,26 @@ static void slavio_timer_save(QEMUFile *f, void *opaque) | @@ -280,29 +292,26 @@ static void slavio_timer_save(QEMUFile *f, void *opaque) | ||
280 | qemu_put_be64s(f, &s->limit); | 292 | qemu_put_be64s(f, &s->limit); |
281 | qemu_put_be32s(f, &s->count); | 293 | qemu_put_be32s(f, &s->count); |
282 | qemu_put_be32s(f, &s->counthigh); | 294 | qemu_put_be32s(f, &s->counthigh); |
283 | - qemu_put_be32(f, 0); // Was irq | ||
284 | qemu_put_be32s(f, &s->reached); | 295 | qemu_put_be32s(f, &s->reached); |
285 | qemu_put_be32s(f, &s->running); | 296 | qemu_put_be32s(f, &s->running); |
286 | - qemu_put_be32s(f, 0); // Was mode | ||
287 | - qemu_put_ptimer(f, s->timer); | 297 | + if (s->timer) |
298 | + qemu_put_ptimer(f, s->timer); | ||
288 | } | 299 | } |
289 | 300 | ||
290 | static int slavio_timer_load(QEMUFile *f, void *opaque, int version_id) | 301 | static int slavio_timer_load(QEMUFile *f, void *opaque, int version_id) |
291 | { | 302 | { |
292 | SLAVIO_TIMERState *s = opaque; | 303 | SLAVIO_TIMERState *s = opaque; |
293 | - uint32_t tmp; | ||
294 | 304 | ||
295 | - if (version_id != 2) | 305 | + if (version_id != 3) |
296 | return -EINVAL; | 306 | return -EINVAL; |
297 | 307 | ||
298 | qemu_get_be64s(f, &s->limit); | 308 | qemu_get_be64s(f, &s->limit); |
299 | qemu_get_be32s(f, &s->count); | 309 | qemu_get_be32s(f, &s->count); |
300 | qemu_get_be32s(f, &s->counthigh); | 310 | qemu_get_be32s(f, &s->counthigh); |
301 | - qemu_get_be32s(f, &tmp); // Was irq | ||
302 | qemu_get_be32s(f, &s->reached); | 311 | qemu_get_be32s(f, &s->reached); |
303 | qemu_get_be32s(f, &s->running); | 312 | qemu_get_be32s(f, &s->running); |
304 | - qemu_get_be32s(f, &tmp); // Was mode | ||
305 | - qemu_get_ptimer(f, s->timer); | 313 | + if (s->timer) |
314 | + qemu_get_ptimer(f, s->timer); | ||
306 | 315 | ||
307 | return 0; | 316 | return 0; |
308 | } | 317 | } |
@@ -315,8 +324,10 @@ static void slavio_timer_reset(void *opaque) | @@ -315,8 +324,10 @@ static void slavio_timer_reset(void *opaque) | ||
315 | s->count = 0; | 324 | s->count = 0; |
316 | s->reached = 0; | 325 | s->reached = 0; |
317 | s->slave_mode = 0; | 326 | s->slave_mode = 0; |
318 | - ptimer_set_limit(s->timer, LIMIT_TO_PERIODS(TIMER_MAX_COUNT32), 1); | ||
319 | - ptimer_run(s->timer, 0); | 327 | + if (!s->master || s->slave_index < s->master->num_slaves) { |
328 | + ptimer_set_limit(s->timer, LIMIT_TO_PERIODS(TIMER_MAX_COUNT32), 1); | ||
329 | + ptimer_run(s->timer, 0); | ||
330 | + } | ||
320 | s->running = 1; | 331 | s->running = 1; |
321 | qemu_irq_lower(s->irq); | 332 | qemu_irq_lower(s->irq); |
322 | } | 333 | } |
@@ -336,9 +347,11 @@ static SLAVIO_TIMERState *slavio_timer_init(target_phys_addr_t addr, | @@ -336,9 +347,11 @@ static SLAVIO_TIMERState *slavio_timer_init(target_phys_addr_t addr, | ||
336 | s->irq = irq; | 347 | s->irq = irq; |
337 | s->master = master; | 348 | s->master = master; |
338 | s->slave_index = slave_index; | 349 | s->slave_index = slave_index; |
339 | - bh = qemu_bh_new(slavio_timer_irq, s); | ||
340 | - s->timer = ptimer_init(bh); | ||
341 | - ptimer_set_period(s->timer, TIMER_PERIOD); | 350 | + if (!master || slave_index < master->num_slaves) { |
351 | + bh = qemu_bh_new(slavio_timer_irq, s); | ||
352 | + s->timer = ptimer_init(bh); | ||
353 | + ptimer_set_period(s->timer, TIMER_PERIOD); | ||
354 | + } | ||
342 | 355 | ||
343 | slavio_timer_io_memory = cpu_register_io_memory(0, slavio_timer_mem_read, | 356 | slavio_timer_io_memory = cpu_register_io_memory(0, slavio_timer_mem_read, |
344 | slavio_timer_mem_write, s); | 357 | slavio_timer_mem_write, s); |
@@ -348,7 +361,7 @@ static SLAVIO_TIMERState *slavio_timer_init(target_phys_addr_t addr, | @@ -348,7 +361,7 @@ static SLAVIO_TIMERState *slavio_timer_init(target_phys_addr_t addr, | ||
348 | else | 361 | else |
349 | cpu_register_physical_memory(addr, SYS_TIMER_SIZE, | 362 | cpu_register_physical_memory(addr, SYS_TIMER_SIZE, |
350 | slavio_timer_io_memory); | 363 | slavio_timer_io_memory); |
351 | - register_savevm("slavio_timer", addr, 2, slavio_timer_save, | 364 | + register_savevm("slavio_timer", addr, 3, slavio_timer_save, |
352 | slavio_timer_load, s); | 365 | slavio_timer_load, s); |
353 | qemu_register_reset(slavio_timer_reset, s); | 366 | qemu_register_reset(slavio_timer_reset, s); |
354 | slavio_timer_reset(s); | 367 | slavio_timer_reset(s); |