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