57
86
uint16_t periph_pdtrb; /* Imposed by the peripherals */
58
87
uint16_t periph_portdirb; /* Direction seen from the peripherals */
59
88
sh7750_io_device *devices[NB_DEVICES]; /* External peripherals */
65
struct intc_desc intc;
93
/**********************************************************************
95
**********************************************************************/
97
/* XXXXX At this time, timer0 works in underflow only mode, that is
98
the value of tcnt0 is read at alarm computation time and cannot
99
be read back by the guest OS */
101
static void start_timer0(SH7750State * s)
103
uint64_t now, next, prescaler;
105
if ((s->tcr0 & 6) == 6) {
106
fprintf(stderr, "rtc clock for timer 0 not supported\n");
110
if ((s->tcr0 & 7) == 5) {
111
fprintf(stderr, "timer 0 configuration not supported\n");
115
if ((s->tcr0 & 4) == 4)
118
prescaler = 4 << (s->tcr0 & 3);
120
now = qemu_get_clock(vm_clock);
123
now + muldiv64(prescaler * s->tcnt0, ticks_per_sec,
127
fprintf(stderr, "now=%016" PRIx64 ", next=%016" PRIx64 "\n", now, next);
128
fprintf(stderr, "timer will underflow in %f seconds\n",
129
(float) (next - now) / (float) ticks_per_sec);
131
qemu_mod_timer(s->timer0, next);
134
static void timer_start_changed(SH7750State * s)
136
if (s->tstr & SH7750_TSTR_STR0) {
139
fprintf(stderr, "timer 0 is stopped\n");
140
qemu_del_timer(s->timer0);
144
static void timer0_cb(void *opaque)
146
SH7750State *s = opaque;
148
s->tcnt0 = (uint32_t) 0; /* XXXXX */
149
if (--s->tcnt0 == (uint32_t) - 1) {
150
fprintf(stderr, "timer 0 underflow\n");
152
s->tcr0 |= SH7750_TCR_UNF;
153
if (s->tcr0 & SH7750_TCR_UNIE) {
155
"interrupt generation for timer 0 not supported\n");
162
static void init_timers(SH7750State * s)
164
s->tcor0 = 0xffffffff;
165
s->tcnt0 = 0xffffffff;
166
s->timer0 = qemu_new_timer(vm_clock, &timer0_cb, s);
169
/**********************************************************************
171
**********************************************************************/
173
static int serial1_can_receive(void *opaque)
175
SH7750State *s = opaque;
177
return s->scscr1 & SH7750_SCSCR_RE;
180
static void serial1_receive_char(SH7750State * s, uint8_t c)
182
if (s->scssr1 & SH7750_SCSSR1_RDRF) {
183
s->scssr1 |= SH7750_SCSSR1_ORER;
188
s->scssr1 |= SH7750_SCSSR1_RDRF;
191
static void serial1_receive(void *opaque, const uint8_t * buf, int size)
193
SH7750State *s = opaque;
196
for (i = 0; i < size; i++) {
197
serial1_receive_char(s, buf[i]);
201
static void serial1_event(void *opaque, int event)
206
static void serial1_maybe_send(SH7750State * s)
210
if (s->scssr1 & SH7750_SCSSR1_TDRE)
213
s->scssr1 |= SH7750_SCSSR1_TDRE | SH7750_SCSSR1_TEND;
214
if (s->scscr1 & SH7750_SCSCR_TIE) {
215
fprintf(stderr, "interrupts for serial port 1 not implemented\n");
218
/* XXXXX Check for errors in write */
219
qemu_chr_write(s->serial1, &c, 1);
222
static void serial1_change_scssr1(SH7750State * s, uint8_t mem_value)
226
/* If transmit disable, TDRE and TEND stays up */
227
if ((s->scscr1 & SH7750_SCSCR_TE) == 0) {
228
mem_value |= SH7750_SCSSR1_TDRE | SH7750_SCSSR1_TEND;
231
/* Only clear bits which have been read before and do not set any bit
233
new_flags = s->scssr1 & ~s->scssr1_read; /* Preserve unread flags */
234
new_flags &= mem_value | ~s->scssr1_read; /* Clear read flags */
236
s->scssr1 = (new_flags & 0xf8) | (mem_value & 1);
237
s->scssr1_read &= mem_value;
239
/* If TDRE has been cleared, TEND will also be cleared */
240
if ((s->scssr1 & SH7750_SCSSR1_TDRE) == 0) {
241
s->scssr1 &= ~SH7750_SCSSR1_TEND;
244
/* Check for transmission to start */
245
serial1_maybe_send(s);
248
static void serial1_update_parameters(SH7750State * s)
250
QEMUSerialSetParams ssp;
252
if (s->scsmr1 & SH7750_SCSMR_CHR_7)
256
if (s->scsmr1 & SH7750_SCSMR_PE) {
257
if (s->scsmr1 & SH7750_SCSMR_PM_ODD)
263
if (s->scsmr1 & SH7750_SCSMR_STOP_2)
267
fprintf(stderr, "SCSMR1=%04x SCBRR1=%02x\n", s->scsmr1, s->scbrr1);
268
ssp.speed = s->periph_freq /
269
(32 * s->scbrr1 * (1 << (2 * (s->scsmr1 & 3)))) - 1;
270
fprintf(stderr, "data bits=%d, stop bits=%d, parity=%c, speed=%d\n",
271
ssp.data_bits, ssp.stop_bits, ssp.parity, ssp.speed);
272
qemu_chr_ioctl(s->serial1, CHR_IOCTL_SERIAL_SET_PARAMS, &ssp);
275
static void scscr1_changed(SH7750State * s)
277
if (s->scscr1 & (SH7750_SCSCR_TE | SH7750_SCSCR_RE)) {
279
fprintf(stderr, "serial port 1 not bound to anything\n");
282
serial1_update_parameters(s);
284
if ((s->scscr1 & SH7750_SCSCR_RE) == 0) {
285
s->scssr1 |= SH7750_SCSSR1_TDRE;
289
static void init_serial1(SH7750State * s, int serial_nb)
291
CharDriverState *chr;
294
chr = serial_hds[serial_nb];
297
"no serial port associated to SH7750 first serial port\n");
302
qemu_chr_add_handlers(chr, serial1_can_receive,
303
serial1_receive, serial1_event, s);
306
/**********************************************************************
308
**********************************************************************/
310
static int serial2_can_receive(void *opaque)
312
SH7750State *s = opaque;
313
static uint8_t max_fifo_size[] = { 15, 1, 4, 6, 8, 10, 12, 14 };
315
return s->serial2_receive_fifo.length <
316
max_fifo_size[(s->scfcr2 >> 9) & 7];
319
static void serial2_adjust_receive_flags(SH7750State * s)
321
static uint8_t max_fifo_size[] = { 1, 4, 8, 14 };
323
/* XXXXX Add interrupt generation */
324
if (s->serial2_receive_fifo.length >=
325
max_fifo_size[(s->scfcr2 >> 7) & 3]) {
326
s->scfsr2 |= SH7750_SCFSR2_RDF;
327
s->scfsr2 &= ~SH7750_SCFSR2_DR;
329
s->scfsr2 &= ~SH7750_SCFSR2_RDF;
330
if (s->serial2_receive_fifo.length > 0)
331
s->scfsr2 |= SH7750_SCFSR2_DR;
333
s->scfsr2 &= ~SH7750_SCFSR2_DR;
337
static void serial2_append_char(SH7750State * s, uint8_t c)
339
if (s->serial2_receive_fifo.length == 16) {
341
s->sclsr2 |= SH7750_SCLSR2_ORER;
345
s->serial2_receive_fifo.data[s->serial2_receive_fifo.write_idx++] = c;
346
s->serial2_receive_fifo.length++;
347
serial2_adjust_receive_flags(s);
350
static void serial2_receive(void *opaque, const uint8_t * buf, int size)
352
SH7750State *s = opaque;
355
for (i = 0; i < size; i++)
356
serial2_append_char(s, buf[i]);
359
static void serial2_event(void *opaque, int event)
365
static void serial2_update_parameters(SH7750State * s)
367
QEMUSerialSetParams ssp;
369
if (s->scsmr2 & SH7750_SCSMR_CHR_7)
373
if (s->scsmr2 & SH7750_SCSMR_PE) {
374
if (s->scsmr2 & SH7750_SCSMR_PM_ODD)
380
if (s->scsmr2 & SH7750_SCSMR_STOP_2)
384
fprintf(stderr, "SCSMR2=%04x SCBRR2=%02x\n", s->scsmr2, s->scbrr2);
385
ssp.speed = s->periph_freq /
386
(32 * s->scbrr2 * (1 << (2 * (s->scsmr2 & 3)))) - 1;
387
fprintf(stderr, "data bits=%d, stop bits=%d, parity=%c, speed=%d\n",
388
ssp.data_bits, ssp.stop_bits, ssp.parity, ssp.speed);
389
qemu_chr_ioctl(s->serial2, CHR_IOCTL_SERIAL_SET_PARAMS, &ssp);
392
static void scscr2_changed(SH7750State * s)
394
if (s->scscr2 & (SH7750_SCSCR_TE | SH7750_SCSCR_RE)) {
396
fprintf(stderr, "serial port 2 not bound to anything\n");
399
serial2_update_parameters(s);
403
static void init_serial2(SH7750State * s, int serial_nb)
405
CharDriverState *chr;
409
chr = serial_hds[serial_nb];
412
"no serial port associated to SH7750 second serial port\n");
417
qemu_chr_add_handlers(chr, serial2_can_receive,
418
serial2_receive, serial1_event, s);
421
static void init_serial_ports(SH7750State * s)
69
427
/**********************************************************************
404
816
sh7750_mem_writel
407
/* sh775x interrupt controller tables for sh_intc.c
408
* stolen from linux/arch/sh/kernel/cpu/sh4/setup-sh7750.c
414
/* interrupt sources */
415
IRL0, IRL1, IRL2, IRL3, /* only IRLM mode supported */
417
DMAC_DMTE0, DMAC_DMTE1, DMAC_DMTE2, DMAC_DMTE3,
418
DMAC_DMTE4, DMAC_DMTE5, DMAC_DMTE6, DMAC_DMTE7,
420
PCIC0_PCISERR, PCIC1_PCIERR, PCIC1_PCIPWDWN, PCIC1_PCIPWON,
421
PCIC1_PCIDMA0, PCIC1_PCIDMA1, PCIC1_PCIDMA2, PCIC1_PCIDMA3,
422
TMU3, TMU4, TMU0, TMU1, TMU2_TUNI, TMU2_TICPI,
423
RTC_ATI, RTC_PRI, RTC_CUI,
424
SCI1_ERI, SCI1_RXI, SCI1_TXI, SCI1_TEI,
425
SCIF_ERI, SCIF_RXI, SCIF_BRI, SCIF_TXI,
429
/* interrupt groups */
430
DMAC, PCIC1, TMU2, RTC, SCI1, SCIF, REF,
435
static struct intc_vect vectors[] = {
436
INTC_VECT(HUDI, 0x600), INTC_VECT(GPIOI, 0x620),
437
INTC_VECT(TMU0, 0x400), INTC_VECT(TMU1, 0x420),
438
INTC_VECT(TMU2_TUNI, 0x440), INTC_VECT(TMU2_TICPI, 0x460),
439
INTC_VECT(RTC_ATI, 0x480), INTC_VECT(RTC_PRI, 0x4a0),
440
INTC_VECT(RTC_CUI, 0x4c0),
441
INTC_VECT(SCI1_ERI, 0x4e0), INTC_VECT(SCI1_RXI, 0x500),
442
INTC_VECT(SCI1_TXI, 0x520), INTC_VECT(SCI1_TEI, 0x540),
443
INTC_VECT(SCIF_ERI, 0x700), INTC_VECT(SCIF_RXI, 0x720),
444
INTC_VECT(SCIF_BRI, 0x740), INTC_VECT(SCIF_TXI, 0x760),
445
INTC_VECT(WDT, 0x560),
446
INTC_VECT(REF_RCMI, 0x580), INTC_VECT(REF_ROVI, 0x5a0),
449
static struct intc_group groups[] = {
450
INTC_GROUP(TMU2, TMU2_TUNI, TMU2_TICPI),
451
INTC_GROUP(RTC, RTC_ATI, RTC_PRI, RTC_CUI),
452
INTC_GROUP(SCI1, SCI1_ERI, SCI1_RXI, SCI1_TXI, SCI1_TEI),
453
INTC_GROUP(SCIF, SCIF_ERI, SCIF_RXI, SCIF_BRI, SCIF_TXI),
454
INTC_GROUP(REF, REF_RCMI, REF_ROVI),
457
static struct intc_prio_reg prio_registers[] = {
458
{ 0xffd00004, 0, 16, 4, /* IPRA */ { TMU0, TMU1, TMU2, RTC } },
459
{ 0xffd00008, 0, 16, 4, /* IPRB */ { WDT, REF, SCI1, 0 } },
460
{ 0xffd0000c, 0, 16, 4, /* IPRC */ { GPIOI, DMAC, SCIF, HUDI } },
461
{ 0xffd00010, 0, 16, 4, /* IPRD */ { IRL0, IRL1, IRL2, IRL3 } },
462
{ 0xfe080000, 0, 32, 4, /* INTPRI00 */ { 0, 0, 0, 0,
464
PCIC1, PCIC0_PCISERR } },
467
/* SH7750, SH7750S, SH7751 and SH7091 all have 4-channel DMA controllers */
469
static struct intc_vect vectors_dma4[] = {
470
INTC_VECT(DMAC_DMTE0, 0x640), INTC_VECT(DMAC_DMTE1, 0x660),
471
INTC_VECT(DMAC_DMTE2, 0x680), INTC_VECT(DMAC_DMTE3, 0x6a0),
472
INTC_VECT(DMAC_DMAE, 0x6c0),
475
static struct intc_group groups_dma4[] = {
476
INTC_GROUP(DMAC, DMAC_DMTE0, DMAC_DMTE1, DMAC_DMTE2,
477
DMAC_DMTE3, DMAC_DMAE),
480
/* SH7750R and SH7751R both have 8-channel DMA controllers */
482
static struct intc_vect vectors_dma8[] = {
483
INTC_VECT(DMAC_DMTE0, 0x640), INTC_VECT(DMAC_DMTE1, 0x660),
484
INTC_VECT(DMAC_DMTE2, 0x680), INTC_VECT(DMAC_DMTE3, 0x6a0),
485
INTC_VECT(DMAC_DMTE4, 0x780), INTC_VECT(DMAC_DMTE5, 0x7a0),
486
INTC_VECT(DMAC_DMTE6, 0x7c0), INTC_VECT(DMAC_DMTE7, 0x7e0),
487
INTC_VECT(DMAC_DMAE, 0x6c0),
490
static struct intc_group groups_dma8[] = {
491
INTC_GROUP(DMAC, DMAC_DMTE0, DMAC_DMTE1, DMAC_DMTE2,
492
DMAC_DMTE3, DMAC_DMTE4, DMAC_DMTE5,
493
DMAC_DMTE6, DMAC_DMTE7, DMAC_DMAE),
496
/* SH7750R, SH7751 and SH7751R all have two extra timer channels */
498
static struct intc_vect vectors_tmu34[] = {
499
INTC_VECT(TMU3, 0xb00), INTC_VECT(TMU4, 0xb80),
502
static struct intc_mask_reg mask_registers[] = {
503
{ 0xfe080040, 0xfe080060, 32, /* INTMSK00 / INTMSKCLR00 */
504
{ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
505
0, 0, 0, 0, 0, 0, TMU4, TMU3,
506
PCIC1_PCIERR, PCIC1_PCIPWDWN, PCIC1_PCIPWON,
507
PCIC1_PCIDMA0, PCIC1_PCIDMA1, PCIC1_PCIDMA2,
508
PCIC1_PCIDMA3, PCIC0_PCISERR } },
511
/* SH7750S, SH7750R, SH7751 and SH7751R all have IRLM priority registers */
513
static struct intc_vect vectors_irlm[] = {
514
INTC_VECT(IRL0, 0x240), INTC_VECT(IRL1, 0x2a0),
515
INTC_VECT(IRL2, 0x300), INTC_VECT(IRL3, 0x360),
518
/* SH7751 and SH7751R both have PCI */
520
static struct intc_vect vectors_pci[] = {
521
INTC_VECT(PCIC0_PCISERR, 0xa00), INTC_VECT(PCIC1_PCIERR, 0xae0),
522
INTC_VECT(PCIC1_PCIPWDWN, 0xac0), INTC_VECT(PCIC1_PCIPWON, 0xaa0),
523
INTC_VECT(PCIC1_PCIDMA0, 0xa80), INTC_VECT(PCIC1_PCIDMA1, 0xa60),
524
INTC_VECT(PCIC1_PCIDMA2, 0xa40), INTC_VECT(PCIC1_PCIDMA3, 0xa20),
527
static struct intc_group groups_pci[] = {
528
INTC_GROUP(PCIC1, PCIC1_PCIERR, PCIC1_PCIPWDWN, PCIC1_PCIPWON,
529
PCIC1_PCIDMA0, PCIC1_PCIDMA1, PCIC1_PCIDMA2, PCIC1_PCIDMA3),
532
/**********************************************************************
533
Memory mapped cache and TLB
534
**********************************************************************/
536
#define MM_REGION_MASK 0x07000000
537
#define MM_ICACHE_ADDR (0)
538
#define MM_ICACHE_DATA (1)
539
#define MM_ITLB_ADDR (2)
540
#define MM_ITLB_DATA (3)
541
#define MM_OCACHE_ADDR (4)
542
#define MM_OCACHE_DATA (5)
543
#define MM_UTLB_ADDR (6)
544
#define MM_UTLB_DATA (7)
545
#define MM_REGION_TYPE(addr) ((addr & MM_REGION_MASK) >> 24)
547
static uint32_t invalid_read(void *opaque, target_phys_addr_t addr)
554
static uint32_t sh7750_mmct_readl(void *opaque, target_phys_addr_t addr)
558
switch (MM_REGION_TYPE(addr)) {
584
static void invalid_write(void *opaque, target_phys_addr_t addr,
590
static void sh7750_mmct_writel(void *opaque, target_phys_addr_t addr,
593
SH7750State *s = opaque;
595
switch (MM_REGION_TYPE(addr)) {
610
cpu_sh4_write_mmaped_utlb_addr(s->cpu, addr, mem_value);
622
static CPUReadMemoryFunc *sh7750_mmct_read[] = {
628
static CPUWriteMemoryFunc *sh7750_mmct_write[] = {
634
819
SH7750State *sh7750_init(CPUSH4State * cpu)
637
822
int sh7750_io_memory;
638
int sh7750_mm_cache_and_tlb; /* memory mapped cache and tlb */
640
824
s = qemu_mallocz(sizeof(SH7750State));
645
829
sh7750_mem_write, s);
646
830
cpu_register_physical_memory(0x1c000000, 0x04000000, sh7750_io_memory);
648
sh7750_mm_cache_and_tlb = cpu_register_io_memory(0,
650
sh7750_mmct_write, s);
651
cpu_register_physical_memory(0xf0000000, 0x08000000,
652
sh7750_mm_cache_and_tlb);
654
sh_intc_init(&s->intc, NR_SOURCES,
655
_INTC_ARRAY(mask_registers),
656
_INTC_ARRAY(prio_registers));
658
sh_intc_register_sources(&s->intc,
659
_INTC_ARRAY(vectors),
660
_INTC_ARRAY(groups));
662
cpu->intc_handle = &s->intc;
664
sh_serial_init(0x1fe00000, 0, s->periph_freq, serial_hds[0],
665
sh_intc_source(&s->intc, SCI1_ERI),
666
sh_intc_source(&s->intc, SCI1_RXI),
667
sh_intc_source(&s->intc, SCI1_TXI),
668
sh_intc_source(&s->intc, SCI1_TEI),
670
sh_serial_init(0x1fe80000, SH_SERIAL_FEAT_SCIF,
671
s->periph_freq, serial_hds[1],
672
sh_intc_source(&s->intc, SCIF_ERI),
673
sh_intc_source(&s->intc, SCIF_RXI),
674
sh_intc_source(&s->intc, SCIF_TXI),
676
sh_intc_source(&s->intc, SCIF_BRI));
678
tmu012_init(0x1fd80000,
679
TMU012_FEAT_TOCR | TMU012_FEAT_3CHAN | TMU012_FEAT_EXTCLK,
681
sh_intc_source(&s->intc, TMU0),
682
sh_intc_source(&s->intc, TMU1),
683
sh_intc_source(&s->intc, TMU2_TUNI),
684
sh_intc_source(&s->intc, TMU2_TICPI));
686
if (cpu->id & (SH_CPU_SH7750 | SH_CPU_SH7750S | SH_CPU_SH7751)) {
687
sh_intc_register_sources(&s->intc,
688
_INTC_ARRAY(vectors_dma4),
689
_INTC_ARRAY(groups_dma4));
692
if (cpu->id & (SH_CPU_SH7750R | SH_CPU_SH7751R)) {
693
sh_intc_register_sources(&s->intc,
694
_INTC_ARRAY(vectors_dma8),
695
_INTC_ARRAY(groups_dma8));
698
if (cpu->id & (SH_CPU_SH7750R | SH_CPU_SH7751 | SH_CPU_SH7751R)) {
699
sh_intc_register_sources(&s->intc,
700
_INTC_ARRAY(vectors_tmu34),
702
tmu012_init(0x1e100000, 0, s->periph_freq,
703
sh_intc_source(&s->intc, TMU3),
704
sh_intc_source(&s->intc, TMU4),
708
if (cpu->id & (SH_CPU_SH7751_ALL)) {
709
sh_intc_register_sources(&s->intc,
710
_INTC_ARRAY(vectors_pci),
711
_INTC_ARRAY(groups_pci));
714
if (cpu->id & (SH_CPU_SH7750S | SH_CPU_SH7750R | SH_CPU_SH7751_ALL)) {
715
sh_intc_register_sources(&s->intc,
716
_INTC_ARRAY(vectors_irlm),
832
init_serial_ports(s);