import source from 0.14.1
[external/qemu.git] / hw / ppc405_uc.c
1 /*
2  * QEMU PowerPC 405 embedded processors emulation
3  *
4  * Copyright (c) 2007 Jocelyn Mayer
5  *
6  * Permission is hereby granted, free of charge, to any person obtaining a copy
7  * of this software and associated documentation files (the "Software"), to deal
8  * in the Software without restriction, including without limitation the rights
9  * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
10  * copies of the Software, and to permit persons to whom the Software is
11  * furnished to do so, subject to the following conditions:
12  *
13  * The above copyright notice and this permission notice shall be included in
14  * all copies or substantial portions of the Software.
15  *
16  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
17  * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
18  * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
19  * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
20  * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
21  * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
22  * THE SOFTWARE.
23  */
24 #include "hw.h"
25 #include "ppc.h"
26 #include "ppc405.h"
27 #include "pc.h"
28 #include "qemu-timer.h"
29 #include "sysemu.h"
30 #include "qemu-log.h"
31
32 #define DEBUG_OPBA
33 #define DEBUG_SDRAM
34 #define DEBUG_GPIO
35 #define DEBUG_SERIAL
36 #define DEBUG_OCM
37 //#define DEBUG_I2C
38 #define DEBUG_GPT
39 #define DEBUG_MAL
40 #define DEBUG_CLOCKS
41 //#define DEBUG_CLOCKS_LL
42
43 ram_addr_t ppc405_set_bootinfo (CPUState *env, ppc4xx_bd_info_t *bd,
44                                 uint32_t flags)
45 {
46     ram_addr_t bdloc;
47     int i, n;
48
49     /* We put the bd structure at the top of memory */
50     if (bd->bi_memsize >= 0x01000000UL)
51         bdloc = 0x01000000UL - sizeof(struct ppc4xx_bd_info_t);
52     else
53         bdloc = bd->bi_memsize - sizeof(struct ppc4xx_bd_info_t);
54     stl_phys(bdloc + 0x00, bd->bi_memstart);
55     stl_phys(bdloc + 0x04, bd->bi_memsize);
56     stl_phys(bdloc + 0x08, bd->bi_flashstart);
57     stl_phys(bdloc + 0x0C, bd->bi_flashsize);
58     stl_phys(bdloc + 0x10, bd->bi_flashoffset);
59     stl_phys(bdloc + 0x14, bd->bi_sramstart);
60     stl_phys(bdloc + 0x18, bd->bi_sramsize);
61     stl_phys(bdloc + 0x1C, bd->bi_bootflags);
62     stl_phys(bdloc + 0x20, bd->bi_ipaddr);
63     for (i = 0; i < 6; i++)
64         stb_phys(bdloc + 0x24 + i, bd->bi_enetaddr[i]);
65     stw_phys(bdloc + 0x2A, bd->bi_ethspeed);
66     stl_phys(bdloc + 0x2C, bd->bi_intfreq);
67     stl_phys(bdloc + 0x30, bd->bi_busfreq);
68     stl_phys(bdloc + 0x34, bd->bi_baudrate);
69     for (i = 0; i < 4; i++)
70         stb_phys(bdloc + 0x38 + i, bd->bi_s_version[i]);
71     for (i = 0; i < 32; i++) {
72         stb_phys(bdloc + 0x3C + i, bd->bi_r_version[i]);
73     }
74     stl_phys(bdloc + 0x5C, bd->bi_plb_busfreq);
75     stl_phys(bdloc + 0x60, bd->bi_pci_busfreq);
76     for (i = 0; i < 6; i++)
77         stb_phys(bdloc + 0x64 + i, bd->bi_pci_enetaddr[i]);
78     n = 0x6A;
79     if (flags & 0x00000001) {
80         for (i = 0; i < 6; i++)
81             stb_phys(bdloc + n++, bd->bi_pci_enetaddr2[i]);
82     }
83     stl_phys(bdloc + n, bd->bi_opbfreq);
84     n += 4;
85     for (i = 0; i < 2; i++) {
86         stl_phys(bdloc + n, bd->bi_iic_fast[i]);
87         n += 4;
88     }
89
90     return bdloc;
91 }
92
93 /*****************************************************************************/
94 /* Shared peripherals */
95
96 /*****************************************************************************/
97 /* Peripheral local bus arbitrer */
98 enum {
99     PLB0_BESR = 0x084,
100     PLB0_BEAR = 0x086,
101     PLB0_ACR  = 0x087,
102 };
103
104 typedef struct ppc4xx_plb_t ppc4xx_plb_t;
105 struct ppc4xx_plb_t {
106     uint32_t acr;
107     uint32_t bear;
108     uint32_t besr;
109 };
110
111 static uint32_t dcr_read_plb (void *opaque, int dcrn)
112 {
113     ppc4xx_plb_t *plb;
114     uint32_t ret;
115
116     plb = opaque;
117     switch (dcrn) {
118     case PLB0_ACR:
119         ret = plb->acr;
120         break;
121     case PLB0_BEAR:
122         ret = plb->bear;
123         break;
124     case PLB0_BESR:
125         ret = plb->besr;
126         break;
127     default:
128         /* Avoid gcc warning */
129         ret = 0;
130         break;
131     }
132
133     return ret;
134 }
135
136 static void dcr_write_plb (void *opaque, int dcrn, uint32_t val)
137 {
138     ppc4xx_plb_t *plb;
139
140     plb = opaque;
141     switch (dcrn) {
142     case PLB0_ACR:
143         /* We don't care about the actual parameters written as
144          * we don't manage any priorities on the bus
145          */
146         plb->acr = val & 0xF8000000;
147         break;
148     case PLB0_BEAR:
149         /* Read only */
150         break;
151     case PLB0_BESR:
152         /* Write-clear */
153         plb->besr &= ~val;
154         break;
155     }
156 }
157
158 static void ppc4xx_plb_reset (void *opaque)
159 {
160     ppc4xx_plb_t *plb;
161
162     plb = opaque;
163     plb->acr = 0x00000000;
164     plb->bear = 0x00000000;
165     plb->besr = 0x00000000;
166 }
167
168 static void ppc4xx_plb_init(CPUState *env)
169 {
170     ppc4xx_plb_t *plb;
171
172     plb = qemu_mallocz(sizeof(ppc4xx_plb_t));
173     ppc_dcr_register(env, PLB0_ACR, plb, &dcr_read_plb, &dcr_write_plb);
174     ppc_dcr_register(env, PLB0_BEAR, plb, &dcr_read_plb, &dcr_write_plb);
175     ppc_dcr_register(env, PLB0_BESR, plb, &dcr_read_plb, &dcr_write_plb);
176     qemu_register_reset(ppc4xx_plb_reset, plb);
177 }
178
179 /*****************************************************************************/
180 /* PLB to OPB bridge */
181 enum {
182     POB0_BESR0 = 0x0A0,
183     POB0_BESR1 = 0x0A2,
184     POB0_BEAR  = 0x0A4,
185 };
186
187 typedef struct ppc4xx_pob_t ppc4xx_pob_t;
188 struct ppc4xx_pob_t {
189     uint32_t bear;
190     uint32_t besr[2];
191 };
192
193 static uint32_t dcr_read_pob (void *opaque, int dcrn)
194 {
195     ppc4xx_pob_t *pob;
196     uint32_t ret;
197
198     pob = opaque;
199     switch (dcrn) {
200     case POB0_BEAR:
201         ret = pob->bear;
202         break;
203     case POB0_BESR0:
204     case POB0_BESR1:
205         ret = pob->besr[dcrn - POB0_BESR0];
206         break;
207     default:
208         /* Avoid gcc warning */
209         ret = 0;
210         break;
211     }
212
213     return ret;
214 }
215
216 static void dcr_write_pob (void *opaque, int dcrn, uint32_t val)
217 {
218     ppc4xx_pob_t *pob;
219
220     pob = opaque;
221     switch (dcrn) {
222     case POB0_BEAR:
223         /* Read only */
224         break;
225     case POB0_BESR0:
226     case POB0_BESR1:
227         /* Write-clear */
228         pob->besr[dcrn - POB0_BESR0] &= ~val;
229         break;
230     }
231 }
232
233 static void ppc4xx_pob_reset (void *opaque)
234 {
235     ppc4xx_pob_t *pob;
236
237     pob = opaque;
238     /* No error */
239     pob->bear = 0x00000000;
240     pob->besr[0] = 0x0000000;
241     pob->besr[1] = 0x0000000;
242 }
243
244 static void ppc4xx_pob_init(CPUState *env)
245 {
246     ppc4xx_pob_t *pob;
247
248     pob = qemu_mallocz(sizeof(ppc4xx_pob_t));
249     ppc_dcr_register(env, POB0_BEAR, pob, &dcr_read_pob, &dcr_write_pob);
250     ppc_dcr_register(env, POB0_BESR0, pob, &dcr_read_pob, &dcr_write_pob);
251     ppc_dcr_register(env, POB0_BESR1, pob, &dcr_read_pob, &dcr_write_pob);
252     qemu_register_reset(ppc4xx_pob_reset, pob);
253 }
254
255 /*****************************************************************************/
256 /* OPB arbitrer */
257 typedef struct ppc4xx_opba_t ppc4xx_opba_t;
258 struct ppc4xx_opba_t {
259     uint8_t cr;
260     uint8_t pr;
261 };
262
263 static uint32_t opba_readb (void *opaque, target_phys_addr_t addr)
264 {
265     ppc4xx_opba_t *opba;
266     uint32_t ret;
267
268 #ifdef DEBUG_OPBA
269     printf("%s: addr " TARGET_FMT_plx "\n", __func__, addr);
270 #endif
271     opba = opaque;
272     switch (addr) {
273     case 0x00:
274         ret = opba->cr;
275         break;
276     case 0x01:
277         ret = opba->pr;
278         break;
279     default:
280         ret = 0x00;
281         break;
282     }
283
284     return ret;
285 }
286
287 static void opba_writeb (void *opaque,
288                          target_phys_addr_t addr, uint32_t value)
289 {
290     ppc4xx_opba_t *opba;
291
292 #ifdef DEBUG_OPBA
293     printf("%s: addr " TARGET_FMT_plx " val %08" PRIx32 "\n", __func__, addr,
294            value);
295 #endif
296     opba = opaque;
297     switch (addr) {
298     case 0x00:
299         opba->cr = value & 0xF8;
300         break;
301     case 0x01:
302         opba->pr = value & 0xFF;
303         break;
304     default:
305         break;
306     }
307 }
308
309 static uint32_t opba_readw (void *opaque, target_phys_addr_t addr)
310 {
311     uint32_t ret;
312
313 #ifdef DEBUG_OPBA
314     printf("%s: addr " TARGET_FMT_plx "\n", __func__, addr);
315 #endif
316     ret = opba_readb(opaque, addr) << 8;
317     ret |= opba_readb(opaque, addr + 1);
318
319     return ret;
320 }
321
322 static void opba_writew (void *opaque,
323                          target_phys_addr_t addr, uint32_t value)
324 {
325 #ifdef DEBUG_OPBA
326     printf("%s: addr " TARGET_FMT_plx " val %08" PRIx32 "\n", __func__, addr,
327            value);
328 #endif
329     opba_writeb(opaque, addr, value >> 8);
330     opba_writeb(opaque, addr + 1, value);
331 }
332
333 static uint32_t opba_readl (void *opaque, target_phys_addr_t addr)
334 {
335     uint32_t ret;
336
337 #ifdef DEBUG_OPBA
338     printf("%s: addr " TARGET_FMT_plx "\n", __func__, addr);
339 #endif
340     ret = opba_readb(opaque, addr) << 24;
341     ret |= opba_readb(opaque, addr + 1) << 16;
342
343     return ret;
344 }
345
346 static void opba_writel (void *opaque,
347                          target_phys_addr_t addr, uint32_t value)
348 {
349 #ifdef DEBUG_OPBA
350     printf("%s: addr " TARGET_FMT_plx " val %08" PRIx32 "\n", __func__, addr,
351            value);
352 #endif
353     opba_writeb(opaque, addr, value >> 24);
354     opba_writeb(opaque, addr + 1, value >> 16);
355 }
356
357 static CPUReadMemoryFunc * const opba_read[] = {
358     &opba_readb,
359     &opba_readw,
360     &opba_readl,
361 };
362
363 static CPUWriteMemoryFunc * const opba_write[] = {
364     &opba_writeb,
365     &opba_writew,
366     &opba_writel,
367 };
368
369 static void ppc4xx_opba_reset (void *opaque)
370 {
371     ppc4xx_opba_t *opba;
372
373     opba = opaque;
374     opba->cr = 0x00; /* No dynamic priorities - park disabled */
375     opba->pr = 0x11;
376 }
377
378 static void ppc4xx_opba_init(target_phys_addr_t base)
379 {
380     ppc4xx_opba_t *opba;
381     int io;
382
383     opba = qemu_mallocz(sizeof(ppc4xx_opba_t));
384 #ifdef DEBUG_OPBA
385     printf("%s: offset " TARGET_FMT_plx "\n", __func__, base);
386 #endif
387     io = cpu_register_io_memory(opba_read, opba_write, opba,
388                                 DEVICE_NATIVE_ENDIAN);
389     cpu_register_physical_memory(base, 0x002, io);
390     qemu_register_reset(ppc4xx_opba_reset, opba);
391 }
392
393 /*****************************************************************************/
394 /* Code decompression controller */
395 /* XXX: TODO */
396
397 /*****************************************************************************/
398 /* Peripheral controller */
399 typedef struct ppc4xx_ebc_t ppc4xx_ebc_t;
400 struct ppc4xx_ebc_t {
401     uint32_t addr;
402     uint32_t bcr[8];
403     uint32_t bap[8];
404     uint32_t bear;
405     uint32_t besr0;
406     uint32_t besr1;
407     uint32_t cfg;
408 };
409
410 enum {
411     EBC0_CFGADDR = 0x012,
412     EBC0_CFGDATA = 0x013,
413 };
414
415 static uint32_t dcr_read_ebc (void *opaque, int dcrn)
416 {
417     ppc4xx_ebc_t *ebc;
418     uint32_t ret;
419
420     ebc = opaque;
421     switch (dcrn) {
422     case EBC0_CFGADDR:
423         ret = ebc->addr;
424         break;
425     case EBC0_CFGDATA:
426         switch (ebc->addr) {
427         case 0x00: /* B0CR */
428             ret = ebc->bcr[0];
429             break;
430         case 0x01: /* B1CR */
431             ret = ebc->bcr[1];
432             break;
433         case 0x02: /* B2CR */
434             ret = ebc->bcr[2];
435             break;
436         case 0x03: /* B3CR */
437             ret = ebc->bcr[3];
438             break;
439         case 0x04: /* B4CR */
440             ret = ebc->bcr[4];
441             break;
442         case 0x05: /* B5CR */
443             ret = ebc->bcr[5];
444             break;
445         case 0x06: /* B6CR */
446             ret = ebc->bcr[6];
447             break;
448         case 0x07: /* B7CR */
449             ret = ebc->bcr[7];
450             break;
451         case 0x10: /* B0AP */
452             ret = ebc->bap[0];
453             break;
454         case 0x11: /* B1AP */
455             ret = ebc->bap[1];
456             break;
457         case 0x12: /* B2AP */
458             ret = ebc->bap[2];
459             break;
460         case 0x13: /* B3AP */
461             ret = ebc->bap[3];
462             break;
463         case 0x14: /* B4AP */
464             ret = ebc->bap[4];
465             break;
466         case 0x15: /* B5AP */
467             ret = ebc->bap[5];
468             break;
469         case 0x16: /* B6AP */
470             ret = ebc->bap[6];
471             break;
472         case 0x17: /* B7AP */
473             ret = ebc->bap[7];
474             break;
475         case 0x20: /* BEAR */
476             ret = ebc->bear;
477             break;
478         case 0x21: /* BESR0 */
479             ret = ebc->besr0;
480             break;
481         case 0x22: /* BESR1 */
482             ret = ebc->besr1;
483             break;
484         case 0x23: /* CFG */
485             ret = ebc->cfg;
486             break;
487         default:
488             ret = 0x00000000;
489             break;
490         }
491         break;
492     default:
493         ret = 0x00000000;
494         break;
495     }
496
497     return ret;
498 }
499
500 static void dcr_write_ebc (void *opaque, int dcrn, uint32_t val)
501 {
502     ppc4xx_ebc_t *ebc;
503
504     ebc = opaque;
505     switch (dcrn) {
506     case EBC0_CFGADDR:
507         ebc->addr = val;
508         break;
509     case EBC0_CFGDATA:
510         switch (ebc->addr) {
511         case 0x00: /* B0CR */
512             break;
513         case 0x01: /* B1CR */
514             break;
515         case 0x02: /* B2CR */
516             break;
517         case 0x03: /* B3CR */
518             break;
519         case 0x04: /* B4CR */
520             break;
521         case 0x05: /* B5CR */
522             break;
523         case 0x06: /* B6CR */
524             break;
525         case 0x07: /* B7CR */
526             break;
527         case 0x10: /* B0AP */
528             break;
529         case 0x11: /* B1AP */
530             break;
531         case 0x12: /* B2AP */
532             break;
533         case 0x13: /* B3AP */
534             break;
535         case 0x14: /* B4AP */
536             break;
537         case 0x15: /* B5AP */
538             break;
539         case 0x16: /* B6AP */
540             break;
541         case 0x17: /* B7AP */
542             break;
543         case 0x20: /* BEAR */
544             break;
545         case 0x21: /* BESR0 */
546             break;
547         case 0x22: /* BESR1 */
548             break;
549         case 0x23: /* CFG */
550             break;
551         default:
552             break;
553         }
554         break;
555     default:
556         break;
557     }
558 }
559
560 static void ebc_reset (void *opaque)
561 {
562     ppc4xx_ebc_t *ebc;
563     int i;
564
565     ebc = opaque;
566     ebc->addr = 0x00000000;
567     ebc->bap[0] = 0x7F8FFE80;
568     ebc->bcr[0] = 0xFFE28000;
569     for (i = 0; i < 8; i++) {
570         ebc->bap[i] = 0x00000000;
571         ebc->bcr[i] = 0x00000000;
572     }
573     ebc->besr0 = 0x00000000;
574     ebc->besr1 = 0x00000000;
575     ebc->cfg = 0x80400000;
576 }
577
578 static void ppc405_ebc_init(CPUState *env)
579 {
580     ppc4xx_ebc_t *ebc;
581
582     ebc = qemu_mallocz(sizeof(ppc4xx_ebc_t));
583     qemu_register_reset(&ebc_reset, ebc);
584     ppc_dcr_register(env, EBC0_CFGADDR,
585                      ebc, &dcr_read_ebc, &dcr_write_ebc);
586     ppc_dcr_register(env, EBC0_CFGDATA,
587                      ebc, &dcr_read_ebc, &dcr_write_ebc);
588 }
589
590 /*****************************************************************************/
591 /* DMA controller */
592 enum {
593     DMA0_CR0 = 0x100,
594     DMA0_CT0 = 0x101,
595     DMA0_DA0 = 0x102,
596     DMA0_SA0 = 0x103,
597     DMA0_SG0 = 0x104,
598     DMA0_CR1 = 0x108,
599     DMA0_CT1 = 0x109,
600     DMA0_DA1 = 0x10A,
601     DMA0_SA1 = 0x10B,
602     DMA0_SG1 = 0x10C,
603     DMA0_CR2 = 0x110,
604     DMA0_CT2 = 0x111,
605     DMA0_DA2 = 0x112,
606     DMA0_SA2 = 0x113,
607     DMA0_SG2 = 0x114,
608     DMA0_CR3 = 0x118,
609     DMA0_CT3 = 0x119,
610     DMA0_DA3 = 0x11A,
611     DMA0_SA3 = 0x11B,
612     DMA0_SG3 = 0x11C,
613     DMA0_SR  = 0x120,
614     DMA0_SGC = 0x123,
615     DMA0_SLP = 0x125,
616     DMA0_POL = 0x126,
617 };
618
619 typedef struct ppc405_dma_t ppc405_dma_t;
620 struct ppc405_dma_t {
621     qemu_irq irqs[4];
622     uint32_t cr[4];
623     uint32_t ct[4];
624     uint32_t da[4];
625     uint32_t sa[4];
626     uint32_t sg[4];
627     uint32_t sr;
628     uint32_t sgc;
629     uint32_t slp;
630     uint32_t pol;
631 };
632
633 static uint32_t dcr_read_dma (void *opaque, int dcrn)
634 {
635     return 0;
636 }
637
638 static void dcr_write_dma (void *opaque, int dcrn, uint32_t val)
639 {
640 }
641
642 static void ppc405_dma_reset (void *opaque)
643 {
644     ppc405_dma_t *dma;
645     int i;
646
647     dma = opaque;
648     for (i = 0; i < 4; i++) {
649         dma->cr[i] = 0x00000000;
650         dma->ct[i] = 0x00000000;
651         dma->da[i] = 0x00000000;
652         dma->sa[i] = 0x00000000;
653         dma->sg[i] = 0x00000000;
654     }
655     dma->sr = 0x00000000;
656     dma->sgc = 0x00000000;
657     dma->slp = 0x7C000000;
658     dma->pol = 0x00000000;
659 }
660
661 static void ppc405_dma_init(CPUState *env, qemu_irq irqs[4])
662 {
663     ppc405_dma_t *dma;
664
665     dma = qemu_mallocz(sizeof(ppc405_dma_t));
666     memcpy(dma->irqs, irqs, 4 * sizeof(qemu_irq));
667     qemu_register_reset(&ppc405_dma_reset, dma);
668     ppc_dcr_register(env, DMA0_CR0,
669                      dma, &dcr_read_dma, &dcr_write_dma);
670     ppc_dcr_register(env, DMA0_CT0,
671                      dma, &dcr_read_dma, &dcr_write_dma);
672     ppc_dcr_register(env, DMA0_DA0,
673                      dma, &dcr_read_dma, &dcr_write_dma);
674     ppc_dcr_register(env, DMA0_SA0,
675                      dma, &dcr_read_dma, &dcr_write_dma);
676     ppc_dcr_register(env, DMA0_SG0,
677                      dma, &dcr_read_dma, &dcr_write_dma);
678     ppc_dcr_register(env, DMA0_CR1,
679                      dma, &dcr_read_dma, &dcr_write_dma);
680     ppc_dcr_register(env, DMA0_CT1,
681                      dma, &dcr_read_dma, &dcr_write_dma);
682     ppc_dcr_register(env, DMA0_DA1,
683                      dma, &dcr_read_dma, &dcr_write_dma);
684     ppc_dcr_register(env, DMA0_SA1,
685                      dma, &dcr_read_dma, &dcr_write_dma);
686     ppc_dcr_register(env, DMA0_SG1,
687                      dma, &dcr_read_dma, &dcr_write_dma);
688     ppc_dcr_register(env, DMA0_CR2,
689                      dma, &dcr_read_dma, &dcr_write_dma);
690     ppc_dcr_register(env, DMA0_CT2,
691                      dma, &dcr_read_dma, &dcr_write_dma);
692     ppc_dcr_register(env, DMA0_DA2,
693                      dma, &dcr_read_dma, &dcr_write_dma);
694     ppc_dcr_register(env, DMA0_SA2,
695                      dma, &dcr_read_dma, &dcr_write_dma);
696     ppc_dcr_register(env, DMA0_SG2,
697                      dma, &dcr_read_dma, &dcr_write_dma);
698     ppc_dcr_register(env, DMA0_CR3,
699                      dma, &dcr_read_dma, &dcr_write_dma);
700     ppc_dcr_register(env, DMA0_CT3,
701                      dma, &dcr_read_dma, &dcr_write_dma);
702     ppc_dcr_register(env, DMA0_DA3,
703                      dma, &dcr_read_dma, &dcr_write_dma);
704     ppc_dcr_register(env, DMA0_SA3,
705                      dma, &dcr_read_dma, &dcr_write_dma);
706     ppc_dcr_register(env, DMA0_SG3,
707                      dma, &dcr_read_dma, &dcr_write_dma);
708     ppc_dcr_register(env, DMA0_SR,
709                      dma, &dcr_read_dma, &dcr_write_dma);
710     ppc_dcr_register(env, DMA0_SGC,
711                      dma, &dcr_read_dma, &dcr_write_dma);
712     ppc_dcr_register(env, DMA0_SLP,
713                      dma, &dcr_read_dma, &dcr_write_dma);
714     ppc_dcr_register(env, DMA0_POL,
715                      dma, &dcr_read_dma, &dcr_write_dma);
716 }
717
718 /*****************************************************************************/
719 /* GPIO */
720 typedef struct ppc405_gpio_t ppc405_gpio_t;
721 struct ppc405_gpio_t {
722     uint32_t or;
723     uint32_t tcr;
724     uint32_t osrh;
725     uint32_t osrl;
726     uint32_t tsrh;
727     uint32_t tsrl;
728     uint32_t odr;
729     uint32_t ir;
730     uint32_t rr1;
731     uint32_t isr1h;
732     uint32_t isr1l;
733 };
734
735 static uint32_t ppc405_gpio_readb (void *opaque, target_phys_addr_t addr)
736 {
737 #ifdef DEBUG_GPIO
738     printf("%s: addr " TARGET_FMT_plx "\n", __func__, addr);
739 #endif
740
741     return 0;
742 }
743
744 static void ppc405_gpio_writeb (void *opaque,
745                                 target_phys_addr_t addr, uint32_t value)
746 {
747 #ifdef DEBUG_GPIO
748     printf("%s: addr " TARGET_FMT_plx " val %08" PRIx32 "\n", __func__, addr,
749            value);
750 #endif
751 }
752
753 static uint32_t ppc405_gpio_readw (void *opaque, target_phys_addr_t addr)
754 {
755 #ifdef DEBUG_GPIO
756     printf("%s: addr " TARGET_FMT_plx "\n", __func__, addr);
757 #endif
758
759     return 0;
760 }
761
762 static void ppc405_gpio_writew (void *opaque,
763                                 target_phys_addr_t addr, uint32_t value)
764 {
765 #ifdef DEBUG_GPIO
766     printf("%s: addr " TARGET_FMT_plx " val %08" PRIx32 "\n", __func__, addr,
767            value);
768 #endif
769 }
770
771 static uint32_t ppc405_gpio_readl (void *opaque, target_phys_addr_t addr)
772 {
773 #ifdef DEBUG_GPIO
774     printf("%s: addr " TARGET_FMT_plx "\n", __func__, addr);
775 #endif
776
777     return 0;
778 }
779
780 static void ppc405_gpio_writel (void *opaque,
781                                 target_phys_addr_t addr, uint32_t value)
782 {
783 #ifdef DEBUG_GPIO
784     printf("%s: addr " TARGET_FMT_plx " val %08" PRIx32 "\n", __func__, addr,
785            value);
786 #endif
787 }
788
789 static CPUReadMemoryFunc * const ppc405_gpio_read[] = {
790     &ppc405_gpio_readb,
791     &ppc405_gpio_readw,
792     &ppc405_gpio_readl,
793 };
794
795 static CPUWriteMemoryFunc * const ppc405_gpio_write[] = {
796     &ppc405_gpio_writeb,
797     &ppc405_gpio_writew,
798     &ppc405_gpio_writel,
799 };
800
801 static void ppc405_gpio_reset (void *opaque)
802 {
803 }
804
805 static void ppc405_gpio_init(target_phys_addr_t base)
806 {
807     ppc405_gpio_t *gpio;
808     int io;
809
810     gpio = qemu_mallocz(sizeof(ppc405_gpio_t));
811 #ifdef DEBUG_GPIO
812     printf("%s: offset " TARGET_FMT_plx "\n", __func__, base);
813 #endif
814     io = cpu_register_io_memory(ppc405_gpio_read, ppc405_gpio_write, gpio,
815                                 DEVICE_NATIVE_ENDIAN);
816     cpu_register_physical_memory(base, 0x038, io);
817     qemu_register_reset(&ppc405_gpio_reset, gpio);
818 }
819
820 /*****************************************************************************/
821 /* On Chip Memory */
822 enum {
823     OCM0_ISARC   = 0x018,
824     OCM0_ISACNTL = 0x019,
825     OCM0_DSARC   = 0x01A,
826     OCM0_DSACNTL = 0x01B,
827 };
828
829 typedef struct ppc405_ocm_t ppc405_ocm_t;
830 struct ppc405_ocm_t {
831     target_ulong offset;
832     uint32_t isarc;
833     uint32_t isacntl;
834     uint32_t dsarc;
835     uint32_t dsacntl;
836 };
837
838 static void ocm_update_mappings (ppc405_ocm_t *ocm,
839                                  uint32_t isarc, uint32_t isacntl,
840                                  uint32_t dsarc, uint32_t dsacntl)
841 {
842 #ifdef DEBUG_OCM
843     printf("OCM update ISA %08" PRIx32 " %08" PRIx32 " (%08" PRIx32
844            " %08" PRIx32 ") DSA %08" PRIx32 " %08" PRIx32
845            " (%08" PRIx32 " %08" PRIx32 ")\n",
846            isarc, isacntl, dsarc, dsacntl,
847            ocm->isarc, ocm->isacntl, ocm->dsarc, ocm->dsacntl);
848 #endif
849     if (ocm->isarc != isarc ||
850         (ocm->isacntl & 0x80000000) != (isacntl & 0x80000000)) {
851         if (ocm->isacntl & 0x80000000) {
852             /* Unmap previously assigned memory region */
853             printf("OCM unmap ISA %08" PRIx32 "\n", ocm->isarc);
854             cpu_register_physical_memory(ocm->isarc, 0x04000000,
855                                          IO_MEM_UNASSIGNED);
856         }
857         if (isacntl & 0x80000000) {
858             /* Map new instruction memory region */
859 #ifdef DEBUG_OCM
860             printf("OCM map ISA %08" PRIx32 "\n", isarc);
861 #endif
862             cpu_register_physical_memory(isarc, 0x04000000,
863                                          ocm->offset | IO_MEM_RAM);
864         }
865     }
866     if (ocm->dsarc != dsarc ||
867         (ocm->dsacntl & 0x80000000) != (dsacntl & 0x80000000)) {
868         if (ocm->dsacntl & 0x80000000) {
869             /* Beware not to unmap the region we just mapped */
870             if (!(isacntl & 0x80000000) || ocm->dsarc != isarc) {
871                 /* Unmap previously assigned memory region */
872 #ifdef DEBUG_OCM
873                 printf("OCM unmap DSA %08" PRIx32 "\n", ocm->dsarc);
874 #endif
875                 cpu_register_physical_memory(ocm->dsarc, 0x04000000,
876                                              IO_MEM_UNASSIGNED);
877             }
878         }
879         if (dsacntl & 0x80000000) {
880             /* Beware not to remap the region we just mapped */
881             if (!(isacntl & 0x80000000) || dsarc != isarc) {
882                 /* Map new data memory region */
883 #ifdef DEBUG_OCM
884                 printf("OCM map DSA %08" PRIx32 "\n", dsarc);
885 #endif
886                 cpu_register_physical_memory(dsarc, 0x04000000,
887                                              ocm->offset | IO_MEM_RAM);
888             }
889         }
890     }
891 }
892
893 static uint32_t dcr_read_ocm (void *opaque, int dcrn)
894 {
895     ppc405_ocm_t *ocm;
896     uint32_t ret;
897
898     ocm = opaque;
899     switch (dcrn) {
900     case OCM0_ISARC:
901         ret = ocm->isarc;
902         break;
903     case OCM0_ISACNTL:
904         ret = ocm->isacntl;
905         break;
906     case OCM0_DSARC:
907         ret = ocm->dsarc;
908         break;
909     case OCM0_DSACNTL:
910         ret = ocm->dsacntl;
911         break;
912     default:
913         ret = 0;
914         break;
915     }
916
917     return ret;
918 }
919
920 static void dcr_write_ocm (void *opaque, int dcrn, uint32_t val)
921 {
922     ppc405_ocm_t *ocm;
923     uint32_t isarc, dsarc, isacntl, dsacntl;
924
925     ocm = opaque;
926     isarc = ocm->isarc;
927     dsarc = ocm->dsarc;
928     isacntl = ocm->isacntl;
929     dsacntl = ocm->dsacntl;
930     switch (dcrn) {
931     case OCM0_ISARC:
932         isarc = val & 0xFC000000;
933         break;
934     case OCM0_ISACNTL:
935         isacntl = val & 0xC0000000;
936         break;
937     case OCM0_DSARC:
938         isarc = val & 0xFC000000;
939         break;
940     case OCM0_DSACNTL:
941         isacntl = val & 0xC0000000;
942         break;
943     }
944     ocm_update_mappings(ocm, isarc, isacntl, dsarc, dsacntl);
945     ocm->isarc = isarc;
946     ocm->dsarc = dsarc;
947     ocm->isacntl = isacntl;
948     ocm->dsacntl = dsacntl;
949 }
950
951 static void ocm_reset (void *opaque)
952 {
953     ppc405_ocm_t *ocm;
954     uint32_t isarc, dsarc, isacntl, dsacntl;
955
956     ocm = opaque;
957     isarc = 0x00000000;
958     isacntl = 0x00000000;
959     dsarc = 0x00000000;
960     dsacntl = 0x00000000;
961     ocm_update_mappings(ocm, isarc, isacntl, dsarc, dsacntl);
962     ocm->isarc = isarc;
963     ocm->dsarc = dsarc;
964     ocm->isacntl = isacntl;
965     ocm->dsacntl = dsacntl;
966 }
967
968 static void ppc405_ocm_init(CPUState *env)
969 {
970     ppc405_ocm_t *ocm;
971
972     ocm = qemu_mallocz(sizeof(ppc405_ocm_t));
973     ocm->offset = qemu_ram_alloc(NULL, "ppc405.ocm", 4096);
974     qemu_register_reset(&ocm_reset, ocm);
975     ppc_dcr_register(env, OCM0_ISARC,
976                      ocm, &dcr_read_ocm, &dcr_write_ocm);
977     ppc_dcr_register(env, OCM0_ISACNTL,
978                      ocm, &dcr_read_ocm, &dcr_write_ocm);
979     ppc_dcr_register(env, OCM0_DSARC,
980                      ocm, &dcr_read_ocm, &dcr_write_ocm);
981     ppc_dcr_register(env, OCM0_DSACNTL,
982                      ocm, &dcr_read_ocm, &dcr_write_ocm);
983 }
984
985 /*****************************************************************************/
986 /* I2C controller */
987 typedef struct ppc4xx_i2c_t ppc4xx_i2c_t;
988 struct ppc4xx_i2c_t {
989     qemu_irq irq;
990     uint8_t mdata;
991     uint8_t lmadr;
992     uint8_t hmadr;
993     uint8_t cntl;
994     uint8_t mdcntl;
995     uint8_t sts;
996     uint8_t extsts;
997     uint8_t sdata;
998     uint8_t lsadr;
999     uint8_t hsadr;
1000     uint8_t clkdiv;
1001     uint8_t intrmsk;
1002     uint8_t xfrcnt;
1003     uint8_t xtcntlss;
1004     uint8_t directcntl;
1005 };
1006
1007 static uint32_t ppc4xx_i2c_readb (void *opaque, target_phys_addr_t addr)
1008 {
1009     ppc4xx_i2c_t *i2c;
1010     uint32_t ret;
1011
1012 #ifdef DEBUG_I2C
1013     printf("%s: addr " TARGET_FMT_plx "\n", __func__, addr);
1014 #endif
1015     i2c = opaque;
1016     switch (addr) {
1017     case 0x00:
1018         //        i2c_readbyte(&i2c->mdata);
1019         ret = i2c->mdata;
1020         break;
1021     case 0x02:
1022         ret = i2c->sdata;
1023         break;
1024     case 0x04:
1025         ret = i2c->lmadr;
1026         break;
1027     case 0x05:
1028         ret = i2c->hmadr;
1029         break;
1030     case 0x06:
1031         ret = i2c->cntl;
1032         break;
1033     case 0x07:
1034         ret = i2c->mdcntl;
1035         break;
1036     case 0x08:
1037         ret = i2c->sts;
1038         break;
1039     case 0x09:
1040         ret = i2c->extsts;
1041         break;
1042     case 0x0A:
1043         ret = i2c->lsadr;
1044         break;
1045     case 0x0B:
1046         ret = i2c->hsadr;
1047         break;
1048     case 0x0C:
1049         ret = i2c->clkdiv;
1050         break;
1051     case 0x0D:
1052         ret = i2c->intrmsk;
1053         break;
1054     case 0x0E:
1055         ret = i2c->xfrcnt;
1056         break;
1057     case 0x0F:
1058         ret = i2c->xtcntlss;
1059         break;
1060     case 0x10:
1061         ret = i2c->directcntl;
1062         break;
1063     default:
1064         ret = 0x00;
1065         break;
1066     }
1067 #ifdef DEBUG_I2C
1068     printf("%s: addr " TARGET_FMT_plx " %02" PRIx32 "\n", __func__, addr, ret);
1069 #endif
1070
1071     return ret;
1072 }
1073
1074 static void ppc4xx_i2c_writeb (void *opaque,
1075                                target_phys_addr_t addr, uint32_t value)
1076 {
1077     ppc4xx_i2c_t *i2c;
1078
1079 #ifdef DEBUG_I2C
1080     printf("%s: addr " TARGET_FMT_plx " val %08" PRIx32 "\n", __func__, addr,
1081            value);
1082 #endif
1083     i2c = opaque;
1084     switch (addr) {
1085     case 0x00:
1086         i2c->mdata = value;
1087         //        i2c_sendbyte(&i2c->mdata);
1088         break;
1089     case 0x02:
1090         i2c->sdata = value;
1091         break;
1092     case 0x04:
1093         i2c->lmadr = value;
1094         break;
1095     case 0x05:
1096         i2c->hmadr = value;
1097         break;
1098     case 0x06:
1099         i2c->cntl = value;
1100         break;
1101     case 0x07:
1102         i2c->mdcntl = value & 0xDF;
1103         break;
1104     case 0x08:
1105         i2c->sts &= ~(value & 0x0A);
1106         break;
1107     case 0x09:
1108         i2c->extsts &= ~(value & 0x8F);
1109         break;
1110     case 0x0A:
1111         i2c->lsadr = value;
1112         break;
1113     case 0x0B:
1114         i2c->hsadr = value;
1115         break;
1116     case 0x0C:
1117         i2c->clkdiv = value;
1118         break;
1119     case 0x0D:
1120         i2c->intrmsk = value;
1121         break;
1122     case 0x0E:
1123         i2c->xfrcnt = value & 0x77;
1124         break;
1125     case 0x0F:
1126         i2c->xtcntlss = value;
1127         break;
1128     case 0x10:
1129         i2c->directcntl = value & 0x7;
1130         break;
1131     }
1132 }
1133
1134 static uint32_t ppc4xx_i2c_readw (void *opaque, target_phys_addr_t addr)
1135 {
1136     uint32_t ret;
1137
1138 #ifdef DEBUG_I2C
1139     printf("%s: addr " TARGET_FMT_plx "\n", __func__, addr);
1140 #endif
1141     ret = ppc4xx_i2c_readb(opaque, addr) << 8;
1142     ret |= ppc4xx_i2c_readb(opaque, addr + 1);
1143
1144     return ret;
1145 }
1146
1147 static void ppc4xx_i2c_writew (void *opaque,
1148                                target_phys_addr_t addr, uint32_t value)
1149 {
1150 #ifdef DEBUG_I2C
1151     printf("%s: addr " TARGET_FMT_plx " val %08" PRIx32 "\n", __func__, addr,
1152            value);
1153 #endif
1154     ppc4xx_i2c_writeb(opaque, addr, value >> 8);
1155     ppc4xx_i2c_writeb(opaque, addr + 1, value);
1156 }
1157
1158 static uint32_t ppc4xx_i2c_readl (void *opaque, target_phys_addr_t addr)
1159 {
1160     uint32_t ret;
1161
1162 #ifdef DEBUG_I2C
1163     printf("%s: addr " TARGET_FMT_plx "\n", __func__, addr);
1164 #endif
1165     ret = ppc4xx_i2c_readb(opaque, addr) << 24;
1166     ret |= ppc4xx_i2c_readb(opaque, addr + 1) << 16;
1167     ret |= ppc4xx_i2c_readb(opaque, addr + 2) << 8;
1168     ret |= ppc4xx_i2c_readb(opaque, addr + 3);
1169
1170     return ret;
1171 }
1172
1173 static void ppc4xx_i2c_writel (void *opaque,
1174                                target_phys_addr_t addr, uint32_t value)
1175 {
1176 #ifdef DEBUG_I2C
1177     printf("%s: addr " TARGET_FMT_plx " val %08" PRIx32 "\n", __func__, addr,
1178            value);
1179 #endif
1180     ppc4xx_i2c_writeb(opaque, addr, value >> 24);
1181     ppc4xx_i2c_writeb(opaque, addr + 1, value >> 16);
1182     ppc4xx_i2c_writeb(opaque, addr + 2, value >> 8);
1183     ppc4xx_i2c_writeb(opaque, addr + 3, value);
1184 }
1185
1186 static CPUReadMemoryFunc * const i2c_read[] = {
1187     &ppc4xx_i2c_readb,
1188     &ppc4xx_i2c_readw,
1189     &ppc4xx_i2c_readl,
1190 };
1191
1192 static CPUWriteMemoryFunc * const i2c_write[] = {
1193     &ppc4xx_i2c_writeb,
1194     &ppc4xx_i2c_writew,
1195     &ppc4xx_i2c_writel,
1196 };
1197
1198 static void ppc4xx_i2c_reset (void *opaque)
1199 {
1200     ppc4xx_i2c_t *i2c;
1201
1202     i2c = opaque;
1203     i2c->mdata = 0x00;
1204     i2c->sdata = 0x00;
1205     i2c->cntl = 0x00;
1206     i2c->mdcntl = 0x00;
1207     i2c->sts = 0x00;
1208     i2c->extsts = 0x00;
1209     i2c->clkdiv = 0x00;
1210     i2c->xfrcnt = 0x00;
1211     i2c->directcntl = 0x0F;
1212 }
1213
1214 static void ppc405_i2c_init(target_phys_addr_t base, qemu_irq irq)
1215 {
1216     ppc4xx_i2c_t *i2c;
1217     int io;
1218
1219     i2c = qemu_mallocz(sizeof(ppc4xx_i2c_t));
1220     i2c->irq = irq;
1221 #ifdef DEBUG_I2C
1222     printf("%s: offset " TARGET_FMT_plx "\n", __func__, base);
1223 #endif
1224     io = cpu_register_io_memory(i2c_read, i2c_write, i2c,
1225                                 DEVICE_NATIVE_ENDIAN);
1226     cpu_register_physical_memory(base, 0x011, io);
1227     qemu_register_reset(ppc4xx_i2c_reset, i2c);
1228 }
1229
1230 /*****************************************************************************/
1231 /* General purpose timers */
1232 typedef struct ppc4xx_gpt_t ppc4xx_gpt_t;
1233 struct ppc4xx_gpt_t {
1234     int64_t tb_offset;
1235     uint32_t tb_freq;
1236     struct QEMUTimer *timer;
1237     qemu_irq irqs[5];
1238     uint32_t oe;
1239     uint32_t ol;
1240     uint32_t im;
1241     uint32_t is;
1242     uint32_t ie;
1243     uint32_t comp[5];
1244     uint32_t mask[5];
1245 };
1246
1247 static uint32_t ppc4xx_gpt_readb (void *opaque, target_phys_addr_t addr)
1248 {
1249 #ifdef DEBUG_GPT
1250     printf("%s: addr " TARGET_FMT_plx "\n", __func__, addr);
1251 #endif
1252     /* XXX: generate a bus fault */
1253     return -1;
1254 }
1255
1256 static void ppc4xx_gpt_writeb (void *opaque,
1257                                target_phys_addr_t addr, uint32_t value)
1258 {
1259 #ifdef DEBUG_I2C
1260     printf("%s: addr " TARGET_FMT_plx " val %08" PRIx32 "\n", __func__, addr,
1261            value);
1262 #endif
1263     /* XXX: generate a bus fault */
1264 }
1265
1266 static uint32_t ppc4xx_gpt_readw (void *opaque, target_phys_addr_t addr)
1267 {
1268 #ifdef DEBUG_GPT
1269     printf("%s: addr " TARGET_FMT_plx "\n", __func__, addr);
1270 #endif
1271     /* XXX: generate a bus fault */
1272     return -1;
1273 }
1274
1275 static void ppc4xx_gpt_writew (void *opaque,
1276                                target_phys_addr_t addr, uint32_t value)
1277 {
1278 #ifdef DEBUG_I2C
1279     printf("%s: addr " TARGET_FMT_plx " val %08" PRIx32 "\n", __func__, addr,
1280            value);
1281 #endif
1282     /* XXX: generate a bus fault */
1283 }
1284
1285 static int ppc4xx_gpt_compare (ppc4xx_gpt_t *gpt, int n)
1286 {
1287     /* XXX: TODO */
1288     return 0;
1289 }
1290
1291 static void ppc4xx_gpt_set_output (ppc4xx_gpt_t *gpt, int n, int level)
1292 {
1293     /* XXX: TODO */
1294 }
1295
1296 static void ppc4xx_gpt_set_outputs (ppc4xx_gpt_t *gpt)
1297 {
1298     uint32_t mask;
1299     int i;
1300
1301     mask = 0x80000000;
1302     for (i = 0; i < 5; i++) {
1303         if (gpt->oe & mask) {
1304             /* Output is enabled */
1305             if (ppc4xx_gpt_compare(gpt, i)) {
1306                 /* Comparison is OK */
1307                 ppc4xx_gpt_set_output(gpt, i, gpt->ol & mask);
1308             } else {
1309                 /* Comparison is KO */
1310                 ppc4xx_gpt_set_output(gpt, i, gpt->ol & mask ? 0 : 1);
1311             }
1312         }
1313         mask = mask >> 1;
1314     }
1315 }
1316
1317 static void ppc4xx_gpt_set_irqs (ppc4xx_gpt_t *gpt)
1318 {
1319     uint32_t mask;
1320     int i;
1321
1322     mask = 0x00008000;
1323     for (i = 0; i < 5; i++) {
1324         if (gpt->is & gpt->im & mask)
1325             qemu_irq_raise(gpt->irqs[i]);
1326         else
1327             qemu_irq_lower(gpt->irqs[i]);
1328         mask = mask >> 1;
1329     }
1330 }
1331
1332 static void ppc4xx_gpt_compute_timer (ppc4xx_gpt_t *gpt)
1333 {
1334     /* XXX: TODO */
1335 }
1336
1337 static uint32_t ppc4xx_gpt_readl (void *opaque, target_phys_addr_t addr)
1338 {
1339     ppc4xx_gpt_t *gpt;
1340     uint32_t ret;
1341     int idx;
1342
1343 #ifdef DEBUG_GPT
1344     printf("%s: addr " TARGET_FMT_plx "\n", __func__, addr);
1345 #endif
1346     gpt = opaque;
1347     switch (addr) {
1348     case 0x00:
1349         /* Time base counter */
1350         ret = muldiv64(qemu_get_clock(vm_clock) + gpt->tb_offset,
1351                        gpt->tb_freq, get_ticks_per_sec());
1352         break;
1353     case 0x10:
1354         /* Output enable */
1355         ret = gpt->oe;
1356         break;
1357     case 0x14:
1358         /* Output level */
1359         ret = gpt->ol;
1360         break;
1361     case 0x18:
1362         /* Interrupt mask */
1363         ret = gpt->im;
1364         break;
1365     case 0x1C:
1366     case 0x20:
1367         /* Interrupt status */
1368         ret = gpt->is;
1369         break;
1370     case 0x24:
1371         /* Interrupt enable */
1372         ret = gpt->ie;
1373         break;
1374     case 0x80 ... 0x90:
1375         /* Compare timer */
1376         idx = (addr - 0x80) >> 2;
1377         ret = gpt->comp[idx];
1378         break;
1379     case 0xC0 ... 0xD0:
1380         /* Compare mask */
1381         idx = (addr - 0xC0) >> 2;
1382         ret = gpt->mask[idx];
1383         break;
1384     default:
1385         ret = -1;
1386         break;
1387     }
1388
1389     return ret;
1390 }
1391
1392 static void ppc4xx_gpt_writel (void *opaque,
1393                                target_phys_addr_t addr, uint32_t value)
1394 {
1395     ppc4xx_gpt_t *gpt;
1396     int idx;
1397
1398 #ifdef DEBUG_I2C
1399     printf("%s: addr " TARGET_FMT_plx " val %08" PRIx32 "\n", __func__, addr,
1400            value);
1401 #endif
1402     gpt = opaque;
1403     switch (addr) {
1404     case 0x00:
1405         /* Time base counter */
1406         gpt->tb_offset = muldiv64(value, get_ticks_per_sec(), gpt->tb_freq)
1407             - qemu_get_clock(vm_clock);
1408         ppc4xx_gpt_compute_timer(gpt);
1409         break;
1410     case 0x10:
1411         /* Output enable */
1412         gpt->oe = value & 0xF8000000;
1413         ppc4xx_gpt_set_outputs(gpt);
1414         break;
1415     case 0x14:
1416         /* Output level */
1417         gpt->ol = value & 0xF8000000;
1418         ppc4xx_gpt_set_outputs(gpt);
1419         break;
1420     case 0x18:
1421         /* Interrupt mask */
1422         gpt->im = value & 0x0000F800;
1423         break;
1424     case 0x1C:
1425         /* Interrupt status set */
1426         gpt->is |= value & 0x0000F800;
1427         ppc4xx_gpt_set_irqs(gpt);
1428         break;
1429     case 0x20:
1430         /* Interrupt status clear */
1431         gpt->is &= ~(value & 0x0000F800);
1432         ppc4xx_gpt_set_irqs(gpt);
1433         break;
1434     case 0x24:
1435         /* Interrupt enable */
1436         gpt->ie = value & 0x0000F800;
1437         ppc4xx_gpt_set_irqs(gpt);
1438         break;
1439     case 0x80 ... 0x90:
1440         /* Compare timer */
1441         idx = (addr - 0x80) >> 2;
1442         gpt->comp[idx] = value & 0xF8000000;
1443         ppc4xx_gpt_compute_timer(gpt);
1444         break;
1445     case 0xC0 ... 0xD0:
1446         /* Compare mask */
1447         idx = (addr - 0xC0) >> 2;
1448         gpt->mask[idx] = value & 0xF8000000;
1449         ppc4xx_gpt_compute_timer(gpt);
1450         break;
1451     }
1452 }
1453
1454 static CPUReadMemoryFunc * const gpt_read[] = {
1455     &ppc4xx_gpt_readb,
1456     &ppc4xx_gpt_readw,
1457     &ppc4xx_gpt_readl,
1458 };
1459
1460 static CPUWriteMemoryFunc * const gpt_write[] = {
1461     &ppc4xx_gpt_writeb,
1462     &ppc4xx_gpt_writew,
1463     &ppc4xx_gpt_writel,
1464 };
1465
1466 static void ppc4xx_gpt_cb (void *opaque)
1467 {
1468     ppc4xx_gpt_t *gpt;
1469
1470     gpt = opaque;
1471     ppc4xx_gpt_set_irqs(gpt);
1472     ppc4xx_gpt_set_outputs(gpt);
1473     ppc4xx_gpt_compute_timer(gpt);
1474 }
1475
1476 static void ppc4xx_gpt_reset (void *opaque)
1477 {
1478     ppc4xx_gpt_t *gpt;
1479     int i;
1480
1481     gpt = opaque;
1482     qemu_del_timer(gpt->timer);
1483     gpt->oe = 0x00000000;
1484     gpt->ol = 0x00000000;
1485     gpt->im = 0x00000000;
1486     gpt->is = 0x00000000;
1487     gpt->ie = 0x00000000;
1488     for (i = 0; i < 5; i++) {
1489         gpt->comp[i] = 0x00000000;
1490         gpt->mask[i] = 0x00000000;
1491     }
1492 }
1493
1494 static void ppc4xx_gpt_init(target_phys_addr_t base, qemu_irq irqs[5])
1495 {
1496     ppc4xx_gpt_t *gpt;
1497     int i;
1498     int io;
1499
1500     gpt = qemu_mallocz(sizeof(ppc4xx_gpt_t));
1501     for (i = 0; i < 5; i++) {
1502         gpt->irqs[i] = irqs[i];
1503     }
1504     gpt->timer = qemu_new_timer(vm_clock, &ppc4xx_gpt_cb, gpt);
1505 #ifdef DEBUG_GPT
1506     printf("%s: offset " TARGET_FMT_plx "\n", __func__, base);
1507 #endif
1508     io = cpu_register_io_memory(gpt_read, gpt_write, gpt, DEVICE_NATIVE_ENDIAN);
1509     cpu_register_physical_memory(base, 0x0d4, io);
1510     qemu_register_reset(ppc4xx_gpt_reset, gpt);
1511 }
1512
1513 /*****************************************************************************/
1514 /* MAL */
1515 enum {
1516     MAL0_CFG      = 0x180,
1517     MAL0_ESR      = 0x181,
1518     MAL0_IER      = 0x182,
1519     MAL0_TXCASR   = 0x184,
1520     MAL0_TXCARR   = 0x185,
1521     MAL0_TXEOBISR = 0x186,
1522     MAL0_TXDEIR   = 0x187,
1523     MAL0_RXCASR   = 0x190,
1524     MAL0_RXCARR   = 0x191,
1525     MAL0_RXEOBISR = 0x192,
1526     MAL0_RXDEIR   = 0x193,
1527     MAL0_TXCTP0R  = 0x1A0,
1528     MAL0_TXCTP1R  = 0x1A1,
1529     MAL0_TXCTP2R  = 0x1A2,
1530     MAL0_TXCTP3R  = 0x1A3,
1531     MAL0_RXCTP0R  = 0x1C0,
1532     MAL0_RXCTP1R  = 0x1C1,
1533     MAL0_RCBS0    = 0x1E0,
1534     MAL0_RCBS1    = 0x1E1,
1535 };
1536
1537 typedef struct ppc40x_mal_t ppc40x_mal_t;
1538 struct ppc40x_mal_t {
1539     qemu_irq irqs[4];
1540     uint32_t cfg;
1541     uint32_t esr;
1542     uint32_t ier;
1543     uint32_t txcasr;
1544     uint32_t txcarr;
1545     uint32_t txeobisr;
1546     uint32_t txdeir;
1547     uint32_t rxcasr;
1548     uint32_t rxcarr;
1549     uint32_t rxeobisr;
1550     uint32_t rxdeir;
1551     uint32_t txctpr[4];
1552     uint32_t rxctpr[2];
1553     uint32_t rcbs[2];
1554 };
1555
1556 static void ppc40x_mal_reset (void *opaque);
1557
1558 static uint32_t dcr_read_mal (void *opaque, int dcrn)
1559 {
1560     ppc40x_mal_t *mal;
1561     uint32_t ret;
1562
1563     mal = opaque;
1564     switch (dcrn) {
1565     case MAL0_CFG:
1566         ret = mal->cfg;
1567         break;
1568     case MAL0_ESR:
1569         ret = mal->esr;
1570         break;
1571     case MAL0_IER:
1572         ret = mal->ier;
1573         break;
1574     case MAL0_TXCASR:
1575         ret = mal->txcasr;
1576         break;
1577     case MAL0_TXCARR:
1578         ret = mal->txcarr;
1579         break;
1580     case MAL0_TXEOBISR:
1581         ret = mal->txeobisr;
1582         break;
1583     case MAL0_TXDEIR:
1584         ret = mal->txdeir;
1585         break;
1586     case MAL0_RXCASR:
1587         ret = mal->rxcasr;
1588         break;
1589     case MAL0_RXCARR:
1590         ret = mal->rxcarr;
1591         break;
1592     case MAL0_RXEOBISR:
1593         ret = mal->rxeobisr;
1594         break;
1595     case MAL0_RXDEIR:
1596         ret = mal->rxdeir;
1597         break;
1598     case MAL0_TXCTP0R:
1599         ret = mal->txctpr[0];
1600         break;
1601     case MAL0_TXCTP1R:
1602         ret = mal->txctpr[1];
1603         break;
1604     case MAL0_TXCTP2R:
1605         ret = mal->txctpr[2];
1606         break;
1607     case MAL0_TXCTP3R:
1608         ret = mal->txctpr[3];
1609         break;
1610     case MAL0_RXCTP0R:
1611         ret = mal->rxctpr[0];
1612         break;
1613     case MAL0_RXCTP1R:
1614         ret = mal->rxctpr[1];
1615         break;
1616     case MAL0_RCBS0:
1617         ret = mal->rcbs[0];
1618         break;
1619     case MAL0_RCBS1:
1620         ret = mal->rcbs[1];
1621         break;
1622     default:
1623         ret = 0;
1624         break;
1625     }
1626
1627     return ret;
1628 }
1629
1630 static void dcr_write_mal (void *opaque, int dcrn, uint32_t val)
1631 {
1632     ppc40x_mal_t *mal;
1633     int idx;
1634
1635     mal = opaque;
1636     switch (dcrn) {
1637     case MAL0_CFG:
1638         if (val & 0x80000000)
1639             ppc40x_mal_reset(mal);
1640         mal->cfg = val & 0x00FFC087;
1641         break;
1642     case MAL0_ESR:
1643         /* Read/clear */
1644         mal->esr &= ~val;
1645         break;
1646     case MAL0_IER:
1647         mal->ier = val & 0x0000001F;
1648         break;
1649     case MAL0_TXCASR:
1650         mal->txcasr = val & 0xF0000000;
1651         break;
1652     case MAL0_TXCARR:
1653         mal->txcarr = val & 0xF0000000;
1654         break;
1655     case MAL0_TXEOBISR:
1656         /* Read/clear */
1657         mal->txeobisr &= ~val;
1658         break;
1659     case MAL0_TXDEIR:
1660         /* Read/clear */
1661         mal->txdeir &= ~val;
1662         break;
1663     case MAL0_RXCASR:
1664         mal->rxcasr = val & 0xC0000000;
1665         break;
1666     case MAL0_RXCARR:
1667         mal->rxcarr = val & 0xC0000000;
1668         break;
1669     case MAL0_RXEOBISR:
1670         /* Read/clear */
1671         mal->rxeobisr &= ~val;
1672         break;
1673     case MAL0_RXDEIR:
1674         /* Read/clear */
1675         mal->rxdeir &= ~val;
1676         break;
1677     case MAL0_TXCTP0R:
1678         idx = 0;
1679         goto update_tx_ptr;
1680     case MAL0_TXCTP1R:
1681         idx = 1;
1682         goto update_tx_ptr;
1683     case MAL0_TXCTP2R:
1684         idx = 2;
1685         goto update_tx_ptr;
1686     case MAL0_TXCTP3R:
1687         idx = 3;
1688     update_tx_ptr:
1689         mal->txctpr[idx] = val;
1690         break;
1691     case MAL0_RXCTP0R:
1692         idx = 0;
1693         goto update_rx_ptr;
1694     case MAL0_RXCTP1R:
1695         idx = 1;
1696     update_rx_ptr:
1697         mal->rxctpr[idx] = val;
1698         break;
1699     case MAL0_RCBS0:
1700         idx = 0;
1701         goto update_rx_size;
1702     case MAL0_RCBS1:
1703         idx = 1;
1704     update_rx_size:
1705         mal->rcbs[idx] = val & 0x000000FF;
1706         break;
1707     }
1708 }
1709
1710 static void ppc40x_mal_reset (void *opaque)
1711 {
1712     ppc40x_mal_t *mal;
1713
1714     mal = opaque;
1715     mal->cfg = 0x0007C000;
1716     mal->esr = 0x00000000;
1717     mal->ier = 0x00000000;
1718     mal->rxcasr = 0x00000000;
1719     mal->rxdeir = 0x00000000;
1720     mal->rxeobisr = 0x00000000;
1721     mal->txcasr = 0x00000000;
1722     mal->txdeir = 0x00000000;
1723     mal->txeobisr = 0x00000000;
1724 }
1725
1726 static void ppc405_mal_init(CPUState *env, qemu_irq irqs[4])
1727 {
1728     ppc40x_mal_t *mal;
1729     int i;
1730
1731     mal = qemu_mallocz(sizeof(ppc40x_mal_t));
1732     for (i = 0; i < 4; i++)
1733         mal->irqs[i] = irqs[i];
1734     qemu_register_reset(&ppc40x_mal_reset, mal);
1735     ppc_dcr_register(env, MAL0_CFG,
1736                      mal, &dcr_read_mal, &dcr_write_mal);
1737     ppc_dcr_register(env, MAL0_ESR,
1738                      mal, &dcr_read_mal, &dcr_write_mal);
1739     ppc_dcr_register(env, MAL0_IER,
1740                      mal, &dcr_read_mal, &dcr_write_mal);
1741     ppc_dcr_register(env, MAL0_TXCASR,
1742                      mal, &dcr_read_mal, &dcr_write_mal);
1743     ppc_dcr_register(env, MAL0_TXCARR,
1744                      mal, &dcr_read_mal, &dcr_write_mal);
1745     ppc_dcr_register(env, MAL0_TXEOBISR,
1746                      mal, &dcr_read_mal, &dcr_write_mal);
1747     ppc_dcr_register(env, MAL0_TXDEIR,
1748                      mal, &dcr_read_mal, &dcr_write_mal);
1749     ppc_dcr_register(env, MAL0_RXCASR,
1750                      mal, &dcr_read_mal, &dcr_write_mal);
1751     ppc_dcr_register(env, MAL0_RXCARR,
1752                      mal, &dcr_read_mal, &dcr_write_mal);
1753     ppc_dcr_register(env, MAL0_RXEOBISR,
1754                      mal, &dcr_read_mal, &dcr_write_mal);
1755     ppc_dcr_register(env, MAL0_RXDEIR,
1756                      mal, &dcr_read_mal, &dcr_write_mal);
1757     ppc_dcr_register(env, MAL0_TXCTP0R,
1758                      mal, &dcr_read_mal, &dcr_write_mal);
1759     ppc_dcr_register(env, MAL0_TXCTP1R,
1760                      mal, &dcr_read_mal, &dcr_write_mal);
1761     ppc_dcr_register(env, MAL0_TXCTP2R,
1762                      mal, &dcr_read_mal, &dcr_write_mal);
1763     ppc_dcr_register(env, MAL0_TXCTP3R,
1764                      mal, &dcr_read_mal, &dcr_write_mal);
1765     ppc_dcr_register(env, MAL0_RXCTP0R,
1766                      mal, &dcr_read_mal, &dcr_write_mal);
1767     ppc_dcr_register(env, MAL0_RXCTP1R,
1768                      mal, &dcr_read_mal, &dcr_write_mal);
1769     ppc_dcr_register(env, MAL0_RCBS0,
1770                      mal, &dcr_read_mal, &dcr_write_mal);
1771     ppc_dcr_register(env, MAL0_RCBS1,
1772                      mal, &dcr_read_mal, &dcr_write_mal);
1773 }
1774
1775 /*****************************************************************************/
1776 /* SPR */
1777 void ppc40x_core_reset (CPUState *env)
1778 {
1779     target_ulong dbsr;
1780
1781     printf("Reset PowerPC core\n");
1782     env->interrupt_request |= CPU_INTERRUPT_EXITTB;
1783     /* XXX: TOFIX */
1784 #if 0
1785     cpu_reset(env);
1786 #else
1787     qemu_system_reset_request();
1788 #endif
1789     dbsr = env->spr[SPR_40x_DBSR];
1790     dbsr &= ~0x00000300;
1791     dbsr |= 0x00000100;
1792     env->spr[SPR_40x_DBSR] = dbsr;
1793 }
1794
1795 void ppc40x_chip_reset (CPUState *env)
1796 {
1797     target_ulong dbsr;
1798
1799     printf("Reset PowerPC chip\n");
1800     env->interrupt_request |= CPU_INTERRUPT_EXITTB;
1801     /* XXX: TOFIX */
1802 #if 0
1803     cpu_reset(env);
1804 #else
1805     qemu_system_reset_request();
1806 #endif
1807     /* XXX: TODO reset all internal peripherals */
1808     dbsr = env->spr[SPR_40x_DBSR];
1809     dbsr &= ~0x00000300;
1810     dbsr |= 0x00000200;
1811     env->spr[SPR_40x_DBSR] = dbsr;
1812 }
1813
1814 void ppc40x_system_reset (CPUState *env)
1815 {
1816     printf("Reset PowerPC system\n");
1817     qemu_system_reset_request();
1818 }
1819
1820 void store_40x_dbcr0 (CPUState *env, uint32_t val)
1821 {
1822     switch ((val >> 28) & 0x3) {
1823     case 0x0:
1824         /* No action */
1825         break;
1826     case 0x1:
1827         /* Core reset */
1828         ppc40x_core_reset(env);
1829         break;
1830     case 0x2:
1831         /* Chip reset */
1832         ppc40x_chip_reset(env);
1833         break;
1834     case 0x3:
1835         /* System reset */
1836         ppc40x_system_reset(env);
1837         break;
1838     }
1839 }
1840
1841 /*****************************************************************************/
1842 /* PowerPC 405CR */
1843 enum {
1844     PPC405CR_CPC0_PLLMR  = 0x0B0,
1845     PPC405CR_CPC0_CR0    = 0x0B1,
1846     PPC405CR_CPC0_CR1    = 0x0B2,
1847     PPC405CR_CPC0_PSR    = 0x0B4,
1848     PPC405CR_CPC0_JTAGID = 0x0B5,
1849     PPC405CR_CPC0_ER     = 0x0B9,
1850     PPC405CR_CPC0_FR     = 0x0BA,
1851     PPC405CR_CPC0_SR     = 0x0BB,
1852 };
1853
1854 enum {
1855     PPC405CR_CPU_CLK   = 0,
1856     PPC405CR_TMR_CLK   = 1,
1857     PPC405CR_PLB_CLK   = 2,
1858     PPC405CR_SDRAM_CLK = 3,
1859     PPC405CR_OPB_CLK   = 4,
1860     PPC405CR_EXT_CLK   = 5,
1861     PPC405CR_UART_CLK  = 6,
1862     PPC405CR_CLK_NB    = 7,
1863 };
1864
1865 typedef struct ppc405cr_cpc_t ppc405cr_cpc_t;
1866 struct ppc405cr_cpc_t {
1867     clk_setup_t clk_setup[PPC405CR_CLK_NB];
1868     uint32_t sysclk;
1869     uint32_t psr;
1870     uint32_t cr0;
1871     uint32_t cr1;
1872     uint32_t jtagid;
1873     uint32_t pllmr;
1874     uint32_t er;
1875     uint32_t fr;
1876 };
1877
1878 static void ppc405cr_clk_setup (ppc405cr_cpc_t *cpc)
1879 {
1880     uint64_t VCO_out, PLL_out;
1881     uint32_t CPU_clk, TMR_clk, SDRAM_clk, PLB_clk, OPB_clk, EXT_clk, UART_clk;
1882     int M, D0, D1, D2;
1883
1884     D0 = ((cpc->pllmr >> 26) & 0x3) + 1; /* CBDV */
1885     if (cpc->pllmr & 0x80000000) {
1886         D1 = (((cpc->pllmr >> 20) - 1) & 0xF) + 1; /* FBDV */
1887         D2 = 8 - ((cpc->pllmr >> 16) & 0x7); /* FWDVA */
1888         M = D0 * D1 * D2;
1889         VCO_out = cpc->sysclk * M;
1890         if (VCO_out < 400000000 || VCO_out > 800000000) {
1891             /* PLL cannot lock */
1892             cpc->pllmr &= ~0x80000000;
1893             goto bypass_pll;
1894         }
1895         PLL_out = VCO_out / D2;
1896     } else {
1897         /* Bypass PLL */
1898     bypass_pll:
1899         M = D0;
1900         PLL_out = cpc->sysclk * M;
1901     }
1902     CPU_clk = PLL_out;
1903     if (cpc->cr1 & 0x00800000)
1904         TMR_clk = cpc->sysclk; /* Should have a separate clock */
1905     else
1906         TMR_clk = CPU_clk;
1907     PLB_clk = CPU_clk / D0;
1908     SDRAM_clk = PLB_clk;
1909     D0 = ((cpc->pllmr >> 10) & 0x3) + 1;
1910     OPB_clk = PLB_clk / D0;
1911     D0 = ((cpc->pllmr >> 24) & 0x3) + 2;
1912     EXT_clk = PLB_clk / D0;
1913     D0 = ((cpc->cr0 >> 1) & 0x1F) + 1;
1914     UART_clk = CPU_clk / D0;
1915     /* Setup CPU clocks */
1916     clk_setup(&cpc->clk_setup[PPC405CR_CPU_CLK], CPU_clk);
1917     /* Setup time-base clock */
1918     clk_setup(&cpc->clk_setup[PPC405CR_TMR_CLK], TMR_clk);
1919     /* Setup PLB clock */
1920     clk_setup(&cpc->clk_setup[PPC405CR_PLB_CLK], PLB_clk);
1921     /* Setup SDRAM clock */
1922     clk_setup(&cpc->clk_setup[PPC405CR_SDRAM_CLK], SDRAM_clk);
1923     /* Setup OPB clock */
1924     clk_setup(&cpc->clk_setup[PPC405CR_OPB_CLK], OPB_clk);
1925     /* Setup external clock */
1926     clk_setup(&cpc->clk_setup[PPC405CR_EXT_CLK], EXT_clk);
1927     /* Setup UART clock */
1928     clk_setup(&cpc->clk_setup[PPC405CR_UART_CLK], UART_clk);
1929 }
1930
1931 static uint32_t dcr_read_crcpc (void *opaque, int dcrn)
1932 {
1933     ppc405cr_cpc_t *cpc;
1934     uint32_t ret;
1935
1936     cpc = opaque;
1937     switch (dcrn) {
1938     case PPC405CR_CPC0_PLLMR:
1939         ret = cpc->pllmr;
1940         break;
1941     case PPC405CR_CPC0_CR0:
1942         ret = cpc->cr0;
1943         break;
1944     case PPC405CR_CPC0_CR1:
1945         ret = cpc->cr1;
1946         break;
1947     case PPC405CR_CPC0_PSR:
1948         ret = cpc->psr;
1949         break;
1950     case PPC405CR_CPC0_JTAGID:
1951         ret = cpc->jtagid;
1952         break;
1953     case PPC405CR_CPC0_ER:
1954         ret = cpc->er;
1955         break;
1956     case PPC405CR_CPC0_FR:
1957         ret = cpc->fr;
1958         break;
1959     case PPC405CR_CPC0_SR:
1960         ret = ~(cpc->er | cpc->fr) & 0xFFFF0000;
1961         break;
1962     default:
1963         /* Avoid gcc warning */
1964         ret = 0;
1965         break;
1966     }
1967
1968     return ret;
1969 }
1970
1971 static void dcr_write_crcpc (void *opaque, int dcrn, uint32_t val)
1972 {
1973     ppc405cr_cpc_t *cpc;
1974
1975     cpc = opaque;
1976     switch (dcrn) {
1977     case PPC405CR_CPC0_PLLMR:
1978         cpc->pllmr = val & 0xFFF77C3F;
1979         break;
1980     case PPC405CR_CPC0_CR0:
1981         cpc->cr0 = val & 0x0FFFFFFE;
1982         break;
1983     case PPC405CR_CPC0_CR1:
1984         cpc->cr1 = val & 0x00800000;
1985         break;
1986     case PPC405CR_CPC0_PSR:
1987         /* Read-only */
1988         break;
1989     case PPC405CR_CPC0_JTAGID:
1990         /* Read-only */
1991         break;
1992     case PPC405CR_CPC0_ER:
1993         cpc->er = val & 0xBFFC0000;
1994         break;
1995     case PPC405CR_CPC0_FR:
1996         cpc->fr = val & 0xBFFC0000;
1997         break;
1998     case PPC405CR_CPC0_SR:
1999         /* Read-only */
2000         break;
2001     }
2002 }
2003
2004 static void ppc405cr_cpc_reset (void *opaque)
2005 {
2006     ppc405cr_cpc_t *cpc;
2007     int D;
2008
2009     cpc = opaque;
2010     /* Compute PLLMR value from PSR settings */
2011     cpc->pllmr = 0x80000000;
2012     /* PFWD */
2013     switch ((cpc->psr >> 30) & 3) {
2014     case 0:
2015         /* Bypass */
2016         cpc->pllmr &= ~0x80000000;
2017         break;
2018     case 1:
2019         /* Divide by 3 */
2020         cpc->pllmr |= 5 << 16;
2021         break;
2022     case 2:
2023         /* Divide by 4 */
2024         cpc->pllmr |= 4 << 16;
2025         break;
2026     case 3:
2027         /* Divide by 6 */
2028         cpc->pllmr |= 2 << 16;
2029         break;
2030     }
2031     /* PFBD */
2032     D = (cpc->psr >> 28) & 3;
2033     cpc->pllmr |= (D + 1) << 20;
2034     /* PT   */
2035     D = (cpc->psr >> 25) & 7;
2036     switch (D) {
2037     case 0x2:
2038         cpc->pllmr |= 0x13;
2039         break;
2040     case 0x4:
2041         cpc->pllmr |= 0x15;
2042         break;
2043     case 0x5:
2044         cpc->pllmr |= 0x16;
2045         break;
2046     default:
2047         break;
2048     }
2049     /* PDC  */
2050     D = (cpc->psr >> 23) & 3;
2051     cpc->pllmr |= D << 26;
2052     /* ODP  */
2053     D = (cpc->psr >> 21) & 3;
2054     cpc->pllmr |= D << 10;
2055     /* EBPD */
2056     D = (cpc->psr >> 17) & 3;
2057     cpc->pllmr |= D << 24;
2058     cpc->cr0 = 0x0000003C;
2059     cpc->cr1 = 0x2B0D8800;
2060     cpc->er = 0x00000000;
2061     cpc->fr = 0x00000000;
2062     ppc405cr_clk_setup(cpc);
2063 }
2064
2065 static void ppc405cr_clk_init (ppc405cr_cpc_t *cpc)
2066 {
2067     int D;
2068
2069     /* XXX: this should be read from IO pins */
2070     cpc->psr = 0x00000000; /* 8 bits ROM */
2071     /* PFWD */
2072     D = 0x2; /* Divide by 4 */
2073     cpc->psr |= D << 30;
2074     /* PFBD */
2075     D = 0x1; /* Divide by 2 */
2076     cpc->psr |= D << 28;
2077     /* PDC */
2078     D = 0x1; /* Divide by 2 */
2079     cpc->psr |= D << 23;
2080     /* PT */
2081     D = 0x5; /* M = 16 */
2082     cpc->psr |= D << 25;
2083     /* ODP */
2084     D = 0x1; /* Divide by 2 */
2085     cpc->psr |= D << 21;
2086     /* EBDP */
2087     D = 0x2; /* Divide by 4 */
2088     cpc->psr |= D << 17;
2089 }
2090
2091 static void ppc405cr_cpc_init (CPUState *env, clk_setup_t clk_setup[7],
2092                                uint32_t sysclk)
2093 {
2094     ppc405cr_cpc_t *cpc;
2095
2096     cpc = qemu_mallocz(sizeof(ppc405cr_cpc_t));
2097     memcpy(cpc->clk_setup, clk_setup,
2098            PPC405CR_CLK_NB * sizeof(clk_setup_t));
2099     cpc->sysclk = sysclk;
2100     cpc->jtagid = 0x42051049;
2101     ppc_dcr_register(env, PPC405CR_CPC0_PSR, cpc,
2102                      &dcr_read_crcpc, &dcr_write_crcpc);
2103     ppc_dcr_register(env, PPC405CR_CPC0_CR0, cpc,
2104                      &dcr_read_crcpc, &dcr_write_crcpc);
2105     ppc_dcr_register(env, PPC405CR_CPC0_CR1, cpc,
2106                      &dcr_read_crcpc, &dcr_write_crcpc);
2107     ppc_dcr_register(env, PPC405CR_CPC0_JTAGID, cpc,
2108                      &dcr_read_crcpc, &dcr_write_crcpc);
2109     ppc_dcr_register(env, PPC405CR_CPC0_PLLMR, cpc,
2110                      &dcr_read_crcpc, &dcr_write_crcpc);
2111     ppc_dcr_register(env, PPC405CR_CPC0_ER, cpc,
2112                      &dcr_read_crcpc, &dcr_write_crcpc);
2113     ppc_dcr_register(env, PPC405CR_CPC0_FR, cpc,
2114                      &dcr_read_crcpc, &dcr_write_crcpc);
2115     ppc_dcr_register(env, PPC405CR_CPC0_SR, cpc,
2116                      &dcr_read_crcpc, &dcr_write_crcpc);
2117     ppc405cr_clk_init(cpc);
2118     qemu_register_reset(ppc405cr_cpc_reset, cpc);
2119 }
2120
2121 CPUState *ppc405cr_init (target_phys_addr_t ram_bases[4],
2122                          target_phys_addr_t ram_sizes[4],
2123                          uint32_t sysclk, qemu_irq **picp,
2124                          int do_init)
2125 {
2126     clk_setup_t clk_setup[PPC405CR_CLK_NB];
2127     qemu_irq dma_irqs[4];
2128     CPUState *env;
2129     qemu_irq *pic, *irqs;
2130
2131     memset(clk_setup, 0, sizeof(clk_setup));
2132     env = ppc4xx_init("405cr", &clk_setup[PPC405CR_CPU_CLK],
2133                       &clk_setup[PPC405CR_TMR_CLK], sysclk);
2134     /* Memory mapped devices registers */
2135     /* PLB arbitrer */
2136     ppc4xx_plb_init(env);
2137     /* PLB to OPB bridge */
2138     ppc4xx_pob_init(env);
2139     /* OBP arbitrer */
2140     ppc4xx_opba_init(0xef600600);
2141     /* Universal interrupt controller */
2142     irqs = qemu_mallocz(sizeof(qemu_irq) * PPCUIC_OUTPUT_NB);
2143     irqs[PPCUIC_OUTPUT_INT] =
2144         ((qemu_irq *)env->irq_inputs)[PPC40x_INPUT_INT];
2145     irqs[PPCUIC_OUTPUT_CINT] =
2146         ((qemu_irq *)env->irq_inputs)[PPC40x_INPUT_CINT];
2147     pic = ppcuic_init(env, irqs, 0x0C0, 0, 1);
2148     *picp = pic;
2149     /* SDRAM controller */
2150     ppc4xx_sdram_init(env, pic[14], 1, ram_bases, ram_sizes, do_init);
2151     /* External bus controller */
2152     ppc405_ebc_init(env);
2153     /* DMA controller */
2154     dma_irqs[0] = pic[26];
2155     dma_irqs[1] = pic[25];
2156     dma_irqs[2] = pic[24];
2157     dma_irqs[3] = pic[23];
2158     ppc405_dma_init(env, dma_irqs);
2159     /* Serial ports */
2160     if (serial_hds[0] != NULL) {
2161         serial_mm_init(0xef600300, 0, pic[0], PPC_SERIAL_MM_BAUDBASE,
2162                        serial_hds[0], 1, 1);
2163     }
2164     if (serial_hds[1] != NULL) {
2165         serial_mm_init(0xef600400, 0, pic[1], PPC_SERIAL_MM_BAUDBASE,
2166                        serial_hds[1], 1, 1);
2167     }
2168     /* IIC controller */
2169     ppc405_i2c_init(0xef600500, pic[2]);
2170     /* GPIO */
2171     ppc405_gpio_init(0xef600700);
2172     /* CPU control */
2173     ppc405cr_cpc_init(env, clk_setup, sysclk);
2174
2175     return env;
2176 }
2177
2178 /*****************************************************************************/
2179 /* PowerPC 405EP */
2180 /* CPU control */
2181 enum {
2182     PPC405EP_CPC0_PLLMR0 = 0x0F0,
2183     PPC405EP_CPC0_BOOT   = 0x0F1,
2184     PPC405EP_CPC0_EPCTL  = 0x0F3,
2185     PPC405EP_CPC0_PLLMR1 = 0x0F4,
2186     PPC405EP_CPC0_UCR    = 0x0F5,
2187     PPC405EP_CPC0_SRR    = 0x0F6,
2188     PPC405EP_CPC0_JTAGID = 0x0F7,
2189     PPC405EP_CPC0_PCI    = 0x0F9,
2190 #if 0
2191     PPC405EP_CPC0_ER     = xxx,
2192     PPC405EP_CPC0_FR     = xxx,
2193     PPC405EP_CPC0_SR     = xxx,
2194 #endif
2195 };
2196
2197 enum {
2198     PPC405EP_CPU_CLK   = 0,
2199     PPC405EP_PLB_CLK   = 1,
2200     PPC405EP_OPB_CLK   = 2,
2201     PPC405EP_EBC_CLK   = 3,
2202     PPC405EP_MAL_CLK   = 4,
2203     PPC405EP_PCI_CLK   = 5,
2204     PPC405EP_UART0_CLK = 6,
2205     PPC405EP_UART1_CLK = 7,
2206     PPC405EP_CLK_NB    = 8,
2207 };
2208
2209 typedef struct ppc405ep_cpc_t ppc405ep_cpc_t;
2210 struct ppc405ep_cpc_t {
2211     uint32_t sysclk;
2212     clk_setup_t clk_setup[PPC405EP_CLK_NB];
2213     uint32_t boot;
2214     uint32_t epctl;
2215     uint32_t pllmr[2];
2216     uint32_t ucr;
2217     uint32_t srr;
2218     uint32_t jtagid;
2219     uint32_t pci;
2220     /* Clock and power management */
2221     uint32_t er;
2222     uint32_t fr;
2223     uint32_t sr;
2224 };
2225
2226 static void ppc405ep_compute_clocks (ppc405ep_cpc_t *cpc)
2227 {
2228     uint32_t CPU_clk, PLB_clk, OPB_clk, EBC_clk, MAL_clk, PCI_clk;
2229     uint32_t UART0_clk, UART1_clk;
2230     uint64_t VCO_out, PLL_out;
2231     int M, D;
2232
2233     VCO_out = 0;
2234     if ((cpc->pllmr[1] & 0x80000000) && !(cpc->pllmr[1] & 0x40000000)) {
2235         M = (((cpc->pllmr[1] >> 20) - 1) & 0xF) + 1; /* FBMUL */
2236 #ifdef DEBUG_CLOCKS_LL
2237         printf("FBMUL %01" PRIx32 " %d\n", (cpc->pllmr[1] >> 20) & 0xF, M);
2238 #endif
2239         D = 8 - ((cpc->pllmr[1] >> 16) & 0x7); /* FWDA */
2240 #ifdef DEBUG_CLOCKS_LL
2241         printf("FWDA %01" PRIx32 " %d\n", (cpc->pllmr[1] >> 16) & 0x7, D);
2242 #endif
2243         VCO_out = cpc->sysclk * M * D;
2244         if (VCO_out < 500000000UL || VCO_out > 1000000000UL) {
2245             /* Error - unlock the PLL */
2246             printf("VCO out of range %" PRIu64 "\n", VCO_out);
2247 #if 0
2248             cpc->pllmr[1] &= ~0x80000000;
2249             goto pll_bypass;
2250 #endif
2251         }
2252         PLL_out = VCO_out / D;
2253         /* Pretend the PLL is locked */
2254         cpc->boot |= 0x00000001;
2255     } else {
2256 #if 0
2257     pll_bypass:
2258 #endif
2259         PLL_out = cpc->sysclk;
2260         if (cpc->pllmr[1] & 0x40000000) {
2261             /* Pretend the PLL is not locked */
2262             cpc->boot &= ~0x00000001;
2263         }
2264     }
2265     /* Now, compute all other clocks */
2266     D = ((cpc->pllmr[0] >> 20) & 0x3) + 1; /* CCDV */
2267 #ifdef DEBUG_CLOCKS_LL
2268     printf("CCDV %01" PRIx32 " %d\n", (cpc->pllmr[0] >> 20) & 0x3, D);
2269 #endif
2270     CPU_clk = PLL_out / D;
2271     D = ((cpc->pllmr[0] >> 16) & 0x3) + 1; /* CBDV */
2272 #ifdef DEBUG_CLOCKS_LL
2273     printf("CBDV %01" PRIx32 " %d\n", (cpc->pllmr[0] >> 16) & 0x3, D);
2274 #endif
2275     PLB_clk = CPU_clk / D;
2276     D = ((cpc->pllmr[0] >> 12) & 0x3) + 1; /* OPDV */
2277 #ifdef DEBUG_CLOCKS_LL
2278     printf("OPDV %01" PRIx32 " %d\n", (cpc->pllmr[0] >> 12) & 0x3, D);
2279 #endif
2280     OPB_clk = PLB_clk / D;
2281     D = ((cpc->pllmr[0] >> 8) & 0x3) + 2; /* EPDV */
2282 #ifdef DEBUG_CLOCKS_LL
2283     printf("EPDV %01" PRIx32 " %d\n", (cpc->pllmr[0] >> 8) & 0x3, D);
2284 #endif
2285     EBC_clk = PLB_clk / D;
2286     D = ((cpc->pllmr[0] >> 4) & 0x3) + 1; /* MPDV */
2287 #ifdef DEBUG_CLOCKS_LL
2288     printf("MPDV %01" PRIx32 " %d\n", (cpc->pllmr[0] >> 4) & 0x3, D);
2289 #endif
2290     MAL_clk = PLB_clk / D;
2291     D = (cpc->pllmr[0] & 0x3) + 1; /* PPDV */
2292 #ifdef DEBUG_CLOCKS_LL
2293     printf("PPDV %01" PRIx32 " %d\n", cpc->pllmr[0] & 0x3, D);
2294 #endif
2295     PCI_clk = PLB_clk / D;
2296     D = ((cpc->ucr - 1) & 0x7F) + 1; /* U0DIV */
2297 #ifdef DEBUG_CLOCKS_LL
2298     printf("U0DIV %01" PRIx32 " %d\n", cpc->ucr & 0x7F, D);
2299 #endif
2300     UART0_clk = PLL_out / D;
2301     D = (((cpc->ucr >> 8) - 1) & 0x7F) + 1; /* U1DIV */
2302 #ifdef DEBUG_CLOCKS_LL
2303     printf("U1DIV %01" PRIx32 " %d\n", (cpc->ucr >> 8) & 0x7F, D);
2304 #endif
2305     UART1_clk = PLL_out / D;
2306 #ifdef DEBUG_CLOCKS
2307     printf("Setup PPC405EP clocks - sysclk %" PRIu32 " VCO %" PRIu64
2308            " PLL out %" PRIu64 " Hz\n", cpc->sysclk, VCO_out, PLL_out);
2309     printf("CPU %" PRIu32 " PLB %" PRIu32 " OPB %" PRIu32 " EBC %" PRIu32
2310            " MAL %" PRIu32 " PCI %" PRIu32 " UART0 %" PRIu32
2311            " UART1 %" PRIu32 "\n",
2312            CPU_clk, PLB_clk, OPB_clk, EBC_clk, MAL_clk, PCI_clk,
2313            UART0_clk, UART1_clk);
2314 #endif
2315     /* Setup CPU clocks */
2316     clk_setup(&cpc->clk_setup[PPC405EP_CPU_CLK], CPU_clk);
2317     /* Setup PLB clock */
2318     clk_setup(&cpc->clk_setup[PPC405EP_PLB_CLK], PLB_clk);
2319     /* Setup OPB clock */
2320     clk_setup(&cpc->clk_setup[PPC405EP_OPB_CLK], OPB_clk);
2321     /* Setup external clock */
2322     clk_setup(&cpc->clk_setup[PPC405EP_EBC_CLK], EBC_clk);
2323     /* Setup MAL clock */
2324     clk_setup(&cpc->clk_setup[PPC405EP_MAL_CLK], MAL_clk);
2325     /* Setup PCI clock */
2326     clk_setup(&cpc->clk_setup[PPC405EP_PCI_CLK], PCI_clk);
2327     /* Setup UART0 clock */
2328     clk_setup(&cpc->clk_setup[PPC405EP_UART0_CLK], UART0_clk);
2329     /* Setup UART1 clock */
2330     clk_setup(&cpc->clk_setup[PPC405EP_UART1_CLK], UART1_clk);
2331 }
2332
2333 static uint32_t dcr_read_epcpc (void *opaque, int dcrn)
2334 {
2335     ppc405ep_cpc_t *cpc;
2336     uint32_t ret;
2337
2338     cpc = opaque;
2339     switch (dcrn) {
2340     case PPC405EP_CPC0_BOOT:
2341         ret = cpc->boot;
2342         break;
2343     case PPC405EP_CPC0_EPCTL:
2344         ret = cpc->epctl;
2345         break;
2346     case PPC405EP_CPC0_PLLMR0:
2347         ret = cpc->pllmr[0];
2348         break;
2349     case PPC405EP_CPC0_PLLMR1:
2350         ret = cpc->pllmr[1];
2351         break;
2352     case PPC405EP_CPC0_UCR:
2353         ret = cpc->ucr;
2354         break;
2355     case PPC405EP_CPC0_SRR:
2356         ret = cpc->srr;
2357         break;
2358     case PPC405EP_CPC0_JTAGID:
2359         ret = cpc->jtagid;
2360         break;
2361     case PPC405EP_CPC0_PCI:
2362         ret = cpc->pci;
2363         break;
2364     default:
2365         /* Avoid gcc warning */
2366         ret = 0;
2367         break;
2368     }
2369
2370     return ret;
2371 }
2372
2373 static void dcr_write_epcpc (void *opaque, int dcrn, uint32_t val)
2374 {
2375     ppc405ep_cpc_t *cpc;
2376
2377     cpc = opaque;
2378     switch (dcrn) {
2379     case PPC405EP_CPC0_BOOT:
2380         /* Read-only register */
2381         break;
2382     case PPC405EP_CPC0_EPCTL:
2383         /* Don't care for now */
2384         cpc->epctl = val & 0xC00000F3;
2385         break;
2386     case PPC405EP_CPC0_PLLMR0:
2387         cpc->pllmr[0] = val & 0x00633333;
2388         ppc405ep_compute_clocks(cpc);
2389         break;
2390     case PPC405EP_CPC0_PLLMR1:
2391         cpc->pllmr[1] = val & 0xC0F73FFF;
2392         ppc405ep_compute_clocks(cpc);
2393         break;
2394     case PPC405EP_CPC0_UCR:
2395         /* UART control - don't care for now */
2396         cpc->ucr = val & 0x003F7F7F;
2397         break;
2398     case PPC405EP_CPC0_SRR:
2399         cpc->srr = val;
2400         break;
2401     case PPC405EP_CPC0_JTAGID:
2402         /* Read-only */
2403         break;
2404     case PPC405EP_CPC0_PCI:
2405         cpc->pci = val;
2406         break;
2407     }
2408 }
2409
2410 static void ppc405ep_cpc_reset (void *opaque)
2411 {
2412     ppc405ep_cpc_t *cpc = opaque;
2413
2414     cpc->boot = 0x00000010;     /* Boot from PCI - IIC EEPROM disabled */
2415     cpc->epctl = 0x00000000;
2416     cpc->pllmr[0] = 0x00011010;
2417     cpc->pllmr[1] = 0x40000000;
2418     cpc->ucr = 0x00000000;
2419     cpc->srr = 0x00040000;
2420     cpc->pci = 0x00000000;
2421     cpc->er = 0x00000000;
2422     cpc->fr = 0x00000000;
2423     cpc->sr = 0x00000000;
2424     ppc405ep_compute_clocks(cpc);
2425 }
2426
2427 /* XXX: sysclk should be between 25 and 100 MHz */
2428 static void ppc405ep_cpc_init (CPUState *env, clk_setup_t clk_setup[8],
2429                                uint32_t sysclk)
2430 {
2431     ppc405ep_cpc_t *cpc;
2432
2433     cpc = qemu_mallocz(sizeof(ppc405ep_cpc_t));
2434     memcpy(cpc->clk_setup, clk_setup,
2435            PPC405EP_CLK_NB * sizeof(clk_setup_t));
2436     cpc->jtagid = 0x20267049;
2437     cpc->sysclk = sysclk;
2438     qemu_register_reset(&ppc405ep_cpc_reset, cpc);
2439     ppc_dcr_register(env, PPC405EP_CPC0_BOOT, cpc,
2440                      &dcr_read_epcpc, &dcr_write_epcpc);
2441     ppc_dcr_register(env, PPC405EP_CPC0_EPCTL, cpc,
2442                      &dcr_read_epcpc, &dcr_write_epcpc);
2443     ppc_dcr_register(env, PPC405EP_CPC0_PLLMR0, cpc,
2444                      &dcr_read_epcpc, &dcr_write_epcpc);
2445     ppc_dcr_register(env, PPC405EP_CPC0_PLLMR1, cpc,
2446                      &dcr_read_epcpc, &dcr_write_epcpc);
2447     ppc_dcr_register(env, PPC405EP_CPC0_UCR, cpc,
2448                      &dcr_read_epcpc, &dcr_write_epcpc);
2449     ppc_dcr_register(env, PPC405EP_CPC0_SRR, cpc,
2450                      &dcr_read_epcpc, &dcr_write_epcpc);
2451     ppc_dcr_register(env, PPC405EP_CPC0_JTAGID, cpc,
2452                      &dcr_read_epcpc, &dcr_write_epcpc);
2453     ppc_dcr_register(env, PPC405EP_CPC0_PCI, cpc,
2454                      &dcr_read_epcpc, &dcr_write_epcpc);
2455 #if 0
2456     ppc_dcr_register(env, PPC405EP_CPC0_ER, cpc,
2457                      &dcr_read_epcpc, &dcr_write_epcpc);
2458     ppc_dcr_register(env, PPC405EP_CPC0_FR, cpc,
2459                      &dcr_read_epcpc, &dcr_write_epcpc);
2460     ppc_dcr_register(env, PPC405EP_CPC0_SR, cpc,
2461                      &dcr_read_epcpc, &dcr_write_epcpc);
2462 #endif
2463 }
2464
2465 CPUState *ppc405ep_init (target_phys_addr_t ram_bases[2],
2466                          target_phys_addr_t ram_sizes[2],
2467                          uint32_t sysclk, qemu_irq **picp,
2468                          int do_init)
2469 {
2470     clk_setup_t clk_setup[PPC405EP_CLK_NB], tlb_clk_setup;
2471     qemu_irq dma_irqs[4], gpt_irqs[5], mal_irqs[4];
2472     CPUState *env;
2473     qemu_irq *pic, *irqs;
2474
2475     memset(clk_setup, 0, sizeof(clk_setup));
2476     /* init CPUs */
2477     env = ppc4xx_init("405ep", &clk_setup[PPC405EP_CPU_CLK],
2478                       &tlb_clk_setup, sysclk);
2479     clk_setup[PPC405EP_CPU_CLK].cb = tlb_clk_setup.cb;
2480     clk_setup[PPC405EP_CPU_CLK].opaque = tlb_clk_setup.opaque;
2481     /* Internal devices init */
2482     /* Memory mapped devices registers */
2483     /* PLB arbitrer */
2484     ppc4xx_plb_init(env);
2485     /* PLB to OPB bridge */
2486     ppc4xx_pob_init(env);
2487     /* OBP arbitrer */
2488     ppc4xx_opba_init(0xef600600);
2489     /* Universal interrupt controller */
2490     irqs = qemu_mallocz(sizeof(qemu_irq) * PPCUIC_OUTPUT_NB);
2491     irqs[PPCUIC_OUTPUT_INT] =
2492         ((qemu_irq *)env->irq_inputs)[PPC40x_INPUT_INT];
2493     irqs[PPCUIC_OUTPUT_CINT] =
2494         ((qemu_irq *)env->irq_inputs)[PPC40x_INPUT_CINT];
2495     pic = ppcuic_init(env, irqs, 0x0C0, 0, 1);
2496     *picp = pic;
2497     /* SDRAM controller */
2498         /* XXX 405EP has no ECC interrupt */
2499     ppc4xx_sdram_init(env, pic[17], 2, ram_bases, ram_sizes, do_init);
2500     /* External bus controller */
2501     ppc405_ebc_init(env);
2502     /* DMA controller */
2503     dma_irqs[0] = pic[5];
2504     dma_irqs[1] = pic[6];
2505     dma_irqs[2] = pic[7];
2506     dma_irqs[3] = pic[8];
2507     ppc405_dma_init(env, dma_irqs);
2508     /* IIC controller */
2509     ppc405_i2c_init(0xef600500, pic[2]);
2510     /* GPIO */
2511     ppc405_gpio_init(0xef600700);
2512     /* Serial ports */
2513     if (serial_hds[0] != NULL) {
2514         serial_mm_init(0xef600300, 0, pic[0], PPC_SERIAL_MM_BAUDBASE,
2515                        serial_hds[0], 1, 1);
2516     }
2517     if (serial_hds[1] != NULL) {
2518         serial_mm_init(0xef600400, 0, pic[1], PPC_SERIAL_MM_BAUDBASE,
2519                        serial_hds[1], 1, 1);
2520     }
2521     /* OCM */
2522     ppc405_ocm_init(env);
2523     /* GPT */
2524     gpt_irqs[0] = pic[19];
2525     gpt_irqs[1] = pic[20];
2526     gpt_irqs[2] = pic[21];
2527     gpt_irqs[3] = pic[22];
2528     gpt_irqs[4] = pic[23];
2529     ppc4xx_gpt_init(0xef600000, gpt_irqs);
2530     /* PCI */
2531     /* Uses pic[3], pic[16], pic[18] */
2532     /* MAL */
2533     mal_irqs[0] = pic[11];
2534     mal_irqs[1] = pic[12];
2535     mal_irqs[2] = pic[13];
2536     mal_irqs[3] = pic[14];
2537     ppc405_mal_init(env, mal_irqs);
2538     /* Ethernet */
2539     /* Uses pic[9], pic[15], pic[17] */
2540     /* CPU control */
2541     ppc405ep_cpc_init(env, clk_setup, sysclk);
2542
2543     return env;
2544 }