Statistics
| Branch: | Revision:

root / hw / ppc405_uc.c @ 99a0949b

History | View | Annotate | Download (65.8 kB)

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
a_ram_addr ppc405_set_bootinfo (CPUState *env, a_ppc4xx_bd_info *bd,
44
                                uint32_t flags)
45
{
46
    a_ram_addr 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);
52
    else
53
        bdloc = bd->bi_memsize - sizeof(struct ppc4xx_bd_info);
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_s_version[i]);
73
    stl_phys(bdloc + 0x5C, bd->bi_plb_busfreq);
74
    stl_phys(bdloc + 0x60, bd->bi_pci_busfreq);
75
    for (i = 0; i < 6; i++)
76
        stb_phys(bdloc + 0x64 + i, bd->bi_pci_enetaddr[i]);
77
    n = 0x6A;
78
    if (flags & 0x00000001) {
79
        for (i = 0; i < 6; i++)
80
            stb_phys(bdloc + n++, bd->bi_pci_enetaddr2[i]);
81
    }
82
    stl_phys(bdloc + n, bd->bi_opbfreq);
83
    n += 4;
84
    for (i = 0; i < 2; i++) {
85
        stl_phys(bdloc + n, bd->bi_iic_fast[i]);
86
        n += 4;
87
    }
88

    
89
    return bdloc;
