Statistics
| Branch: | Revision:

root / hw / ppc405_uc.c @ 3b3fb322

History | View | Annotate | Download (78 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
ram_addr_t ppc405_set_bootinfo (CPUState *env, ppc4xx_bd_info_t *bd,
44
                                uint32_t flags)
45
{
46
    ram_addr_t bdloc;
47
    int i, n;
48

    
49
    /* We put the bd structure at the top of memory */
50
    if (bd->bi_memsize >= 0x01000000UL)
51
        bdloc = 0x01000000UL - sizeof(struct ppc4xx_bd_info_t);
52
    else
53
        bdloc = bd->bi_memsize - sizeof(struct ppc4xx_bd_info_t);
54
    stl_raw(phys_ram_base + bdloc + 0x00, bd->bi_memstart);
55
    stl_raw(phys_ram_base + bdloc + 0x04, bd->bi_memsize);
56
    stl_raw(phys_ram_base + bdloc + 0x08, bd->bi_flashstart);
57
    stl_raw(phys_ram_base + bdloc + 0x0C, bd->bi_flashsize);
58
    stl_raw(phys_ram_base + bdloc + 0x10, bd->bi_flashoffset);
59
    stl_raw(phys_ram_base + bdloc + 0x14, bd->bi_sramstart);
60
    stl_raw(phys_ram_base + bdloc + 0x18, bd->bi_sramsize);
61
    stl_raw(phys_ram_base + bdloc + 0x1C, bd->bi_bootflags);
62
    stl_raw(phys_ram_base + bdloc + 0x20, bd->bi_ipaddr);
63
    for (i = 0; i < 6; i++)
64
        stb_raw(phys_ram_base + bdloc + 0x24 + i, bd->bi_enetaddr[i]);
65
    stw_raw(phys_ram_base + bdloc + 0x2A, bd->bi_ethspeed);
66
    stl_raw(phys_ram_base + bdloc + 0x2C, bd->bi_intfreq);
67
    stl_raw(phys_ram_base + bdloc + 0x30, bd->bi_busfreq);
68
    stl_raw(phys_ram_base + bdloc + 0x34, bd->bi_baudrate);
69
    for (i = 0; i < 4; i++)
70
        stb_raw(phys_ram_base + bdloc + 0x38 + i, bd->bi_s_version[i]);
71
    for (i = 0; i < 32; i++)
72
        stb_raw(phys_ram_base + bdloc + 0x3C + i, bd->bi_s_version[i]);
73
    stl_raw(phys_ram_base + bdloc + 0x5C, bd->bi_plb_busfreq);
74
    stl_raw(phys_ram_base + bdloc + 0x60, bd->bi_pci_busfreq);
75
    for (i = 0; i < 6; i++)
76
        stb_raw(phys_ram_base + bdloc + 0x64 + i, bd->bi_pci_enetaddr[i]);
77
    n = 0x6A;
78
    if (flags & 0x00000001) {
79
        for (i = 0; i < 6; i++)
80
            stb_raw(phys_ram_base + bdloc + n++, bd->bi_pci_enetaddr2[i]);
81
    }
82
    stl_raw(phys_ram_base + bdloc + n, bd->bi_opbfreq);
83
    n += 4;
84
    for (i = 0; i < 2; i++) {
85
        stl_raw(phys_ram_base + 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_t ppc4xx_plb_t;
104
struct ppc4xx_plb_t {
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
    ppc4xx_plb_t *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
    ppc4xx_plb_t *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
    ppc4xx_plb_t *plb;
160

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

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

    
171
    plb = qemu_mallocz(sizeof(ppc4xx_plb_t));
172
    if (plb != NULL) {
173
        ppc_dcr_register(env, PLB0_ACR, plb, &dcr_read_plb, &dcr_write_plb);
174
        ppc_dcr_register(env, PLB0_BEAR, plb, &dcr_read_plb, &dcr_write_plb);
175
        ppc_dcr_register(env, PLB0_BESR, plb, &dcr_read_plb, &dcr_write_plb);
176
        ppc4xx_plb_reset(plb);
177
        qemu_register_reset(ppc4xx_plb_reset, plb);
178
    }
179
}
180

    
181
/*****************************************************************************/
182
/* PLB to OPB bridge */
183
enum {
184
    POB0_BESR0 = 0x0A0,
185
    POB0_BESR1 = 0x0A2,
186
    POB0_BEAR  = 0x0A4,
187
};
188

    
189
typedef struct ppc4xx_pob_t ppc4xx_pob_t;
190
struct ppc4xx_pob_t {
191
    uint32_t bear;
192
    uint32_t besr[2];
193
};
194

    
195
static target_ulong dcr_read_pob (void *opaque, int dcrn)
196
{
197
    ppc4xx_pob_t *pob;
198
    target_ulong ret;
199

    
200
    pob = opaque;
201
    switch (dcrn) {
202
    case POB0_BEAR:
203
        ret = pob->bear;
204
        break;
205
    case POB0_BESR0:
206
    case POB0_BESR1:
207
        ret = pob->besr[dcrn - POB0_BESR0];
208
        break;
209
    default:
210
        /* Avoid gcc warning */
211
        ret = 0;
212
        break;
213
    }
214

    
215
    return ret;
216
}
217

    
218
static void dcr_write_pob (void *opaque, int dcrn, target_ulong val)
219
{
220
    ppc4xx_pob_t *pob;
221

    
222
    pob = opaque;
223
    switch (dcrn) {
224
    case POB0_BEAR:
225
        /* Read only */
226
        break;
227
    case POB0_BESR0:
228
    case POB0_BESR1:
229
        /* Write-clear */
230
        pob->besr[dcrn - POB0_BESR0] &= ~val;
231
        break;
232
    }
233
}
234

    
235
static void ppc4xx_pob_reset (void *opaque)
236
{
237
    ppc4xx_pob_t *pob;
238

    
239
    pob = opaque;
240
    /* No error */
241
    pob->bear = 0x00000000;
242
    pob->besr[0] = 0x0000000;
243
    pob->besr[1] = 0x0000000;
244
}
245

    
246
void ppc4xx_pob_init (CPUState *env)
247
{
248
    ppc4xx_pob_t *pob;
249

    
250
    pob = qemu_mallocz(sizeof(ppc4xx_pob_t));
251
    if (pob != NULL) {
252
        ppc_dcr_register(env, POB0_BEAR, pob, &dcr_read_pob, &dcr_write_pob);
253
        ppc_dcr_register(env, POB0_BESR0, pob, &dcr_read_pob, &dcr_write_pob);
254
        ppc_dcr_register(env, POB0_BESR1, pob, &dcr_read_pob, &dcr_write_pob);
255
        qemu_register_reset(ppc4xx_pob_reset, pob);
256
        ppc4xx_pob_reset(env);
257
    }
258
}
259

    
260
/*****************************************************************************/
261
/* OPB arbitrer */
262
typedef struct ppc4xx_opba_t ppc4xx_opba_t;
263
struct ppc4xx_opba_t {
264
    target_phys_addr_t base;
265
    uint8_t cr;
266
    uint8_t pr;
267
};
268

    
269
static uint32_t opba_readb (void *opaque, target_phys_addr_t addr)
270
{
271
    ppc4xx_opba_t *opba;
272
    uint32_t ret;
273

    
274
#ifdef DEBUG_OPBA
275
    printf("%s: addr " PADDRX "\n", __func__, addr);
276
#endif
277
    opba = opaque;
278
    switch (addr - opba->base) {
279
    case 0x00:
280
        ret = opba->cr;
281
        break;
282
    case 0x01:
283
        ret = opba->pr;
284
        break;
285
    default:
286
        ret = 0x00;
287
        break;
288
    }
289

    
290
    return ret;
291
}
292

    
293
static void opba_writeb (void *opaque,
294
                         target_phys_addr_t addr, uint32_t value)
295
{
296
    ppc4xx_opba_t *opba;
297

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

    
314
static uint32_t opba_readw (void *opaque, target_phys_addr_t addr)
315
{
316
    uint32_t ret;
317

    
318
#ifdef DEBUG_OPBA
319
    printf("%s: addr " PADDRX "\n", __func__, addr);
320
#endif
321
    ret = opba_readb(opaque, addr) << 8;
322
    ret |= opba_readb(opaque, addr + 1);
323

    
324
    return ret;
325
}
326

    
327
static void opba_writew (void *opaque,
328
                         target_phys_addr_t addr, uint32_t value)
329
{
330
#ifdef DEBUG_OPBA
331
    printf("%s: addr " PADDRX " val %08" PRIx32 "\n", __func__, addr, value);
332
#endif
333
    opba_writeb(opaque, addr, value >> 8);
334
    opba_writeb(opaque, addr + 1, value);
335
}
336

    
337
static uint32_t opba_readl (void *opaque, target_phys_addr_t addr)
338
{
339
    uint32_t ret;
340

    
341
#ifdef DEBUG_OPBA
342
    printf("%s: addr " PADDRX "\n", __func__, addr);
343
#endif
344
    ret = opba_readb(opaque, addr) << 24;
345
    ret |= opba_readb(opaque, addr + 1) << 16;
346

    
347
    return ret;
348
}
349

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

    
360
static CPUReadMemoryFunc *opba_read[] = {
361
    &opba_readb,
362
    &opba_readw,
363
    &opba_readl,
364
};
365

    
366
static CPUWriteMemoryFunc *opba_write[] = {
367
    &opba_writeb,
368
    &opba_writew,
369
    &opba_writel,
370
};
371

    
372
static void ppc4xx_opba_reset (void *opaque)
373
{
374
    ppc4xx_opba_t *opba;
375

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

    
381
void ppc4xx_opba_init (CPUState *env, ppc4xx_mmio_t *mmio,
382
                       target_phys_addr_t offset)
383
{
384
    ppc4xx_opba_t *opba;
385

    
386
    opba = qemu_mallocz(sizeof(ppc4xx_opba_t));
387
    if (opba != NULL) {
388
        opba->base = offset;
389
#ifdef DEBUG_OPBA
390
        printf("%s: offset " PADDRX "\n", __func__, offset);
391
#endif
392
        ppc4xx_mmio_register(env, mmio, offset, 0x002,
393
                             opba_read, opba_write, opba);
394
        qemu_register_reset(ppc4xx_opba_reset, opba);
395
        ppc4xx_opba_reset(opba);
396
    }
397
}
398

    
399
/*****************************************************************************/
400
/* Code decompression controller */
401
/* XXX: TODO */
402

    
403
/*****************************************************************************/
404
/* SDRAM controller */
405
typedef struct ppc4xx_sdram_t ppc4xx_sdram_t;
406
struct ppc4xx_sdram_t {
407
    uint32_t addr;
408
    int nbanks;
409
    target_phys_addr_t ram_bases[4];
410
    target_phys_addr_t ram_sizes[4];
411
    uint32_t besr0;
412
    uint32_t besr1;
413
    uint32_t bear;
414
    uint32_t cfg;
415
    uint32_t status;
416
    uint32_t rtr;
417
    uint32_t pmit;
418
    uint32_t bcr[4];
419
    uint32_t tr;
420
    uint32_t ecccfg;
421
    uint32_t eccesr;
422
    qemu_irq irq;
423
};
424

    
425
enum {
426
    SDRAM0_CFGADDR = 0x010,
427
    SDRAM0_CFGDATA = 0x011,
428
};
429

    
430
/* XXX: TOFIX: some patches have made this code become inconsistent:
431
 *      there are type inconsistencies, mixing target_phys_addr_t, target_ulong
432
 *      and uint32_t
433
 */
434
static uint32_t sdram_bcr (target_phys_addr_t ram_base,
435
                           target_phys_addr_t ram_size)
436
{
437
    uint32_t bcr;
438

    
439
    switch (ram_size) {
440
    case (4 * 1024 * 1024):
441
        bcr = 0x00000000;
442
        break;
443
    case (8 * 1024 * 1024):
444
        bcr = 0x00020000;
445
        break;
446
    case (16 * 1024 * 1024):
447
        bcr = 0x00040000;
448
        break;
449
    case (32 * 1024 * 1024):
450
        bcr = 0x00060000;
451
        break;
452
    case (64 * 1024 * 1024):
453
        bcr = 0x00080000;
454
        break;
455
    case (128 * 1024 * 1024):
456
        bcr = 0x000A0000;
457
        break;
458
    case (256 * 1024 * 1024):
459
        bcr = 0x000C0000;
460
        break;
461
    default:
462
        printf("%s: invalid RAM size " PADDRX "\n", __func__, ram_size);
463
        return 0x00000000;
464
    }
465
    bcr |= ram_base & 0xFF800000;
466
    bcr |= 1;
467

    
468
    return bcr;
469
}
470

    
471
static always_inline target_phys_addr_t sdram_base (uint32_t bcr)
472
{
473
    return bcr & 0xFF800000;
474
}
475

    
476
static target_ulong sdram_size (uint32_t bcr)
477
{
478
    target_ulong size;
479
    int sh;
480

    
481
    sh = (bcr >> 17) & 0x7;
482
    if (sh == 7)
483
        size = -1;
484
    else
485
        size = (4 * 1024 * 1024) << sh;
486

    
487
    return size;
488
}
489

    
490
static void sdram_set_bcr (uint32_t *bcrp, uint32_t bcr, int enabled)
491
{
492
    if (*bcrp & 0x00000001) {
493
        /* Unmap RAM */
494
#ifdef DEBUG_SDRAM
495
        printf("%s: unmap RAM area " PADDRX " " ADDRX "\n",
496
               __func__, sdram_base(*bcrp), sdram_size(*bcrp));
497
#endif
498
        cpu_register_physical_memory(sdram_base(*bcrp), sdram_size(*bcrp),
499
                                     IO_MEM_UNASSIGNED);
500
    }
501
    *bcrp = bcr & 0xFFDEE001;
502
    if (enabled && (bcr & 0x00000001)) {
503
#ifdef DEBUG_SDRAM
504
        printf("%s: Map RAM area " PADDRX " " ADDRX "\n",
505
               __func__, sdram_base(bcr), sdram_size(bcr));
506
#endif
507
        cpu_register_physical_memory(sdram_base(bcr), sdram_size(bcr),
508
                                     sdram_base(bcr) | IO_MEM_RAM);
509
    }
510
}
511

    
512
static void sdram_map_bcr (ppc4xx_sdram_t *sdram)
513
{
514
    int i;
515

    
516
    for (i = 0; i < sdram->nbanks; i++) {
517
        if (sdram->ram_sizes[i] != 0) {
518
            sdram_set_bcr(&sdram->bcr[i],
519
                          sdram_bcr(sdram->ram_bases[i], sdram->ram_sizes[i]),
520
                          1);
521
        } else {
522
            sdram_set_bcr(&sdram->bcr[i], 0x00000000, 0);
523
        }
524
    }
525
}
526

    
527
static void sdram_unmap_bcr (ppc4xx_sdram_t *sdram)
528
{
529
    int i;
530

    
531
    for (i = 0; i < sdram->nbanks; i++) {
532
#ifdef DEBUG_SDRAM
533
        printf("%s: Unmap RAM area " PADDRX " " ADDRX "\n",
534
               __func__, sdram_base(sdram->bcr[i]), sdram_size(sdram->bcr[i]));
535
#endif
536
        cpu_register_physical_memory(sdram_base(sdram->bcr[i]),
537
                                     sdram_size(sdram->bcr[i]),
538
                                     IO_MEM_UNASSIGNED);
539
    }
540
}
541

    
542
static target_ulong dcr_read_sdram (void *opaque, int dcrn)
543
{
544
    ppc4xx_sdram_t *sdram;
545
    target_ulong ret;
546

    
547
    sdram = opaque;
548
    switch (dcrn) {
549
    case SDRAM0_CFGADDR:
550
        ret = sdram->addr;
551
        break;
552
    case SDRAM0_CFGDATA:
553
        switch (sdram->addr) {
554
        case 0x00: /* SDRAM_BESR0 */
555
            ret = sdram->besr0;
556
            break;
557
        case 0x08: /* SDRAM_BESR1 */
558
            ret = sdram->besr1;
559
            break;
560
        case 0x10: /* SDRAM_BEAR */
561
            ret = sdram->bear;
562
            break;
563
        case 0x20: /* SDRAM_CFG */
564
            ret = sdram->cfg;
565
            break;
566
        case 0x24: /* SDRAM_STATUS */
567
            ret = sdram->status;
568
            break;
569
        case 0x30: /* SDRAM_RTR */
570
            ret = sdram->rtr;
571
            break;
572
        case 0x34: /* SDRAM_PMIT */
573
            ret = sdram->pmit;
574
            break;
575
        case 0x40: /* SDRAM_B0CR */
576
            ret = sdram->bcr[0];
577
            break;
578
        case 0x44: /* SDRAM_B1CR */
579
            ret = sdram->bcr[1];
580
            break;
581
        case 0x48: /* SDRAM_B2CR */
582
            ret = sdram->bcr[2];
583
            break;
584
        case 0x4C: /* SDRAM_B3CR */
585
            ret = sdram->bcr[3];
586
            break;
587
        case 0x80: /* SDRAM_TR */
588
            ret = -1; /* ? */
589
            break;
590
        case 0x94: /* SDRAM_ECCCFG */
591
            ret = sdram->ecccfg;
592
            break;
593
        case 0x98: /* SDRAM_ECCESR */
594
            ret = sdram->eccesr;
595
            break;
596
        default: /* Error */
597
            ret = -1;
598
            break;
599
        }
600
        break;
601
    default:
602
        /* Avoid gcc warning */
603
        ret = 0x00000000;
604
        break;
605
    }
606

    
607
    return ret;
608
}
609

    
610
static void dcr_write_sdram (void *opaque, int dcrn, target_ulong val)
611
{
612
    ppc4xx_sdram_t *sdram;
613

    
614
    sdram = opaque;
615
    switch (dcrn) {
616
    case SDRAM0_CFGADDR:
617
        sdram->addr = val;
618
        break;
619
    case SDRAM0_CFGDATA:
620
        switch (sdram->addr) {
621
        case 0x00: /* SDRAM_BESR0 */
622
            sdram->besr0 &= ~val;
623
            break;
624
        case 0x08: /* SDRAM_BESR1 */
625
            sdram->besr1 &= ~val;
626
            break;
627
        case 0x10: /* SDRAM_BEAR */
628
            sdram->bear = val;
629
            break;
630
        case 0x20: /* SDRAM_CFG */
631
            val &= 0xFFE00000;
632
            if (!(sdram->cfg & 0x80000000) && (val & 0x80000000)) {
633
#ifdef DEBUG_SDRAM
634
                printf("%s: enable SDRAM controller\n", __func__);
635
#endif
636
                /* validate all RAM mappings */
637
                sdram_map_bcr(sdram);
638
                sdram->status &= ~0x80000000;
639
            } else if ((sdram->cfg & 0x80000000) && !(val & 0x80000000)) {
640
#ifdef DEBUG_SDRAM
641
                printf("%s: disable SDRAM controller\n", __func__);
642
#endif
643
                /* invalidate all RAM mappings */
644
                sdram_unmap_bcr(sdram);
645
                sdram->status |= 0x80000000;
646
            }
647
            if (!(sdram->cfg & 0x40000000) && (val & 0x40000000))
648
                sdram->status |= 0x40000000;
649
            else if ((sdram->cfg & 0x40000000) && !(val & 0x40000000))
650
                sdram->status &= ~0x40000000;
651
            sdram->cfg = val;
652
            break;
653
        case 0x24: /* SDRAM_STATUS */
654
            /* Read-only register */
655
            break;
656
        case 0x30: /* SDRAM_RTR */
657
            sdram->rtr = val & 0x3FF80000;
658
            break;
659
        case 0x34: /* SDRAM_PMIT */
660
            sdram->pmit = (val & 0xF8000000) | 0x07C00000;
661
            break;
662
        case 0x40: /* SDRAM_B0CR */
663
            sdram_set_bcr(&sdram->bcr[0], val, sdram->cfg & 0x80000000);
664
            break;
665
        case 0x44: /* SDRAM_B1CR */
666
            sdram_set_bcr(&sdram->bcr[1], val, sdram->cfg & 0x80000000);
667
            break;
668
        case 0x48: /* SDRAM_B2CR */
669
            sdram_set_bcr(&sdram->bcr[2], val, sdram->cfg & 0x80000000);
670
            break;
671
        case 0x4C: /* SDRAM_B3CR */
672
            sdram_set_bcr(&sdram->bcr[3], val, sdram->cfg & 0x80000000);
673
            break;
674
        case 0x80: /* SDRAM_TR */
675
            sdram->tr = val & 0x018FC01F;
676
            break;
677
        case 0x94: /* SDRAM_ECCCFG */
678
            sdram->ecccfg = val & 0x00F00000;
679
            break;
680
        case 0x98: /* SDRAM_ECCESR */
681
            val &= 0xFFF0F000;
682
            if (sdram->eccesr == 0 && val != 0)
683
                qemu_irq_raise(sdram->irq);
684
            else if (sdram->eccesr != 0 && val == 0)
685
                qemu_irq_lower(sdram->irq);
686
            sdram->eccesr = val;
687
            break;
688
        default: /* Error */
689
            break;
690
        }
691
        break;
692
    }
693
}
694

    
695
static void sdram_reset (void *opaque)
696
{
697
    ppc4xx_sdram_t *sdram;
698

    
699
    sdram = opaque;
700
    sdram->addr = 0x00000000;
701
    sdram->bear = 0x00000000;
702
    sdram->besr0 = 0x00000000; /* No error */
703
    sdram->besr1 = 0x00000000; /* No error */
704
    sdram->cfg = 0x00000000;
705
    sdram->ecccfg = 0x00000000; /* No ECC */
706
    sdram->eccesr = 0x00000000; /* No error */
707
    sdram->pmit = 0x07C00000;
708
    sdram->rtr = 0x05F00000;
709
    sdram->tr = 0x00854009;
710
    /* We pre-initialize RAM banks */
711
    sdram->status = 0x00000000;
712
    sdram->cfg = 0x00800000;
713
    sdram_unmap_bcr(sdram);
714
}
715

    
716
void ppc405_sdram_init (CPUState *env, qemu_irq irq, int nbanks,
717
                        target_phys_addr_t *ram_bases,
718
                        target_phys_addr_t *ram_sizes,
719
                        int do_init)
720
{
721
    ppc4xx_sdram_t *sdram;
722

    
723
    sdram = qemu_mallocz(sizeof(ppc4xx_sdram_t));
724
    if (sdram != NULL) {
725
        sdram->irq = irq;
726
        sdram->nbanks = nbanks;
727
        memset(sdram->ram_bases, 0, 4 * sizeof(target_phys_addr_t));
728
        memcpy(sdram->ram_bases, ram_bases,
729
               nbanks * sizeof(target_phys_addr_t));
730
        memset(sdram->ram_sizes, 0, 4 * sizeof(target_phys_addr_t));
731
        memcpy(sdram->ram_sizes, ram_sizes,
732
               nbanks * sizeof(target_phys_addr_t));
733
        sdram_reset(sdram);
734
        qemu_register_reset(&sdram_reset, sdram);
735
        ppc_dcr_register(env, SDRAM0_CFGADDR,
736
                         sdram, &dcr_read_sdram, &dcr_write_sdram);
737
        ppc_dcr_register(env, SDRAM0_CFGDATA,
738
                         sdram, &dcr_read_sdram, &dcr_write_sdram);
739
        if (do_init)
740
            sdram_map_bcr(sdram);
741
    }
742
}
743

    
744
/*****************************************************************************/
745
/* Peripheral controller */
746
typedef struct ppc4xx_ebc_t ppc4xx_ebc_t;
747
struct ppc4xx_ebc_t {
748
    uint32_t addr;
749
    uint32_t bcr[8];
750
    uint32_t bap[8];
751
    uint32_t bear;
752
    uint32_t besr0;
753
    uint32_t besr1;
754
    uint32_t cfg;
755
};
756

    
757
enum {
758
    EBC0_CFGADDR = 0x012,
759
    EBC0_CFGDATA = 0x013,
760
};
761

    
762
static target_ulong dcr_read_ebc (void *opaque, int dcrn)
763
{
764
    ppc4xx_ebc_t *ebc;
765
    target_ulong ret;
766

    
767
    ebc = opaque;
768
    switch (dcrn) {
769
    case EBC0_CFGADDR:
770
        ret = ebc->addr;
771
        break;
772
    case EBC0_CFGDATA:
773
        switch (ebc->addr) {
774
        case 0x00: /* B0CR */
775
            ret = ebc->bcr[0];
776
            break;
777
        case 0x01: /* B1CR */
778
            ret = ebc->bcr[1];
779
            break;
780
        case 0x02: /* B2CR */
781
            ret = ebc->bcr[2];
782
            break;
783
        case 0x03: /* B3CR */
784
            ret = ebc->bcr[3];
785
            break;
786
        case 0x04: /* B4CR */
787
            ret = ebc->bcr[4];
788
            break;
789
        case 0x05: /* B5CR */
790
            ret = ebc->bcr[5];
791
            break;
792
        case 0x06: /* B6CR */
793
            ret = ebc->bcr[6];
794
            break;
795
        case 0x07: /* B7CR */
796
            ret = ebc->bcr[7];
797
            break;
798
        case 0x10: /* B0AP */
799
            ret = ebc->bap[0];
800
            break;
801
        case 0x11: /* B1AP */
802
            ret = ebc->bap[1];
803
            break;
804
        case 0x12: /* B2AP */
805
            ret = ebc->bap[2];
806
            break;
807
        case 0x13: /* B3AP */
808
            ret = ebc->bap[3];
809
            break;
810
        case 0x14: /* B4AP */
811
            ret = ebc->bap[4];
812
            break;
813
        case 0x15: /* B5AP */
814
            ret = ebc->bap[5];
815
            break;
816
        case 0x16: /* B6AP */
817
            ret = ebc->bap[6];
818
            break;
819
        case 0x17: /* B7AP */
820
            ret = ebc->bap[7];
821
            break;
822
        case 0x20: /* BEAR */
823
            ret = ebc->bear;
824
            break;
825
        case 0x21: /* BESR0 */
826
            ret = ebc->besr0;
827
            break;
828
        case 0x22: /* BESR1 */
829
            ret = ebc->besr1;
830
            break;
831
        case 0x23: /* CFG */
832
            ret = ebc->cfg;
833
            break;
834
        default:
835
            ret = 0x00000000;
836
            break;
837
        }
838
    default:
839
        ret = 0x00000000;
840
        break;
841
    }
842

    
843
    return ret;
844
}
845

    
846
static void dcr_write_ebc (void *opaque, int dcrn, target_ulong val)
847
{
848
    ppc4xx_ebc_t *ebc;
849

    
850
    ebc = opaque;
851
    switch (dcrn) {
852
    case EBC0_CFGADDR:
853
        ebc->addr = val;
854
        break;
855
    case EBC0_CFGDATA:
856
        switch (ebc->addr) {
857
        case 0x00: /* B0CR */
858
            break;
859
        case 0x01: /* B1CR */
860
            break;
861
        case 0x02: /* B2CR */
862
            break;
863
        case 0x03: /* B3CR */
864
            break;
865
        case 0x04: /* B4CR */
866
            break;
867
        case 0x05: /* B5CR */
868
            break;
869
        case 0x06: /* B6CR */
870
            break;
871
        case 0x07: /* B7CR */
872
            break;
873
        case 0x10: /* B0AP */
874
            break;
875
        case 0x11: /* B1AP */
876
            break;
877
        case 0x12: /* B2AP */
878
            break;
879
        case 0x13: /* B3AP */
880
            break;
881
        case 0x14: /* B4AP */
882
            break;
883
        case 0x15: /* B5AP */
884
            break;
885
        case 0x16: /* B6AP */
886
            break;
887
        case 0x17: /* B7AP */
888
            break;
889
        case 0x20: /* BEAR */
890
            break;
891
        case 0x21: /* BESR0 */
892
            break;
893
        case 0x22: /* BESR1 */
894
            break;
895
        case 0x23: /* CFG */
896
            break;
897
        default:
898
            break;
899
        }
900
        break;
901
    default:
902
        break;
903
    }
904
}
905

    
906
static void ebc_reset (void *opaque)
907
{
908
    ppc4xx_ebc_t *ebc;
909
    int i;
910

    
911
    ebc = opaque;
912
    ebc->addr = 0x00000000;
913
    ebc->bap[0] = 0x7F8FFE80;
914
    ebc->bcr[0] = 0xFFE28000;
915
    for (i = 0; i < 8; i++) {
916
        ebc->bap[i] = 0x00000000;
917
        ebc->bcr[i] = 0x00000000;
918
    }
919
    ebc->besr0 = 0x00000000;
920
    ebc->besr1 = 0x00000000;
921
    ebc->cfg = 0x80400000;
922
}
923

    
924
void ppc405_ebc_init (CPUState *env)
925
{
926
    ppc4xx_ebc_t *ebc;
927

    
928
    ebc = qemu_mallocz(sizeof(ppc4xx_ebc_t));
929
    if (ebc != NULL) {
930
        ebc_reset(ebc);
931
        qemu_register_reset(&ebc_reset, ebc);
932
        ppc_dcr_register(env, EBC0_CFGADDR,
933
                         ebc, &dcr_read_ebc, &dcr_write_ebc);
934
        ppc_dcr_register(env, EBC0_CFGDATA,
935
                         ebc, &dcr_read_ebc, &dcr_write_ebc);
936
    }
937
}
938

    
939
/*****************************************************************************/
940
/* DMA controller */
941
enum {
942
    DMA0_CR0 = 0x100,
943
    DMA0_CT0 = 0x101,
944
    DMA0_DA0 = 0x102,
945
    DMA0_SA0 = 0x103,
946
    DMA0_SG0 = 0x104,
947
    DMA0_CR1 = 0x108,
948
    DMA0_CT1 = 0x109,
949
    DMA0_DA1 = 0x10A,
950
    DMA0_SA1 = 0x10B,
951
    DMA0_SG1 = 0x10C,
952
    DMA0_CR2 = 0x110,
953
    DMA0_CT2 = 0x111,
954
    DMA0_DA2 = 0x112,
955
    DMA0_SA2 = 0x113,
956
    DMA0_SG2 = 0x114,
957
    DMA0_CR3 = 0x118,
958
    DMA0_CT3 = 0x119,
959
    DMA0_DA3 = 0x11A,
960
    DMA0_SA3 = 0x11B,
961
    DMA0_SG3 = 0x11C,
962
    DMA0_SR  = 0x120,
963
    DMA0_SGC = 0x123,
964
    DMA0_SLP = 0x125,
965
    DMA0_POL = 0x126,
966
};
967

    
968
typedef struct ppc405_dma_t ppc405_dma_t;
969
struct ppc405_dma_t {
970
    qemu_irq irqs[4];
971
    uint32_t cr[4];
972
    uint32_t ct[4];
973
    uint32_t da[4];
974
    uint32_t sa[4];
975
    uint32_t sg[4];
976
    uint32_t sr;
977
    uint32_t sgc;
978
    uint32_t slp;
979
    uint32_t pol;
980
};
981

    
982
static target_ulong dcr_read_dma (void *opaque, int dcrn)
983
{
984
    ppc405_dma_t *dma;
985

    
986
    dma = opaque;
987

    
988
    return 0;
989
}
990

    
991
static void dcr_write_dma (void *opaque, int dcrn, target_ulong val)
992
{
993
    ppc405_dma_t *dma;
994

    
995
    dma = opaque;
996
}
997

    
998
static void ppc405_dma_reset (void *opaque)
999
{
1000
    ppc405_dma_t *dma;
1001
    int i;
1002

    
1003
    dma = opaque;
1004
    for (i = 0; i < 4; i++) {
1005
        dma->cr[i] = 0x00000000;
1006
        dma->ct[i] = 0x00000000;
1007
        dma->da[i] = 0x00000000;
1008
        dma->sa[i] = 0x00000000;
1009
        dma->sg[i] = 0x00000000;
1010
    }
1011
    dma->sr = 0x00000000;
1012
    dma->sgc = 0x00000000;
1013
    dma->slp = 0x7C000000;
1014
    dma->pol = 0x00000000;
1015
}
1016

    
1017
void ppc405_dma_init (CPUState *env, qemu_irq irqs[4])
1018
{
1019
    ppc405_dma_t *dma;
1020

    
1021
    dma = qemu_mallocz(sizeof(ppc405_dma_t));
1022
    if (dma != NULL) {
1023
        memcpy(dma->irqs, irqs, 4 * sizeof(qemu_irq));
1024
        ppc405_dma_reset(dma);
1025
        qemu_register_reset(&ppc405_dma_reset, dma);
1026
        ppc_dcr_register(env, DMA0_CR0,
1027
                         dma, &dcr_read_dma, &dcr_write_dma);
1028
        ppc_dcr_register(env, DMA0_CT0,
1029
                         dma, &dcr_read_dma, &dcr_write_dma);
1030
        ppc_dcr_register(env, DMA0_DA0,
1031
                         dma, &dcr_read_dma, &dcr_write_dma);
1032
        ppc_dcr_register(env, DMA0_SA0,
1033
                         dma, &dcr_read_dma, &dcr_write_dma);
1034
        ppc_dcr_register(env, DMA0_SG0,
1035
                         dma, &dcr_read_dma, &dcr_write_dma);
1036
        ppc_dcr_register(env, DMA0_CR1,
1037
                         dma, &dcr_read_dma, &dcr_write_dma);
1038
        ppc_dcr_register(env, DMA0_CT1,
1039
                         dma, &dcr_read_dma, &dcr_write_dma);
1040
        ppc_dcr_register(env, DMA0_DA1,
1041
                         dma, &dcr_read_dma, &dcr_write_dma);
1042
        ppc_dcr_register(env, DMA0_SA1,
1043
                         dma, &dcr_read_dma, &dcr_write_dma);
1044
        ppc_dcr_register(env, DMA0_SG1,
1045
                         dma, &dcr_read_dma, &dcr_write_dma);
1046
        ppc_dcr_register(env, DMA0_CR2,
1047
                         dma, &dcr_read_dma, &dcr_write_dma);
1048
        ppc_dcr_register(env, DMA0_CT2,
1049
                         dma, &dcr_read_dma, &dcr_write_dma);
1050
        ppc_dcr_register(env, DMA0_DA2,
1051
                         dma, &dcr_read_dma, &dcr_write_dma);
1052
        ppc_dcr_register(env, DMA0_SA2,
1053
                         dma, &dcr_read_dma, &dcr_write_dma);
1054
        ppc_dcr_register(env, DMA0_SG2,
1055
                         dma, &dcr_read_dma, &dcr_write_dma);
1056
        ppc_dcr_register(env, DMA0_CR3,
1057
                         dma, &dcr_read_dma, &dcr_write_dma);
1058
        ppc_dcr_register(env, DMA0_CT3,
1059
                         dma, &dcr_read_dma, &dcr_write_dma);
1060
        ppc_dcr_register(env, DMA0_DA3,
1061
                         dma, &dcr_read_dma, &dcr_write_dma);
1062
        ppc_dcr_register(env, DMA0_SA3,
1063
                         dma, &dcr_read_dma, &dcr_write_dma);
1064
        ppc_dcr_register(env, DMA0_SG3,
1065
                         dma, &dcr_read_dma, &dcr_write_dma);
1066
        ppc_dcr_register(env, DMA0_SR,
1067
                         dma, &dcr_read_dma, &dcr_write_dma);
1068
        ppc_dcr_register(env, DMA0_SGC,
1069
                         dma, &dcr_read_dma, &dcr_write_dma);
1070
        ppc_dcr_register(env, DMA0_SLP,
1071
                         dma, &dcr_read_dma, &dcr_write_dma);
1072
        ppc_dcr_register(env, DMA0_POL,
1073
                         dma, &dcr_read_dma, &dcr_write_dma);
1074
    }
1075
}
1076

    
1077
/*****************************************************************************/
1078
/* GPIO */
1079
typedef struct ppc405_gpio_t ppc405_gpio_t;
1080
struct ppc405_gpio_t {
1081
    target_phys_addr_t base;
1082
    uint32_t or;
1083
    uint32_t tcr;
1084
    uint32_t osrh;
1085
    uint32_t osrl;
1086
    uint32_t tsrh;
1087
    uint32_t tsrl;
1088
    uint32_t odr;
1089
    uint32_t ir;
1090
    uint32_t rr1;
1091
    uint32_t isr1h;
1092
    uint32_t isr1l;
1093
};
1094

    
1095
static uint32_t ppc405_gpio_readb (void *opaque, target_phys_addr_t addr)
1096
{
1097
    ppc405_gpio_t *gpio;
1098

    
1099
    gpio = opaque;
1100
#ifdef DEBUG_GPIO
1101
    printf("%s: addr " PADDRX "\n", __func__, addr);
1102
#endif
1103

    
1104
    return 0;
1105
}
1106

    
1107
static void ppc405_gpio_writeb (void *opaque,
1108
                                target_phys_addr_t addr, uint32_t value)
1109
{
1110
    ppc405_gpio_t *gpio;
1111

    
1112
    gpio = opaque;
1113
#ifdef DEBUG_GPIO
1114
    printf("%s: addr " PADDRX " val %08" PRIx32 "\n", __func__, addr, value);
1115
#endif
1116
}
1117

    
1118
static uint32_t ppc405_gpio_readw (void *opaque, target_phys_addr_t addr)
1119
{
1120
    ppc405_gpio_t *gpio;
1121

    
1122
    gpio = opaque;
1123
#ifdef DEBUG_GPIO
1124
    printf("%s: addr " PADDRX "\n", __func__, addr);
1125
#endif
1126

    
1127
    return 0;
1128
}
1129

    
1130
static void ppc405_gpio_writew (void *opaque,
1131
                                target_phys_addr_t addr, uint32_t value)
1132
{
1133
    ppc405_gpio_t *gpio;
1134

    
1135
    gpio = opaque;
1136
#ifdef DEBUG_GPIO
1137
    printf("%s: addr " PADDRX " val %08" PRIx32 "\n", __func__, addr, value);
1138
#endif
1139
}
1140

    
1141
static uint32_t ppc405_gpio_readl (void *opaque, target_phys_addr_t addr)
1142
{
1143
    ppc405_gpio_t *gpio;
1144

    
1145
    gpio = opaque;
1146
#ifdef DEBUG_GPIO
1147
    printf("%s: addr " PADDRX "\n", __func__, addr);
1148
#endif
1149

    
1150
    return 0;
1151
}
1152

    
1153
static void ppc405_gpio_writel (void *opaque,
1154
                                target_phys_addr_t addr, uint32_t value)
1155
{
1156
    ppc405_gpio_t *gpio;
1157

    
1158
    gpio = opaque;
1159
#ifdef DEBUG_GPIO
1160
    printf("%s: addr " PADDRX " val %08" PRIx32 "\n", __func__, addr, value);
1161
#endif
1162
}
1163

    
1164
static CPUReadMemoryFunc *ppc405_gpio_read[] = {
1165
    &ppc405_gpio_readb,
1166
    &ppc405_gpio_readw,
1167
    &ppc405_gpio_readl,
1168
};
1169

    
1170
static CPUWriteMemoryFunc *ppc405_gpio_write[] = {
1171
    &ppc405_gpio_writeb,
1172
    &ppc405_gpio_writew,
1173
    &ppc405_gpio_writel,
1174
};
1175

    
1176
static void ppc405_gpio_reset (void *opaque)
1177
{
1178
    ppc405_gpio_t *gpio;
1179

    
1180
    gpio = opaque;
1181
}
1182

    
1183
void ppc405_gpio_init (CPUState *env, ppc4xx_mmio_t *mmio,
1184
                       target_phys_addr_t offset)
1185
{
1186
    ppc405_gpio_t *gpio;
1187

    
1188
    gpio = qemu_mallocz(sizeof(ppc405_gpio_t));
1189
    if (gpio != NULL) {
1190
        gpio->base = offset;
1191
        ppc405_gpio_reset(gpio);
1192
        qemu_register_reset(&ppc405_gpio_reset, gpio);
1193
#ifdef DEBUG_GPIO
1194
        printf("%s: offset " PADDRX "\n", __func__, offset);
1195
#endif
1196
        ppc4xx_mmio_register(env, mmio, offset, 0x038,
1197
                             ppc405_gpio_read, ppc405_gpio_write, gpio);
1198
    }
1199
}
1200

    
1201
/*****************************************************************************/
1202
/* Serial ports */
1203
static CPUReadMemoryFunc *serial_mm_read[] = {
1204
    &serial_mm_readb,
1205
    &serial_mm_readw,
1206
    &serial_mm_readl,
1207
};
1208

    
1209
static CPUWriteMemoryFunc *serial_mm_write[] = {
1210
    &serial_mm_writeb,
1211
    &serial_mm_writew,
1212
    &serial_mm_writel,
1213
};
1214

    
1215
void ppc405_serial_init (CPUState *env, ppc4xx_mmio_t *mmio,
1216
                         target_phys_addr_t offset, qemu_irq irq,
1217
                         CharDriverState *chr)
1218
{
1219
    void *serial;
1220

    
1221
#ifdef DEBUG_SERIAL
1222
    printf("%s: offset " PADDRX "\n", __func__, offset);
1223
#endif
1224
    serial = serial_mm_init(offset, 0, irq, 399193, chr, 0);
1225
    ppc4xx_mmio_register(env, mmio, offset, 0x008,
1226
                         serial_mm_read, serial_mm_write, serial);
1227
}
1228

    
1229
/*****************************************************************************/
1230
/* On Chip Memory */
1231
enum {
1232
    OCM0_ISARC   = 0x018,
1233
    OCM0_ISACNTL = 0x019,
1234
    OCM0_DSARC   = 0x01A,
1235
    OCM0_DSACNTL = 0x01B,
1236
};
1237

    
1238
typedef struct ppc405_ocm_t ppc405_ocm_t;
1239
struct ppc405_ocm_t {
1240
    target_ulong offset;
1241
    uint32_t isarc;
1242
    uint32_t isacntl;
1243
    uint32_t dsarc;
1244
    uint32_t dsacntl;
1245
};
1246

    
1247
static void ocm_update_mappings (ppc405_ocm_t *ocm,
1248
                                 uint32_t isarc, uint32_t isacntl,
1249
                                 uint32_t dsarc, uint32_t dsacntl)
1250
{
1251
#ifdef DEBUG_OCM
1252
    printf("OCM update ISA %08" PRIx32 " %08" PRIx32 " (%08" PRIx32
1253
           " %08" PRIx32 ") DSA %08" PRIx32 " %08" PRIx32
1254
           " (%08" PRIx32 " %08" PRIx32 ")\n",
1255
           isarc, isacntl, dsarc, dsacntl,
1256
           ocm->isarc, ocm->isacntl, ocm->dsarc, ocm->dsacntl);
1257
#endif
1258
    if (ocm->isarc != isarc ||
1259
        (ocm->isacntl & 0x80000000) != (isacntl & 0x80000000)) {
1260
        if (ocm->isacntl & 0x80000000) {
1261
            /* Unmap previously assigned memory region */
1262
            printf("OCM unmap ISA %08" PRIx32 "\n", ocm->isarc);
1263
            cpu_register_physical_memory(ocm->isarc, 0x04000000,
1264
                                         IO_MEM_UNASSIGNED);
1265
        }
1266
        if (isacntl & 0x80000000) {
1267
            /* Map new instruction memory region */
1268
#ifdef DEBUG_OCM
1269
            printf("OCM map ISA %08" PRIx32 "\n", isarc);
1270
#endif
1271
            cpu_register_physical_memory(isarc, 0x04000000,
1272
                                         ocm->offset | IO_MEM_RAM);
1273
        }
1274
    }
1275
    if (ocm->dsarc != dsarc ||
1276
        (ocm->dsacntl & 0x80000000) != (dsacntl & 0x80000000)) {
1277
        if (ocm->dsacntl & 0x80000000) {
1278
            /* Beware not to unmap the region we just mapped */
1279
            if (!(isacntl & 0x80000000) || ocm->dsarc != isarc) {
1280
                /* Unmap previously assigned memory region */
1281
#ifdef DEBUG_OCM
1282
                printf("OCM unmap DSA %08" PRIx32 "\n", ocm->dsarc);
1283
#endif
1284
                cpu_register_physical_memory(ocm->dsarc, 0x04000000,
1285
                                             IO_MEM_UNASSIGNED);
1286
            }
1287
        }
1288
        if (dsacntl & 0x80000000) {
1289
            /* Beware not to remap the region we just mapped */
1290
            if (!(isacntl & 0x80000000) || dsarc != isarc) {
1291
                /* Map new data memory region */
1292
#ifdef DEBUG_OCM
1293
                printf("OCM map DSA %08" PRIx32 "\n", dsarc);
1294
#endif
1295
                cpu_register_physical_memory(dsarc, 0x04000000,
1296
                                             ocm->offset | IO_MEM_RAM);
1297
            }
1298
        }
1299
    }
1300
}
1301

    
1302
static target_ulong dcr_read_ocm (void *opaque, int dcrn)
1303
{
1304
    ppc405_ocm_t *ocm;
1305
    target_ulong ret;
1306

    
1307
    ocm = opaque;
1308
    switch (dcrn) {
1309
    case OCM0_ISARC:
1310
        ret = ocm->isarc;
1311
        break;
1312
    case OCM0_ISACNTL:
1313
        ret = ocm->isacntl;
1314
        break;
1315
    case OCM0_DSARC:
1316
        ret = ocm->dsarc;
1317
        break;
1318
    case OCM0_DSACNTL:
1319
        ret = ocm->dsacntl;
1320
        break;
1321
    default:
1322
        ret = 0;
1323
        break;
1324
    }
1325

    
1326
    return ret;
1327
}
1328

    
1329
static void dcr_write_ocm (void *opaque, int dcrn, target_ulong val)
1330
{
1331
    ppc405_ocm_t *ocm;
1332
    uint32_t isarc, dsarc, isacntl, dsacntl;
1333

    
1334
    ocm = opaque;
1335
    isarc = ocm->isarc;
1336
    dsarc = ocm->dsarc;
1337
    isacntl = ocm->isacntl;
1338
    dsacntl = ocm->dsacntl;
1339
    switch (dcrn) {
1340
    case OCM0_ISARC:
1341
        isarc = val & 0xFC000000;
1342
        break;
1343
    case OCM0_ISACNTL:
1344
        isacntl = val & 0xC0000000;
1345
        break;
1346
    case OCM0_DSARC:
1347
        isarc = val & 0xFC000000;
1348
        break;
1349
    case OCM0_DSACNTL:
1350
        isacntl = val & 0xC0000000;
1351
        break;
1352
    }
1353
    ocm_update_mappings(ocm, isarc, isacntl, dsarc, dsacntl);
1354
    ocm->isarc = isarc;
1355
    ocm->dsarc = dsarc;
1356
    ocm->isacntl = isacntl;
1357
    ocm->dsacntl = dsacntl;
1358
}
1359

    
1360
static void ocm_reset (void *opaque)
1361
{
1362
    ppc405_ocm_t *ocm;
1363
    uint32_t isarc, dsarc, isacntl, dsacntl;
1364

    
1365
    ocm = opaque;
1366
    isarc = 0x00000000;
1367
    isacntl = 0x00000000;
1368
    dsarc = 0x00000000;
1369
    dsacntl = 0x00000000;
1370
    ocm_update_mappings(ocm, isarc, isacntl, dsarc, dsacntl);
1371
    ocm->isarc = isarc;
1372
    ocm->dsarc = dsarc;
1373
    ocm->isacntl = isacntl;
1374
    ocm->dsacntl = dsacntl;
1375
}
1376

    
1377
void ppc405_ocm_init (CPUState *env, unsigned long offset)
1378
{
1379
    ppc405_ocm_t *ocm;
1380

    
1381
    ocm = qemu_mallocz(sizeof(ppc405_ocm_t));
1382
    if (ocm != NULL) {
1383
        ocm->offset = offset;
1384
        ocm_reset(ocm);
1385
        qemu_register_reset(&ocm_reset, ocm);
1386
        ppc_dcr_register(env, OCM0_ISARC,
1387
                         ocm, &dcr_read_ocm, &dcr_write_ocm);
1388
        ppc_dcr_register(env, OCM0_ISACNTL,
1389
                         ocm, &dcr_read_ocm, &dcr_write_ocm);
1390
        ppc_dcr_register(env, OCM0_DSARC,
1391
                         ocm, &dcr_read_ocm, &dcr_write_ocm);
1392
        ppc_dcr_register(env, OCM0_DSACNTL,
1393
                         ocm, &dcr_read_ocm, &dcr_write_ocm);
1394
    }
1395
}
1396

    
1397
/*****************************************************************************/
1398
/* I2C controller */
1399
typedef struct ppc4xx_i2c_t ppc4xx_i2c_t;
1400
struct ppc4xx_i2c_t {
1401
    target_phys_addr_t base;
1402
    qemu_irq irq;
1403
    uint8_t mdata;
1404
    uint8_t lmadr;
1405
    uint8_t hmadr;
1406
    uint8_t cntl;
1407
    uint8_t mdcntl;
1408
    uint8_t sts;
1409
    uint8_t extsts;
1410
    uint8_t sdata;
1411
    uint8_t lsadr;
1412
    uint8_t hsadr;
1413
    uint8_t clkdiv;
1414
    uint8_t intrmsk;
1415
    uint8_t xfrcnt;
1416
    uint8_t xtcntlss;
1417
    uint8_t directcntl;
1418
};
1419

    
1420
static uint32_t ppc4xx_i2c_readb (void *opaque, target_phys_addr_t addr)
1421
{
1422
    ppc4xx_i2c_t *i2c;
1423
    uint32_t ret;
1424

    
1425
#ifdef DEBUG_I2C
1426
    printf("%s: addr " PADDRX "\n", __func__, addr);
1427
#endif
1428
    i2c = opaque;
1429
    switch (addr - i2c->base) {
1430
    case 0x00:
1431
        //        i2c_readbyte(&i2c->mdata);
1432
        ret = i2c->mdata;
1433
        break;
1434
    case 0x02:
1435
        ret = i2c->sdata;
1436
        break;
1437
    case 0x04:
1438
        ret = i2c->lmadr;
1439
        break;
1440
    case 0x05:
1441
        ret = i2c->hmadr;
1442
        break;
1443
    case 0x06:
1444
        ret = i2c->cntl;
1445
        break;
1446
    case 0x07:
1447
        ret = i2c->mdcntl;
1448
        break;
1449
    case 0x08:
1450
        ret = i2c->sts;
1451
        break;
1452
    case 0x09:
1453
        ret = i2c->extsts;
1454
        break;
1455
    case 0x0A:
1456
        ret = i2c->lsadr;
1457
        break;
1458
    case 0x0B:
1459
        ret = i2c->hsadr;
1460
        break;
1461
    case 0x0C:
1462
        ret = i2c->clkdiv;
1463
        break;
1464
    case 0x0D:
1465
        ret = i2c->intrmsk;
1466
        break;
1467
    case 0x0E:
1468
        ret = i2c->xfrcnt;
1469
        break;
1470
    case 0x0F:
1471
        ret = i2c->xtcntlss;
1472
        break;
1473
    case 0x10:
1474
        ret = i2c->directcntl;
1475
        break;
1476
    default:
1477
        ret = 0x00;
1478
        break;
1479
    }
1480
#ifdef DEBUG_I2C
1481
    printf("%s: addr " PADDRX " %02" PRIx32 "\n", __func__, addr, ret);
1482
#endif
1483

    
1484
    return ret;
1485
}
1486

    
1487
static void ppc4xx_i2c_writeb (void *opaque,
1488
                               target_phys_addr_t addr, uint32_t value)
1489
{
1490
    ppc4xx_i2c_t *i2c;
1491

    
1492
#ifdef DEBUG_I2C
1493
    printf("%s: addr " PADDRX " val %08" PRIx32 "\n", __func__, addr, value);
1494
#endif
1495
    i2c = opaque;
1496
    switch (addr - i2c->base) {
1497
    case 0x00:
1498
        i2c->mdata = value;
1499
        //        i2c_sendbyte(&i2c->mdata);
1500
        break;
1501
    case 0x02:
1502
        i2c->sdata = value;
1503
        break;
1504
    case 0x04:
1505
        i2c->lmadr = value;
1506
        break;
1507
    case 0x05:
1508
        i2c->hmadr = value;
1509
        break;
1510
    case 0x06:
1511
        i2c->cntl = value;
1512
        break;
1513
    case 0x07:
1514
        i2c->mdcntl = value & 0xDF;
1515
        break;
1516
    case 0x08:
1517
        i2c->sts &= ~(value & 0x0A);
1518
        break;
1519
    case 0x09:
1520
        i2c->extsts &= ~(value & 0x8F);
1521
        break;
1522
    case 0x0A:
1523
        i2c->lsadr = value;
1524
        break;
1525
    case 0x0B:
1526
        i2c->hsadr = value;
1527
        break;
1528
    case 0x0C:
1529
        i2c->clkdiv = value;
1530
        break;
1531
    case 0x0D:
1532
        i2c->intrmsk = value;
1533
        break;
1534
    case 0x0E:
1535
        i2c->xfrcnt = value & 0x77;
1536
        break;
1537
    case 0x0F:
1538
        i2c->xtcntlss = value;
1539
        break;
1540
    case 0x10:
1541
        i2c->directcntl = value & 0x7;
1542
        break;
1543
    }
1544
}
1545

    
1546
static uint32_t ppc4xx_i2c_readw (void *opaque, target_phys_addr_t addr)
1547
{
1548
    uint32_t ret;
1549

    
1550
#ifdef DEBUG_I2C
1551
    printf("%s: addr " PADDRX "\n", __func__, addr);
1552
#endif
1553
    ret = ppc4xx_i2c_readb(opaque, addr) << 8;
1554
    ret |= ppc4xx_i2c_readb(opaque, addr + 1);
1555

    
1556
    return ret;
1557
}
1558

    
1559
static void ppc4xx_i2c_writew (void *opaque,
1560
                               target_phys_addr_t addr, uint32_t value)
1561
{
1562
#ifdef DEBUG_I2C
1563
    printf("%s: addr " PADDRX " val %08" PRIx32 "\n", __func__, addr, value);
1564
#endif
1565
    ppc4xx_i2c_writeb(opaque, addr, value >> 8);
1566
    ppc4xx_i2c_writeb(opaque, addr + 1, value);
1567
}
1568

    
1569
static uint32_t ppc4xx_i2c_readl (void *opaque, target_phys_addr_t addr)
1570
{
1571
    uint32_t ret;
1572

    
1573
#ifdef DEBUG_I2C
1574
    printf("%s: addr " PADDRX "\n", __func__, addr);
1575
#endif
1576
    ret = ppc4xx_i2c_readb(opaque, addr) << 24;
1577
    ret |= ppc4xx_i2c_readb(opaque, addr + 1) << 16;
1578
    ret |= ppc4xx_i2c_readb(opaque, addr + 2) << 8;
1579
    ret |= ppc4xx_i2c_readb(opaque, addr + 3);
1580

    
1581
    return ret;
1582
}
1583

    
1584
static void ppc4xx_i2c_writel (void *opaque,
1585
                               target_phys_addr_t addr, uint32_t value)
1586
{
1587
#ifdef DEBUG_I2C
1588
    printf("%s: addr " PADDRX " val %08" PRIx32 "\n", __func__, addr, value);
1589
#endif
1590
    ppc4xx_i2c_writeb(opaque, addr, value >> 24);
1591
    ppc4xx_i2c_writeb(opaque, addr + 1, value >> 16);
1592
    ppc4xx_i2c_writeb(opaque, addr + 2, value >> 8);
1593
    ppc4xx_i2c_writeb(opaque, addr + 3, value);
1594
}
1595

    
1596
static CPUReadMemoryFunc *i2c_read[] = {
1597
    &ppc4xx_i2c_readb,
1598
    &ppc4xx_i2c_readw,
1599
    &ppc4xx_i2c_readl,
1600
};
1601

    
1602
static CPUWriteMemoryFunc *i2c_write[] = {
1603
    &ppc4xx_i2c_writeb,
1604
    &ppc4xx_i2c_writew,
1605
    &ppc4xx_i2c_writel,
1606
};
1607

    
1608
static void ppc4xx_i2c_reset (void *opaque)
1609
{
1610
    ppc4xx_i2c_t *i2c;
1611

    
1612
    i2c = opaque;
1613
    i2c->mdata = 0x00;
1614
    i2c->sdata = 0x00;
1615
    i2c->cntl = 0x00;
1616
    i2c->mdcntl = 0x00;
1617
    i2c->sts = 0x00;
1618
    i2c->extsts = 0x00;
1619
    i2c->clkdiv = 0x00;
1620
    i2c->xfrcnt = 0x00;
1621
    i2c->directcntl = 0x0F;
1622
}
1623

    
1624
void ppc405_i2c_init (CPUState *env, ppc4xx_mmio_t *mmio,
1625
                      target_phys_addr_t offset, qemu_irq irq)
1626
{
1627
    ppc4xx_i2c_t *i2c;
1628

    
1629
    i2c = qemu_mallocz(sizeof(ppc4xx_i2c_t));
1630
    if (i2c != NULL) {
1631
        i2c->base = offset;
1632
        i2c->irq = irq;
1633
        ppc4xx_i2c_reset(i2c);
1634
#ifdef DEBUG_I2C
1635
        printf("%s: offset " PADDRX "\n", __func__, offset);
1636
#endif
1637
        ppc4xx_mmio_register(env, mmio, offset, 0x011,
1638
                             i2c_read, i2c_write, i2c);
1639
        qemu_register_reset(ppc4xx_i2c_reset, i2c);
1640
    }
1641
}
1642

    
1643
/*****************************************************************************/
1644
/* General purpose timers */
1645
typedef struct ppc4xx_gpt_t ppc4xx_gpt_t;
1646
struct ppc4xx_gpt_t {
1647
    target_phys_addr_t base;
1648
    int64_t tb_offset;
1649
    uint32_t tb_freq;
1650
    struct QEMUTimer *timer;
1651
    qemu_irq irqs[5];
1652
    uint32_t oe;
1653
    uint32_t ol;
1654
    uint32_t im;
1655
    uint32_t is;
1656
    uint32_t ie;
1657
    uint32_t comp[5];
1658
    uint32_t mask[5];
1659
};
1660

    
1661
static uint32_t ppc4xx_gpt_readb (void *opaque, target_phys_addr_t addr)
1662
{
1663
#ifdef DEBUG_GPT
1664
    printf("%s: addr " PADDRX "\n", __func__, addr);
1665
#endif
1666
    /* XXX: generate a bus fault */
1667
    return -1;
1668
}
1669

    
1670
static void ppc4xx_gpt_writeb (void *opaque,
1671
                               target_phys_addr_t addr, uint32_t value)
1672
{
1673
#ifdef DEBUG_I2C
1674
    printf("%s: addr " PADDRX " val %08" PRIx32 "\n", __func__, addr, value);
1675
#endif
1676
    /* XXX: generate a bus fault */
1677
}
1678

    
1679
static uint32_t ppc4xx_gpt_readw (void *opaque, target_phys_addr_t addr)
1680
{
1681
#ifdef DEBUG_GPT
1682
    printf("%s: addr " PADDRX "\n", __func__, addr);
1683
#endif
1684
    /* XXX: generate a bus fault */
1685
    return -1;
1686
}
1687

    
1688
static void ppc4xx_gpt_writew (void *opaque,
1689
                               target_phys_addr_t addr, uint32_t value)
1690
{
1691
#ifdef DEBUG_I2C
1692
    printf("%s: addr " PADDRX " val %08" PRIx32 "\n", __func__, addr, value);
1693
#endif
1694
    /* XXX: generate a bus fault */
1695
}
1696

    
1697
static int ppc4xx_gpt_compare (ppc4xx_gpt_t *gpt, int n)
1698
{
1699
    /* XXX: TODO */
1700
    return 0;
1701
}
1702

    
1703
static void ppc4xx_gpt_set_output (ppc4xx_gpt_t *gpt, int n, int level)
1704
{
1705
    /* XXX: TODO */
1706
}
1707

    
1708
static void ppc4xx_gpt_set_outputs (ppc4xx_gpt_t *gpt)
1709
{
1710
    uint32_t mask;
1711
    int i;
1712

    
1713
    mask = 0x80000000;
1714
    for (i = 0; i < 5; i++) {
1715
        if (gpt->oe & mask) {
1716
            /* Output is enabled */
1717
            if (ppc4xx_gpt_compare(gpt, i)) {
1718
                /* Comparison is OK */
1719
                ppc4xx_gpt_set_output(gpt, i, gpt->ol & mask);
1720
            } else {
1721
                /* Comparison is KO */
1722
                ppc4xx_gpt_set_output(gpt, i, gpt->ol & mask ? 0 : 1);
1723
            }
1724
        }
1725
        mask = mask >> 1;
1726
    }
1727
}
1728

    
1729
static void ppc4xx_gpt_set_irqs (ppc4xx_gpt_t *gpt)
1730
{
1731
    uint32_t mask;
1732
    int i;
1733

    
1734
    mask = 0x00008000;
1735
    for (i = 0; i < 5; i++) {
1736
        if (gpt->is & gpt->im & mask)
1737
            qemu_irq_raise(gpt->irqs[i]);
1738
        else
1739
            qemu_irq_lower(gpt->irqs[i]);
1740
        mask = mask >> 1;
1741
    }
1742
}
1743

    
1744
static void ppc4xx_gpt_compute_timer (ppc4xx_gpt_t *gpt)
1745
{
1746
    /* XXX: TODO */
1747
}
1748

    
1749
static uint32_t ppc4xx_gpt_readl (void *opaque, target_phys_addr_t addr)
1750
{
1751
    ppc4xx_gpt_t *gpt;
1752
    uint32_t ret;
1753
    int idx;
1754

    
1755
#ifdef DEBUG_GPT
1756
    printf("%s: addr " PADDRX "\n", __func__, addr);
1757
#endif
1758
    gpt = opaque;
1759
    switch (addr - gpt->base) {
1760
    case 0x00:
1761
        /* Time base counter */
1762
        ret = muldiv64(qemu_get_clock(vm_clock) + gpt->tb_offset,
1763
                       gpt->tb_freq, ticks_per_sec);
1764
        break;
1765
    case 0x10:
1766
        /* Output enable */
1767
        ret = gpt->oe;
1768
        break;
1769
    case 0x14:
1770
        /* Output level */
1771
        ret = gpt->ol;
1772
        break;
1773
    case 0x18:
1774
        /* Interrupt mask */
1775
        ret = gpt->im;
1776
        break;
1777
    case 0x1C:
1778
    case 0x20:
1779
        /* Interrupt status */
1780
        ret = gpt->is;
1781
        break;
1782
    case 0x24:
1783
        /* Interrupt enable */
1784
        ret = gpt->ie;
1785
        break;
1786
    case 0x80 ... 0x90:
1787
        /* Compare timer */
1788
        idx = ((addr - gpt->base) - 0x80) >> 2;
1789
        ret = gpt->comp[idx];
1790
        break;
1791
    case 0xC0 ... 0xD0:
1792
        /* Compare mask */
1793
        idx = ((addr - gpt->base) - 0xC0) >> 2;
1794
        ret = gpt->mask[idx];
1795
        break;
1796
    default:
1797
        ret = -1;
1798
        break;
1799
    }
1800

    
1801
    return ret;
1802
}
1803

    
1804
static void ppc4xx_gpt_writel (void *opaque,
1805
                               target_phys_addr_t addr, uint32_t value)
1806
{
1807
    ppc4xx_gpt_t *gpt;
1808
    int idx;
1809

    
1810
#ifdef DEBUG_I2C
1811
    printf("%s: addr " PADDRX " val %08" PRIx32 "\n", __func__, addr, value);
1812
#endif
1813
    gpt = opaque;
1814
    switch (addr - gpt->base) {
1815
    case 0x00:
1816
        /* Time base counter */
1817
        gpt->tb_offset = muldiv64(value, ticks_per_sec, gpt->tb_freq)
1818
            - qemu_get_clock(vm_clock);
1819
        ppc4xx_gpt_compute_timer(gpt);
1820
        break;
1821
    case 0x10:
1822
        /* Output enable */
1823
        gpt->oe = value & 0xF8000000;
1824
        ppc4xx_gpt_set_outputs(gpt);
1825
        break;
1826
    case 0x14:
1827
        /* Output level */
1828
        gpt->ol = value & 0xF8000000;
1829
        ppc4xx_gpt_set_outputs(gpt);
1830
        break;
1831
    case 0x18:
1832
        /* Interrupt mask */
1833
        gpt->im = value & 0x0000F800;
1834
        break;
1835
    case 0x1C:
1836
        /* Interrupt status set */
1837
        gpt->is |= value & 0x0000F800;
1838
        ppc4xx_gpt_set_irqs(gpt);
1839
        break;
1840
    case 0x20:
1841
        /* Interrupt status clear */
1842
        gpt->is &= ~(value & 0x0000F800);
1843
        ppc4xx_gpt_set_irqs(gpt);
1844
        break;
1845
    case 0x24:
1846
        /* Interrupt enable */
1847
        gpt->ie = value & 0x0000F800;
1848
        ppc4xx_gpt_set_irqs(gpt);
1849
        break;
1850
    case 0x80 ... 0x90:
1851
        /* Compare timer */
1852
        idx = ((addr - gpt->base) - 0x80) >> 2;
1853
        gpt->comp[idx] = value & 0xF8000000;
1854
        ppc4xx_gpt_compute_timer(gpt);
1855
        break;
1856
    case 0xC0 ... 0xD0:
1857
        /* Compare mask */
1858
        idx = ((addr - gpt->base) - 0xC0) >> 2;
1859
        gpt->mask[idx] = value & 0xF8000000;
1860
        ppc4xx_gpt_compute_timer(gpt);
1861
        break;
1862
    }
1863
}
1864

    
1865
static CPUReadMemoryFunc *gpt_read[] = {
1866
    &ppc4xx_gpt_readb,
1867
    &ppc4xx_gpt_readw,
1868
    &ppc4xx_gpt_readl,
1869
};
1870

    
1871
static CPUWriteMemoryFunc *gpt_write[] = {
1872
    &ppc4xx_gpt_writeb,
1873
    &ppc4xx_gpt_writew,
1874
    &ppc4xx_gpt_writel,
1875
};
1876

    
1877
static void ppc4xx_gpt_cb (void *opaque)
1878
{
1879
    ppc4xx_gpt_t *gpt;
1880

    
1881
    gpt = opaque;
1882
    ppc4xx_gpt_set_irqs(gpt);
1883
    ppc4xx_gpt_set_outputs(gpt);
1884
    ppc4xx_gpt_compute_timer(gpt);
1885
}
1886

    
1887
static void ppc4xx_gpt_reset (void *opaque)
1888
{
1889
    ppc4xx_gpt_t *gpt;
1890
    int i;
1891

    
1892
    gpt = opaque;
1893
    qemu_del_timer(gpt->timer);
1894
    gpt->oe = 0x00000000;
1895
    gpt->ol = 0x00000000;
1896
    gpt->im = 0x00000000;
1897
    gpt->is = 0x00000000;
1898
    gpt->ie = 0x00000000;
1899
    for (i = 0; i < 5; i++) {
1900
        gpt->comp[i] = 0x00000000;
1901
        gpt->mask[i] = 0x00000000;
1902
    }
1903
}
1904

    
1905
void ppc4xx_gpt_init (CPUState *env, ppc4xx_mmio_t *mmio,
1906
                      target_phys_addr_t offset, qemu_irq irqs[5])
1907
{
1908
    ppc4xx_gpt_t *gpt;
1909
    int i;
1910

    
1911
    gpt = qemu_mallocz(sizeof(ppc4xx_gpt_t));
1912
    if (gpt != NULL) {
1913
        gpt->base = offset;
1914
        for (i = 0; i < 5; i++)
1915
            gpt->irqs[i] = irqs[i];
1916
        gpt->timer = qemu_new_timer(vm_clock, &ppc4xx_gpt_cb, gpt);
1917
        ppc4xx_gpt_reset(gpt);
1918
#ifdef DEBUG_GPT
1919
        printf("%s: offset " PADDRX "\n", __func__, offset);
1920
#endif
1921
        ppc4xx_mmio_register(env, mmio, offset, 0x0D4,
1922
                             gpt_read, gpt_write, gpt);
1923
        qemu_register_reset(ppc4xx_gpt_reset, gpt);
1924
    }
1925
}
1926

    
1927
/*****************************************************************************/
1928
/* MAL */
1929
enum {
1930
    MAL0_CFG      = 0x180,
1931
    MAL0_ESR      = 0x181,
1932
    MAL0_IER      = 0x182,
1933
    MAL0_TXCASR   = 0x184,
1934
    MAL0_TXCARR   = 0x185,
1935
    MAL0_TXEOBISR = 0x186,
1936
    MAL0_TXDEIR   = 0x187,
1937
    MAL0_RXCASR   = 0x190,
1938
    MAL0_RXCARR   = 0x191,
1939
    MAL0_RXEOBISR = 0x192,
1940
    MAL0_RXDEIR   = 0x193,
1941
    MAL0_TXCTP0R  = 0x1A0,
1942
    MAL0_TXCTP1R  = 0x1A1,
1943
    MAL0_TXCTP2R  = 0x1A2,
1944
    MAL0_TXCTP3R  = 0x1A3,
1945
    MAL0_RXCTP0R  = 0x1C0,
1946
    MAL0_RXCTP1R  = 0x1C1,
1947
    MAL0_RCBS0    = 0x1E0,
1948
    MAL0_RCBS1    = 0x1E1,
1949
};
1950

    
1951
typedef struct ppc40x_mal_t ppc40x_mal_t;
1952
struct ppc40x_mal_t {
1953
    qemu_irq irqs[4];
1954
    uint32_t cfg;
1955
    uint32_t esr;
1956
    uint32_t ier;
1957
    uint32_t txcasr;
1958
    uint32_t txcarr;
1959
    uint32_t txeobisr;
1960
    uint32_t txdeir;
1961
    uint32_t rxcasr;
1962
    uint32_t rxcarr;
1963
    uint32_t rxeobisr;
1964
    uint32_t rxdeir;
1965
    uint32_t txctpr[4];
1966
    uint32_t rxctpr[2];
1967
    uint32_t rcbs[2];
1968
};
1969

    
1970
static void ppc40x_mal_reset (void *opaque);
1971

    
1972
static target_ulong dcr_read_mal (void *opaque, int dcrn)
1973
{
1974
    ppc40x_mal_t *mal;
1975
    target_ulong ret;
1976

    
1977
    mal = opaque;
1978
    switch (dcrn) {
1979
    case MAL0_CFG:
1980
        ret = mal->cfg;
1981
        break;
1982
    case MAL0_ESR:
1983
        ret = mal->esr;
1984
        break;
1985
    case MAL0_IER:
1986
        ret = mal->ier;
1987
        break;
1988
    case MAL0_TXCASR:
1989
        ret = mal->txcasr;
1990
        break;
1991
    case MAL0_TXCARR:
1992
        ret = mal->txcarr;
1993
        break;
1994
    case MAL0_TXEOBISR:
1995
        ret = mal->txeobisr;
1996
        break;
1997
    case MAL0_TXDEIR:
1998
        ret = mal->txdeir;
1999
        break;
2000
    case MAL0_RXCASR:
2001
        ret = mal->rxcasr;
2002
        break;
2003
    case MAL0_RXCARR:
2004
        ret = mal->rxcarr;
2005
        break;
2006
    case MAL0_RXEOBISR:
2007
        ret = mal->rxeobisr;
2008
        break;
2009
    case MAL0_RXDEIR:
2010
        ret = mal->rxdeir;
2011
        break;
2012
    case MAL0_TXCTP0R:
2013
        ret = mal->txctpr[0];
2014
        break;
2015
    case MAL0_TXCTP1R:
2016
        ret = mal->txctpr[1];
2017
        break;
2018
    case MAL0_TXCTP2R:
2019
        ret = mal->txctpr[2];
2020
        break;
2021
    case MAL0_TXCTP3R:
2022
        ret = mal->txctpr[3];
2023
        break;
2024
    case MAL0_RXCTP0R:
2025
        ret = mal->rxctpr[0];
2026
        break;
2027
    case MAL0_RXCTP1R:
2028
        ret = mal->rxctpr[1];
2029
        break;
2030
    case MAL0_RCBS0:
2031
        ret = mal->rcbs[0];
2032
        break;
2033
    case MAL0_RCBS1:
2034
        ret = mal->rcbs[1];
2035
        break;
2036
    default:
2037
        ret = 0;
2038
        break;
2039
    }
2040

    
2041
    return ret;
2042
}
2043

    
2044
static void dcr_write_mal (void *opaque, int dcrn, target_ulong val)
2045
{
2046
    ppc40x_mal_t *mal;
2047
    int idx;
2048

    
2049
    mal = opaque;
2050
    switch (dcrn) {
2051
    case MAL0_CFG:
2052
        if (val & 0x80000000)
2053
            ppc40x_mal_reset(mal);
2054
        mal->cfg = val & 0x00FFC087;
2055
        break;
2056
    case MAL0_ESR:
2057
        /* Read/clear */
2058
        mal->esr &= ~val;
2059
        break;
2060
    case MAL0_IER:
2061
        mal->ier = val & 0x0000001F;
2062
        break;
2063
    case MAL0_TXCASR:
2064
        mal->txcasr = val & 0xF0000000;
2065
        break;
2066
    case MAL0_TXCARR:
2067
        mal->txcarr = val & 0xF0000000;
2068
        break;
2069
    case MAL0_TXEOBISR:
2070
        /* Read/clear */
2071
        mal->txeobisr &= ~val;
2072
        break;
2073
    case MAL0_TXDEIR:
2074
        /* Read/clear */
2075
        mal->txdeir &= ~val;
2076
        break;
2077
    case MAL0_RXCASR:
2078
        mal->rxcasr = val & 0xC0000000;
2079
        break;
2080
    case MAL0_RXCARR:
2081
        mal->rxcarr = val & 0xC0000000;
2082
        break;
2083
    case MAL0_RXEOBISR:
2084
        /* Read/clear */
2085
        mal->rxeobisr &= ~val;
2086
        break;
2087
    case MAL0_RXDEIR:
2088
        /* Read/clear */
2089
        mal->rxdeir &= ~val;
2090
        break;
2091
    case MAL0_TXCTP0R:
2092
        idx = 0;
2093
        goto update_tx_ptr;
2094
    case MAL0_TXCTP1R:
2095
        idx = 1;
2096
        goto update_tx_ptr;
2097
    case MAL0_TXCTP2R:
2098
        idx = 2;
2099
        goto update_tx_ptr;
2100
    case MAL0_TXCTP3R:
2101
        idx = 3;
2102
    update_tx_ptr:
2103
        mal->txctpr[idx] = val;
2104
        break;
2105
    case MAL0_RXCTP0R:
2106
        idx = 0;
2107
        goto update_rx_ptr;
2108
    case MAL0_RXCTP1R:
2109
        idx = 1;
2110
    update_rx_ptr:
2111
        mal->rxctpr[idx] = val;
2112
        break;
2113
    case MAL0_RCBS0:
2114
        idx = 0;
2115
        goto update_rx_size;
2116
    case MAL0_RCBS1:
2117
        idx = 1;
2118
    update_rx_size:
2119
        mal->rcbs[idx] = val & 0x000000FF;
2120
        break;
2121
    }
2122
}
2123

    
2124
static void ppc40x_mal_reset (void *opaque)
2125
{
2126
    ppc40x_mal_t *mal;
2127

    
2128
    mal = opaque;
2129
    mal->cfg = 0x0007C000;
2130
    mal->esr = 0x00000000;
2131
    mal->ier = 0x00000000;
2132
    mal->rxcasr = 0x00000000;
2133
    mal->rxdeir = 0x00000000;
2134
    mal->rxeobisr = 0x00000000;
2135
    mal->txcasr = 0x00000000;
2136
    mal->txdeir = 0x00000000;
2137
    mal->txeobisr = 0x00000000;
2138
}
2139

    
2140
void ppc405_mal_init (CPUState *env, qemu_irq irqs[4])
2141
{
2142
    ppc40x_mal_t *mal;
2143
    int i;
2144

    
2145
    mal = qemu_mallocz(sizeof(ppc40x_mal_t));
2146
    if (mal != NULL) {
2147
        for (i = 0; i < 4; i++)
2148
            mal->irqs[i] = irqs[i];
2149
        ppc40x_mal_reset(mal);
2150
        qemu_register_reset(&ppc40x_mal_reset, mal);
2151
        ppc_dcr_register(env, MAL0_CFG,
2152
                         mal, &dcr_read_mal, &dcr_write_mal);
2153
        ppc_dcr_register(env, MAL0_ESR,
2154
                         mal, &dcr_read_mal, &dcr_write_mal);
2155
        ppc_dcr_register(env, MAL0_IER,
2156
                         mal, &dcr_read_mal, &dcr_write_mal);
2157
        ppc_dcr_register(env, MAL0_TXCASR,
2158
                         mal, &dcr_read_mal, &dcr_write_mal);
2159
        ppc_dcr_register(env, MAL0_TXCARR,
2160
                         mal, &dcr_read_mal, &dcr_write_mal);
2161
        ppc_dcr_register(env, MAL0_TXEOBISR,
2162
                         mal, &dcr_read_mal, &dcr_write_mal);
2163
        ppc_dcr_register(env, MAL0_TXDEIR,
2164
                         mal, &dcr_read_mal, &dcr_write_mal);
2165
        ppc_dcr_register(env, MAL0_RXCASR,
2166
                         mal, &dcr_read_mal, &dcr_write_mal);
2167
        ppc_dcr_register(env, MAL0_RXCARR,
2168
                         mal, &dcr_read_mal, &dcr_write_mal);
2169
        ppc_dcr_register(env, MAL0_RXEOBISR,
2170
                         mal, &dcr_read_mal, &dcr_write_mal);
2171
        ppc_dcr_register(env, MAL0_RXDEIR,
2172
                         mal, &dcr_read_mal, &dcr_write_mal);
2173
        ppc_dcr_register(env, MAL0_TXCTP0R,
2174
                         mal, &dcr_read_mal, &dcr_write_mal);
2175
        ppc_dcr_register(env, MAL0_TXCTP1R,
2176
                         mal, &dcr_read_mal, &dcr_write_mal);
2177
        ppc_dcr_register(env, MAL0_TXCTP2R,
2178
                         mal, &dcr_read_mal, &dcr_write_mal);
2179
        ppc_dcr_register(env, MAL0_TXCTP3R,
2180
                         mal, &dcr_read_mal, &dcr_write_mal);
2181
        ppc_dcr_register(env, MAL0_RXCTP0R,
2182
                         mal, &dcr_read_mal, &dcr_write_mal);
2183
        ppc_dcr_register(env, MAL0_RXCTP1R,
2184
                         mal, &dcr_read_mal, &dcr_write_mal);
2185
        ppc_dcr_register(env, MAL0_RCBS0,
2186
                         mal, &dcr_read_mal, &dcr_write_mal);
2187
        ppc_dcr_register(env, MAL0_RCBS1,
2188
                         mal, &dcr_read_mal, &dcr_write_mal);
2189
    }
2190
}
2191

    
2192
/*****************************************************************************/
2193
/* SPR */
2194
void ppc40x_core_reset (CPUState *env)
2195
{
2196
    target_ulong dbsr;
2197

    
2198
    printf("Reset PowerPC core\n");
2199
    env->interrupt_request |= CPU_INTERRUPT_EXITTB;
2200
    /* XXX: TOFIX */
2201
#if 0
2202
    cpu_ppc_reset(env);
2203
#else
2204
    qemu_system_reset_request();
2205
#endif
2206
    dbsr = env->spr[SPR_40x_DBSR];
2207
    dbsr &= ~0x00000300;
2208
    dbsr |= 0x00000100;
2209
    env->spr[SPR_40x_DBSR] = dbsr;
2210
}
2211

    
2212
void ppc40x_chip_reset (CPUState *env)
2213
{
2214
    target_ulong dbsr;
2215

    
2216
    printf("Reset PowerPC chip\n");
2217
    env->interrupt_request |= CPU_INTERRUPT_EXITTB;
2218
    /* XXX: TOFIX */
2219
#if 0
2220
    cpu_ppc_reset(env);
2221
#else
2222
    qemu_system_reset_request();
2223
#endif
2224
    /* XXX: TODO reset all internal peripherals */
2225
    dbsr = env->spr[SPR_40x_DBSR];
2226
    dbsr &= ~0x00000300;
2227
    dbsr |= 0x00000200;
2228
    env->spr[SPR_40x_DBSR] = dbsr;
2229
}
2230

    
2231
void ppc40x_system_reset (CPUState *env)
2232
{
2233
    printf("Reset PowerPC system\n");
2234
    qemu_system_reset_request();
2235
}
2236

    
2237
void store_40x_dbcr0 (CPUState *env, uint32_t val)
2238
{
2239
    switch ((val >> 28) & 0x3) {
2240
    case 0x0:
2241
        /* No action */
2242
        break;
2243
    case 0x1:
2244
        /* Core reset */
2245
        ppc40x_core_reset(env);
2246
        break;
2247
    case 0x2:
2248
        /* Chip reset */
2249
        ppc40x_chip_reset(env);
2250
        break;
2251
    case 0x3:
2252
        /* System reset */
2253
        ppc40x_system_reset(env);
2254
        break;
2255
    }
2256
}
2257

    
2258
/*****************************************************************************/
2259
/* PowerPC 405CR */
2260
enum {
2261
    PPC405CR_CPC0_PLLMR  = 0x0B0,
2262
    PPC405CR_CPC0_CR0    = 0x0B1,
2263
    PPC405CR_CPC0_CR1    = 0x0B2,
2264
    PPC405CR_CPC0_PSR    = 0x0B4,
2265
    PPC405CR_CPC0_JTAGID = 0x0B5,
2266
    PPC405CR_CPC0_ER     = 0x0B9,
2267
    PPC405CR_CPC0_FR     = 0x0BA,
2268
    PPC405CR_CPC0_SR     = 0x0BB,
2269
};
2270

    
2271
enum {
2272
    PPC405CR_CPU_CLK   = 0,
2273
    PPC405CR_TMR_CLK   = 1,
2274
    PPC405CR_PLB_CLK   = 2,
2275
    PPC405CR_SDRAM_CLK = 3,
2276
    PPC405CR_OPB_CLK   = 4,
2277
    PPC405CR_EXT_CLK   = 5,
2278
    PPC405CR_UART_CLK  = 6,
2279
    PPC405CR_CLK_NB    = 7,
2280
};
2281

    
2282
typedef struct ppc405cr_cpc_t ppc405cr_cpc_t;
2283
struct ppc405cr_cpc_t {
2284
    clk_setup_t clk_setup[PPC405CR_CLK_NB];
2285
    uint32_t sysclk;
2286
    uint32_t psr;
2287
    uint32_t cr0;
2288
    uint32_t cr1;
2289
    uint32_t jtagid;
2290
    uint32_t pllmr;
2291
    uint32_t er;
2292
    uint32_t fr;
2293
};
2294

    
2295
static void ppc405cr_clk_setup (ppc405cr_cpc_t *cpc)
2296
{
2297
    uint64_t VCO_out, PLL_out;
2298
    uint32_t CPU_clk, TMR_clk, SDRAM_clk, PLB_clk, OPB_clk, EXT_clk, UART_clk;
2299
    int M, D0, D1, D2;
2300

    
2301
    D0 = ((cpc->pllmr >> 26) & 0x3) + 1; /* CBDV */
2302
    if (cpc->pllmr & 0x80000000) {
2303
        D1 = (((cpc->pllmr >> 20) - 1) & 0xF) + 1; /* FBDV */
2304
        D2 = 8 - ((cpc->pllmr >> 16) & 0x7); /* FWDVA */
2305
        M = D0 * D1 * D2;
2306
        VCO_out = cpc->sysclk * M;
2307
        if (VCO_out < 400000000 || VCO_out > 800000000) {
2308
            /* PLL cannot lock */
2309
            cpc->pllmr &= ~0x80000000;
2310
            goto bypass_pll;
2311
        }
2312
        PLL_out = VCO_out / D2;
2313
    } else {
2314
        /* Bypass PLL */
2315
    bypass_pll:
2316
        M = D0;
2317
        PLL_out = cpc->sysclk * M;
2318
    }
2319
    CPU_clk = PLL_out;
2320
    if (cpc->cr1 & 0x00800000)
2321
        TMR_clk = cpc->sysclk; /* Should have a separate clock */
2322
    else
2323
        TMR_clk = CPU_clk;
2324
    PLB_clk = CPU_clk / D0;
2325
    SDRAM_clk = PLB_clk;
2326
    D0 = ((cpc->pllmr >> 10) & 0x3) + 1;
2327
    OPB_clk = PLB_clk / D0;
2328
    D0 = ((cpc->pllmr >> 24) & 0x3) + 2;
2329
    EXT_clk = PLB_clk / D0;
2330
    D0 = ((cpc->cr0 >> 1) & 0x1F) + 1;
2331
    UART_clk = CPU_clk / D0;
2332
    /* Setup CPU clocks */
2333
    clk_setup(&cpc->clk_setup[PPC405CR_CPU_CLK], CPU_clk);
2334
    /* Setup time-base clock */
2335
    clk_setup(&cpc->clk_setup[PPC405CR_TMR_CLK], TMR_clk);
2336
    /* Setup PLB clock */
2337
    clk_setup(&cpc->clk_setup[PPC405CR_PLB_CLK], PLB_clk);
2338
    /* Setup SDRAM clock */
2339
    clk_setup(&cpc->clk_setup[PPC405CR_SDRAM_CLK], SDRAM_clk);
2340
    /* Setup OPB clock */
2341
    clk_setup(&cpc->clk_setup[PPC405CR_OPB_CLK], OPB_clk);
2342
    /* Setup external clock */
2343
    clk_setup(&cpc->clk_setup[PPC405CR_EXT_CLK], EXT_clk);
2344
    /* Setup UART clock */
2345
    clk_setup(&cpc->clk_setup[PPC405CR_UART_CLK], UART_clk);
2346
}
2347

    
2348
static target_ulong dcr_read_crcpc (void *opaque, int dcrn)
2349
{
2350
    ppc405cr_cpc_t *cpc;
2351
    target_ulong ret;
2352

    
2353
    cpc = opaque;
2354
    switch (dcrn) {
2355
    case PPC405CR_CPC0_PLLMR:
2356
        ret = cpc->pllmr;
2357
        break;
2358
    case PPC405CR_CPC0_CR0:
2359
        ret = cpc->cr0;
2360
        break;
2361
    case PPC405CR_CPC0_CR1:
2362
        ret = cpc->cr1;
2363
        break;
2364
    case PPC405CR_CPC0_PSR:
2365
        ret = cpc->psr;
2366
        break;
2367
    case PPC405CR_CPC0_JTAGID:
2368
        ret = cpc->jtagid;
2369
        break;
2370
    case PPC405CR_CPC0_ER:
2371
        ret = cpc->er;
2372
        break;
2373
    case PPC405CR_CPC0_FR:
2374
        ret = cpc->fr;
2375
        break;
2376
    case PPC405CR_CPC0_SR:
2377
        ret = ~(cpc->er | cpc->fr) & 0xFFFF0000;
2378
        break;
2379
    default:
2380
        /* Avoid gcc warning */
2381
        ret = 0;
2382
        break;
2383
    }
2384

    
2385
    return ret;
2386
}
2387

    
2388
static void dcr_write_crcpc (void *opaque, int dcrn, target_ulong val)
2389
{
2390
    ppc405cr_cpc_t *cpc;
2391

    
2392
    cpc = opaque;
2393
    switch (dcrn) {
2394
    case PPC405CR_CPC0_PLLMR:
2395
        cpc->pllmr = val & 0xFFF77C3F;
2396
        break;
2397
    case PPC405CR_CPC0_CR0:
2398
        cpc->cr0 = val & 0x0FFFFFFE;
2399
        break;
2400
    case PPC405CR_CPC0_CR1:
2401
        cpc->cr1 = val & 0x00800000;
2402
        break;
2403
    case PPC405CR_CPC0_PSR:
2404
        /* Read-only */
2405
        break;
2406
    case PPC405CR_CPC0_JTAGID:
2407
        /* Read-only */
2408
        break;
2409
    case PPC405CR_CPC0_ER:
2410
        cpc->er = val & 0xBFFC0000;
2411
        break;
2412
    case PPC405CR_CPC0_FR:
2413
        cpc->fr = val & 0xBFFC0000;
2414
        break;
2415
    case PPC405CR_CPC0_SR:
2416
        /* Read-only */
2417
        break;
2418
    }
2419
}
2420

    
2421
static void ppc405cr_cpc_reset (void *opaque)
2422
{
2423
    ppc405cr_cpc_t *cpc;
2424
    int D;
2425

    
2426
    cpc = opaque;
2427
    /* Compute PLLMR value from PSR settings */
2428
    cpc->pllmr = 0x80000000;
2429
    /* PFWD */
2430
    switch ((cpc->psr >> 30) & 3) {
2431
    case 0:
2432
        /* Bypass */
2433
        cpc->pllmr &= ~0x80000000;
2434
        break;
2435
    case 1:
2436
        /* Divide by 3 */
2437
        cpc->pllmr |= 5 << 16;
2438
        break;
2439
    case 2:
2440
        /* Divide by 4 */
2441
        cpc->pllmr |= 4 << 16;
2442
        break;
2443
    case 3:
2444
        /* Divide by 6 */
2445
        cpc->pllmr |= 2 << 16;
2446
        break;
2447
    }
2448
    /* PFBD */
2449
    D = (cpc->psr >> 28) & 3;
2450
    cpc->pllmr |= (D + 1) << 20;
2451
    /* PT   */
2452
    D = (cpc->psr >> 25) & 7;
2453
    switch (D) {
2454
    case 0x2:
2455
        cpc->pllmr |= 0x13;
2456
        break;
2457
    case 0x4:
2458
        cpc->pllmr |= 0x15;
2459
        break;
2460
    case 0x5:
2461
        cpc->pllmr |= 0x16;
2462
        break;
2463
    default:
2464
        break;
2465
    }
2466
    /* PDC  */
2467
    D = (cpc->psr >> 23) & 3;
2468
    cpc->pllmr |= D << 26;
2469
    /* ODP  */
2470
    D = (cpc->psr >> 21) & 3;
2471
    cpc->pllmr |= D << 10;
2472
    /* EBPD */
2473
    D = (cpc->psr >> 17) & 3;
2474
    cpc->pllmr |= D << 24;
2475
    cpc->cr0 = 0x0000003C;
2476
    cpc->cr1 = 0x2B0D8800;
2477
    cpc->er = 0x00000000;
2478
    cpc->fr = 0x00000000;
2479
    ppc405cr_clk_setup(cpc);
2480
}
2481

    
2482
static void ppc405cr_clk_init (ppc405cr_cpc_t *cpc)
2483
{
2484
    int D;
2485

    
2486
    /* XXX: this should be read from IO pins */
2487
    cpc->psr = 0x00000000; /* 8 bits ROM */
2488
    /* PFWD */
2489
    D = 0x2; /* Divide by 4 */
2490
    cpc->psr |= D << 30;
2491
    /* PFBD */
2492
    D = 0x1; /* Divide by 2 */
2493
    cpc->psr |= D << 28;
2494
    /* PDC */
2495
    D = 0x1; /* Divide by 2 */
2496
    cpc->psr |= D << 23;
2497
    /* PT */
2498
    D = 0x5; /* M = 16 */
2499
    cpc->psr |= D << 25;
2500
    /* ODP */
2501
    D = 0x1; /* Divide by 2 */
2502
    cpc->psr |= D << 21;
2503
    /* EBDP */
2504
    D = 0x2; /* Divide by 4 */
2505
    cpc->psr |= D << 17;
2506
}
2507

    
2508
static void ppc405cr_cpc_init (CPUState *env, clk_setup_t clk_setup[7],
2509
                               uint32_t sysclk)
2510
{
2511
    ppc405cr_cpc_t *cpc;
2512

    
2513
    cpc = qemu_mallocz(sizeof(ppc405cr_cpc_t));
2514
    if (cpc != NULL) {
2515
        memcpy(cpc->clk_setup, clk_setup,
2516
               PPC405CR_CLK_NB * sizeof(clk_setup_t));
2517
        cpc->sysclk = sysclk;
2518
        cpc->jtagid = 0x42051049;
2519
        ppc_dcr_register(env, PPC405CR_CPC0_PSR, cpc,
2520
                         &dcr_read_crcpc, &dcr_write_crcpc);
2521
        ppc_dcr_register(env, PPC405CR_CPC0_CR0, cpc,
2522
                         &dcr_read_crcpc, &dcr_write_crcpc);
2523
        ppc_dcr_register(env, PPC405CR_CPC0_CR1, cpc,
2524
                         &dcr_read_crcpc, &dcr_write_crcpc);
2525
        ppc_dcr_register(env, PPC405CR_CPC0_JTAGID, cpc,
2526
                         &dcr_read_crcpc, &dcr_write_crcpc);
2527
        ppc_dcr_register(env, PPC405CR_CPC0_PLLMR, cpc,
2528
                         &dcr_read_crcpc, &dcr_write_crcpc);
2529
        ppc_dcr_register(env, PPC405CR_CPC0_ER, cpc,
2530
                         &dcr_read_crcpc, &dcr_write_crcpc);
2531
        ppc_dcr_register(env, PPC405CR_CPC0_FR, cpc,
2532
                         &dcr_read_crcpc, &dcr_write_crcpc);
2533
        ppc_dcr_register(env, PPC405CR_CPC0_SR, cpc,
2534
                         &dcr_read_crcpc, &dcr_write_crcpc);
2535
        ppc405cr_clk_init(cpc);
2536
        qemu_register_reset(ppc405cr_cpc_reset, cpc);
2537
        ppc405cr_cpc_reset(cpc);
2538
    }
2539
}
2540

    
2541
CPUState *ppc405cr_init (target_phys_addr_t ram_bases[4],
2542
                         target_phys_addr_t ram_sizes[4],
2543
                         uint32_t sysclk, qemu_irq **picp,
2544
                         ram_addr_t *offsetp, int do_init)
2545
{
2546
    clk_setup_t clk_setup[PPC405CR_CLK_NB];
2547
    qemu_irq dma_irqs[4];
2548
    CPUState *env;
2549
    ppc4xx_mmio_t *mmio;
2550
    qemu_irq *pic, *irqs;
2551
    ram_addr_t offset;
2552
    int i;
2553

    
2554
    memset(clk_setup, 0, sizeof(clk_setup));
2555
    env = ppc4xx_init("405cr", &clk_setup[PPC405CR_CPU_CLK],
2556
                      &clk_setup[PPC405CR_TMR_CLK], sysclk);
2557
    /* Memory mapped devices registers */
2558
    mmio = ppc4xx_mmio_init(env, 0xEF600000);
2559
    /* PLB arbitrer */
2560
    ppc4xx_plb_init(env);
2561
    /* PLB to OPB bridge */
2562
    ppc4xx_pob_init(env);
2563
    /* OBP arbitrer */
2564
    ppc4xx_opba_init(env, mmio, 0x600);
2565
    /* Universal interrupt controller */
2566
    irqs = qemu_mallocz(sizeof(qemu_irq) * PPCUIC_OUTPUT_NB);
2567
    irqs[PPCUIC_OUTPUT_INT] =
2568
        ((qemu_irq *)env->irq_inputs)[PPC40x_INPUT_INT];
2569
    irqs[PPCUIC_OUTPUT_CINT] =
2570
        ((qemu_irq *)env->irq_inputs)[PPC40x_INPUT_CINT];
2571
    pic = ppcuic_init(env, irqs, 0x0C0, 0, 1);
2572
    *picp = pic;
2573
    /* SDRAM controller */
2574
    ppc405_sdram_init(env, pic[14], 1, ram_bases, ram_sizes, do_init);
2575
    offset = 0;
2576
    for (i = 0; i < 4; i++)
2577
        offset += ram_sizes[i];
2578
    /* External bus controller */
2579
    ppc405_ebc_init(env);
2580
    /* DMA controller */
2581
    dma_irqs[0] = pic[26];
2582
    dma_irqs[1] = pic[25];
2583
    dma_irqs[2] = pic[24];
2584
    dma_irqs[3] = pic[23];
2585
    ppc405_dma_init(env, dma_irqs);
2586
    /* Serial ports */
2587
    if (serial_hds[0] != NULL) {
2588
        ppc405_serial_init(env, mmio, 0x300, pic[0], serial_hds[0]);
2589
    }
2590
    if (serial_hds[1] != NULL) {
2591
        ppc405_serial_init(env, mmio, 0x400, pic[1], serial_hds[1]);
2592
    }
2593
    /* IIC controller */
2594
    ppc405_i2c_init(env, mmio, 0x500, pic[2]);
2595
    /* GPIO */
2596
    ppc405_gpio_init(env, mmio, 0x700);
2597
    /* CPU control */
2598
    ppc405cr_cpc_init(env, clk_setup, sysclk);
2599
    *offsetp = offset;
2600

    
2601
    return env;
2602
}
2603

    
2604
/*****************************************************************************/
2605
/* PowerPC 405EP */
2606
/* CPU control */
2607
enum {
2608
    PPC405EP_CPC0_PLLMR0 = 0x0F0,
2609
    PPC405EP_CPC0_BOOT   = 0x0F1,
2610
    PPC405EP_CPC0_EPCTL  = 0x0F3,
2611
    PPC405EP_CPC0_PLLMR1 = 0x0F4,
2612
    PPC405EP_CPC0_UCR    = 0x0F5,
2613
    PPC405EP_CPC0_SRR    = 0x0F6,
2614
    PPC405EP_CPC0_JTAGID = 0x0F7,
2615
    PPC405EP_CPC0_PCI    = 0x0F9,
2616
#if 0
2617
    PPC405EP_CPC0_ER     = xxx,
2618
    PPC405EP_CPC0_FR     = xxx,
2619
    PPC405EP_CPC0_SR     = xxx,
2620
#endif
2621
};
2622

    
2623
enum {
2624
    PPC405EP_CPU_CLK   = 0,
2625
    PPC405EP_PLB_CLK   = 1,
2626
    PPC405EP_OPB_CLK   = 2,
2627
    PPC405EP_EBC_CLK   = 3,
2628
    PPC405EP_MAL_CLK   = 4,
2629
    PPC405EP_PCI_CLK   = 5,
2630
    PPC405EP_UART0_CLK = 6,
2631
    PPC405EP_UART1_CLK = 7,
2632
    PPC405EP_CLK_NB    = 8,
2633
};
2634

    
2635
typedef struct ppc405ep_cpc_t ppc405ep_cpc_t;
2636
struct ppc405ep_cpc_t {
2637
    uint32_t sysclk;
2638
    clk_setup_t clk_setup[PPC405EP_CLK_NB];
2639
    uint32_t boot;
2640
    uint32_t epctl;
2641
    uint32_t pllmr[2];
2642
    uint32_t ucr;
2643
    uint32_t srr;
2644
    uint32_t jtagid;
2645
    uint32_t pci;
2646
    /* Clock and power management */
2647
    uint32_t er;
2648
    uint32_t fr;
2649
    uint32_t sr;
2650
};
2651

    
2652
static void ppc405ep_compute_clocks (ppc405ep_cpc_t *cpc)
2653
{
2654
    uint32_t CPU_clk, PLB_clk, OPB_clk, EBC_clk, MAL_clk, PCI_clk;
2655
    uint32_t UART0_clk, UART1_clk;
2656
    uint64_t VCO_out, PLL_out;
2657
    int M, D;
2658

    
2659
    VCO_out = 0;
2660
    if ((cpc->pllmr[1] & 0x80000000) && !(cpc->pllmr[1] & 0x40000000)) {
2661
        M = (((cpc->pllmr[1] >> 20) - 1) & 0xF) + 1; /* FBMUL */
2662
#ifdef DEBUG_CLOCKS_LL
2663
        printf("FBMUL %01" PRIx32 " %d\n", (cpc->pllmr[1] >> 20) & 0xF, M);
2664
#endif
2665
        D = 8 - ((cpc->pllmr[1] >> 16) & 0x7); /* FWDA */
2666
#ifdef DEBUG_CLOCKS_LL
2667
        printf("FWDA %01" PRIx32 " %d\n", (cpc->pllmr[1] >> 16) & 0x7, D);
2668
#endif
2669
        VCO_out = cpc->sysclk * M * D;
2670
        if (VCO_out < 500000000UL || VCO_out > 1000000000UL) {
2671
            /* Error - unlock the PLL */
2672
            printf("VCO out of range %" PRIu64 "\n", VCO_out);
2673
#if 0
2674
            cpc->pllmr[1] &= ~0x80000000;
2675
            goto pll_bypass;
2676
#endif
2677
        }
2678
        PLL_out = VCO_out / D;
2679
        /* Pretend the PLL is locked */
2680
        cpc->boot |= 0x00000001;
2681
    } else {
2682
#if 0
2683
    pll_bypass:
2684
#endif
2685
        PLL_out = cpc->sysclk;
2686
        if (cpc->pllmr[1] & 0x40000000) {
2687
            /* Pretend the PLL is not locked */
2688
            cpc->boot &= ~0x00000001;
2689
        }
2690
    }
2691
    /* Now, compute all other clocks */
2692
    D = ((cpc->pllmr[0] >> 20) & 0x3) + 1; /* CCDV */
2693
#ifdef DEBUG_CLOCKS_LL
2694
    printf("CCDV %01" PRIx32 " %d\n", (cpc->pllmr[0] >> 20) & 0x3, D);
2695
#endif
2696
    CPU_clk = PLL_out / D;
2697
    D = ((cpc->pllmr[0] >> 16) & 0x3) + 1; /* CBDV */
2698
#ifdef DEBUG_CLOCKS_LL
2699
    printf("CBDV %01" PRIx32 " %d\n", (cpc->pllmr[0] >> 16) & 0x3, D);
2700
#endif
2701
    PLB_clk = CPU_clk / D;
2702
    D = ((cpc->pllmr[0] >> 12) & 0x3) + 1; /* OPDV */
2703
#ifdef DEBUG_CLOCKS_LL
2704
    printf("OPDV %01" PRIx32 " %d\n", (cpc->pllmr[0] >> 12) & 0x3, D);
2705
#endif
2706
    OPB_clk = PLB_clk / D;
2707
    D = ((cpc->pllmr[0] >> 8) & 0x3) + 2; /* EPDV */
2708
#ifdef DEBUG_CLOCKS_LL
2709
    printf("EPDV %01" PRIx32 " %d\n", (cpc->pllmr[0] >> 8) & 0x3, D);
2710
#endif
2711
    EBC_clk = PLB_clk / D;
2712
    D = ((cpc->pllmr[0] >> 4) & 0x3) + 1; /* MPDV */
2713
#ifdef DEBUG_CLOCKS_LL
2714
    printf("MPDV %01" PRIx32 " %d\n", (cpc->pllmr[0] >> 4) & 0x3, D);
2715
#endif
2716
    MAL_clk = PLB_clk / D;
2717
    D = (cpc->pllmr[0] & 0x3) + 1; /* PPDV */
2718
#ifdef DEBUG_CLOCKS_LL
2719
    printf("PPDV %01" PRIx32 " %d\n", cpc->pllmr[0] & 0x3, D);
2720
#endif
2721
    PCI_clk = PLB_clk / D;
2722
    D = ((cpc->ucr - 1) & 0x7F) + 1; /* U0DIV */
2723
#ifdef DEBUG_CLOCKS_LL
2724
    printf("U0DIV %01" PRIx32 " %d\n", cpc->ucr & 0x7F, D);
2725
#endif
2726
    UART0_clk = PLL_out / D;
2727
    D = (((cpc->ucr >> 8) - 1) & 0x7F) + 1; /* U1DIV */
2728
#ifdef DEBUG_CLOCKS_LL
2729
    printf("U1DIV %01" PRIx32 " %d\n", (cpc->ucr >> 8) & 0x7F, D);
2730
#endif
2731
    UART1_clk = PLL_out / D;
2732
#ifdef DEBUG_CLOCKS
2733
    printf("Setup PPC405EP clocks - sysclk %" PRIu32 " VCO %" PRIu64
2734
           " PLL out %" PRIu64 " Hz\n", cpc->sysclk, VCO_out, PLL_out);
2735
    printf("CPU %" PRIu32 " PLB %" PRIu32 " OPB %" PRIu32 " EBC %" PRIu32
2736
           " MAL %" PRIu32 " PCI %" PRIu32 " UART0 %" PRIu32
2737
           " UART1 %" PRIu32 "\n",
2738
           CPU_clk, PLB_clk, OPB_clk, EBC_clk, MAL_clk, PCI_clk,
2739
           UART0_clk, UART1_clk);
2740
#endif
2741
    /* Setup CPU clocks */
2742
    clk_setup(&cpc->clk_setup[PPC405EP_CPU_CLK], CPU_clk);
2743
    /* Setup PLB clock */
2744
    clk_setup(&cpc->clk_setup[PPC405EP_PLB_CLK], PLB_clk);
2745
    /* Setup OPB clock */
2746
    clk_setup(&cpc->clk_setup[PPC405EP_OPB_CLK], OPB_clk);
2747
    /* Setup external clock */
2748
    clk_setup(&cpc->clk_setup[PPC405EP_EBC_CLK], EBC_clk);
2749
    /* Setup MAL clock */
2750
    clk_setup(&cpc->clk_setup[PPC405EP_MAL_CLK], MAL_clk);
2751
    /* Setup PCI clock */
2752
    clk_setup(&cpc->clk_setup[PPC405EP_PCI_CLK], PCI_clk);
2753
    /* Setup UART0 clock */
2754
    clk_setup(&cpc->clk_setup[PPC405EP_UART0_CLK], UART0_clk);
2755
    /* Setup UART1 clock */
2756
    clk_setup(&cpc->clk_setup[PPC405EP_UART1_CLK], UART1_clk);
2757
}
2758

    
2759
static target_ulong dcr_read_epcpc (void *opaque, int dcrn)
2760
{
2761
    ppc405ep_cpc_t *cpc;
2762
    target_ulong ret;
2763

    
2764
    cpc = opaque;
2765
    switch (dcrn) {
2766
    case PPC405EP_CPC0_BOOT:
2767
        ret = cpc->boot;
2768
        break;
2769
    case PPC405EP_CPC0_EPCTL:
2770
        ret = cpc->epctl;
2771
        break;
2772
    case PPC405EP_CPC0_PLLMR0:
2773
        ret = cpc->pllmr[0];
2774
        break;
2775
    case PPC405EP_CPC0_PLLMR1:
2776
        ret = cpc->pllmr[1];
2777
        break;
2778
    case PPC405EP_CPC0_UCR:
2779
        ret = cpc->ucr;
2780
        break;
2781
    case PPC405EP_CPC0_SRR:
2782
        ret = cpc->srr;
2783
        break;
2784
    case PPC405EP_CPC0_JTAGID:
2785
        ret = cpc->jtagid;
2786
        break;
2787
    case PPC405EP_CPC0_PCI:
2788
        ret = cpc->pci;
2789
        break;
2790
    default:
2791
        /* Avoid gcc warning */
2792
        ret = 0;
2793
        break;
2794
    }
2795

    
2796
    return ret;
2797
}
2798

    
2799
static void dcr_write_epcpc (void *opaque, int dcrn, target_ulong val)
2800
{
2801
    ppc405ep_cpc_t *cpc;
2802

    
2803
    cpc = opaque;
2804
    switch (dcrn) {
2805
    case PPC405EP_CPC0_BOOT:
2806
        /* Read-only register */
2807
        break;
2808
    case PPC405EP_CPC0_EPCTL:
2809
        /* Don't care for now */
2810
        cpc->epctl = val & 0xC00000F3;
2811
        break;
2812
    case PPC405EP_CPC0_PLLMR0:
2813
        cpc->pllmr[0] = val & 0x00633333;
2814
        ppc405ep_compute_clocks(cpc);
2815
        break;
2816
    case PPC405EP_CPC0_PLLMR1:
2817
        cpc->pllmr[1] = val & 0xC0F73FFF;
2818
        ppc405ep_compute_clocks(cpc);
2819
        break;
2820
    case PPC405EP_CPC0_UCR:
2821
        /* UART control - don't care for now */
2822
        cpc->ucr = val & 0x003F7F7F;
2823
        break;
2824
    case PPC405EP_CPC0_SRR:
2825
        cpc->srr = val;
2826
        break;
2827
    case PPC405EP_CPC0_JTAGID:
2828
        /* Read-only */
2829
        break;
2830
    case PPC405EP_CPC0_PCI:
2831
        cpc->pci = val;
2832
        break;
2833
    }
2834
}
2835

    
2836
static void ppc405ep_cpc_reset (void *opaque)
2837
{
2838
    ppc405ep_cpc_t *cpc = opaque;
2839

    
2840
    cpc->boot = 0x00000010;     /* Boot from PCI - IIC EEPROM disabled */
2841
    cpc->epctl = 0x00000000;
2842
    cpc->pllmr[0] = 0x00011010;
2843
    cpc->pllmr[1] = 0x40000000;
2844
    cpc->ucr = 0x00000000;
2845
    cpc->srr = 0x00040000;
2846
    cpc->pci = 0x00000000;
2847
    cpc->er = 0x00000000;
2848
    cpc->fr = 0x00000000;
2849
    cpc->sr = 0x00000000;
2850
    ppc405ep_compute_clocks(cpc);
2851
}
2852

    
2853
/* XXX: sysclk should be between 25 and 100 MHz */
2854
static void ppc405ep_cpc_init (CPUState *env, clk_setup_t clk_setup[8],
2855
                               uint32_t sysclk)
2856
{
2857
    ppc405ep_cpc_t *cpc;
2858

    
2859
    cpc = qemu_mallocz(sizeof(ppc405ep_cpc_t));
2860
    if (cpc != NULL) {
2861
        memcpy(cpc->clk_setup, clk_setup,
2862
               PPC405EP_CLK_NB * sizeof(clk_setup_t));
2863
        cpc->jtagid = 0x20267049;
2864
        cpc->sysclk = sysclk;
2865
        ppc405ep_cpc_reset(cpc);
2866
        qemu_register_reset(&ppc405ep_cpc_reset, cpc);
2867
        ppc_dcr_register(env, PPC405EP_CPC0_BOOT, cpc,
2868
                         &dcr_read_epcpc, &dcr_write_epcpc);
2869
        ppc_dcr_register(env, PPC405EP_CPC0_EPCTL, cpc,
2870
                         &dcr_read_epcpc, &dcr_write_epcpc);
2871
        ppc_dcr_register(env, PPC405EP_CPC0_PLLMR0, cpc,
2872
                         &dcr_read_epcpc, &dcr_write_epcpc);
2873
        ppc_dcr_register(env, PPC405EP_CPC0_PLLMR1, cpc,
2874
                         &dcr_read_epcpc, &dcr_write_epcpc);
2875
        ppc_dcr_register(env, PPC405EP_CPC0_UCR, cpc,
2876
                         &dcr_read_epcpc, &dcr_write_epcpc);
2877
        ppc_dcr_register(env, PPC405EP_CPC0_SRR, cpc,
2878
                         &dcr_read_epcpc, &dcr_write_epcpc);
2879
        ppc_dcr_register(env, PPC405EP_CPC0_JTAGID, cpc,
2880
                         &dcr_read_epcpc, &dcr_write_epcpc);
2881
        ppc_dcr_register(env, PPC405EP_CPC0_PCI, cpc,
2882
                         &dcr_read_epcpc, &dcr_write_epcpc);
2883
#if 0
2884
        ppc_dcr_register(env, PPC405EP_CPC0_ER, cpc,
2885
                         &dcr_read_epcpc, &dcr_write_epcpc);
2886
        ppc_dcr_register(env, PPC405EP_CPC0_FR, cpc,
2887
                         &dcr_read_epcpc, &dcr_write_epcpc);
2888
        ppc_dcr_register(env, PPC405EP_CPC0_SR, cpc,
2889
                         &dcr_read_epcpc, &dcr_write_epcpc);
2890
#endif
2891
    }
2892
}
2893

    
2894
CPUState *ppc405ep_init (target_phys_addr_t ram_bases[2],
2895
                         target_phys_addr_t ram_sizes[2],
2896
                         uint32_t sysclk, qemu_irq **picp,
2897
                         ram_addr_t *offsetp, int do_init)
2898
{
2899
    clk_setup_t clk_setup[PPC405EP_CLK_NB], tlb_clk_setup;
2900
    qemu_irq dma_irqs[4], gpt_irqs[5], mal_irqs[4];
2901
    CPUState *env;
2902
    ppc4xx_mmio_t *mmio;
2903
    qemu_irq *pic, *irqs;
2904
    ram_addr_t offset;
2905
    int i;
2906

    
2907
    memset(clk_setup, 0, sizeof(clk_setup));
2908
    /* init CPUs */
2909
    env = ppc4xx_init("405ep", &clk_setup[PPC405EP_CPU_CLK],
2910
                      &tlb_clk_setup, sysclk);
2911
    clk_setup[PPC405EP_CPU_CLK].cb = tlb_clk_setup.cb;
2912
    clk_setup[PPC405EP_CPU_CLK].opaque = tlb_clk_setup.opaque;
2913
    /* Internal devices init */
2914
    /* Memory mapped devices registers */
2915
    mmio = ppc4xx_mmio_init(env, 0xEF600000);
2916
    /* PLB arbitrer */
2917
    ppc4xx_plb_init(env);
2918
    /* PLB to OPB bridge */
2919
    ppc4xx_pob_init(env);
2920
    /* OBP arbitrer */
2921
    ppc4xx_opba_init(env, mmio, 0x600);
2922
    /* Universal interrupt controller */
2923
    irqs = qemu_mallocz(sizeof(qemu_irq) * PPCUIC_OUTPUT_NB);
2924
    irqs[PPCUIC_OUTPUT_INT] =
2925
        ((qemu_irq *)env->irq_inputs)[PPC40x_INPUT_INT];
2926
    irqs[PPCUIC_OUTPUT_CINT] =
2927
        ((qemu_irq *)env->irq_inputs)[PPC40x_INPUT_CINT];
2928
    pic = ppcuic_init(env, irqs, 0x0C0, 0, 1);
2929
    *picp = pic;
2930
    /* SDRAM controller */
2931
        /* XXX 405EP has no ECC interrupt */
2932
    ppc405_sdram_init(env, pic[17], 2, ram_bases, ram_sizes, do_init);
2933
    offset = 0;
2934
    for (i = 0; i < 2; i++)
2935
        offset += ram_sizes[i];
2936
    /* External bus controller */
2937
    ppc405_ebc_init(env);
2938
    /* DMA controller */
2939
    dma_irqs[0] = pic[5];
2940
    dma_irqs[1] = pic[6];
2941
    dma_irqs[2] = pic[7];
2942
    dma_irqs[3] = pic[8];
2943
    ppc405_dma_init(env, dma_irqs);
2944
    /* IIC controller */
2945
    ppc405_i2c_init(env, mmio, 0x500, pic[2]);
2946
    /* GPIO */
2947
    ppc405_gpio_init(env, mmio, 0x700);
2948
    /* Serial ports */
2949
    if (serial_hds[0] != NULL) {
2950
        ppc405_serial_init(env, mmio, 0x300, pic[0], serial_hds[0]);
2951
    }
2952
    if (serial_hds[1] != NULL) {
2953
        ppc405_serial_init(env, mmio, 0x400, pic[1], serial_hds[1]);
2954
    }
2955
    /* OCM */
2956
    ppc405_ocm_init(env, ram_sizes[0] + ram_sizes[1]);
2957
    offset += 4096;
2958
    /* GPT */
2959
    gpt_irqs[0] = pic[19];
2960
    gpt_irqs[1] = pic[20];
2961
    gpt_irqs[2] = pic[21];
2962
    gpt_irqs[3] = pic[22];
2963
    gpt_irqs[4] = pic[23];
2964
    ppc4xx_gpt_init(env, mmio, 0x000, gpt_irqs);
2965
    /* PCI */
2966
    /* Uses pic[3], pic[16], pic[18] */
2967
    /* MAL */
2968
    mal_irqs[0] = pic[11];
2969
    mal_irqs[1] = pic[12];
2970
    mal_irqs[2] = pic[13];
2971
    mal_irqs[3] = pic[14];
2972
    ppc405_mal_init(env, mal_irqs);
2973
    /* Ethernet */
2974
    /* Uses pic[9], pic[15], pic[17] */
2975
    /* CPU control */
2976
    ppc405ep_cpc_init(env, clk_setup, sysclk);
2977
    *offsetp = offset;
2978

    
2979
    return env;
2980
}