]> git.ipfire.org Git - thirdparty/binutils-gdb.git/blame - sim/mn10300/dv-mn103tim.c
Update copyright year range in header of all files managed by GDB
[thirdparty/binutils-gdb.git] / sim / mn10300 / dv-mn103tim.c
CommitLineData
c906108c
SS
1/* This file is part of the program GDB, the GNU debugger.
2
1d506c26 3 Copyright (C) 1998-2024 Free Software Foundation, Inc.
c906108c
SS
4 Contributed by Cygnus Solutions.
5
6 This program is free software; you can redistribute it and/or modify
7 it under the terms of the GNU General Public License as published by
4744ac1b 8 the Free Software Foundation; either version 3 of the License, or
c906108c 9 (at your option) any later version.
4744ac1b 10
c906108c
SS
11 This program is distributed in the hope that it will be useful,
12 but WITHOUT ANY WARRANTY; without even the implied warranty of
13 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 GNU General Public License for more details.
4744ac1b 15
c906108c 16 You should have received a copy of the GNU General Public License
4744ac1b 17 along with this program. If not, see <http://www.gnu.org/licenses/>.
c906108c
SS
18
19 */
20
6df01ab8
MF
21/* This must come before any other includes. */
22#include "defs.h"
23
c906108c
SS
24#include "sim-main.h"
25#include "hw-main.h"
26#include "sim-assert.h"
27
28/* DEVICE
29
30
31 mn103tim - mn103002 timers (8 and 16 bit)
32
33
34 DESCRIPTION
35
36 Implements the mn103002 8 and 16 bit timers as described in the mn103002 user guide.
37
38
39 PROPERTIES
40
41 reg = <8bit-timers-addr> <8bit-timers-size> <16bit-timers-addr> <16bit-timers-size>
42
43
44 BUGS
45
46 */
47
48
49/* The timers' register address blocks */
50
51struct mn103tim_block {
52 unsigned_word base;
53 unsigned_word bound;
54};
55
56enum { TIMER8_BLOCK, TIMER16_BLOCK, NR_TIMER_BLOCKS };
57
58enum timer_register_types {
59 FIRST_MODE_REG = 0,
60 TM0MD = FIRST_MODE_REG,
61 TM1MD,
62 TM2MD,
63 TM3MD,
64 TM4MD,
65 TM5MD,
66 TM6MD,
67 LAST_MODE_REG = TM6MD,
68 FIRST_BASE_REG,
69 TM0BR = FIRST_BASE_REG,
70 TM1BR,
71 TM2BR,
72 TM3BR,
73 TM4BR,
74 TM5BR,
75 LAST_BASE_REG = TM5BR,
76 FIRST_COUNTER,
77 TM0BC = FIRST_COUNTER,
78 TM1BC,
79 TM2BC,
80 TM3BC,
81 TM4BC,
82 TM5BC,
83 TM6BC,
84 LAST_COUNTER = TM6BC,
85 TM6MDA,
86 TM6MDB,
87 TM6CA,
88 TM6CB,
0960c785 89 LAST_TIMER_REG = TM6CB,
c906108c
SS
90};
91
92
93/* Don't include timer 6 because it's handled specially. */
94#define NR_8BIT_TIMERS 4
95#define NR_16BIT_TIMERS 2
96#define NR_REG_TIMERS 6 /* Exclude timer 6 - it's handled specially. */
97#define NR_TIMERS 7
98
99typedef struct _mn10300_timer_regs {
74ccc978
MF
100 uint32_t base;
101 uint8_t mode;
c906108c
SS
102} mn10300_timer_regs;
103
104typedef struct _mn10300_timer {
74ccc978 105 uint32_t div_ratio, start;
c906108c
SS
106 struct hw_event *event;
107} mn10300_timer;
108
109
110struct mn103tim {
111 struct mn103tim_block block[NR_TIMER_BLOCKS];
112 mn10300_timer_regs reg[NR_REG_TIMERS];
113 mn10300_timer timer[NR_TIMERS];
114
115 /* treat timer 6 registers specially. */
74ccc978
MF
116 uint16_t tm6md0, tm6md1, tm6bc, tm6ca, tm6cb;
117 uint8_t tm6mda, tm6mdb; /* compare/capture mode regs for timer 6 */
c906108c
SS
118};
119
120/* output port ID's */
121
122/* for mn103002 */
123enum {
124 TIMER0_UFLOW,
125 TIMER1_UFLOW,
126 TIMER2_UFLOW,
127 TIMER3_UFLOW,
128 TIMER4_UFLOW,
129 TIMER5_UFLOW,
130 TIMER6_UFLOW,
131 TIMER6_CMPA,
132 TIMER6_CMPB,
133};
134
135
136static const struct hw_port_descriptor mn103tim_ports[] = {
137
138 { "timer-0-underflow", TIMER0_UFLOW, 0, output_port, },
139 { "timer-1-underflow", TIMER1_UFLOW, 0, output_port, },
140 { "timer-2-underflow", TIMER2_UFLOW, 0, output_port, },
141 { "timer-3-underflow", TIMER3_UFLOW, 0, output_port, },
142 { "timer-4-underflow", TIMER4_UFLOW, 0, output_port, },
143 { "timer-5-underflow", TIMER5_UFLOW, 0, output_port, },
144
145 { "timer-6-underflow", TIMER6_UFLOW, 0, output_port, },
146 { "timer-6-compare-a", TIMER6_CMPA, 0, output_port, },
147 { "timer-6-compare-b", TIMER6_CMPB, 0, output_port, },
148
149 { NULL, },
150};
151
152#define bits2to5_mask 0x3c
153#define bits0to2_mask 0x07
154#define load_mask 0x40
155#define count_mask 0x80
156#define count_and_load_mask (load_mask | count_mask)
157#define clock_mask 0x03
158#define clk_ioclk 0x00
159#define clk_cascaded 0x03
160
161
162/* Finish off the partially created hw device. Attach our local
163 callbacks. Wire up our port names etc */
164
165static hw_io_read_buffer_method mn103tim_io_read_buffer;
166static hw_io_write_buffer_method mn103tim_io_write_buffer;
167
168static void
169attach_mn103tim_regs (struct hw *me,
170 struct mn103tim *timers)
171{
172 int i;
173 if (hw_find_property (me, "reg") == NULL)
174 hw_abort (me, "Missing \"reg\" property");
175 for (i = 0; i < NR_TIMER_BLOCKS; i++)
176 {
177 unsigned_word attach_address;
178 int attach_space;
179 unsigned attach_size;
180 reg_property_spec reg;
181 if (!hw_find_reg_array_property (me, "reg", i, &reg))
182 hw_abort (me, "\"reg\" property must contain three addr/size entries");
183 hw_unit_address_to_attach_address (hw_parent (me),
184 &reg.address,
185 &attach_space,
186 &attach_address,
187 me);
188 timers->block[i].base = attach_address;
189 hw_unit_size_to_attach_size (hw_parent (me),
190 &reg.size,
191 &attach_size, me);
192 timers->block[i].bound = attach_address + (attach_size - 1);
193 hw_attach_address (hw_parent (me),
194 0,
195 attach_space, attach_address, attach_size,
196 me);
197 }
198}
199
200static void
201mn103tim_finish (struct hw *me)
202{
203 struct mn103tim *timers;
204 int i;
205
206 timers = HW_ZALLOC (me, struct mn103tim);
207 set_hw_data (me, timers);
208 set_hw_io_read_buffer (me, mn103tim_io_read_buffer);
209 set_hw_io_write_buffer (me, mn103tim_io_write_buffer);
210 set_hw_ports (me, mn103tim_ports);
211
212 /* Attach ourself to our parent bus */
213 attach_mn103tim_regs (me, timers);
214
215 /* Initialize the timers */
216 for ( i=0; i < NR_REG_TIMERS; ++i )
217 {
218 timers->reg[i].mode = 0x00;
219 timers->reg[i].base = 0;
220 }
221 for ( i=0; i < NR_TIMERS; ++i )
222 {
223 timers->timer[i].event = NULL;
224 timers->timer[i].div_ratio = 0;
225 timers->timer[i].start = 0;
226 }
227 timers->tm6md0 = 0x00;
228 timers->tm6md1 = 0x00;
229 timers->tm6bc = 0x0000;
230 timers->tm6ca = 0x0000;
231 timers->tm6cb = 0x0000;
232 timers->tm6mda = 0x00;
233 timers->tm6mdb = 0x00;
234}
235
236
237
238/* read and write */
239
240static int
241decode_addr (struct hw *me,
242 struct mn103tim *timers,
243 unsigned_word address)
244{
245 unsigned_word offset;
246 offset = address - timers->block[0].base;
247
248 switch (offset)
249 {
250 case 0x00: return TM0MD;
251 case 0x01: return TM1MD;
252 case 0x02: return TM2MD;
253 case 0x03: return TM3MD;
254 case 0x10: return TM0BR;
255 case 0x11: return TM1BR;
256 case 0x12: return TM2BR;
257 case 0x13: return TM3BR;
258 case 0x20: return TM0BC;
259 case 0x21: return TM1BC;
260 case 0x22: return TM2BC;
261 case 0x23: return TM3BC;
262 case 0x80: return TM4MD;
263 case 0x82: return TM5MD;
264 case 0x84: /* fall through */
265 case 0x85: return TM6MD;
266 case 0x90: return TM4BR;
267 case 0x92: return TM5BR;
268 case 0xa0: return TM4BC;
269 case 0xa2: return TM5BC;
270 case 0xa4: return TM6BC;
271 case 0xb4: return TM6MDA;
272 case 0xb5: return TM6MDB;
273 case 0xc4: return TM6CA;
274 case 0xd4: return TM6CB;
275 default:
276 {
277 hw_abort (me, "bad address");
278 return -1;
279 }
280 }
281}
282
283static void
284read_mode_reg (struct hw *me,
285 struct mn103tim *timers,
286 int timer_nr,
287 void *dest,
288 unsigned nr_bytes)
289{
74ccc978
MF
290 uint16_t val16;
291 uint32_t val32;
c906108c
SS
292
293 switch ( nr_bytes )
294 {
295 case 1:
296 /* Accessing 1 byte is ok for all mode registers. */
297 if ( timer_nr == 6 )
298 {
74ccc978 299 *(uint8_t*)dest = timers->tm6md0;
c906108c
SS
300 }
301 else
302 {
74ccc978 303 *(uint8_t*)dest = timers->reg[timer_nr].mode;
c906108c
SS
304 }
305 break;
306
307 case 2:
308 if ( timer_nr == 6 )
309 {
74ccc978 310 *(uint16_t *)dest = (timers->tm6md0 << 8) | timers->tm6md1;
c906108c
SS
311 }
312 else if ( timer_nr == 0 || timer_nr == 2 )
313 {
314 val16 = (timers->reg[timer_nr].mode << 8)
315 | timers->reg[timer_nr+1].mode;
74ccc978 316 *(uint16_t*)dest = val16;
c906108c
SS
317 }
318 else
319 {
320 hw_abort (me, "bad read size of 2 bytes to TM%dMD.", timer_nr);
321 }
322 break;
323
324 case 4:
325 if ( timer_nr == 0 )
326 {
327 val32 = (timers->reg[0].mode << 24 )
328 | (timers->reg[1].mode << 16)
329 | (timers->reg[2].mode << 8)
330 | timers->reg[3].mode;
74ccc978 331 *(uint32_t*)dest = val32;
c906108c
SS
332 }
333 else
334 {
335 hw_abort (me, "bad read size of 4 bytes to TM%dMD.", timer_nr);
336 }
337 break;
338
339 default:
340 hw_abort (me, "bad read size of %d bytes to TM%dMD.",
341 nr_bytes, timer_nr);
342 }
343}
344
345
346static void
347read_base_reg (struct hw *me,
348 struct mn103tim *timers,
349 int timer_nr,
350 void *dest,
351 unsigned nr_bytes)
352{
74ccc978
MF
353 uint16_t val16;
354 uint32_t val32;
c906108c
SS
355
356 /* Check nr_bytes: accesses of 1, 2 and 4 bytes allowed depending on timer. */
357 switch ( nr_bytes )
358 {
359 case 1:
360 /* Reading 1 byte is ok for all registers. */
361 if ( timer_nr < NR_8BIT_TIMERS )
362 {
74ccc978 363 *(uint8_t*)dest = timers->reg[timer_nr].base;
c906108c
SS
364 }
365 break;
366
367 case 2:
368 if ( timer_nr == 1 || timer_nr == 3 )
369 {
370 hw_abort (me, "bad read size of 2 bytes to TM%dBR.", timer_nr);
371 }
372 else
373 {
374 if ( timer_nr < NR_8BIT_TIMERS )
375 {
376 val16 = (timers->reg[timer_nr].base<<8)
377 | timers->reg[timer_nr+1].base;
378 }
379 else
380 {
381 val16 = timers->reg[timer_nr].base;
382 }
74ccc978 383 *(uint16_t*)dest = val16;
c906108c
SS
384 }
385 break;
386
387 case 4:
388 if ( timer_nr == 0 )
389 {
390 val32 = (timers->reg[0].base << 24) | (timers->reg[1].base << 16)
391 | (timers->reg[2].base << 8) | timers->reg[3].base;
74ccc978 392 *(uint32_t*)dest = val32;
c906108c
SS
393 }
394 else if ( timer_nr == 4 )
395 {
396 val32 = (timers->reg[4].base << 16) | timers->reg[5].base;
74ccc978 397 *(uint32_t*)dest = val32;
c906108c
SS
398 }
399 else
400 {
401 hw_abort (me, "bad read size of 4 bytes to TM%dBR.", timer_nr);
402 }
403 break;
404
405 default:
406 hw_abort (me, "bad read size must of %d bytes to TM%dBR.",
407 nr_bytes, timer_nr);
408 }
409}
410
411
412static void
413read_counter (struct hw *me,
414 struct mn103tim *timers,
415 int timer_nr,
416 void *dest,
417 unsigned nr_bytes)
418{
74ccc978 419 uint32_t val;
c906108c
SS
420
421 if ( NULL == timers->timer[timer_nr].event )
422 {
423 /* Timer is not counting, use value in base register. */
424 if ( timer_nr == 6 )
425 {
426 val = 0; /* timer 6 is an up counter */
427 }
428 else
429 {
430 val = timers->reg[timer_nr].base;
431 }
432 }
433 else
434 {
435 if ( timer_nr == 6 ) /* timer 6 is an up counter. */
436 {
437 val = hw_event_queue_time(me) - timers->timer[timer_nr].start;
438 }
439 else
440 {
441 /* ticks left = start time + div ratio - curr time */
442 /* Cannot use base register because it can be written during counting and it
443 doesn't affect counter until underflow occurs. */
444
445 val = timers->timer[timer_nr].start + timers->timer[timer_nr].div_ratio
446 - hw_event_queue_time(me);
447 }
448 }
449
450 switch (nr_bytes) {
451 case 1:
74ccc978 452 *(uint8_t *)dest = val;
c906108c
SS
453 break;
454
455 case 2:
74ccc978 456 *(uint16_t *)dest = val;
c906108c
SS
457 break;
458
459 case 4:
74ccc978 460 *(uint32_t *)dest = val;
c906108c
SS
461 break;
462
463 default:
464 hw_abort(me, "bad read size for reading counter");
465 }
466
467}
468
469
470static void
471read_special_timer6_reg (struct hw *me,
472 struct mn103tim *timers,
473 int timer_nr,
474 void *dest,
475 unsigned nr_bytes)
476{
c906108c
SS
477 switch (nr_bytes) {
478 case 1:
479 {
480 switch ( timer_nr ) {
481 case TM6MDA:
74ccc978 482 *(uint8_t *)dest = timers->tm6mda;
c906108c
SS
483 break;
484
485 case TM6MDB:
74ccc978 486 *(uint8_t *)dest = timers->tm6mdb;
c906108c
SS
487 break;
488
489 case TM6CA:
74ccc978 490 *(uint8_t *)dest = timers->tm6ca;
c906108c
SS
491 break;
492
493 case TM6CB:
74ccc978 494 *(uint8_t *)dest = timers->tm6cb;
c906108c
SS
495 break;
496
497 default:
bb6317d3 498 break;
c906108c
SS
499 }
500 break;
501 }
502
503 case 2:
504 if ( timer_nr == TM6CA )
505 {
74ccc978 506 *(uint16_t *)dest = timers->tm6ca;
c906108c
SS
507 }
508 else if ( timer_nr == TM6CB )
509 {
74ccc978 510 *(uint16_t *)dest = timers->tm6cb;
c906108c
SS
511 }
512 else
513 {
514 hw_abort(me, "bad read size for timer 6 mode A/B register");
515 }
516 break;
517
518 default:
519 hw_abort(me, "bad read size for timer 6 register");
520 }
521
522}
523
524
525static unsigned
526mn103tim_io_read_buffer (struct hw *me,
527 void *dest,
528 int space,
529 unsigned_word base,
530 unsigned nr_bytes)
531{
532 struct mn103tim *timers = hw_data (me);
533 enum timer_register_types timer_reg;
534
535 HW_TRACE ((me, "read 0x%08lx %d", (long) base, (int) nr_bytes));
536
537 timer_reg = decode_addr (me, timers, base);
538
539 /* It can be either a mode register, a base register, a binary counter, */
540 /* or a special timer 6 register. Check in that order. */
541 if ( timer_reg >= FIRST_MODE_REG && timer_reg <= LAST_MODE_REG )
542 {
543 read_mode_reg(me, timers, timer_reg-FIRST_MODE_REG, dest, nr_bytes);
544 }
545 else if ( timer_reg <= LAST_BASE_REG )
546 {
547 read_base_reg(me, timers, timer_reg-FIRST_BASE_REG, dest, nr_bytes);
548 }
549 else if ( timer_reg <= LAST_COUNTER )
550 {
551 read_counter(me, timers, timer_reg-FIRST_COUNTER, dest, nr_bytes);
552 }
553 else if ( timer_reg <= LAST_TIMER_REG )
554 {
555 read_special_timer6_reg(me, timers, timer_reg, dest, nr_bytes);
556 }
557 else
558 {
559 hw_abort(me, "invalid timer register address.");
560 }
561
562 return nr_bytes;
563}
564
565
566static void
567do_counter_event (struct hw *me,
568 void *data)
569{
570 struct mn103tim *timers = hw_data(me);
ad251174 571 long timer_nr = (uintptr_t) data;
c906108c
SS
572 int next_timer;
573
574 /* Check if counting is still enabled. */
575 if ( (timers->reg[timer_nr].mode & count_mask) != 0 )
576 {
577 /* Generate an interrupt for the timer underflow (TIMERn_UFLOW). */
578
579 /* Port event occurs on port of last cascaded timer. */
580 /* This works across timer range from 0 to NR_REG_TIMERS because */
581 /* the first 16 bit timer (timer 4) is not allowed to be set as */
582 /* a cascading timer. */
583 for ( next_timer = timer_nr+1; next_timer < NR_REG_TIMERS; ++next_timer )
584 {
585 if ( (timers->reg[next_timer].mode & clock_mask) != clk_cascaded )
586 {
587 break;
588 }
589 }
590 hw_port_event (me, next_timer-1, 1);
591
592 /* Schedule next timeout. */
593 timers->timer[timer_nr].start = hw_event_queue_time(me);
594 /* FIX: Check if div_ratio has changed and if it's now 0. */
595 timers->timer[timer_nr].event
596 = hw_event_queue_schedule (me, timers->timer[timer_nr].div_ratio,
ad251174 597 do_counter_event, (void *)(uintptr_t)timer_nr);
c906108c
SS
598 }
599 else
600 {
601 timers->timer[timer_nr].event = NULL;
602 }
603
604}
605
606
607static void
608do_counter6_event (struct hw *me,
609 void *data)
610{
611 struct mn103tim *timers = hw_data(me);
ad251174 612 long timer_nr = (uintptr_t) data;
c906108c
SS
613
614 /* Check if counting is still enabled. */
615 if ( (timers->reg[timer_nr].mode & count_mask) != 0 )
616 {
617 /* Generate an interrupt for the timer underflow (TIMERn_UFLOW). */
618 hw_port_event (me, timer_nr, 1);
619
620 /* Schedule next timeout. */
621 timers->timer[timer_nr].start = hw_event_queue_time(me);
622 /* FIX: Check if div_ratio has changed and if it's now 0. */
623 timers->timer[timer_nr].event
624 = hw_event_queue_schedule (me, timers->timer[timer_nr].div_ratio,
ad251174 625 do_counter6_event, (void *)(uintptr_t)timer_nr);
c906108c
SS
626 }
627 else
628 {
629 timers->timer[timer_nr].event = NULL;
630 }
631
632}
633
634static void
635write_base_reg (struct hw *me,
636 struct mn103tim *timers,
637 int timer_nr,
638 const void *source,
639 unsigned nr_bytes)
640{
74ccc978
MF
641 const uint8_t *buf8 = source;
642 const uint16_t *buf16 = source;
c906108c
SS
643
644 /* If TMnCNE == 0 (counting is off), writing to the base register
645 (TMnBR) causes a simultaneous write to the counter reg (TMnBC).
646 Else, the TMnBC is reloaded with the value from TMnBR when
647 underflow occurs. Since the counter register is not explicitly
648 maintained, this functionality is handled in read_counter. */
649
650 /* Check nr_bytes: write of 1, 2 or 4 bytes allowed depending on timer. */
651 switch ( nr_bytes )
652 {
653 case 1:
654 /* Storing 1 byte is ok for all registers. */
655 timers->reg[timer_nr].base = buf8[0];
656 break;
657
658 case 2:
659 if ( timer_nr == 1 || timer_nr == 3 )
660 {
661 hw_abort (me, "bad write size of 2 bytes to TM%dBR.", timer_nr);
662 }
663 else
664 {
665 if ( timer_nr < NR_8BIT_TIMERS )
666 {
667 timers->reg[timer_nr].base = buf8[0];
668 timers->reg[timer_nr+1].base = buf8[1];
669 }
670 else
671 {
672 timers->reg[timer_nr].base = buf16[0];
673 }
674 }
675 break;
676
677 case 4:
678 if ( timer_nr == 0 )
679 {
680 timers->reg[0].base = buf8[0];
681 timers->reg[1].base = buf8[1];
682 timers->reg[2].base = buf8[2];
683 timers->reg[3].base = buf8[3];
684 }
685 else if ( timer_nr == 4 )
686 {
687 timers->reg[4].base = buf16[0];
688 timers->reg[5].base = buf16[1];
689 }
690 else
691 {
692 hw_abort (me, "bad write size of 4 bytes to TM%dBR.", timer_nr);
693 }
694 break;
695
696 default:
697 hw_abort (me, "bad write size must of %d bytes to TM%dBR.",
698 nr_bytes, timer_nr);
699 }
700
701}
702
703static void
704write_mode_reg (struct hw *me,
705 struct mn103tim *timers,
e158f0a0 706 long timer_nr,
c906108c
SS
707 const void *source,
708 unsigned nr_bytes)
709 /* for timers 0 to 5 */
710{
711 unsigned i;
74ccc978
MF
712 uint8_t mode_val, next_mode_val;
713 uint32_t div_ratio;
c906108c
SS
714
715 if ( nr_bytes != 1 )
716 {
e158f0a0
AC
717 hw_abort (me, "bad write size of %d bytes to TM%ldMD.", nr_bytes,
718 timer_nr);
c906108c
SS
719 }
720
74ccc978 721 mode_val = *(uint8_t *)source;
c906108c
SS
722 timers->reg[timer_nr].mode = mode_val;
723
724 if ( ( mode_val & count_and_load_mask ) == count_and_load_mask )
725 {
726 hw_abort(me, "Cannot load base reg and start counting simultaneously.");
727 }
728 if ( ( mode_val & bits2to5_mask ) != 0 )
729 {
730 hw_abort(me, "Cannot write to bits 2 to 5 of mode register");
731 }
732
733 if ( mode_val & count_mask )
734 {
735 /* - de-schedule any previous event. */
736 /* - add new event to queue to start counting. */
737 /* - assert that counter == base reg? */
738
739 /* For cascaded timers, */
740 if ( (mode_val & clock_mask) == clk_cascaded )
741 {
742 if ( timer_nr == 0 || timer_nr == 4 )
743 {
e158f0a0 744 hw_abort(me, "Timer %ld cannot be cascaded.", timer_nr);
c906108c
SS
745 }
746 }
747 else
748 {
749 div_ratio = timers->reg[timer_nr].base;
750
751 /* Check for cascading. */
752 if ( timer_nr < NR_8BIT_TIMERS )
753 {
754 for ( i = timer_nr + 1; i <= 3; ++i )
755 {
756 next_mode_val = timers->reg[i].mode;
757 if ( ( next_mode_val & clock_mask ) == clk_cascaded )
758 {
759 /* Check that CNE is on. */
760 if ( ( next_mode_val & count_mask ) == 0 )
761 {
762 hw_abort (me, "cascaded timer not ready for counting");
763 }
764 ASSERT(timers->timer[i].event == NULL);
765 ASSERT(timers->timer[i].div_ratio == 0);
766 div_ratio = div_ratio
767 | (timers->reg[i].base << (8*(i-timer_nr)));
768 }
769 else
770 {
771 break;
772 }
773 }
774 }
775 else
776 {
777 /* Mode register for a 16 bit timer */
778 next_mode_val = timers->reg[timer_nr+1].mode;
779 if ( ( next_mode_val & clock_mask ) == clk_cascaded )
780 {
781 /* Check that CNE is on. */
782 if ( ( next_mode_val & count_mask ) == 0 )
783 {
784 hw_abort (me, "cascaded timer not ready for counting");
785 }
786 ASSERT(timers->timer[timer_nr+1].event == NULL);
787 ASSERT(timers->timer[timer_nr+1].div_ratio == 0);
788 div_ratio = div_ratio | (timers->reg[timer_nr+1].base << 16);
789 }
790 }
791
792 timers->timer[timer_nr].div_ratio = div_ratio;
793
794 if ( NULL != timers->timer[timer_nr].event )
795 {
796 hw_event_queue_deschedule (me, timers->timer[timer_nr].event);
797 timers->timer[timer_nr].event = NULL;
798 }
799
800 if ( div_ratio > 0 )
801 {
802 /* Set start time. */
803 timers->timer[timer_nr].start = hw_event_queue_time(me);
804 timers->timer[timer_nr].event
805 = hw_event_queue_schedule(me, div_ratio,
806 do_counter_event,
ad251174 807 (void *)(uintptr_t)timer_nr);
c906108c
SS
808 }
809 }
810 }
811 else
812 {
813 /* Turn off counting */
814 if ( NULL != timers->timer[timer_nr].event )
815 {
816 ASSERT((timers->reg[timer_nr].mode & clock_mask) != clk_cascaded);
817 hw_event_queue_deschedule (me, timers->timer[timer_nr].event);
818 timers->timer[timer_nr].event = NULL;
819 }
820 else
821 {
822 if ( (timers->reg[timer_nr].mode & clock_mask) == clk_cascaded )
823 {
824 ASSERT(timers->timer[timer_nr].event == NULL);
825 }
826 }
827
828 }
829
830}
831
832static void
833write_tm6md (struct hw *me,
834 struct mn103tim *timers,
835 unsigned_word address,
836 const void *source,
837 unsigned nr_bytes)
838{
74ccc978
MF
839 uint8_t mode_val0 = 0x00, mode_val1 = 0x00;
840 uint32_t div_ratio;
e158f0a0 841 long timer_nr = 6;
c906108c
SS
842
843 unsigned_word offset = address - timers->block[0].base;
844
7a292a7a 845 if ((offset != 0x84 && nr_bytes > 1) || nr_bytes > 2 )
c906108c
SS
846 {
847 hw_abort (me, "Bad write size of %d bytes to TM6MD", nr_bytes);
848 }
849
850 if ( offset == 0x84 ) /* address of TM6MD */
851 {
852 /* Fill in first byte of mode */
74ccc978 853 mode_val0 = *(uint8_t *)source;
c906108c
SS
854 timers->tm6md0 = mode_val0;
855
856 if ( ( mode_val0 & 0x26 ) != 0 )
857 {
858 hw_abort(me, "Cannot write to bits 5, 3, and 2 of TM6MD");
859 }
860 }
861
862 if ( offset == 0x85 || nr_bytes == 2 )
863 {
864 /* Fill in second byte of mode */
865 if ( nr_bytes == 2 )
866 {
74ccc978 867 mode_val1 = *(uint8_t *)source+1;
c906108c
SS
868 }
869 else
870 {
74ccc978 871 mode_val1 = *(uint8_t *)source;
c906108c
SS
872 }
873
874 timers->tm6md1 = mode_val1;
875
876 if ( ( mode_val1 & count_and_load_mask ) == count_and_load_mask )
877 {
878 hw_abort(me, "Cannot load base reg and start counting simultaneously.");
879 }
880 if ( ( mode_val1 & bits0to2_mask ) != 0 )
881 {
882 hw_abort(me, "Cannot write to bits 8 to 10 of TM6MD");
883 }
884 }
885
886 if ( mode_val1 & count_mask )
887 {
888 /* - de-schedule any previous event. */
889 /* - add new event to queue to start counting. */
890 /* - assert that counter == base reg? */
891
892 div_ratio = timers->tm6ca; /* binary counter for timer 6 */
893 timers->timer[timer_nr].div_ratio = div_ratio;
894 if ( NULL != timers->timer[timer_nr].event )
895 {
896 hw_event_queue_deschedule (me, timers->timer[timer_nr].event);
897 timers->timer[timer_nr].event = NULL;
898 }
899
900 if ( div_ratio > 0 )
901 {
902 /* Set start time. */
903 timers->timer[timer_nr].start = hw_event_queue_time(me);
904 timers->timer[timer_nr].event
905 = hw_event_queue_schedule(me, div_ratio,
906 do_counter6_event,
ad251174 907 (void *)(uintptr_t)timer_nr);
c906108c
SS
908 }
909 }
910 else
911 {
912 /* Turn off counting */
913 if ( NULL != timers->timer[timer_nr].event )
914 {
915 hw_event_queue_deschedule (me, timers->timer[timer_nr].event);
916 timers->timer[timer_nr].event = NULL;
917 }
918 }
919}
920
921
922
923static void
924write_special_timer6_reg (struct hw *me,
925 struct mn103tim *timers,
926 int timer_nr,
927 const void *source,
928 unsigned nr_bytes)
929{
c906108c
SS
930 switch (nr_bytes) {
931 case 1:
932 {
933 switch ( timer_nr ) {
934 case TM6MDA:
74ccc978 935 timers->tm6mda = *(uint8_t *)source;
c906108c
SS
936 break;
937
938 case TM6MDB:
74ccc978 939 timers->tm6mdb = *(uint8_t *)source;
c906108c
SS
940 break;
941
942 case TM6CA:
74ccc978 943 timers->tm6ca = *(uint8_t *)source;
c906108c
SS
944 break;
945
946 case TM6CB:
74ccc978 947 timers->tm6cb = *(uint8_t *)source;
c906108c
SS
948 break;
949
950 default:
bb6317d3 951 break;
c906108c
SS
952 }
953 break;
954 }
955
956 case 2:
957 if ( timer_nr == TM6CA )
958 {
74ccc978 959 timers->tm6ca = *(uint16_t *)source;
c906108c
SS
960 }
961 else if ( timer_nr == TM6CB )
962 {
74ccc978 963 timers->tm6cb = *(uint16_t *)source;
c906108c
SS
964 }
965 else
966 {
967 hw_abort(me, "bad read size for timer 6 mode A/B register");
968 }
969 break;
970
971 default:
972 hw_abort(me, "bad read size for timer 6 register");
973 }
974
975}
976
977
978static unsigned
979mn103tim_io_write_buffer (struct hw *me,
980 const void *source,
981 int space,
982 unsigned_word base,
983 unsigned nr_bytes)
984{
985 struct mn103tim *timers = hw_data (me);
986 enum timer_register_types timer_reg;
987
988 HW_TRACE ((me, "write to 0x%08lx length %d with 0x%x", (long) base,
74ccc978 989 (int) nr_bytes, *(uint32_t *)source));
c906108c
SS
990
991 timer_reg = decode_addr (me, timers, base);
992
993 /* It can be either a mode register, a base register, a binary counter, */
994 /* or a special timer 6 register. Check in that order. */
995 if ( timer_reg <= LAST_MODE_REG )
996 {
997 if ( timer_reg == 6 )
998 {
999 write_tm6md(me, timers, base, source, nr_bytes);
1000 }
1001 else
1002 {
1003 write_mode_reg(me, timers, timer_reg-FIRST_MODE_REG,
1004 source, nr_bytes);
1005 }
1006 }
1007 else if ( timer_reg <= LAST_BASE_REG )
1008 {
1009 write_base_reg(me, timers, timer_reg-FIRST_BASE_REG, source, nr_bytes);
1010 }
1011 else if ( timer_reg <= LAST_COUNTER )
1012 {
1013 hw_abort(me, "cannot write to counter");
1014 }
1015 else if ( timer_reg <= LAST_TIMER_REG )
1016 {
1017 write_special_timer6_reg(me, timers, timer_reg, source, nr_bytes);
1018 }
1019 else
1020 {
1021 hw_abort(me, "invalid reg type");
1022 }
1023
1024 return nr_bytes;
1025}
1026
1027
1028const struct hw_descriptor dv_mn103tim_descriptor[] = {
1029 { "mn103tim", mn103tim_finish, },
1030 { NULL },
1031};