90
}
91

    
92
/*****************************************************************************/
93
/* Shared peripherals */
94

    
95
/*****************************************************************************/
96
/* Peripheral local bus arbitrer */
97
enum {
98
    PLB0_BESR = 0x084,
99
    PLB0_BEAR = 0x086,
100
    PLB0_ACR  = 0x087,
101
};
102

    
103
typedef struct ppc4xx_plb a_ppc4xx_plb;
104
struct ppc4xx_plb {
105
    uint32_t acr;
106
    uint32_t bear;
107
    uint32_t besr;
108
};
109

    
110
static target_ulong dcr_read_plb (void *opaque, int dcrn)
111
{
112
    a_ppc4xx_plb *plb;
113
    target_ulong ret;
114

    
115
    plb = opaque;
116
    switch (dcrn) {
117
    case PLB0_ACR:
118
        ret = plb->acr;
119
        break;
120
    case PLB0_BEAR:
121
        ret = plb->bear;
122
        break;
123
    case PLB0_BESR:
124
        ret = plb->besr;
125
        break;
126
    default:
127
        /* Avoid gcc warning */
128
        ret = 0;
129
        break;
130
    }
131

    
132
    return ret;
133
}
134

    
135
static void dcr_write_plb (void *opaque, int dcrn, target_ulong val)
136
{
137
    a_ppc4xx_plb *plb;
138

    
139
    plb = opaque;
140
    switch (dcrn) {
141
    case PLB0_ACR:
142
        /* We don't care about the actual parameters written as
143
         * we don't manage any priorities on the bus
144
         */
145
        plb->acr = val & 0xF8000000;
146
        break;
147
    case PLB0_BEAR:
148
        /* Read only */
149
        break;
150
    case PLB0_BESR:
151
        /* Write-clear */
152
        plb->besr &= ~val;
153
        break;
154
    }
155
}
156

    
157
static void ppc4xx_plb_reset (void *opaque)
158
{
159
    a_ppc4xx_plb *plb;
160

    
161
    plb = opaque;
162
    plb->acr = 0x00000000;
163
    plb->bear = 0x00000000;
164
    plb->besr = 0x00000000;
165
}
166

    
167
static void ppc4xx_plb_init(CPUState *env)
168
{
169
    a_ppc4xx_plb *plb;
170

    
171
    plb = qemu_mallocz(sizeof(a_ppc4xx_plb));
172
    ppc_dcr_register(env, PLB0_ACR, plb, &dcr_read_plb, &dcr_write_plb);
173
    ppc_dcr_register(env, PLB0_BEAR, plb, &dcr_read_plb, &dcr_write_plb);
174
    ppc_dcr_register(env, PLB0_BESR, plb, &dcr_read_plb, &dcr_write_plb);
175
    ppc4xx_plb_reset(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 a_ppc4xx_pob;
188
struct ppc4xx_pob {
189
    uint32_t bear;
190
    uint32_t besr[2];
191
};
192

    
193
static target_ulong dcr_read_pob (void *opaque, int dcrn)
194
{
195
    a_ppc4xx_pob *pob;
196
    target_ulong 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, target_ulong val)
217
{
218
    a_ppc4xx_pob *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
    a_ppc4xx_pob *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
    a_ppc4xx_pob *pob;
247

    
248
    pob = qemu_mallocz(sizeof(a_ppc4xx_pob));
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
    ppc4xx_pob_reset(pob);
254
}
255

    
256
/*****************************************************************************/
257
/* OPB arbitrer */
258
typedef struct ppc4xx_opba a_ppc4xx_opba;
259
struct ppc4xx_opba {
260
    uint8_t cr;
261
    uint8_t pr;
262
};
263

    
264
static uint32_t opba_readb (void *opaque, a_target_phys_addr addr)
265
{
266
    a_ppc4xx_opba *opba;
267
    uint32_t ret;
268

    
269
#ifdef DEBUG_OPBA
270
    printf("%s: addr " TARGET_FMT_plx "\n", __func__, addr);
271
#endif
272
    opba = opaque;
273
    switch (addr) {
274
    case 0x00:
275
        ret = opba->cr;
276
        break;
277
    case 0x01:
278
        ret = opba->pr;
279
        break;
280
    default:
281
        ret = 0x00;
282
        break;
283
    }
284

    
285
    return ret;
286
}
287

    
288
static void opba_writeb (void *opaque,
289
                         a_target_phys_addr addr, uint32_t value)
290
{
291
    a_ppc4xx_opba *opba;
292

    
293
#ifdef DEBUG_OPBA
294
    printf("%s: addr " TARGET_FMT_plx " val %08" PRIx32 "\n", __func__, addr,
295
           value);
296
#endif
297
    opba = opaque;
298
    switch (addr) {
299
    case 0x00:
300
        opba->cr = value & 0xF8;
301
        break;
302
    case 0x01:
303
        opba->pr = value & 0xFF;
304
        break;
305
    default:
306
        break;
307
    }
308
}
309

    
310
static uint32_t opba_readw (void *opaque, a_target_phys_addr addr)
311
{
312
    uint32_t ret;
313

    
314
#ifdef DEBUG_OPBA
315
    printf("%s: addr " TARGET_FMT_plx "\n", __func__, addr);
316
#endif
317
    ret = opba_readb(opaque, addr) << 8;
318
    ret |= opba_readb(opaque, addr + 1);
319

    
320
    return ret;
321
}
322

    
323
static void opba_writew (void *opaque,
324
                         a_target_phys_addr addr, uint32_t value)
325
{
326
#ifdef DEBUG_OPBA
327
    printf("%s: addr " TARGET_FMT_plx " val %08" PRIx32 "\n", __func__, addr,
328
           value);
329
#endif
330
    opba_writeb(opaque, addr, value >> 8);
331
    opba_writeb(opaque, addr + 1, value);
332
}
333

    
334
static uint32_t opba_readl (void *opaque, a_target_phys_addr addr)
335
{
336
    uint32_t ret;
337

    
338
#ifdef DEBUG_OPBA
339
    printf("%s: addr " TARGET_FMT_plx "\n", __func__, addr);
340
#endif
341
    ret = opba_readb(opaque, addr) << 24;
342
    ret |= opba_readb(opaque, addr + 1) << 16;
343

    
344
    return ret;
345
}
346

    
347
static void opba_writel (void *opaque,
348
                         a_target_phys_addr addr, uint32_t value)
349
{
350
#ifdef DEBUG_OPBA
351
    printf("%s: addr " TARGET_FMT_plx " val %08" PRIx32 "\n", __func__, addr,
352
           value);
353
#endif
354
    opba_writeb(opaque, addr, value >> 24);
355
    opba_writeb(opaque, addr + 1, value >> 16);
356
}
357

    
358
static CPUReadMemoryFunc * const opba_read[] = {
359
    &opba_readb,
360
    &opba_readw,
361
    &opba_readl,
362
};
363

    
364
static CPUWriteMemoryFunc * const opba_write[] = {
365
    &opba_writeb,
366
    &opba_writew,
367
    &opba_writel,
368
};
369

    
370
static void ppc4xx_opba_reset (void *opaque)
371
{
372
    a_ppc4xx_opba *opba;
373

    
374
    opba = opaque;
375
    opba->cr = 0x00; /* No dynamic priorities - park disabled */
376
    opba->pr = 0x11;
377
}
378

    
379
static void ppc4xx_opba_init(a_target_phys_addr base)
380
{
381
    a_ppc4xx_opba *opba;
382
    int io;
383

    
384
    opba = qemu_mallocz(sizeof(a_ppc4xx_opba));
385
#ifdef DEBUG_OPBA
386
    printf("%s: offset " TARGET_FMT_plx "\n", __func__, base);
387
#endif
388
    io = cpu_register_io_memory(opba_read, opba_write, opba);
389
    cpu_register_physical_memory(base, 0x002, io);
390
    ppc4xx_opba_reset(opba);
391
    qemu_register_reset(ppc4xx_opba_reset, opba);
392
}
393

    
394
/*****************************************************************************/
395
/* Code decompression controller */
396
/* XXX: TODO */
397

    
398
/*****************************************************************************/
399
/* Peripheral controller */
400
typedef struct ppc4xx_ebc a_ppc4xx_ebc;
401
struct ppc4xx_ebc {
402
    uint32_t addr;
403
    uint32_t bcr[8];
404
    uint32_t bap[8];
405
    uint32_t bear;
406
    uint32_t besr0;
407
    uint32_t besr1;
408
    uint32_t cfg;
409
};
410

    
411
enum {
412
    EBC0_CFGADDR = 0x012,
413
    EBC0_CFGDATA = 0x013,
414
};
415

    
416
static target_ulong dcr_read_ebc (void *opaque, int dcrn)
417
{
418
    a_ppc4xx_ebc *ebc;
419
    target_ulong ret;
420

    
421
    ebc = opaque;
422
    switch (dcrn) {
423
    case EBC0_CFGADDR:
424
        ret = ebc->addr;
425
        break;
426
    case EBC0_CFGDATA:
427
        switch (ebc->addr) {
428
        case 0x00: /* B0CR */
429
            ret = ebc->bcr[0];
430
            break;
431
        case 0x01: /* B1CR */
432
            ret = ebc->bcr[1];
433
            break;
434
        case 0x02: /* B2CR */
435
            ret = ebc->bcr[2];
436
            break;
437
        case 0x03: /* B3CR */
438
            ret = ebc->bcr[3];
439
            break;
440
        case 0x04: /* B4CR */
441
            ret = ebc->bcr[4];
442
            break;
443
        case 0x05: /* B5CR */
444
            ret = ebc->bcr[5];
445
            break;
446
        case 0x06: /* B6CR */
447
            ret = ebc->bcr[6];
448
            break;
449
        case 0x07: /* B7CR */
450
            ret = ebc->bcr[7];
451
            break;
452
        case 0x10: /* B0AP */
453
            ret = ebc->bap[0];
454
            break;
455
        case 0x11: /* B1AP */
456
            ret = ebc->bap[1];
457
            break;
458
        case 0x12: /* B2AP */
459
            ret = ebc->bap[2];
460
            break;
461
        case 0x13: /* B3AP */
462
            ret = ebc->bap[3];
463
            break;
464
        case 0x14: /* B4AP */
465
            ret = ebc->bap[4];
466
            break;
467
        case 0x15: /* B5AP */
468
            ret = ebc->bap[5];
469
            break;
470
        case 0x16: /* B6AP */
471
            ret = ebc->bap[6];
472
            break;
473
        case 0x17: /* B7AP */
474
            ret = ebc->bap[7];
475
            break;
476
        case 0x20: /* BEAR */
477
            ret = ebc->bear;
478
            break;
479
        case 0x21: /* BESR0 */
480
            ret = ebc->besr0;
481
            break;
482
        case 0x22: /* BESR1 */
483
            ret = ebc->besr1;
484
            break;
485
        case 0x23: /* CFG */
486
            ret = ebc->cfg;
487
            break;
488
        default:
489
            ret = 0x00000000;
490
            break;
491
        }
492
    default:
493
        ret = 0x00000000;
494
        break;
495
    }
496

    
497
    return ret;
498
}
499

    
500
static void dcr_write_ebc (void *opaque, int dcrn, target_ulong val)
501
{
502
    a_ppc4xx_ebc *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
    a_ppc4xx_ebc *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
    a_ppc4xx_ebc *ebc;
581

    
582
    ebc = qemu_mallocz(sizeof(a_ppc4xx_ebc));
583
    ebc_reset(ebc);
584
    qemu_register_reset(&ebc_reset, ebc);
585
    ppc_dcr_register(env, EBC0_CFGADDR,
586
                     ebc, &dcr_read_ebc, &dcr_write_ebc);
587
    ppc_dcr_register(env, EBC0_CFGDATA,
588
                     ebc, &dcr_read_ebc, &dcr_write_ebc);
589
}
590

    
591
/*****************************************************************************/
592
/* DMA controller */
593
enum {
594
    DMA0_CR0 = 0x100,
595
    DMA0_CT0 = 0x101,
596
    DMA0_DA0 = 0x102,
597
    DMA0_SA0 = 0x103,
598
    DMA0_SG0 = 0x104,
599
    DMA0_CR1 = 0x108,
600
    DMA0_CT1 = 0x109,
601
    DMA0_DA1 = 0x10A,
602
    DMA0_SA1 = 0x10B,
603
    DMA0_SG1 = 0x10C,
604
    DMA0_CR2 = 0x110,
605
    DMA0_CT2 = 0x111,
606
    DMA0_DA2 = 0x112,
607
    DMA0_SA2 = 0x113,
608
    DMA0_SG2 = 0x114,
609
    DMA0_CR3 = 0x118,
610
    DMA0_CT3 = 0x119,
611
    DMA0_DA3 = 0x11A,
612
    DMA0_SA3 = 0x11B,
613
    DMA0_SG3 = 0x11C,
614
    DMA0_SR  = 0x120,
615
    DMA0_SGC = 0x123,
616
    DMA0_SLP = 0x125,
617
    DMA0_POL = 0x126,
618
};
619

    
620
typedef struct ppc405_dma a_ppc405_dma;
621
struct ppc405_dma {
622
    qemu_irq irqs[4];
623
    uint32_t cr[4];
624
    uint32_t ct[4];
625
    uint32_t da[4];
626
    uint32_t sa[4];
627
    uint32_t sg[4];
628
    uint32_t sr;
629
    uint32_t sgc;
630
    uint32_t slp;
631
    uint32_t pol;
632
};
633

    
634
static target_ulong dcr_read_dma (void *opaque, int dcrn)
635
{
636
    a_ppc405_dma *dma;
637

    
638
    dma = opaque;
639

    
640
    return 0;
641
}
642

    
643
static void dcr_write_dma (void *opaque, int dcrn, target_ulong val)
644
{
645
    a_ppc405_dma *dma;
646

    
647
    dma = opaque;
648
}
649

    
650
static void ppc405_dma_reset (void *opaque)
651
{
652
    a_ppc405_dma *dma;
653
    int i;
654

    
655
    dma = opaque;
656
    for (i = 0; i < 4; i++) {
657
        dma->cr[i] = 0x00000000;
658
        dma->ct[i] = 0x00000000;
659
        dma->da[i] = 0x00000000;
660
        dma->sa[i] = 0x00000000;
661
        dma->sg[i] = 0x00000000;
662
    }
663
    dma->sr = 0x00000000;
664
    dma->sgc = 0x00000000;
665
    dma->slp = 0x7C000000;
666
    dma->pol = 0x00000000;
667
}
668

    
669
static void ppc405_dma_init(CPUState *env, qemu_irq irqs[4])
670
{
671
    a_ppc405_dma *dma;
672

    
673
    dma = qemu_mallocz(sizeof(a_ppc405_dma));
674
    memcpy(dma->irqs, irqs, 4 * sizeof(qemu_irq));
675
    ppc405_dma_reset(dma);
676
    qemu_register_reset(&ppc405_dma_reset, dma);
677
    ppc_dcr_register(env, DMA0_CR0,
678
                     dma, &dcr_read_dma, &dcr_write_dma);
679
    ppc_dcr_register(env, DMA0_CT0,
680
                     dma, &dcr_read_dma, &dcr_write_dma);
681
    ppc_dcr_register(env, DMA0_DA0,
682
                     dma, &dcr_read_dma, &dcr_write_dma);
683
    ppc_dcr_register(env, DMA0_SA0,
684
                     dma, &dcr_read_dma, &dcr_write_dma);
685
    ppc_dcr_register(env, DMA0_SG0,
686
                     dma, &dcr_read_dma, &dcr_write_dma);
687
    ppc_dcr_register(env, DMA0_CR1,
688
                     dma, &dcr_read_dma, &dcr_write_dma);
689
    ppc_dcr_register(env, DMA0_CT1,
690
                     dma, &dcr_read_dma, &dcr_write_dma);
691
    ppc_dcr_register(env, DMA0_DA1,
692
                     dma, &dcr_read_dma, &dcr_write_dma);
693
    ppc_dcr_register(env, DMA0_SA1,
694
                     dma, &dcr_read_dma, &dcr_write_dma);
695
    ppc_dcr_register(env, DMA0_SG1,
696
                     dma, &dcr_read_dma, &dcr_write_dma);
697
    ppc_dcr_register(env, DMA0_CR2,
698
                     dma, &dcr_read_dma, &dcr_write_dma);
699
    ppc_dcr_register(env, DMA0_CT2,
700
                     dma, &dcr_read_dma, &dcr_write_dma);
701
    ppc_dcr_register(env, DMA0_DA2,
702
                     dma, &dcr_read_dma, &dcr_write_dma);
703
    ppc_dcr_register(env, DMA0_SA2,
704
                     dma, &dcr_read_dma, &dcr_write_dma);
705
    ppc_dcr_register(env, DMA0_SG2,
706
                     dma, &dcr_read_dma, &dcr_write_dma);
707
    ppc_dcr_register(env, DMA0_CR3,
708
                     dma, &dcr_read_dma, &dcr_write_dma);
709
    ppc_dcr_register(env, DMA0_CT3,
710
                     dma, &dcr_read_dma, &dcr_write_dma);
711
    ppc_dcr_register(env, DMA0_DA3,
712
                     dma, &dcr_read_dma, &dcr_write_dma);
713
    ppc_dcr_register(env, DMA0_SA3,
714
                     dma, &dcr_read_dma, &dcr_write_dma);
715
    ppc_dcr_register(env, DMA0_SG3,
716
                     dma, &dcr_read_dma, &dcr_write_dma);
717
    ppc_dcr_register(env, DMA0_SR,
718
                     dma, &dcr_read_dma, &dcr_write_dma);
719
    ppc_dcr_register(env, DMA0_SGC,
720
                     dma, &dcr_read_dma, &dcr_write_dma);
721
    ppc_dcr_register(env, DMA0_SLP,
722
                     dma, &dcr_read_dma, &dcr_write_dma);
723
    ppc_dcr_register(env, DMA0_POL,
724
                     dma, &dcr_read_dma, &dcr_write_dma);
725
}
726

    
727
/*****************************************************************************/
728
/* GPIO */
729
typedef struct ppc405_gpio a_ppc405_gpio;
730
struct ppc405_gpio {
731
    uint32_t or;
732
    uint32_t tcr;
733
    uint32_t osrh;
734
    uint32_t osrl;
735
    uint32_t tsrh;
736
    uint32_t tsrl;
737
    uint32_t odr;
738
    uint32_t ir;
739
    uint32_t rr1;
740
    uint32_t isr1h;
741
    uint32_t isr1l;
742
};
743

    
744
static uint32_t ppc405_gpio_readb (void *opaque, a_target_phys_addr addr)
745
{
746
    a_ppc405_gpio *gpio;
747

    
748
    gpio = opaque;
749
#ifdef DEBUG_GPIO
750
    printf("%s: addr " TARGET_FMT_plx "\n", __func__, addr);
751
#endif
752

    
753
    return 0;
754
}
755

    
756
static void ppc405_gpio_writeb (void *opaque,
757
                                a_target_phys_addr addr, uint32_t value)
758
{
759
    a_ppc405_gpio *gpio;
760

    
761
    gpio = opaque;
762
#ifdef DEBUG_GPIO
763
    printf("%s: addr " TARGET_FMT_plx " val %08" PRIx32 "\n", __func__, addr,
764
           value);
765
#endif
766
}
767

    
768
static uint32_t ppc405_gpio_readw (void *opaque, a_target_phys_addr addr)
769
{
770
    a_ppc405_gpio *gpio;
771

    
772
    gpio = opaque;
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_writew (void *opaque,
781
                                a_target_phys_addr addr, uint32_t value)
782
{
783
    a_ppc405_gpio *gpio;
784

    
785
    gpio = opaque;
786
#ifdef DEBUG_GPIO
787
    printf("%s: addr " TARGET_FMT_plx " val %08" PRIx32 "\n", __func__, addr,
788
           value);
789
#endif
790
}
791

    
792
static uint32_t ppc405_gpio_readl (void *opaque, a_target_phys_addr addr)
793
{
794
    a_ppc405_gpio *gpio;
795

    
796
    gpio = opaque;
797
#ifdef DEBUG_GPIO
798
    printf("%s: addr " TARGET_FMT_plx "\n", __func__, addr);
799
#endif
800

    
801
    return 0;
802
}
803

    
804
static void ppc405_gpio_writel (void *opaque,
805
                                a_target_phys_addr addr, uint32_t value)
806
{
807
    a_ppc405_gpio *gpio;
808

    
809
    gpio = opaque;
810
#ifdef DEBUG_GPIO
811
    printf("%s: addr " TARGET_FMT_plx " val %08" PRIx32 "\n", __func__, addr,
812
           value);
813
#endif
814
}
815

    
816
static CPUReadMemoryFunc * const ppc405_gpio_read[] = {
817
    &ppc405_gpio_readb,
818
    &ppc405_gpio_readw,
819
    &ppc405_gpio_readl,
820
};
821

    
822
static CPUWriteMemoryFunc * const ppc405_gpio_write[] = {
823
    &ppc405_gpio_writeb,
824
    &ppc405_gpio_writew,
825
    &ppc405_gpio_writel,
826
};
827

    
828
static void ppc405_gpio_reset (void *opaque)
829
{
830
    a_ppc405_gpio *gpio;
831

    
832
    gpio = opaque;
833
}
834

    
835
static void ppc405_gpio_init(a_target_phys_addr base)
836
{
837
    a_ppc405_gpio *gpio;
838
    int io;
839

    
840
    gpio = qemu_mallocz(sizeof(a_ppc405_gpio));
841
#ifdef DEBUG_GPIO
842
    printf("%s: offset " TARGET_FMT_plx "\n", __func__, base);
843
#endif
844
    io = cpu_register_io_memory(ppc405_gpio_read, ppc405_gpio_write, gpio);
845
    cpu_register_physical_memory(base, 0x038, io);
846
    ppc405_gpio_reset(gpio);
847
    qemu_register_reset(&ppc405_gpio_reset, gpio);
848
}
849

    
850
/*****************************************************************************/
851
/* On Chip Memory */
852
enum {
853
    OCM0_ISARC   = 0x018,
854
    OCM0_ISACNTL = 0x019,
855
    OCM0_DSARC   = 0x01A,
856
    OCM0_DSACNTL = 0x01B,
857
};
858

    
859
typedef struct ppc405_ocm a_ppc405_ocm;
860
struct ppc405_ocm {
861
    target_ulong offset;
862
    uint32_t isarc;
863
    uint32_t isacntl;
864
    uint32_t dsarc;
865
    uint32_t dsacntl;
866
};
867

    
868
static void ocm_update_mappings (a_ppc405_ocm *ocm,
869
                                 uint32_t isarc, uint32_t isacntl,
870
                                 uint32_t dsarc, uint32_t dsacntl)
871
{
872
#ifdef DEBUG_OCM
873
    printf("OCM update ISA %08" PRIx32 " %08" PRIx32 " (%08" PRIx32
874
           " %08" PRIx32 ") DSA %08" PRIx32 " %08" PRIx32
875
           " (%08" PRIx32 " %08" PRIx32 ")\n",
876
           isarc, isacntl, dsarc, dsacntl,
877
           ocm->isarc, ocm->isacntl, ocm->dsarc, ocm->dsacntl);
878
#endif
879
    if (ocm->isarc != isarc ||
880
        (ocm->isacntl & 0x80000000) != (isacntl & 0x80000000)) {
881
        if (ocm->isacntl & 0x80000000) {
882
            /* Unmap previously assigned memory region */
883
            printf("OCM unmap ISA %08" PRIx32 "\n", ocm->isarc);
884
            cpu_register_physical_memory(ocm->isarc, 0x04000000,
885
                                         IO_MEM_UNASSIGNED);
886
        }
887
        if (isacntl & 0x80000000) {
888
            /* Map new instruction memory region */
889
#ifdef DEBUG_OCM
890
            printf("OCM map ISA %08" PRIx32 "\n", isarc);
891
#endif
892
            cpu_register_physical_memory(isarc, 0x04000000,
893
                                         ocm->offset | IO_MEM_RAM);
894
        }
895
    }
896
    if (ocm->dsarc != dsarc ||
897
        (ocm->dsacntl & 0x80000000) != (dsacntl & 0x80000000)) {
898
        if (ocm->dsacntl & 0x80000000) {
899
            /* Beware not to unmap the region we just mapped */
900
            if (!(isacntl & 0x80000000) || ocm->dsarc != isarc) {
901
                /* Unmap previously assigned memory region */
902
#ifdef DEBUG_OCM
903
                printf("OCM unmap DSA %08" PRIx32 "\n", ocm->dsarc);
904
#endif
905
                cpu_register_physical_memory(ocm->dsarc, 0x04000000,
906
                                             IO_MEM_UNASSIGNED);
907
            }
908
        }
909
        if (dsacntl & 0x80000000) {
910
            /* Beware not to remap the region we just mapped */
911
            if (!(isacntl & 0x80000000) || dsarc != isarc) {
912
                /* Map new data memory region */
913
#ifdef DEBUG_OCM
914
                printf("OCM map DSA %08" PRIx32 "\n", dsarc);
915
#endif
916
                cpu_register_physical_memory(dsarc, 0x04000000,
917
                                             ocm->offset | IO_MEM_RAM);
918
            }
919
        }
920
    }
921
}
922

    
923
static target_ulong dcr_read_ocm (void *opaque, int dcrn)
924
{
925
    a_ppc405_ocm *ocm;
926
    target_ulong ret;
927

    
928
    ocm = opaque;
929
    switch (dcrn) {
930
    case OCM0_ISARC:
931
        ret = ocm->isarc;
932
        break;
933
    case OCM0_ISACNTL:
934
        ret = ocm->isacntl;
935
        break;
936
    case OCM0_DSARC:
937
        ret = ocm->dsarc;
938
        break;
939
    case OCM0_DSACNTL:
940
        ret = ocm->dsacntl;
941
        break;
942
    default:
943
        ret = 0;
944
        break;
945
    }
946

    
947
    return ret;
948
}
949

    
950
static void dcr_write_ocm (void *opaque, int dcrn, target_ulong val)
951
{
952
    a_ppc405_ocm *ocm;
953
    uint32_t isarc, dsarc, isacntl, dsacntl;
954

    
955
    ocm = opaque;
956
    isarc = ocm->isarc;
957
    dsarc = ocm->dsarc;
958
    isacntl = ocm->isacntl;
959
    dsacntl = ocm->dsacntl;
960
    switch (dcrn) {
961
    case OCM0_ISARC:
962
        isarc = val & 0xFC000000;
963
        break;
964
    case OCM0_ISACNTL:
965
        isacntl = val & 0xC0000000;
966
        break;
967
    case OCM0_DSARC:
968
        isarc = val & 0xFC000000;
969
        break;
970
    case OCM0_DSACNTL:
971
        isacntl = val & 0xC0000000;
972
        break;
973
    }
974
    ocm_update_mappings(ocm, isarc, isacntl, dsarc, dsacntl);
975
    ocm->isarc = isarc;
976
    ocm->dsarc = dsarc;
977
    ocm->isacntl = isacntl;
978
    ocm->dsacntl = dsacntl;
979
}
980

    
981
static void ocm_reset (void *opaque)
982
{
983
    a_ppc405_ocm *ocm;
984
    uint32_t isarc, dsarc, isacntl, dsacntl;
985

    
986
    ocm = opaque;
987
    isarc = 0x00000000;
988
    isacntl = 0x00000000;
989
    dsarc = 0x00000000;
990
    dsacntl = 0x00000000;
991
    ocm_update_mappings(ocm, isarc, isacntl, dsarc, dsacntl);
992
    ocm->isarc = isarc;
993
    ocm->dsarc = dsarc;
994
    ocm->isacntl = isacntl;
995
    ocm->dsacntl = dsacntl;
996
}
997

    
998
static void ppc405_ocm_init(CPUState *env)
999
{
1000
    a_ppc405_ocm *ocm;
1001

    
1002
    ocm = qemu_mallocz(sizeof(a_ppc405_ocm));
1003
    ocm->offset = qemu_ram_alloc(4096);
1004
    ocm_reset(ocm);
1005
    qemu_register_reset(&ocm_reset, ocm);
1006
    ppc_dcr_register(env, OCM0_ISARC,
1007
                     ocm, &dcr_read_ocm, &dcr_write_ocm);
1008
    ppc_dcr_register(env, OCM0_ISACNTL,
1009
                     ocm, &dcr_read_ocm, &dcr_write_ocm);
1010
    ppc_dcr_register(env, OCM0_DSARC,
1011
                     ocm, &dcr_read_ocm, &dcr_write_ocm);
1012
    ppc_dcr_register(env, OCM0_DSACNTL,
1013
                     ocm, &dcr_read_ocm, &dcr_write_ocm);
1014
}
1015

    
1016
/*****************************************************************************/
1017
/* I2C controller */
1018
typedef struct ppc4xx_i2c a_ppc4xx_i2c;
1019
struct ppc4xx_i2c {
1020
    qemu_irq irq;
1021
    uint8_t mdata;
1022
    uint8_t lmadr;
1023
    uint8_t hmadr;
1024
    uint8_t cntl;
1025
    uint8_t mdcntl;
1026
    uint8_t sts;
1027
    uint8_t extsts;
1028
    uint8_t sdata;
1029
    uint8_t lsadr;
1030
    uint8_t hsadr;
1031
    uint8_t clkdiv;
1032
    uint8_t intrmsk;
1033
    uint8_t xfrcnt;
1034
    uint8_t xtcntlss;
1035
    uint8_t directcntl;
1036
};
1037

    
1038
static uint32_t ppc4xx_i2c_readb (void *opaque, a_target_phys_addr addr)
1039
{
1040
    a_ppc4xx_i2c *i2c;
1041
    uint32_t ret;
1042

    
1043
#ifdef DEBUG_I2C
1044
    printf("%s: addr " TARGET_FMT_plx "\n", __func__, addr);
1045
#endif
1046
    i2c = opaque;
1047
    switch (addr) {
1048
    case 0x00:
1049
        //        i2c_readbyte(&i2c->mdata);
1050
        ret = i2c->mdata;
1051
        break;
1052
    case 0x02:
1053
        ret = i2c->sdata;
1054
        break;
1055
    case 0x04:
1056
        ret = i2c->lmadr;
1057
        break;
1058
    case 0x05:
1059
        ret = i2c->hmadr;
1060
        break;
1061
    case 0x06:
1062
        ret = i2c->cntl;
1063
        break;
1064
    case 0x07:
1065
        ret = i2c->mdcntl;
1066
        break;
1067
    case 0x08:
1068
        ret = i2c->sts;
1069
        break;
1070
    case 0x09:
1071
        ret = i2c->extsts;
1072
        break;
1073
    case 0x0A:
1074
        ret = i2c->lsadr;
1075
        break;
1076
    case 0x0B:
1077
        ret = i2c->hsadr;
1078
        break;
1079
    case 0x0C:
1080
        ret = i2c->clkdiv;
1081
        break;
1082
    case 0x0D:
1083
        ret = i2c->intrmsk;
1084
        break;
1085
    case 0x0E:
1086
        ret = i2c->xfrcnt;
1087
        break;
1088
    case 0x0F:
1089
        ret = i2c->xtcntlss;
1090
        break;
1091
    case 0x10:
1092
        ret = i2c->directcntl;
1093
        break;
1094
    default:
1095
        ret = 0x00;
1096
        break;
1097
    }
1098
#ifdef DEBUG_I2C
1099
    printf("%s: addr " TARGET_FMT_plx " %02" PRIx32 "\n", __func__, addr, ret);
1100
#endif
1101

    
1102
    return ret;
1103
}
1104

    
1105
static void ppc4xx_i2c_writeb (void *opaque,
1106
                               a_target_phys_addr addr, uint32_t value)
1107
{
1108
    a_ppc4xx_i2c *i2c;
1109

    
1110
#ifdef DEBUG_I2C
1111
    printf("%s: addr " TARGET_FMT_plx " val %08" PRIx32 "\n", __func__, addr,
1112
           value);
1113
#endif
1114
    i2c = opaque;
1115
    switch (addr) {
1116
    case 0x00:
1117
        i2c->mdata = value;
1118
        //        i2c_sendbyte(&i2c->mdata);
1119
        break;
1120
    case 0x02:
1121
        i2c->sdata = value;
1122
        break;
1123
    case 0x04:
1124
        i2c->lmadr = value;
1125
        break;
1126
    case 0x05:
1127
        i2c->hmadr = value;
1128
        break;
1129
    case 0x06:
1130
        i2c->cntl = value;
1131
        break;
1132
    case 0x07:
1133
        i2c->mdcntl = value & 0xDF;
1134
        break;
1135
    case 0x08:
1136
        i2c->sts &= ~(value & 0x0A);
1137
        break;
1138
    case 0x09:
1139
        i2c->extsts &= ~(value & 0x8F);
1140
        break;
1141
    case 0x0A:
1142
        i2c->lsadr = value;
1143
        break;
1144
    case 0x0B:
1145
        i2c->hsadr = value;
1146
        break;
1147
    case 0x0C:
1148
        i2c->clkdiv = value;
1149
        break;
1150
    case 0x0D:
1151
        i2c->intrmsk = value;
1152
        break;
1153
    case 0x0E:
1154
        i2c->xfrcnt = value & 0x77;
1155
        break;
1156
    case 0x0F:
1157
        i2c->xtcntlss = value;
1158
        break;
1159
    case 0x10:
1160
        i2c->directcntl = value & 0x7;
1161
        break;
1162
    }
1163
}
1164

    
1165
static uint32_t ppc4xx_i2c_readw (void *opaque, a_target_phys_addr addr)
1166
{
1167
    uint32_t ret;
1168

    
1169
#ifdef DEBUG_I2C
1170
    printf("%s: addr " TARGET_FMT_plx "\n", __func__, addr);
1171
#endif
1172
    ret = ppc4xx_i2c_readb(opaque, addr) << 8;
1173
    ret |= ppc4xx_i2c_readb(opaque, addr + 1);
1174

    
1175
    return ret;
1176
}
1177

    
1178
static void ppc4xx_i2c_writew (void *opaque,
1179
                               a_target_phys_addr addr, uint32_t value)
1180
{
1181
#ifdef DEBUG_I2C
1182
    printf("%s: addr " TARGET_FMT_plx " val %08" PRIx32 "\n", __func__, addr,
1183
           value);
1184
#endif
1185
    ppc4xx_i2c_writeb(opaque, addr, value >> 8);
1186
    ppc4xx_i2c_writeb(opaque, addr + 1, value);
1187
}
1188

    
1189
static uint32_t ppc4xx_i2c_readl (void *opaque, a_target_phys_addr addr)
1190
{
1191
    uint32_t ret;
1192

    
1193
#ifdef DEBUG_I2C
1194
    printf("%s: addr " TARGET_FMT_plx "\n", __func__, addr);
1195
#endif
1196
    ret = ppc4xx_i2c_readb(opaque, addr) << 24;
1197
    ret |= ppc4xx_i2c_readb(opaque, addr + 1) << 16;
1198
    ret |= ppc4xx_i2c_readb(opaque, addr + 2) << 8;
1199
    ret |= ppc4xx_i2c_readb(opaque, addr + 3);
1200

    
1201
    return ret;
1202
}
1203

    
1204
static void ppc4xx_i2c_writel (void *opaque,
1205
                               a_target_phys_addr addr, uint32_t value)
1206
{
1207
#ifdef DEBUG_I2C
1208
    printf("%s: addr " TARGET_FMT_plx " val %08" PRIx32 "\n", __func__, addr,
1209
           value);
1210
#endif
1211
    ppc4xx_i2c_writeb(opaque, addr, value >> 24);
1212
    ppc4xx_i2c_writeb(opaque, addr + 1, value >> 16);
1213
    ppc4xx_i2c_writeb(opaque, addr + 2, value >> 8);
1214
    ppc4xx_i2c_writeb(opaque, addr + 3, value);
1215
}
1216

    
1217
static CPUReadMemoryFunc * const i2c_read[] = {
1218
    &ppc4xx_i2c_readb,
1219
    &ppc4xx_i2c_readw,
1220
    &ppc4xx_i2c_readl,
1221
};
1222

    
1223
static CPUWriteMemoryFunc * const i2c_write[] = {
1224
    &ppc4xx_i2c_writeb,
1225
    &ppc4xx_i2c_writew,
1226
    &ppc4xx_i2c_writel,
1227
};
1228

    
1229
static void ppc4xx_i2c_reset (void *opaque)
1230
{
1231
    a_ppc4xx_i2c *i2c;
1232

    
1233
    i2c = opaque;
1234
    i2c->mdata = 0x00;
1235
    i2c->sdata = 0x00;
1236
    i2c->cntl = 0x00;
1237
    i2c->mdcntl = 0x00;
1238
    i2c->sts = 0x00;
1239
    i2c->extsts = 0x00;
1240
    i2c->clkdiv = 0x00;
1241
    i2c->xfrcnt = 0x00;
1242
    i2c->directcntl = 0x0F;
1243
}
1244

    
1245
static void ppc405_i2c_init(a_target_phys_addr base, qemu_irq irq)
1246
{
1247
    a_ppc4xx_i2c *i2c;
1248
    int io;
1249

    
1250
    i2c = qemu_mallocz(sizeof(a_ppc4xx_i2c));
1251
    i2c->irq = irq;
1252
#ifdef DEBUG_I2C
1253
    printf("%s: offset " TARGET_FMT_plx "\n", __func__, base);
1254
#endif
1255
    io = cpu_register_io_memory(i2c_read, i2c_write, i2c);
1256
    cpu_register_physical_memory(base, 0x011, io);
1257
    ppc4xx_i2c_reset(i2c);
1258
    qemu_register_reset(ppc4xx_i2c_reset, i2c);
1259
}
1260

    
1261
/*****************************************************************************/
1262
/* General purpose timers */
1263
typedef struct ppc4xx_gpt a_ppc4xx_gpt;
1264
struct ppc4xx_gpt {
1265
    int64_t tb_offset;
1266
    uint32_t tb_freq;
1267
    struct QEMUTimer *timer;
1268
    qemu_irq irqs[5];
1269
    uint32_t oe;
1270
    uint32_t ol;
1271
    uint32_t im;
1272
    uint32_t is;
1273
    uint32_t ie;
1274
    uint32_t comp[5];
1275
    uint32_t mask[5];
1276
};
1277

    
1278
static uint32_t ppc4xx_gpt_readb (void *opaque, a_target_phys_addr addr)
1279
{
1280
#ifdef DEBUG_GPT
1281
    printf("%s: addr " TARGET_FMT_plx "\n", __func__, addr);
1282
#endif
1283
    /* XXX: generate a bus fault */
1284
    return -1;
1285
}
1286

    
1287
static void ppc4xx_gpt_writeb (void *opaque,
1288
                               a_target_phys_addr addr, uint32_t value)
1289
{
1290
#ifdef DEBUG_I2C
1291
    printf("%s: addr " TARGET_FMT_plx " val %08" PRIx32 "\n", __func__, addr,
1292
           value);
1293
#endif
1294
    /* XXX: generate a bus fault */
1295
}
1296

    
1297
static uint32_t ppc4xx_gpt_readw (void *opaque, a_target_phys_addr addr)
1298
{
1299
#ifdef DEBUG_GPT
1300
    printf("%s: addr " TARGET_FMT_plx "\n", __func__, addr);
1301
#endif
1302
    /* XXX: generate a bus fault */
1303
    return -1;
1304
}
1305

    
1306
static void ppc4xx_gpt_writew (void *opaque,
1307
                               a_target_phys_addr addr, uint32_t value)
1308
{
1309
#ifdef DEBUG_I2C
1310
    printf("%s: addr " TARGET_FMT_plx " val %08" PRIx32 "\n", __func__, addr,
1311
           value);
1312
#endif
1313
    /* XXX: generate a bus fault */
1314
}
1315

    
1316
static int ppc4xx_gpt_compare (a_ppc4xx_gpt *gpt, int n)
1317
{
1318
    /* XXX: TODO */
1319
    return 0;
1320
}
1321

    
1322
static void ppc4xx_gpt_set_output (a_ppc4xx_gpt *gpt, int n, int level)
1323
{
1324
    /* XXX: TODO */
1325
}
1326

    
1327
static void ppc4xx_gpt_set_outputs (a_ppc4xx_gpt *gpt)
1328
{
1329
    uint32_t mask;
1330
    int i;
1331

    
1332
    mask = 0x80000000;
1333
    for (i = 0; i < 5; i++) {
1334
        if (gpt->oe & mask) {
1335
            /* Output is enabled */
1336
            if (ppc4xx_gpt_compare(gpt, i)) {
1337
                /* Comparison is OK */
1338
                ppc4xx_gpt_set_output(gpt, i, gpt->ol & mask);
1339
            } else {
1340
                /* Comparison is KO */
1341
                ppc4xx_gpt_set_output(gpt, i, gpt->ol & mask ? 0 : 1);
1342
            }
1343
        }
1344
        mask = mask >> 1;
1345
    }
1346
}
1347

    
1348
static void ppc4xx_gpt_set_irqs (a_ppc4xx_gpt *gpt)
1349
{
1350
    uint32_t mask;
1351
    int i;
1352

    
1353
    mask = 0x00008000;
1354
    for (i = 0; i < 5; i++) {
1355
        if (gpt->is & gpt->im & mask)
1356
            qemu_irq_raise(gpt->irqs[i]);
1357
        else
1358
            qemu_irq_lower(gpt->irqs[i]);
1359
        mask = mask >> 1;
1360
    }
1361
}
1362

    
1363
static void ppc4xx_gpt_compute_timer (a_ppc4xx_gpt *gpt)
1364
{
1365
    /* XXX: TODO */
1366
}
1367

    
1368
static uint32_t ppc4xx_gpt_readl (void *opaque, a_target_phys_addr addr)
1369
{
1370
    a_ppc4xx_gpt *gpt;
1371
    uint32_t ret;
1372
    int idx;
1373

    
1374
#ifdef DEBUG_GPT
1375
    printf("%s: addr " TARGET_FMT_plx "\n", __func__, addr);
1376
#endif
1377
    gpt = opaque;
1378
    switch (addr) {
1379
    case 0x00:
1380
        /* Time base counter */
1381
        ret = muldiv64(qemu_get_clock(vm_clock) + gpt->tb_offset,
1382
                       gpt->tb_freq, get_ticks_per_sec());
1383
        break;
1384
    case 0x10:
1385
        /* Output enable */
1386
        ret = gpt->oe;
1387
        break;
1388
    case 0x14:
1389
        /* Output level */
1390
        ret = gpt->ol;
1391
        break;
1392
    case 0x18:
1393
        /* Interrupt mask */
1394
        ret = gpt->im;
1395
        break;
1396
    case 0x1C:
1397
    case 0x20:
1398
        /* Interrupt status */
1399
        ret = gpt->is;
1400
        break;
1401
    case 0x24:
1402
        /* Interrupt enable */
1403
        ret = gpt->ie;
1404
        break;
1405
    case 0x80 ... 0x90:
1406
        /* Compare timer */
1407
        idx = (addr - 0x80) >> 2;
1408
        ret = gpt->comp[idx];
1409
        break;
1410
    case 0xC0 ... 0xD0:
1411
        /* Compare mask */
1412
        idx = (addr - 0xC0) >> 2;
1413
        ret = gpt->mask[idx];
1414
        break;
1415
    default:
1416
        ret = -1;
1417
        break;
1418
    }
1419

    
1420
    return ret;
1421
}
1422

    
1423
static void ppc4xx_gpt_writel (void *opaque,
1424
                               a_target_phys_addr addr, uint32_t value)
1425
{
1426
    a_ppc4xx_gpt *gpt;
1427
    int idx;
1428

    
1429
#ifdef DEBUG_I2C
1430
    printf("%s: addr " TARGET_FMT_plx " val %08" PRIx32 "\n", __func__, addr,
1431
           value);
1432
#endif
1433
    gpt = opaque;
1434
    switch (addr) {
1435
    case 0x00:
1436
        /* Time base counter */
1437
        gpt->tb_offset = muldiv64(value, get_ticks_per_sec(), gpt->tb_freq)
1438
            - qemu_get_clock(vm_clock);
1439
        ppc4xx_gpt_compute_timer(gpt);
1440
        break;
1441
    case 0x10:
1442
        /* Output enable */
1443
        gpt->oe = value & 0xF8000000;
1444
        ppc4xx_gpt_set_outputs(gpt);
1445
        break;
1446
    case 0x14:
1447
        /* Output level */
1448
        gpt->ol = value & 0xF8000000;
1449
        ppc4xx_gpt_set_outputs(gpt);
1450
        break;
1451
    case 0x18:
1452
        /* Interrupt mask */
1453
        gpt->im = value & 0x0000F800;
1454
        break;
1455
    case 0x1C:
1456
        /* Interrupt status set */
1457
        gpt->is |= value & 0x0000F800;
1458
        ppc4xx_gpt_set_irqs(gpt);
1459
        break;
1460
    case 0x20:
1461
        /* Interrupt status clear */
1462
        gpt->is &= ~(value & 0x0000F800);
1463
        ppc4xx_gpt_set_irqs(gpt);
1464
        break;
1465
    case 0x24:
1466
        /* Interrupt enable */
1467
        gpt->ie = value & 0x0000F800;
1468
        ppc4xx_gpt_set_irqs(gpt);
1469
        break;
1470
    case 0x80 ... 0x90:
1471
        /* Compare timer */
1472
        idx = (addr - 0x80) >> 2;
1473
        gpt->comp[idx] = value & 0xF8000000;
1474
        ppc4xx_gpt_compute_timer(gpt);
1475
        break;
1476
    case 0xC0 ... 0xD0:
1477
        /* Compare mask */
1478
        idx = (addr - 0xC0) >> 2;
1479
        gpt->mask[idx] = value & 0xF8000000;
1480
        ppc4xx_gpt_compute_timer(gpt);
1481
        break;
1482
    }
1483
}
1484

    
1485
static CPUReadMemoryFunc * const gpt_read[] = {
1486
    &ppc4xx_gpt_readb,
1487
    &ppc4xx_gpt_readw,
1488
    &ppc4xx_gpt_readl,
1489
};
1490

    
1491
static CPUWriteMemoryFunc * const gpt_write[] = {
1492
    &ppc4xx_gpt_writeb,
1493
    &ppc4xx_gpt_writew,
1494
    &ppc4xx_gpt_writel,
1495
};
1496

    
1497
static void ppc4xx_gpt_cb (void *opaque)
1498
{
1499
    a_ppc4xx_gpt *gpt;
1500

    
1501
    gpt = opaque;
1502
    ppc4xx_gpt_set_irqs(gpt);
1503
    ppc4xx_gpt_set_outputs(gpt);
1504
    ppc4xx_gpt_compute_timer(gpt);
1505
}
1506

    
1507
static void ppc4xx_gpt_reset (void *opaque)
1508
{
1509
    a_ppc4xx_gpt *gpt;
1510
    int i;
1511

    
1512
    gpt = opaque;
1513
    qemu_del_timer(gpt->timer);
1514
    gpt->oe = 0x00000000;
1515
    gpt->ol = 0x00000000;
1516
    gpt->im = 0x00000000;
1517
    gpt->is = 0x00000000;
1518
    gpt->ie = 0x00000000;
1519
    for (i = 0; i < 5; i++) {
1520
        gpt->comp[i] = 0x00000000;
1521
        gpt->mask[i] = 0x00000000;
1522
    }
1523
}
1524

    
1525
static void ppc4xx_gpt_init(a_target_phys_addr base, qemu_irq irqs[5])
1526
{
1527
    a_ppc4xx_gpt *gpt;
1528
    int i;
1529
    int io;
1530

    
1531
    gpt = qemu_mallocz(sizeof(a_ppc4xx_gpt));
1532
    for (i = 0; i < 5; i++) {
1533
        gpt->irqs[i] = irqs[i];
1534
    }
1535
    gpt->timer = qemu_new_timer(vm_clock, &ppc4xx_gpt_cb, gpt);
1536
#ifdef DEBUG_GPT
1537
    printf("%s: offset " TARGET_FMT_plx "\n", __func__, base);
1538
#endif
1539
    io = cpu_register_io_memory(gpt_read, gpt_write, gpt);
1540
    cpu_register_physical_memory(base, 0x0d4, io);
1541
    qemu_register_reset(ppc4xx_gpt_reset, gpt);
1542
    ppc4xx_gpt_reset(gpt);
1543
}
1544

    
1545
/*****************************************************************************/
1546
/* MAL */
1547
enum {
1548
    MAL0_CFG      = 0x180,
1549
    MAL0_ESR      = 0x181,
1550
    MAL0_IER      = 0x182,
1551
    MAL0_TXCASR   = 0x184,
1552
    MAL0_TXCARR   = 0x185,
1553
    MAL0_TXEOBISR = 0x186,
1554
    MAL0_TXDEIR   = 0x187,
1555
    MAL0_RXCASR   = 0x190,
1556
    MAL0_RXCARR   = 0x191,
1557
    MAL0_RXEOBISR = 0x192,
1558
    MAL0_RXDEIR   = 0x193,
1559
    MAL0_TXCTP0R  = 0x1A0,
1560
    MAL0_TXCTP1R  = 0x1A1,
1561
    MAL0_TXCTP2R  = 0x1A2,
1562
    MAL0_TXCTP3R  = 0x1A3,
1563
    MAL0_RXCTP0R  = 0x1C0,
1564
    MAL0_RXCTP1R  = 0x1C1,
1565
    MAL0_RCBS0    = 0x1E0,
1566
    MAL0_RCBS1    = 0x1E1,
1567
};
1568

    
1569
typedef struct ppc40x_mal a_ppc40x_mal;
1570
struct ppc40x_mal {
1571
    qemu_irq irqs[4];
1572
    uint32_t cfg;
1573
    uint32_t esr;
1574
    uint32_t ier;
1575
    uint32_t txcasr;
1576
    uint32_t txcarr;
1577
    uint32_t txeobisr;
1578
    uint32_t txdeir;
1579
    uint32_t rxcasr;
1580
    uint32_t rxcarr;
1581
    uint32_t rxeobisr;
1582
    uint32_t rxdeir;
1583
    uint32_t txctpr[4];
1584
    uint32_t rxctpr[2];
1585
    uint32_t rcbs[2];
1586
};
1587

    
1588
static void ppc40x_mal_reset (void *opaque);
1589

    
1590
static target_ulong dcr_read_mal (void *opaque, int dcrn)
1591
{
1592
    a_ppc40x_mal *mal;
1593
    target_ulong ret;
1594

    
1595
    mal = opaque;
1596
    switch (dcrn) {
1597
    case MAL0_CFG:
1598
        ret = mal->cfg;
1599
        break;
1600
    case MAL0_ESR:
1601
        ret = mal->esr;
1602
        break;
1603
    case MAL0_IER:
1604
        ret = mal->ier;
1605
        break;
1606
    case MAL0_TXCASR:
1607
        ret = mal->txcasr;
1608
        break;
1609
    case MAL0_TXCARR:
1610
        ret = mal->txcarr;
1611
        break;
1612
    case MAL0_TXEOBISR:
1613
        ret = mal->txeobisr;
1614
        break;
1615
    case MAL0_TXDEIR:
1616
        ret = mal->txdeir;
1617
        break;
1618
    case MAL0_RXCASR:
1619
        ret = mal->rxcasr;
1620
        break;
1621
    case MAL0_RXCARR:
1622
        ret = mal->rxcarr;
1623
        break;
1624
    case MAL0_RXEOBISR:
1625
        ret = mal->rxeobisr;
1626
        break;
1627
    case MAL0_RXDEIR:
1628
        ret = mal->rxdeir;
1629
        break;
1630
    case MAL0_TXCTP0R:
1631
        ret = mal->txctpr[0];
1632
        break;
1633
    case MAL0_TXCTP1R:
1634
        ret = mal->txctpr[1];
1635
        break;
1636
    case MAL0_TXCTP2R:
1637
        ret = mal->txctpr[2];
1638
        break;
1639
    case MAL0_TXCTP3R:
1640
        ret = mal->txctpr[3];
1641
        break;
1642
    case MAL0_RXCTP0R:
1643
        ret = mal->rxctpr[0];
1644
        break;
1645
    case MAL0_RXCTP1R:
1646
        ret = mal->rxctpr[1];
1647
        break;
1648
    case MAL0_RCBS0:
1649
        ret = mal->rcbs[0];
1650
        break;
1651
    case MAL0_RCBS1:
1652
        ret = mal->rcbs[1];
1653
        break;
1654
    default:
1655
        ret = 0;
1656
        break;
1657
    }
1658

    
1659
    return ret;
1660
}
1661

    
1662
static void dcr_write_mal (void *opaque, int dcrn, target_ulong val)
1663
{
1664
    a_ppc40x_mal *mal;
1665
    int idx;
1666

    
1667
    mal = opaque;
1668
    switch (dcrn) {
1669
    case MAL0_CFG:
1670
        if (val & 0x80000000)
1671
            ppc40x_mal_reset(mal);
1672
        mal->cfg = val & 0x00FFC087;
1673
        break;
1674
    case MAL0_ESR:
1675
        /* Read/clear */
1676
        mal->esr &= ~val;
1677
        break;
1678
    case MAL0_IER:
1679
        mal->ier = val & 0x0000001F;
1680
        break;
1681
    case MAL0_TXCASR:
1682
        mal->txcasr = val & 0xF0000000;
1683
        break;
1684
    case MAL0_TXCARR:
1685
        mal->txcarr = val & 0xF0000000;
1686
        break;
1687
    case MAL0_TXEOBISR:
1688
        /* Read/clear */
1689
        mal->txeobisr &= ~val;
1690
        break;
1691
    case MAL0_TXDEIR:
1692
        /* Read/clear */
1693
        mal->txdeir &= ~val;
1694
        break;
1695
    case MAL0_RXCASR:
1696
        mal->rxcasr = val & 0xC0000000;
1697
        break;
1698
    case MAL0_RXCARR:
1699
        mal->rxcarr = val & 0xC0000000;
1700
        break;
1701
    case MAL0_RXEOBISR:
1702
        /* Read/clear */
1703
        mal->rxeobisr &= ~val;
1704
        break;
1705
    case MAL0_RXDEIR:
1706
        /* Read/clear */
1707
        mal->rxdeir &= ~val;
1708
        break;
1709
    case MAL0_TXCTP0R:
1710
        idx = 0;
1711
        goto update_tx_ptr;
1712
    case MAL0_TXCTP1R:
1713
        idx = 1;
1714
        goto update_tx_ptr;
1715
    case MAL0_TXCTP2R:
1716
        idx = 2;
1717
        goto update_tx_ptr;
1718
    case MAL0_TXCTP3R:
1719
        idx = 3;
1720
    update_tx_ptr:
1721
        mal->txctpr[idx] = val;
1722
        break;
1723
    case MAL0_RXCTP0R:
1724
        idx = 0;
1725
        goto update_rx_ptr;
1726
    case MAL0_RXCTP1R:
1727
        idx = 1;
1728
    update_rx_ptr:
1729
        mal->rxctpr[idx] = val;
1730
        break;
1731
    case MAL0_RCBS0:
1732
        idx = 0;
1733
        goto update_rx_size;
1734
    case MAL0_RCBS1:
1735
        idx = 1;
1736
    update_rx_size:
1737
        mal->rcbs[idx] = val & 0x000000FF;
1738
        break;
1739
    }
1740
}
1741

    
1742
static void ppc40x_mal_reset (void *opaque)
1743
{
1744
    a_ppc40x_mal *mal;
1745

    
1746
    mal = opaque;
1747
    mal->cfg = 0x0007C000;
1748
    mal->esr = 0x00000000;
1749
    mal->ier = 0x00000000;
1750
    mal->rxcasr = 0x00000000;
1751
    mal->rxdeir = 0x00000000;
1752
    mal->rxeobisr = 0x00000000;
1753
    mal->txcasr = 0x00000000;
1754
    mal->txdeir = 0x00000000;
1755
    mal->txeobisr = 0x00000000;
1756
}
1757

    
1758
static void ppc405_mal_init(CPUState *env, qemu_irq irqs[4])
1759
{
1760
    a_ppc40x_mal *mal;
1761
    int i;
1762

    
1763
    mal = qemu_mallocz(sizeof(a_ppc40x_mal));
1764
    for (i = 0; i < 4; i++)
1765
        mal->irqs[i] = irqs[i];
1766
    ppc40x_mal_reset(mal);
1767
    qemu_register_reset(&ppc40x_mal_reset, mal);
1768
    ppc_dcr_register(env, MAL0_CFG,
1769
                     mal, &dcr_read_mal, &dcr_write_mal);
1770
    ppc_dcr_register(env, MAL0_ESR,
1771
                     mal, &dcr_read_mal, &dcr_write_mal);
1772
    ppc_dcr_register(env, MAL0_IER,
1773
                     mal, &dcr_read_mal, &dcr_write_mal);
1774
    ppc_dcr_register(env, MAL0_TXCASR,
1775
                     mal, &dcr_read_mal, &dcr_write_mal);
1776
    ppc_dcr_register(env, MAL0_TXCARR,
1777
                     mal, &dcr_read_mal, &dcr_write_mal);
1778
    ppc_dcr_register(env, MAL0_TXEOBISR,
1779
                     mal, &dcr_read_mal, &dcr_write_mal);
1780
    ppc_dcr_register(env, MAL0_TXDEIR,
1781
                     mal, &dcr_read_mal, &dcr_write_mal);
1782
    ppc_dcr_register(env, MAL0_RXCASR,
1783
                     mal, &dcr_read_mal, &dcr_write_mal);
1784
    ppc_dcr_register(env, MAL0_RXCARR,
1785
                     mal, &dcr_read_mal, &dcr_write_mal);
1786
    ppc_dcr_register(env, MAL0_RXEOBISR,
1787
                     mal, &dcr_read_mal, &dcr_write_mal);
1788
    ppc_dcr_register(env, MAL0_RXDEIR,
1789
                     mal, &dcr_read_mal, &dcr_write_mal);
1790
    ppc_dcr_register(env, MAL0_TXCTP0R,
1791
                     mal, &dcr_read_mal, &dcr_write_mal);
1792
    ppc_dcr_register(env, MAL0_TXCTP1R,
1793
                     mal, &dcr_read_mal, &dcr_write_mal);
1794
    ppc_dcr_register(env, MAL0_TXCTP2R,
1795
                     mal, &dcr_read_mal, &dcr_write_mal);
1796
    ppc_dcr_register(env, MAL0_TXCTP3R,
1797
                     mal, &dcr_read_mal, &dcr_write_mal);
1798
    ppc_dcr_register(env, MAL0_RXCTP0R,
1799
                     mal, &dcr_read_mal, &dcr_write_mal);
1800
    ppc_dcr_register(env, MAL0_RXCTP1R,
1801
                     mal, &dcr_read_mal, &dcr_write_mal);
1802
    ppc_dcr_register(env, MAL0_RCBS0,
1803
                     mal, &dcr_read_mal, &dcr_write_mal);
1804
    ppc_dcr_register(env, MAL0_RCBS1,
1805
                     mal, &dcr_read_mal, &dcr_write_mal);
1806
}
1807

    
1808
/*****************************************************************************/
1809
/* SPR */
1810
void ppc40x_core_reset (CPUState *env)
1811
{
1812
    target_ulong dbsr;
1813

    
1814
    printf("Reset PowerPC core\n");
1815
    env->interrupt_request |= CPU_INTERRUPT_EXITTB;
1816
    /* XXX: TOFIX */
1817
#if 0
1818
    cpu_ppc_reset(env);
1819
#else
1820
    qemu_system_reset_request();
1821
#endif
1822
    dbsr = env->spr[SPR_40x_DBSR];
1823
    dbsr &= ~0x00000300;
1824
    dbsr |= 0x00000100;
1825
    env->spr[SPR_40x_DBSR] = dbsr;
1826
}
1827

    
1828
void ppc40x_chip_reset (CPUState *env)
1829
{
1830
    target_ulong dbsr;
1831

    
1832
    printf("Reset PowerPC chip\n");
1833
    env->interrupt_request |= CPU_INTERRUPT_EXITTB;
1834
    /* XXX: TOFIX */
1835
#if 0
1836
    cpu_ppc_reset(env);
1837
#else
1838
    qemu_system_reset_request();
1839
#endif
1840
    /* XXX: TODO reset all internal peripherals */
1841
    dbsr = env->spr[SPR_40x_DBSR];
1842
    dbsr &= ~0x00000300;
1843
    dbsr |= 0x00000200;
1844
    env->spr[SPR_40x_DBSR] = dbsr;
1845
}
1846

    
1847
void ppc40x_system_reset (CPUState *env)
1848
{
1849
    printf("Reset PowerPC system\n");
1850
    qemu_system_reset_request();
1851
}
1852

    
1853
void store_40x_dbcr0 (CPUState *env, uint32_t val)
1854
{
1855
    switch ((val >> 28) & 0x3) {
1856
    case 0x0:
1857
        /* No action */
1858
        break;
1859
    case 0x1:
1860
        /* Core reset */
1861
        ppc40x_core_reset(env);
1862
        break;
1863
    case 0x2:
1864
        /* Chip reset */
1865
        ppc40x_chip_reset(env);
1866
        break;
1867
    case 0x3:
1868
        /* System reset */
1869
        ppc40x_system_reset(env);
1870
        break;
1871
    }
1872
}
1873

    
1874
/*****************************************************************************/
1875
/* PowerPC 405CR */
1876
enum {
1877
    PPC405CR_CPC0_PLLMR  = 0x0B0,
1878
    PPC405CR_CPC0_CR0    = 0x0B1,
1879
    PPC405CR_CPC0_CR1    = 0x0B2,
1880
    PPC405CR_CPC0_PSR    = 0x0B4,
1881
    PPC405CR_CPC0_JTAGID = 0x0B5,
1882
    PPC405CR_CPC0_ER     = 0x0B9,
1883
    PPC405CR_CPC0_FR     = 0x0BA,
1884
    PPC405CR_CPC0_SR     = 0x0BB,
1885
};
1886

    
1887
enum {
1888
    PPC405CR_CPU_CLK   = 0,
1889
    PPC405CR_TMR_CLK   = 1,
1890
    PPC405CR_PLB_CLK   = 2,
1891
    PPC405CR_SDRAM_CLK = 3,
1892
    PPC405CR_OPB_CLK   = 4,
1893
    PPC405CR_EXT_CLK   = 5,
1894
    PPC405CR_UART_CLK  = 6,
1895
    PPC405CR_CLK_NB    = 7,
1896
};
1897

    
1898
typedef struct ppc405cr_cpc a_ppc405cr_cpc;
1899
struct ppc405cr_cpc {
1900
    a_clk_setup clk_setup[PPC405CR_CLK_NB];
1901
    uint32_t sysclk;
1902
    uint32_t psr;
1903
    uint32_t cr0;
1904
    uint32_t cr1;
1905
    uint32_t jtagid;
1906
    uint32_t pllmr;
1907
    uint32_t er;
1908
    uint32_t fr;
1909
};
1910

    
1911
static void ppc405cr_clk_setup (a_ppc405cr_cpc *cpc)
1912
{
1913
    uint64_t VCO_out, PLL_out;
1914
    uint32_t CPU_clk, TMR_clk, SDRAM_clk, PLB_clk, OPB_clk, EXT_clk, UART_clk;
1915
    int M, D0, D1, D2;
1916

    
1917
    D0 = ((cpc->pllmr >> 26) & 0x3) + 1; /* CBDV */
1918
    if (cpc->pllmr & 0x80000000) {
1919
        D1 = (((cpc->pllmr >> 20) - 1) & 0xF) + 1; /* FBDV */
1920
        D2 = 8 - ((cpc->pllmr >> 16) & 0x7); /* FWDVA */
1921
        M = D0 * D1 * D2;
1922
        VCO_out = cpc->sysclk * M;
1923
        if (VCO_out < 400000000 || VCO_out > 800000000) {
1924
            /* PLL cannot lock */
1925
            cpc->pllmr &= ~0x80000000;
1926
            goto bypass_pll;
1927
        }
1928
        PLL_out = VCO_out / D2;
1929
    } else {
1930
        /* Bypass PLL */
1931
    bypass_pll:
1932
        M = D0;
1933
        PLL_out = cpc->sysclk * M;
1934
    }
1935
    CPU_clk = PLL_out;
1936
    if (cpc->cr1 & 0x00800000)
1937
        TMR_clk = cpc->sysclk; /* Should have a separate clock */
1938
    else
1939
        TMR_clk = CPU_clk;
1940
    PLB_clk = CPU_clk / D0;
1941
    SDRAM_clk = PLB_clk;
1942
    D0 = ((cpc->pllmr >> 10) & 0x3) + 1;
1943
    OPB_clk = PLB_clk / D0;
1944
    D0 = ((cpc->pllmr >> 24) & 0x3) + 2;
1945
    EXT_clk = PLB_clk / D0;
1946
    D0 = ((cpc->cr0 >> 1) & 0x1F) + 1;
1947
    UART_clk = CPU_clk / D0;
1948
    /* Setup CPU clocks */
1949
    clk_setup(&cpc->clk_setup[PPC405CR_CPU_CLK], CPU_clk);
1950
    /* Setup time-base clock */
1951
    clk_setup(&cpc->clk_setup[PPC405CR_TMR_CLK], TMR_clk);
1952
    /* Setup PLB clock */
1953
    clk_setup(&cpc->clk_setup[PPC405CR_PLB_CLK], PLB_clk);
1954
    /* Setup SDRAM clock */
1955
    clk_setup(&cpc->clk_setup[PPC405CR_SDRAM_CLK], SDRAM_clk);
1956
    /* Setup OPB clock */
1957
    clk_setup(&cpc->clk_setup[PPC405CR_OPB_CLK], OPB_clk);
1958
    /* Setup external clock */
1959
    clk_setup(&cpc->clk_setup[PPC405CR_EXT_CLK], EXT_clk);
1960
    /* Setup UART clock */
1961
    clk_setup(&cpc->clk_setup[PPC405CR_UART_CLK], UART_clk);
1962
}
1963

    
1964
static target_ulong dcr_read_crcpc (void *opaque, int dcrn)
1965
{
1966
    a_ppc405cr_cpc *cpc;
1967
    target_ulong ret;
1968

    
1969
    cpc = opaque;
1970
    switch (dcrn) {
1971
    case PPC405CR_CPC0_PLLMR:
1972
        ret = cpc->pllmr;
1973
        break;
1974
    case PPC405CR_CPC0_CR0:
1975
        ret = cpc->cr0;
1976
        break;
1977
    case PPC405CR_CPC0_CR1:
1978
        ret = cpc->cr1;
1979
        break;
1980
    case PPC405CR_CPC0_PSR:
1981
        ret = cpc->psr;
1982
        break;
1983
    case PPC405CR_CPC0_JTAGID:
1984
        ret = cpc->jtagid;
1985
        break;
1986
    case PPC405CR_CPC0_ER:
1987
        ret = cpc->er;
1988
        break;
1989
    case PPC405CR_CPC0_FR:
1990
        ret = cpc->fr;
1991
        break;
1992
    case PPC405CR_CPC0_SR:
1993
        ret = ~(cpc->er | cpc->fr) & 0xFFFF0000;
1994
        break;
1995
    default:
1996
        /* Avoid gcc warning */
1997
        ret = 0;
1998
        break;
1999
    }
2000

    
2001
    return ret;
2002
}
2003

    
2004
static void dcr_write_crcpc (void *opaque, int dcrn, target_ulong val)
2005
{
2006
    a_ppc405cr_cpc *cpc;
2007

    
2008
    cpc = opaque;
2009
    switch (dcrn) {
2010
    case PPC405CR_CPC0_PLLMR:
2011
        cpc->pllmr = val & 0xFFF77C3F;
2012
        break;
2013
    case PPC405CR_CPC0_CR0:
2014
        cpc->cr0 = val & 0x0FFFFFFE;
2015
        break;
2016
    case PPC405CR_CPC0_CR1:
2017
        cpc->cr1 = val & 0x00800000;
2018
        break;
2019
    case PPC405CR_CPC0_PSR:
2020
        /* Read-only */
2021
        break;
2022
    case PPC405CR_CPC0_JTAGID:
2023
        /* Read-only */
2024
        break;
2025
    case PPC405CR_CPC0_ER:
2026
        cpc->er = val & 0xBFFC0000;
2027
        break;
2028
    case PPC405CR_CPC0_FR:
2029
        cpc->fr = val & 0xBFFC0000;
2030
        break;
2031
    case PPC405CR_CPC0_SR:
2032
        /* Read-only */
2033
        break;
2034
    }
2035
}
2036

    
2037
static void ppc405cr_cpc_reset (void *opaque)
2038
{
2039
    a_ppc405cr_cpc *cpc;
2040
    int D;
2041

    
2042
    cpc = opaque;
2043
    /* Compute PLLMR value from PSR settings */
2044
    cpc->pllmr = 0x80000000;
2045
    /* PFWD */
2046
    switch ((cpc->psr >> 30) & 3) {
2047
    case 0:
2048
        /* Bypass */
2049
        cpc->pllmr &= ~0x80000000;
2050
        break;
2051
    case 1:
2052
        /* Divide by 3 */
2053
        cpc->pllmr |= 5 << 16;
2054
        break;
2055
    case 2:
2056
        /* Divide by 4 */
2057
        cpc->pllmr |= 4 << 16;
2058
        break;
2059
    case 3:
2060
        /* Divide by 6 */
2061
        cpc->pllmr |= 2 << 16;
2062
        break;
2063
    }
2064
    /* PFBD */
2065
    D = (cpc->psr >> 28) & 3;
2066
    cpc->pllmr |= (D + 1) << 20;
2067
    /* PT   */
2068
    D = (cpc->psr >> 25) & 7;
2069
    switch (D) {
2070
    case 0x2:
2071
        cpc->pllmr |= 0x13;
2072
        break;
2073
    case 0x4:
2074
        cpc->pllmr |= 0x15;
2075
        break;
2076
    case 0x5:
2077
        cpc->pllmr |= 0x16;
2078
        break;
2079
    default:
2080
        break;
2081
    }
2082
    /* PDC  */
2083
    D = (cpc->psr >> 23) & 3;
2084
    cpc->pllmr |= D << 26;
2085
    /* ODP  */
2086
    D = (cpc->psr >> 21) & 3;
2087
    cpc->pllmr |= D << 10;
2088
    /* EBPD */
2089
    D = (cpc->psr >> 17) & 3;
2090
    cpc->pllmr |= D << 24;
2091
    cpc->cr0 = 0x0000003C;
2092
    cpc->cr1 = 0x2B0D8800;
2093
    cpc->er = 0x00000000;
2094
    cpc->fr = 0x00000000;
2095
    ppc405cr_clk_setup(cpc);
2096
}
2097

    
2098
static void ppc405cr_clk_init (a_ppc405cr_cpc *cpc)
2099
{
2100
    int D;
2101

    
2102
    /* XXX: this should be read from IO pins */
2103
    cpc->psr = 0x00000000; /* 8 bits ROM */
2104
    /* PFWD */
2105
    D = 0x2; /* Divide by 4 */
2106
    cpc->psr |= D << 30;
2107
    /* PFBD */
2108
    D = 0x1; /* Divide by 2 */
2109
    cpc->psr |= D << 28;
2110
    /* PDC */
2111
    D = 0x1; /* Divide by 2 */
2112
    cpc->psr |= D << 23;
2113
    /* PT */
2114
    D = 0x5; /* M = 16 */
2115
    cpc->psr |= D << 25;
2116
    /* ODP */
2117
    D = 0x1; /* Divide by 2 */
2118
    cpc->psr |= D << 21;
2119
    /* EBDP */
2120
    D = 0x2; /* Divide by 4 */
2121
    cpc->psr |= D << 17;
2122
}
2123

    
2124
static void ppc405cr_cpc_init (CPUState *env, a_clk_setup clk_setup[7],
2125
                               uint32_t sysclk)
2126
{
2127
    a_ppc405cr_cpc *cpc;
2128

    
2129
    cpc = qemu_mallocz(sizeof(a_ppc405cr_cpc));
2130
    memcpy(cpc->clk_setup, clk_setup,
2131
           PPC405CR_CLK_NB * sizeof(a_clk_setup));
2132
    cpc->sysclk = sysclk;
2133
    cpc->jtagid = 0x42051049;
2134
    ppc_dcr_register(env, PPC405CR_CPC0_PSR, cpc,
2135
                     &dcr_read_crcpc, &dcr_write_crcpc);
2136
    ppc_dcr_register(env, PPC405CR_CPC0_CR0, cpc,
2137
                     &dcr_read_crcpc, &dcr_write_crcpc);
2138
    ppc_dcr_register(env, PPC405CR_CPC0_CR1, cpc,
2139
                     &dcr_read_crcpc, &dcr_write_crcpc);
2140
    ppc_dcr_register(env, PPC405CR_CPC0_JTAGID, cpc,
2141
                     &dcr_read_crcpc, &dcr_write_crcpc);
2142
    ppc_dcr_register(env, PPC405CR_CPC0_PLLMR, cpc,
2143
                     &dcr_read_crcpc, &dcr_write_crcpc);
2144
    ppc_dcr_register(env, PPC405CR_CPC0_ER, cpc,
2145
                     &dcr_read_crcpc, &dcr_write_crcpc);
2146
    ppc_dcr_register(env, PPC405CR_CPC0_FR, cpc,
2147
                     &dcr_read_crcpc, &dcr_write_crcpc);
2148
    ppc_dcr_register(env, PPC405CR_CPC0_SR, cpc,
2149
                     &dcr_read_crcpc, &dcr_write_crcpc);
2150
    ppc405cr_clk_init(cpc);
2151
    qemu_register_reset(ppc405cr_cpc_reset, cpc);
2152
    ppc405cr_cpc_reset(cpc);
2153
}
2154

    
2155
CPUState *ppc405cr_init (a_target_phys_addr ram_bases[4],
2156
                         a_target_phys_addr ram_sizes[4],
2157
                         uint32_t sysclk, qemu_irq **picp,
2158
                         int do_init)
2159
{
2160
    a_clk_setup clk_setup[PPC405CR_CLK_NB];
2161
    qemu_irq dma_irqs[4];
2162
    CPUState *env;
2163
    qemu_irq *pic, *irqs;
2164

    
2165
    memset(clk_setup, 0, sizeof(clk_setup));
2166
    env = ppc4xx_init("405cr", &clk_setup[PPC405CR_CPU_CLK],
2167
                      &clk_setup[PPC405CR_TMR_CLK], sysclk);
2168
    /* Memory mapped devices registers */
2169
    /* PLB arbitrer */
2170
    ppc4xx_plb_init(env);
2171
    /* PLB to OPB bridge */
2172
    ppc4xx_pob_init(env);
2173
    /* OBP arbitrer */
2174
    ppc4xx_opba_init(0xef600600);
2175
    /* Universal interrupt controller */
2176
    irqs = qemu_mallocz(sizeof(qemu_irq) * PPCUIC_OUTPUT_NB);
2177
    irqs[PPCUIC_OUTPUT_INT] =
2178
        ((qemu_irq *)env->irq_inputs)[PPC40x_INPUT_INT];
2179
    irqs[PPCUIC_OUTPUT_CINT] =
2180
        ((qemu_irq *)env->irq_inputs)[PPC40x_INPUT_CINT];
2181
    pic = ppcuic_init(env, irqs, 0x0C0, 0, 1);
2182
    *picp = pic;
2183
    /* SDRAM controller */
2184
    ppc4xx_sdram_init(env, pic[14], 1, ram_bases, ram_sizes, do_init);
2185
    /* External bus controller */
2186
    ppc405_ebc_init(env);
2187
    /* DMA controller */
2188
    dma_irqs[0] = pic[26];
2189
    dma_irqs[1] = pic[25];
2190
    dma_irqs[2] = pic[24];
2191
    dma_irqs[3] = pic[23];
2192
    ppc405_dma_init(env, dma_irqs);
2193
    /* Serial ports */
2194
    if (serial_hds[0] != NULL) {
2195
        serial_mm_init(0xef600300, 0, pic[0], PPC_SERIAL_MM_BAUDBASE,
2196
                       serial_hds[0], 1);
2197
    }
2198
    if (serial_hds[1] != NULL) {
2199
        serial_mm_init(0xef600400, 0, pic[1], PPC_SERIAL_MM_BAUDBASE,
2200
                       serial_hds[1], 1);
2201
    }
2202
    /* IIC controller */
2203
    ppc405_i2c_init(0xef600500, pic[2]);
2204
    /* GPIO */
2205
    ppc405_gpio_init(0xef600700);
2206
    /* CPU control */
2207
    ppc405cr_cpc_init(env, clk_setup, sysclk);
2208

    
2209
    return env;
2210
}
2211

    
2212
/*****************************************************************************/
2213
/* PowerPC 405EP */
2214
/* CPU control */
2215
enum {
2216
    PPC405EP_CPC0_PLLMR0 = 0x0F0,
2217
    PPC405EP_CPC0_BOOT   = 0x0F1,
2218
    PPC405EP_CPC0_EPCTL  = 0x0F3,
2219
    PPC405EP_CPC0_PLLMR1 = 0x0F4,
2220
    PPC405EP_CPC0_UCR    = 0x0F5,
2221
    PPC405EP_CPC0_SRR    = 0x0F6,
2222
    PPC405EP_CPC0_JTAGID = 0x0F7,
2223
    PPC405EP_CPC0_PCI    = 0x0F9,
2224
#if 0
2225
    PPC405EP_CPC0_ER     = xxx,
2226
    PPC405EP_CPC0_FR     = xxx,
2227
    PPC405EP_CPC0_SR     = xxx,
2228
#endif
2229
};
2230

    
2231
enum {
2232
    PPC405EP_CPU_CLK   = 0,
2233
    PPC405EP_PLB_CLK   = 1,
2234
    PPC405EP_OPB_CLK   = 2,
2235
    PPC405EP_EBC_CLK   = 3,
2236
    PPC405EP_MAL_CLK   = 4,
2237
    PPC405EP_PCI_CLK   = 5,
2238
    PPC405EP_UART0_CLK = 6,
2239
    PPC405EP_UART1_CLK = 7,
2240
    PPC405EP_CLK_NB    = 8,
2241
};
2242

    
2243
typedef struct ppc405ep_cpc a_ppc405ep_cpc;
2244
struct ppc405ep_cpc {
2245
    uint32_t sysclk;
2246
    a_clk_setup clk_setup[PPC405EP_CLK_NB];
2247
    uint32_t boot;
2248
    uint32_t epctl;
2249
    uint32_t pllmr[2];
2250
    uint32_t ucr;
2251
    uint32_t srr;
2252
    uint32_t jtagid;
2253
    uint32_t pci;
2254
    /* Clock and power management */
2255
    uint32_t er;
2256
    uint32_t fr;
2257
    uint32_t sr;
2258
};
2259

    
2260
static void ppc405ep_compute_clocks (a_ppc405ep_cpc *cpc)
2261
{
2262
    uint32_t CPU_clk, PLB_clk, OPB_clk, EBC_clk, MAL_clk, PCI_clk;
2263
    uint32_t UART0_clk, UART1_clk;
2264
    uint64_t VCO_out, PLL_out;
2265
    int M, D;
2266

    
2267
    VCO_out = 0;
2268
    if ((cpc->pllmr[1] & 0x80000000) && !(cpc->pllmr[1] & 0x40000000)) {
2269
        M = (((cpc->pllmr[1] >> 20) - 1) & 0xF) + 1; /* FBMUL */
2270
#ifdef DEBUG_CLOCKS_LL
2271
        printf("FBMUL %01" PRIx32 " %d\n", (cpc->pllmr[1] >> 20) & 0xF, M);
2272
#endif
2273
        D = 8 - ((cpc->pllmr[1] >> 16) & 0x7); /* FWDA */
2274
#ifdef DEBUG_CLOCKS_LL
2275
        printf("FWDA %01" PRIx32 " %d\n", (cpc->pllmr[1] >> 16) & 0x7, D);
2276
#endif
2277
        VCO_out = cpc->sysclk * M * D;
2278
        if (VCO_out < 500000000UL || VCO_out > 1000000000UL) {
2279
            /* Error - unlock the PLL */
2280
            printf("VCO out of range %" PRIu64 "\n", VCO_out);
2281
#if 0
2282
            cpc->pllmr[1] &= ~0x80000000;
2283
            goto pll_bypass;
2284
#endif
2285
        }
2286
        PLL_out = VCO_out / D;
2287
        /* Pretend the PLL is locked */
2288
        cpc->boot |= 0x00000001;
2289
    } else {
2290
#if 0
2291
    pll_bypass:
2292
#endif
2293
        PLL_out = cpc->sysclk;
2294
        if (cpc->pllmr[1] & 0x40000000) {
2295
            /* Pretend the PLL is not locked */
2296
            cpc->boot &= ~0x00000001;
2297
        }
2298
    }
2299
    /* Now, compute all other clocks */
2300
    D = ((cpc->pllmr[0] >> 20) & 0x3) + 1; /* CCDV */
2301
#ifdef DEBUG_CLOCKS_LL
2302
    printf("CCDV %01" PRIx32 " %d\n", (cpc->pllmr[0] >> 20) & 0x3, D);
2303
#endif
2304
    CPU_clk = PLL_out / D;
2305
    D = ((cpc->pllmr[0] >> 16) & 0x3) + 1; /* CBDV */
2306
#ifdef DEBUG_CLOCKS_LL
2307
    printf("CBDV %01" PRIx32 " %d\n", (cpc->pllmr[0] >> 16) & 0x3, D);
2308
#endif
2309
    PLB_clk = CPU_clk / D;
2310
    D = ((cpc->pllmr[0] >> 12) & 0x3) + 1; /* OPDV */
2311
#ifdef DEBUG_CLOCKS_LL
2312
    printf("OPDV %01" PRIx32 " %d\n", (cpc->pllmr[0] >> 12) & 0x3, D);
2313
#endif
2314
    OPB_clk = PLB_clk / D;
2315
    D = ((cpc->pllmr[0] >> 8) & 0x3) + 2; /* EPDV */
2316
#ifdef DEBUG_CLOCKS_LL
2317
    printf("EPDV %01" PRIx32 " %d\n", (cpc->pllmr[0] >> 8) & 0x3, D);
2318
#endif
2319
    EBC_clk = PLB_clk / D;
2320
    D = ((cpc->pllmr[0] >> 4) & 0x3) + 1; /* MPDV */
2321
#ifdef DEBUG_CLOCKS_LL
2322
    printf("MPDV %01" PRIx32 " %d\n", (cpc->pllmr[0] >> 4) & 0x3, D);
2323
#endif
2324
    MAL_clk = PLB_clk / D;
2325
    D = (cpc->pllmr[0] & 0x3) + 1; /* PPDV */
2326
#ifdef DEBUG_CLOCKS_LL
2327
    printf("PPDV %01" PRIx32 " %d\n", cpc->pllmr[0] & 0x3, D);
2328
#endif
2329
    PCI_clk = PLB_clk / D;
2330
    D = ((cpc->ucr - 1) & 0x7F) + 1; /* U0DIV */
2331
#ifdef DEBUG_CLOCKS_LL
2332
    printf("U0DIV %01" PRIx32 " %d\n", cpc->ucr & 0x7F, D);
2333
#endif
2334
    UART0_clk = PLL_out / D;
2335
    D = (((cpc->ucr >> 8) - 1) & 0x7F) + 1; /* U1DIV */
2336
#ifdef DEBUG_CLOCKS_LL
2337
    printf("U1DIV %01" PRIx32 " %d\n", (cpc->ucr >> 8) & 0x7F, D);
2338
#endif
2339
    UART1_clk = PLL_out / D;
2340
#ifdef DEBUG_CLOCKS
2341
    printf("Setup PPC405EP clocks - sysclk %" PRIu32 " VCO %" PRIu64
2342
           " PLL out %" PRIu64 " Hz\n", cpc->sysclk, VCO_out, PLL_out);
2343
    printf("CPU %" PRIu32 " PLB %" PRIu32 " OPB %" PRIu32 " EBC %" PRIu32
2344
           " MAL %" PRIu32 " PCI %" PRIu32 " UART0 %" PRIu32
2345
           " UART1 %" PRIu32 "\n",
2346
           CPU_clk, PLB_clk, OPB_clk, EBC_clk, MAL_clk, PCI_clk,
2347
           UART0_clk, UART1_clk);
2348
#endif
2349
    /* Setup CPU clocks */
2350
    clk_setup(&cpc->clk_setup[PPC405EP_CPU_CLK], CPU_clk);
2351
    /* Setup PLB clock */
2352
    clk_setup(&cpc->clk_setup[PPC405EP_PLB_CLK], PLB_clk);
2353
    /* Setup OPB clock */
2354
    clk_setup(&cpc->clk_setup[PPC405EP_OPB_CLK], OPB_clk);
2355
    /* Setup external clock */
2356
    clk_setup(&cpc->clk_setup[PPC405EP_EBC_CLK], EBC_clk);
2357
    /* Setup MAL clock */
2358
    clk_setup(&cpc->clk_setup[PPC405EP_MAL_CLK], MAL_clk);
2359
    /* Setup PCI clock */
2360
    clk_setup(&cpc->clk_setup[PPC405EP_PCI_CLK], PCI_clk);
2361
    /* Setup UART0 clock */
2362
    clk_setup(&cpc->clk_setup[PPC405EP_UART0_CLK], UART0_clk);
2363
    /* Setup UART1 clock */
2364
    clk_setup(&cpc->clk_setup[PPC405EP_UART1_CLK], UART1_clk);
2365
}
2366

    
2367
static target_ulong dcr_read_epcpc (void *opaque, int dcrn)
2368
{
2369
    a_ppc405ep_cpc *cpc;
2370
    target_ulong ret;
2371

    
2372
    cpc = opaque;
2373
    switch (dcrn) {
2374
    case PPC405EP_CPC0_BOOT:
2375
        ret = cpc->boot;
2376
        break;
2377
    case PPC405EP_CPC0_EPCTL:
2378
        ret = cpc->epctl;
2379
        break;
2380
    case PPC405EP_CPC0_PLLMR0:
2381
        ret = cpc->pllmr[0];
2382
        break;
2383
    case PPC405EP_CPC0_PLLMR1:
2384
        ret = cpc->pllmr[1];
2385
        break;
2386
    case PPC405EP_CPC0_UCR:
2387
        ret = cpc->ucr;
2388
        break;
2389
    case PPC405EP_CPC0_SRR:
2390
        ret = cpc->srr;
2391
        break;
2392
    case PPC405EP_CPC0_JTAGID:
2393
        ret = cpc->jtagid;
2394
        break;
2395
    case PPC405EP_CPC0_PCI:
2396
        ret = cpc->pci;
2397
        break;
2398
    default:
2399
        /* Avoid gcc warning */
2400
        ret = 0;
2401
        break;
2402
    }
2403

    
2404
    return ret;
2405
}
2406

    
2407
static void dcr_write_epcpc (void *opaque, int dcrn, target_ulong val)
2408
{
2409
    a_ppc405ep_cpc *cpc;
2410

    
2411
    cpc = opaque;
2412
    switch (dcrn) {
2413
    case PPC405EP_CPC0_BOOT:
2414
        /* Read-only register */
2415
        break;
2416
    case PPC405EP_CPC0_EPCTL:
2417
        /* Don't care for now */
2418
        cpc->epctl = val & 0xC00000F3;
2419
        break;
2420
    case PPC405EP_CPC0_PLLMR0:
2421
        cpc->pllmr[0] = val & 0x00633333;
2422
        ppc405ep_compute_clocks(cpc);
2423
        break;
2424
    case PPC405EP_CPC0_PLLMR1:
2425
        cpc->pllmr[1] = val & 0xC0F73FFF;
2426
        ppc405ep_compute_clocks(cpc);
2427
        break;
2428
    case PPC405EP_CPC0_UCR:
2429
        /* UART control - don't care for now */
2430
        cpc->ucr = val & 0x003F7F7F;
2431
        break;
2432
    case PPC405EP_CPC0_SRR:
2433
        cpc->srr = val;
2434
        break;
2435
    case PPC405EP_CPC0_JTAGID:
2436
        /* Read-only */
2437
        break;
2438
    case PPC405EP_CPC0_PCI:
2439
        cpc->pci = val;
2440
        break;
2441
    }
2442
}
2443

    
2444
static void ppc405ep_cpc_reset (void *opaque)
2445
{
2446
    a_ppc405ep_cpc *cpc = opaque;
2447

    
2448
    cpc->boot = 0x00000010;     /* Boot from PCI - IIC EEPROM disabled */
2449
    cpc->epctl = 0x00000000;
2450
    cpc->pllmr[0] = 0x00011010;
2451
    cpc->pllmr[1] = 0x40000000;
2452
    cpc->ucr = 0x00000000;
2453
    cpc->srr = 0x00040000;
2454
    cpc->pci = 0x00000000;
2455
    cpc->er = 0x00000000;
2456
    cpc->fr = 0x00000000;
2457
    cpc->sr = 0x00000000;
2458
    ppc405ep_compute_clocks(cpc);
2459
}
2460

    
2461
/* XXX: sysclk should be between 25 and 100 MHz */
2462
static void ppc405ep_cpc_init (CPUState *env, a_clk_setup clk_setup[8],
2463
                               uint32_t sysclk)
2464
{
2465
    a_ppc405ep_cpc *cpc;
2466

    
2467
    cpc = qemu_mallocz(sizeof(a_ppc405ep_cpc));
2468
    memcpy(cpc->clk_setup, clk_setup,
2469
           PPC405EP_CLK_NB * sizeof(a_clk_setup));
2470
    cpc->jtagid = 0x20267049;
2471
    cpc->sysclk = sysclk;
2472
    ppc405ep_cpc_reset(cpc);
2473
    qemu_register_reset(&ppc405ep_cpc_reset, cpc);
2474
    ppc_dcr_register(env, PPC405EP_CPC0_BOOT, cpc,
2475
                     &dcr_read_epcpc, &dcr_write_epcpc);
2476
    ppc_dcr_register(env, PPC405EP_CPC0_EPCTL, cpc,
2477
                     &dcr_read_epcpc, &dcr_write_epcpc);
2478
    ppc_dcr_register(env, PPC405EP_CPC0_PLLMR0, cpc,
2479
                     &dcr_read_epcpc, &dcr_write_epcpc);
2480
    ppc_dcr_register(env, PPC405EP_CPC0_PLLMR1, cpc,
2481
                     &dcr_read_epcpc, &dcr_write_epcpc);
2482
    ppc_dcr_register(env, PPC405EP_CPC0_UCR, cpc,
2483
                     &dcr_read_epcpc, &dcr_write_epcpc);
2484
    ppc_dcr_register(env, PPC405EP_CPC0_SRR, cpc,
2485
                     &dcr_read_epcpc, &dcr_write_epcpc);
2486
    ppc_dcr_register(env, PPC405EP_CPC0_JTAGID, cpc,
2487
                     &dcr_read_epcpc, &dcr_write_epcpc);
2488
    ppc_dcr_register(env, PPC405EP_CPC0_PCI, cpc,
2489
                     &dcr_read_epcpc, &dcr_write_epcpc);
2490
#if 0
2491
    ppc_dcr_register(env, PPC405EP_CPC0_ER, cpc,
2492
                     &dcr_read_epcpc, &dcr_write_epcpc);
2493
    ppc_dcr_register(env, PPC405EP_CPC0_FR, cpc,
2494
                     &dcr_read_epcpc, &dcr_write_epcpc);
2495
    ppc_dcr_register(env, PPC405EP_CPC0_SR, cpc,
2496
                     &dcr_read_epcpc, &dcr_write_epcpc);
2497
#endif
2498
}
2499

    
2500
CPUState *ppc405ep_init (a_target_phys_addr ram_bases[2],
2501
                         a_target_phys_addr ram_sizes[2],
2502
                         uint32_t sysclk, qemu_irq **picp,
2503
                         int do_init)
2504
{
2505
    a_clk_setup clk_setup[PPC405EP_CLK_NB], tlb_clk_setup;
2506
    qemu_irq dma_irqs[4], gpt_irqs[5], mal_irqs[4];
2507
    CPUState *env;
2508
    qemu_irq *pic, *irqs;
2509

    
2510
    memset(clk_setup, 0, sizeof(clk_setup));
2511
    /* init CPUs */
2512
    env = ppc4xx_init("405ep", &clk_setup[PPC405EP_CPU_CLK],
2513
                      &tlb_clk_setup, sysclk);
2514
    clk_setup[PPC405EP_CPU_CLK].cb = tlb_clk_setup.cb;
2515
    clk_setup[PPC405EP_CPU_CLK].opaque = tlb_clk_setup.opaque;
2516
    /* Internal devices init */
2517
    /* Memory mapped devices registers */
2518
    /* PLB arbitrer */
2519
    ppc4xx_plb_init(env);
2520
    /* PLB to OPB bridge */
2521
    ppc4xx_pob_init(env);
2522
    /* OBP arbitrer */
2523
    ppc4xx_opba_init(0xef600600);
2524
    /* Universal interrupt controller */
2525
    irqs = qemu_mallocz(sizeof(qemu_irq) * PPCUIC_OUTPUT_NB);
2526
    irqs[PPCUIC_OUTPUT_INT] =
2527
        ((qemu_irq *)env->irq_inputs)[PPC40x_INPUT_INT];
2528
    irqs[PPCUIC_OUTPUT_CINT] =
2529
        ((qemu_irq *)env->irq_inputs)[PPC40x_INPUT_CINT];
2530
    pic = ppcuic_init(env, irqs, 0x0C0, 0, 1);
2531
    *picp = pic;
2532
    /* SDRAM controller */
2533
        /* XXX 405EP has no ECC interrupt */
2534
    ppc4xx_sdram_init(env, pic[17], 2, ram_bases, ram_sizes, do_init);
2535
    /* External bus controller */
2536
    ppc405_ebc_init(env);
2537
    /* DMA controller */
2538
    dma_irqs[0] = pic[5];
2539
    dma_irqs[1] = pic[6];
2540
    dma_irqs[2] = pic[7];
2541
    dma_irqs[3] = pic[8];
2542
    ppc405_dma_init(env, dma_irqs);
2543
    /* IIC controller */
2544
    ppc405_i2c_init(0xef600500, pic[2]);
2545
    /* GPIO */
2546
    ppc405_gpio_init(0xef600700);
2547
    /* Serial ports */
2548
    if (serial_hds[0] != NULL) {
2549
        serial_mm_init(0xef600300, 0, pic[0], PPC_SERIAL_MM_BAUDBASE,
2550
                       serial_hds[0], 1);
2551
    }
2552
    if (serial_hds[1] != NULL) {
2553
        serial_mm_init(0xef600400, 0, pic[1], PPC_SERIAL_MM_BAUDBASE,
2554
                       serial_hds[1], 1);
2555
    }
2556
    /* OCM */
2557
    ppc405_ocm_init(env);
2558
    /* GPT */
2559
    gpt_irqs[0] = pic[19];
2560
    gpt_irqs[1] = pic[20];
2561
    gpt_irqs[2] = pic[21];
2562
    gpt_irqs[3] = pic[22];
2563
    gpt_irqs[4] = pic[23];
2564
    ppc4xx_gpt_init(0xef600000, gpt_irqs);
2565
    /* PCI */
2566
    /* Uses pic[3], pic[16], pic[18] */
2567
    /* MAL */
2568
    mal_irqs[0] = pic[11];
2569
    mal_irqs[1] = pic[12];
2570
    mal_irqs[2] = pic[13];
2571
    mal_irqs[3] = pic[14];
2572
    ppc405_mal_init(env, mal_irqs);
2573
    /* Ethernet */
2574
    /* Uses pic[9], pic[15], pic[17] */
2575
    /* CPU control */
2576
    ppc405ep_cpc_init(env, clk_setup, sysclk);
2577

    
2578
    return env;
2579
}