2 * QEMU PowerPC 405 embedded processors emulation
4 * Copyright (c) 2007 Jocelyn Mayer
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:
13 * The above copyright notice and this permission notice shall be included in
14 * all copies or substantial portions of the Software.
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
38 #define DEBUG_UNASSIGNED
40 /*****************************************************************************/
41 /* Generic PowerPC 405 processor instanciation */
42 CPUState *ppc405_init (const unsigned char *cpu_model,
43 clk_setup_t *cpu_clk, clk_setup_t *tb_clk,
51 qemu_register_reset(&cpu_ppc_reset, env);
52 register_savevm("cpu", 0, 3, cpu_save, cpu_load, env);
53 ppc_find_by_name(cpu_model, &def);
55 cpu_abort(env, "Unable to find PowerPC %s CPU definition\n",
58 cpu_ppc_register(env, def);
59 cpu_clk->cb = NULL; /* We don't care about CPU clock frequency changes */
60 cpu_clk->opaque = env;
61 /* Set time-base frequency to sysclk */
62 tb_clk->cb = ppc_emb_timers_init(env, sysclk);
64 ppc_dcr_init(env, NULL, NULL);
69 /*****************************************************************************/
70 /* Shared peripherals */
72 /*****************************************************************************/
73 /* Fake device used to map multiple devices in a single memory page */
74 #define MMIO_AREA_BITS 8
75 #define MMIO_AREA_LEN (1 << MMIO_AREA_BITS)
76 #define MMIO_AREA_NB (1 << (TARGET_PAGE_BITS - MMIO_AREA_BITS))
77 #define MMIO_IDX(addr) (((addr) >> MMIO_AREA_BITS) & (MMIO_AREA_NB - 1))
78 struct ppc4xx_mmio_t {
80 CPUReadMemoryFunc **mem_read[MMIO_AREA_NB];
81 CPUWriteMemoryFunc **mem_write[MMIO_AREA_NB];
82 void *opaque[MMIO_AREA_NB];
85 static uint32_t unassigned_mem_readb (void *opaque, target_phys_addr_t addr)
87 #ifdef DEBUG_UNASSIGNED
88 printf("Unassigned mem read 0x" PADDRX "\n", addr);
94 static void unassigned_mem_writeb (void *opaque,
95 target_phys_addr_t addr, uint32_t val)
97 #ifdef DEBUG_UNASSIGNED
98 printf("Unassigned mem write 0x" PADDRX " = 0x%x\n", addr, val);
102 static CPUReadMemoryFunc *unassigned_mem_read[3] = {
103 unassigned_mem_readb,
104 unassigned_mem_readb,
105 unassigned_mem_readb,
108 static CPUWriteMemoryFunc *unassigned_mem_write[3] = {
109 unassigned_mem_writeb,
110 unassigned_mem_writeb,
111 unassigned_mem_writeb,
114 static uint32_t mmio_readlen (ppc4xx_mmio_t *mmio,
115 target_phys_addr_t addr, int len)
117 CPUReadMemoryFunc **mem_read;
121 idx = MMIO_IDX(addr - mmio->base);
122 #if defined(DEBUG_MMIO)
123 printf("%s: mmio %p len %d addr " PADDRX " idx %d\n", __func__,
124 mmio, len, addr, idx);
126 mem_read = mmio->mem_read[idx];
127 ret = (*mem_read[len])(mmio->opaque[idx], addr);
132 static void mmio_writelen (ppc4xx_mmio_t *mmio,
133 target_phys_addr_t addr, uint32_t value, int len)
135 CPUWriteMemoryFunc **mem_write;
138 idx = MMIO_IDX(addr - mmio->base);
139 #if defined(DEBUG_MMIO)
140 printf("%s: mmio %p len %d addr " PADDRX " idx %d value %08x\n", __func__,
141 mmio, len, addr, idx, value);
143 mem_write = mmio->mem_write[idx];
144 (*mem_write[len])(mmio->opaque[idx], addr, value);
147 static uint32_t mmio_readb (void *opaque, target_phys_addr_t addr)
149 #if defined(DEBUG_MMIO)
150 printf("%s: addr " PADDRX "\n", __func__, addr);
153 return mmio_readlen(opaque, addr, 0);
156 static void mmio_writeb (void *opaque,
157 target_phys_addr_t addr, uint32_t value)
159 #if defined(DEBUG_MMIO)
160 printf("%s: addr " PADDRX " val %08x\n", __func__, addr, value);
162 mmio_writelen(opaque, addr, value, 0);
165 static uint32_t mmio_readw (void *opaque, target_phys_addr_t addr)
167 #if defined(DEBUG_MMIO)
168 printf("%s: addr " PADDRX "\n", __func__, addr);
171 return mmio_readlen(opaque, addr, 1);
174 static void mmio_writew (void *opaque,
175 target_phys_addr_t addr, uint32_t value)
177 #if defined(DEBUG_MMIO)
178 printf("%s: addr " PADDRX " val %08x\n", __func__, addr, value);
180 mmio_writelen(opaque, addr, value, 1);
183 static uint32_t mmio_readl (void *opaque, target_phys_addr_t addr)
185 #if defined(DEBUG_MMIO)
186 printf("%s: addr " PADDRX "\n", __func__, addr);
189 return mmio_readlen(opaque, addr, 2);
192 static void mmio_writel (void *opaque,
193 target_phys_addr_t addr, uint32_t value)
195 #if defined(DEBUG_MMIO)
196 printf("%s: addr " PADDRX " val %08x\n", __func__, addr, value);
198 mmio_writelen(opaque, addr, value, 2);
201 static CPUReadMemoryFunc *mmio_read[] = {
207 static CPUWriteMemoryFunc *mmio_write[] = {
213 int ppc4xx_mmio_register (CPUState *env, ppc4xx_mmio_t *mmio,
214 uint32_t offset, uint32_t len,
215 CPUReadMemoryFunc **mem_read,
216 CPUWriteMemoryFunc **mem_write, void *opaque)
221 if ((offset + len) > TARGET_PAGE_SIZE)
223 idx = MMIO_IDX(offset);
224 end = offset + len - 1;
225 eidx = MMIO_IDX(end);
226 #if defined(DEBUG_MMIO)
227 printf("%s: offset %08x len %08x %08x %d %d\n", __func__, offset, len,
230 for (; idx <= eidx; idx++) {
231 mmio->mem_read[idx] = mem_read;
232 mmio->mem_write[idx] = mem_write;
233 mmio->opaque[idx] = opaque;
239 ppc4xx_mmio_t *ppc4xx_mmio_init (CPUState *env, uint32_t base)
244 mmio = qemu_mallocz(sizeof(ppc4xx_mmio_t));
247 mmio_memory = cpu_register_io_memory(0, mmio_read, mmio_write, mmio);
248 #if defined(DEBUG_MMIO)
249 printf("%s: %p base %08x len %08x %d\n", __func__,
250 mmio, base, TARGET_PAGE_SIZE, mmio_memory);
252 cpu_register_physical_memory(base, TARGET_PAGE_SIZE, mmio_memory);
253 ppc4xx_mmio_register(env, mmio, 0, TARGET_PAGE_SIZE,
254 unassigned_mem_read, unassigned_mem_write, NULL);
260 /*****************************************************************************/
261 /* Peripheral local bus arbitrer */
268 typedef struct ppc4xx_plb_t ppc4xx_plb_t;
269 struct ppc4xx_plb_t {
275 static target_ulong dcr_read_plb (void *opaque, int dcrn)
292 /* Avoid gcc warning */
300 static void dcr_write_plb (void *opaque, int dcrn, target_ulong val)
307 plb->acr = val & 0xFC000000;
319 static void ppc4xx_plb_reset (void *opaque)
324 plb->acr = 0x00000000;
325 plb->bear = 0x00000000;
326 plb->besr = 0x00000000;
329 void ppc4xx_plb_init (CPUState *env)
333 plb = qemu_mallocz(sizeof(ppc4xx_plb_t));
335 ppc_dcr_register(env, PLB0_ACR, plb, &dcr_read_plb, &dcr_write_plb);
336 ppc_dcr_register(env, PLB0_BEAR, plb, &dcr_read_plb, &dcr_write_plb);
337 ppc_dcr_register(env, PLB0_BESR, plb, &dcr_read_plb, &dcr_write_plb);
338 ppc4xx_plb_reset(plb);
339 qemu_register_reset(ppc4xx_plb_reset, plb);
343 /*****************************************************************************/
344 /* PLB to OPB bridge */
351 typedef struct ppc4xx_pob_t ppc4xx_pob_t;
352 struct ppc4xx_pob_t {
357 static target_ulong dcr_read_pob (void *opaque, int dcrn)
369 ret = pob->besr[dcrn - POB0_BESR0];
372 /* Avoid gcc warning */
380 static void dcr_write_pob (void *opaque, int dcrn, target_ulong val)
392 pob->besr[dcrn - POB0_BESR0] &= ~val;
397 static void ppc4xx_pob_reset (void *opaque)
403 pob->bear = 0x00000000;
404 pob->besr[0] = 0x0000000;
405 pob->besr[1] = 0x0000000;
408 void ppc4xx_pob_init (CPUState *env)
412 pob = qemu_mallocz(sizeof(ppc4xx_pob_t));
414 ppc_dcr_register(env, POB0_BEAR, pob, &dcr_read_pob, &dcr_write_pob);
415 ppc_dcr_register(env, POB0_BESR0, pob, &dcr_read_pob, &dcr_write_pob);
416 ppc_dcr_register(env, POB0_BESR1, pob, &dcr_read_pob, &dcr_write_pob);
417 qemu_register_reset(ppc4xx_pob_reset, pob);
418 ppc4xx_pob_reset(env);
422 /*****************************************************************************/
424 typedef struct ppc4xx_opba_t ppc4xx_opba_t;
425 struct ppc4xx_opba_t {
431 static uint32_t opba_readb (void *opaque, target_phys_addr_t addr)
437 printf("%s: addr " PADDRX "\n", __func__, addr);
440 switch (addr - opba->base) {
455 static void opba_writeb (void *opaque,
456 target_phys_addr_t addr, uint32_t value)
461 printf("%s: addr " PADDRX " val %08x\n", __func__, addr, value);
464 switch (addr - opba->base) {
466 opba->cr = value & 0xF8;
469 opba->pr = value & 0xFF;
476 static uint32_t opba_readw (void *opaque, target_phys_addr_t addr)
481 printf("%s: addr " PADDRX "\n", __func__, addr);
483 ret = opba_readb(opaque, addr) << 8;
484 ret |= opba_readb(opaque, addr + 1);
489 static void opba_writew (void *opaque,
490 target_phys_addr_t addr, uint32_t value)
493 printf("%s: addr " PADDRX " val %08x\n", __func__, addr, value);
495 opba_writeb(opaque, addr, value >> 8);
496 opba_writeb(opaque, addr + 1, value);
499 static uint32_t opba_readl (void *opaque, target_phys_addr_t addr)
504 printf("%s: addr " PADDRX "\n", __func__, addr);
506 ret = opba_readb(opaque, addr) << 24;
507 ret |= opba_readb(opaque, addr + 1) << 16;
512 static void opba_writel (void *opaque,
513 target_phys_addr_t addr, uint32_t value)
516 printf("%s: addr " PADDRX " val %08x\n", __func__, addr, value);
518 opba_writeb(opaque, addr, value >> 24);
519 opba_writeb(opaque, addr + 1, value >> 16);
522 static CPUReadMemoryFunc *opba_read[] = {
528 static CPUWriteMemoryFunc *opba_write[] = {
534 static void ppc4xx_opba_reset (void *opaque)
539 opba->cr = 0x00; /* No dynamic priorities - park disabled */
543 void ppc4xx_opba_init (CPUState *env, ppc4xx_mmio_t *mmio, uint32_t offset)
547 opba = qemu_mallocz(sizeof(ppc4xx_opba_t));
549 opba->base = mmio->base + offset;
551 printf("%s: offset=%08x\n", __func__, offset);
553 ppc4xx_mmio_register(env, mmio, offset, 0x002,
554 opba_read, opba_write, opba);
555 qemu_register_reset(ppc4xx_opba_reset, opba);
556 ppc4xx_opba_reset(opba);
560 /*****************************************************************************/
561 /* "Universal" Interrupt controller */
575 #define UIC_MAX_IRQ 32
576 typedef struct ppcuic_t ppcuic_t;
580 uint32_t uicsr; /* Status register */
581 uint32_t uicer; /* Enable register */
582 uint32_t uiccr; /* Critical register */
583 uint32_t uicpr; /* Polarity register */
584 uint32_t uictr; /* Triggering register */
585 uint32_t uicvcr; /* Vector configuration register */
590 static void ppcuic_trigger_irq (ppcuic_t *uic)
593 int start, end, inc, i;
595 /* Trigger interrupt if any is pending */
596 ir = uic->uicsr & uic->uicer & (~uic->uiccr);
597 cr = uic->uicsr & uic->uicer & uic->uiccr;
599 if (loglevel & CPU_LOG_INT) {
600 fprintf(logfile, "%s: uicsr %08x uicer %08x uiccr %08x\n"
601 " %08x ir %08x cr %08x\n", __func__,
602 uic->uicsr, uic->uicer, uic->uiccr,
603 uic->uicsr & uic->uicer, ir, cr);
606 if (ir != 0x0000000) {
608 if (loglevel & CPU_LOG_INT) {
609 fprintf(logfile, "Raise UIC interrupt\n");
612 qemu_irq_raise(uic->irqs[PPCUIC_OUTPUT_INT]);
615 if (loglevel & CPU_LOG_INT) {
616 fprintf(logfile, "Lower UIC interrupt\n");
619 qemu_irq_lower(uic->irqs[PPCUIC_OUTPUT_INT]);
621 /* Trigger critical interrupt if any is pending and update vector */
622 if (cr != 0x0000000) {
623 qemu_irq_raise(uic->irqs[PPCUIC_OUTPUT_CINT]);
624 if (uic->use_vectors) {
625 /* Compute critical IRQ vector */
626 if (uic->uicvcr & 1) {
635 uic->uicvr = uic->uicvcr & 0xFFFFFFFC;
636 for (i = start; i <= end; i += inc) {
638 uic->uicvr += (i - start) * 512 * inc;
644 if (loglevel & CPU_LOG_INT) {
645 fprintf(logfile, "Raise UIC critical interrupt - vector %08x\n",
651 if (loglevel & CPU_LOG_INT) {
652 fprintf(logfile, "Lower UIC critical interrupt\n");
655 qemu_irq_lower(uic->irqs[PPCUIC_OUTPUT_CINT]);
656 uic->uicvr = 0x00000000;
660 static void ppcuic_set_irq (void *opaque, int irq_num, int level)
668 if (loglevel & CPU_LOG_INT) {
669 fprintf(logfile, "%s: irq %d level %d uicsr %08x mask %08x => %08x "
670 "%08x\n", __func__, irq_num, level,
671 uic->uicsr, mask, uic->uicsr & mask, level << irq_num);
674 if (irq_num < 0 || irq_num > 31)
677 if (!(uic->uicpr & mask)) {
678 /* Negatively asserted IRQ */
679 level = level == 0 ? 1 : 0;
681 /* Update status register */
682 if (uic->uictr & mask) {
683 /* Edge sensitive interrupt */
687 /* Level sensitive interrupt */
694 if (loglevel & CPU_LOG_INT) {
695 fprintf(logfile, "%s: irq %d level %d sr %08x => %08x\n", __func__,
696 irq_num, level, uic->uicsr, sr);
699 if (sr != uic->uicsr)
700 ppcuic_trigger_irq(uic);
703 static target_ulong dcr_read_uic (void *opaque, int dcrn)
709 dcrn -= uic->dcr_base;
728 ret = uic->uicsr & uic->uicer;
731 if (!uic->use_vectors)
736 if (!uic->use_vectors)
749 static void dcr_write_uic (void *opaque, int dcrn, target_ulong val)
754 dcrn -= uic->dcr_base;
756 if (loglevel & CPU_LOG_INT) {
757 fprintf(logfile, "%s: dcr %d val " ADDRX "\n", __func__, dcrn, val);
763 ppcuic_trigger_irq(uic);
767 ppcuic_trigger_irq(uic);
771 ppcuic_trigger_irq(uic);
775 ppcuic_trigger_irq(uic);
779 ppcuic_trigger_irq(uic);
783 ppcuic_trigger_irq(uic);
790 uic->uicvcr = val & 0xFFFFFFFD;
791 ppcuic_trigger_irq(uic);
796 static void ppcuic_reset (void *opaque)
801 uic->uiccr = 0x00000000;
802 uic->uicer = 0x00000000;
803 uic->uicpr = 0x00000000;
804 uic->uicsr = 0x00000000;
805 uic->uictr = 0x00000000;
806 if (uic->use_vectors) {
807 uic->uicvcr = 0x00000000;
808 uic->uicvr = 0x0000000;
812 qemu_irq *ppcuic_init (CPUState *env, qemu_irq *irqs,
813 uint32_t dcr_base, int has_ssr, int has_vr)
818 uic = qemu_mallocz(sizeof(ppcuic_t));
820 uic->dcr_base = dcr_base;
823 uic->use_vectors = 1;
824 for (i = 0; i < DCR_UICMAX; i++) {
825 ppc_dcr_register(env, dcr_base + i, uic,
826 &dcr_read_uic, &dcr_write_uic);
828 qemu_register_reset(ppcuic_reset, uic);
832 return qemu_allocate_irqs(&ppcuic_set_irq, uic, UIC_MAX_IRQ);
835 /*****************************************************************************/
836 /* Code decompression controller */
839 /*****************************************************************************/
840 /* SDRAM controller */
841 typedef struct ppc4xx_sdram_t ppc4xx_sdram_t;
842 struct ppc4xx_sdram_t {
845 target_ulong ram_bases[4];
846 target_ulong ram_sizes[4];
862 SDRAM0_CFGADDR = 0x010,
863 SDRAM0_CFGDATA = 0x011,
866 static uint32_t sdram_bcr (target_ulong ram_base, target_ulong ram_size)
871 case (4 * 1024 * 1024):
874 case (8 * 1024 * 1024):
877 case (16 * 1024 * 1024):
880 case (32 * 1024 * 1024):
883 case (64 * 1024 * 1024):
886 case (128 * 1024 * 1024):
889 case (256 * 1024 * 1024):
893 printf("%s: invalid RAM size " TARGET_FMT_ld "\n", __func__, ram_size);
896 bcr |= ram_base & 0xFF800000;
902 static inline target_ulong sdram_base (uint32_t bcr)
904 return bcr & 0xFF800000;
907 static target_ulong sdram_size (uint32_t bcr)
912 sh = (bcr >> 17) & 0x7;
916 size = (4 * 1024 * 1024) << sh;
921 static void sdram_set_bcr (uint32_t *bcrp, uint32_t bcr, int enabled)
923 if (*bcrp & 0x00000001) {
926 printf("%s: unmap RAM area " ADDRX " " ADDRX "\n", __func__,
927 sdram_base(*bcrp), sdram_size(*bcrp));
929 cpu_register_physical_memory(sdram_base(*bcrp), sdram_size(*bcrp),
932 *bcrp = bcr & 0xFFDEE001;
933 if (enabled && (bcr & 0x00000001)) {
935 printf("%s: Map RAM area " ADDRX " " ADDRX "\n", __func__,
936 sdram_base(bcr), sdram_size(bcr));
938 cpu_register_physical_memory(sdram_base(bcr), sdram_size(bcr),
939 sdram_base(bcr) | IO_MEM_RAM);
943 static void sdram_map_bcr (ppc4xx_sdram_t *sdram)
947 for (i = 0; i < sdram->nbanks; i++) {
948 if (sdram->ram_sizes[i] != 0) {
949 sdram_set_bcr(&sdram->bcr[i],
950 sdram_bcr(sdram->ram_bases[i], sdram->ram_sizes[i]),
953 sdram_set_bcr(&sdram->bcr[i], 0x00000000, 0);
958 static void sdram_unmap_bcr (ppc4xx_sdram_t *sdram)
962 for (i = 0; i < sdram->nbanks; i++) {
963 cpu_register_physical_memory(sdram_base(sdram->bcr[i]),
964 sdram_size(sdram->bcr[i]),
969 static target_ulong dcr_read_sdram (void *opaque, int dcrn)
971 ppc4xx_sdram_t *sdram;
980 switch (sdram->addr) {
981 case 0x00: /* SDRAM_BESR0 */
984 case 0x08: /* SDRAM_BESR1 */
987 case 0x10: /* SDRAM_BEAR */
990 case 0x20: /* SDRAM_CFG */
993 case 0x24: /* SDRAM_STATUS */
996 case 0x30: /* SDRAM_RTR */
999 case 0x34: /* SDRAM_PMIT */
1002 case 0x40: /* SDRAM_B0CR */
1003 ret = sdram->bcr[0];
1005 case 0x44: /* SDRAM_B1CR */
1006 ret = sdram->bcr[1];
1008 case 0x48: /* SDRAM_B2CR */
1009 ret = sdram->bcr[2];
1011 case 0x4C: /* SDRAM_B3CR */
1012 ret = sdram->bcr[3];
1014 case 0x80: /* SDRAM_TR */
1017 case 0x94: /* SDRAM_ECCCFG */
1018 ret = sdram->ecccfg;
1020 case 0x98: /* SDRAM_ECCESR */
1021 ret = sdram->eccesr;
1023 default: /* Error */
1029 /* Avoid gcc warning */
1037 static void dcr_write_sdram (void *opaque, int dcrn, target_ulong val)
1039 ppc4xx_sdram_t *sdram;
1043 case SDRAM0_CFGADDR:
1046 case SDRAM0_CFGDATA:
1047 switch (sdram->addr) {
1048 case 0x00: /* SDRAM_BESR0 */
1049 sdram->besr0 &= ~val;
1051 case 0x08: /* SDRAM_BESR1 */
1052 sdram->besr1 &= ~val;
1054 case 0x10: /* SDRAM_BEAR */
1057 case 0x20: /* SDRAM_CFG */
1059 if (!(sdram->cfg & 0x80000000) && (val & 0x80000000)) {
1061 printf("%s: enable SDRAM controller\n", __func__);
1063 /* validate all RAM mappings */
1064 sdram_map_bcr(sdram);
1065 sdram->status &= ~0x80000000;
1066 } else if ((sdram->cfg & 0x80000000) && !(val & 0x80000000)) {
1068 printf("%s: disable SDRAM controller\n", __func__);
1070 /* invalidate all RAM mappings */
1071 sdram_unmap_bcr(sdram);
1072 sdram->status |= 0x80000000;
1074 if (!(sdram->cfg & 0x40000000) && (val & 0x40000000))
1075 sdram->status |= 0x40000000;
1076 else if ((sdram->cfg & 0x40000000) && !(val & 0x40000000))
1077 sdram->status &= ~0x40000000;
1080 case 0x24: /* SDRAM_STATUS */
1081 /* Read-only register */
1083 case 0x30: /* SDRAM_RTR */
1084 sdram->rtr = val & 0x3FF80000;
1086 case 0x34: /* SDRAM_PMIT */
1087 sdram->pmit = (val & 0xF8000000) | 0x07C00000;
1089 case 0x40: /* SDRAM_B0CR */
1090 sdram_set_bcr(&sdram->bcr[0], val, sdram->cfg & 0x80000000);
1092 case 0x44: /* SDRAM_B1CR */
1093 sdram_set_bcr(&sdram->bcr[1], val, sdram->cfg & 0x80000000);
1095 case 0x48: /* SDRAM_B2CR */
1096 sdram_set_bcr(&sdram->bcr[2], val, sdram->cfg & 0x80000000);
1098 case 0x4C: /* SDRAM_B3CR */
1099 sdram_set_bcr(&sdram->bcr[3], val, sdram->cfg & 0x80000000);
1101 case 0x80: /* SDRAM_TR */
1102 sdram->tr = val & 0x018FC01F;
1104 case 0x94: /* SDRAM_ECCCFG */
1105 sdram->ecccfg = val & 0x00F00000;
1107 case 0x98: /* SDRAM_ECCESR */
1109 if (sdram->eccesr == 0 && val != 0)
1110 qemu_irq_raise(sdram->irq);
1111 else if (sdram->eccesr != 0 && val == 0)
1112 qemu_irq_lower(sdram->irq);
1113 sdram->eccesr = val;
1115 default: /* Error */
1122 static void sdram_reset (void *opaque)
1124 ppc4xx_sdram_t *sdram;
1127 sdram->addr = 0x00000000;
1128 sdram->bear = 0x00000000;
1129 sdram->besr0 = 0x00000000; /* No error */
1130 sdram->besr1 = 0x00000000; /* No error */
1131 sdram->cfg = 0x00000000;
1132 sdram->ecccfg = 0x00000000; /* No ECC */
1133 sdram->eccesr = 0x00000000; /* No error */
1134 sdram->pmit = 0x07C00000;
1135 sdram->rtr = 0x05F00000;
1136 sdram->tr = 0x00854009;
1137 /* We pre-initialize RAM banks */
1138 sdram->status = 0x00000000;
1139 sdram->cfg = 0x00800000;
1140 sdram_unmap_bcr(sdram);
1143 void ppc405_sdram_init (CPUState *env, qemu_irq irq, int nbanks,
1144 target_ulong *ram_bases, target_ulong *ram_sizes)
1146 ppc4xx_sdram_t *sdram;
1148 sdram = qemu_mallocz(sizeof(ppc4xx_sdram_t));
1149 if (sdram != NULL) {
1151 sdram->nbanks = nbanks;
1152 memset(sdram->ram_bases, 0, 4 * sizeof(target_ulong));
1153 memcpy(sdram->ram_bases, ram_bases, nbanks * sizeof(target_ulong));
1154 memset(sdram->ram_sizes, 0, 4 * sizeof(target_ulong));
1155 memcpy(sdram->ram_sizes, ram_sizes, nbanks * sizeof(target_ulong));
1157 qemu_register_reset(&sdram_reset, sdram);
1158 ppc_dcr_register(env, SDRAM0_CFGADDR,
1159 sdram, &dcr_read_sdram, &dcr_write_sdram);
1160 ppc_dcr_register(env, SDRAM0_CFGDATA,
1161 sdram, &dcr_read_sdram, &dcr_write_sdram);
1165 /*****************************************************************************/
1166 /* Peripheral controller */
1167 typedef struct ppc4xx_ebc_t ppc4xx_ebc_t;
1168 struct ppc4xx_ebc_t {
1179 EBC0_CFGADDR = 0x012,
1180 EBC0_CFGDATA = 0x013,
1183 static target_ulong dcr_read_ebc (void *opaque, int dcrn)
1194 switch (ebc->addr) {
1195 case 0x00: /* B0CR */
1198 case 0x01: /* B1CR */
1201 case 0x02: /* B2CR */
1204 case 0x03: /* B3CR */
1207 case 0x04: /* B4CR */
1210 case 0x05: /* B5CR */
1213 case 0x06: /* B6CR */
1216 case 0x07: /* B7CR */
1219 case 0x10: /* B0AP */
1222 case 0x11: /* B1AP */
1225 case 0x12: /* B2AP */
1228 case 0x13: /* B3AP */
1231 case 0x14: /* B4AP */
1234 case 0x15: /* B5AP */
1237 case 0x16: /* B6AP */
1240 case 0x17: /* B7AP */
1243 case 0x20: /* BEAR */
1246 case 0x21: /* BESR0 */
1249 case 0x22: /* BESR1 */
1252 case 0x23: /* CFG */
1267 static void dcr_write_ebc (void *opaque, int dcrn, target_ulong val)
1277 switch (ebc->addr) {
1278 case 0x00: /* B0CR */
1280 case 0x01: /* B1CR */
1282 case 0x02: /* B2CR */
1284 case 0x03: /* B3CR */
1286 case 0x04: /* B4CR */
1288 case 0x05: /* B5CR */
1290 case 0x06: /* B6CR */
1292 case 0x07: /* B7CR */
1294 case 0x10: /* B0AP */
1296 case 0x11: /* B1AP */
1298 case 0x12: /* B2AP */
1300 case 0x13: /* B3AP */
1302 case 0x14: /* B4AP */
1304 case 0x15: /* B5AP */
1306 case 0x16: /* B6AP */
1308 case 0x17: /* B7AP */
1310 case 0x20: /* BEAR */
1312 case 0x21: /* BESR0 */
1314 case 0x22: /* BESR1 */
1316 case 0x23: /* CFG */
1327 static void ebc_reset (void *opaque)
1333 ebc->addr = 0x00000000;
1334 ebc->bap[0] = 0x7F8FFE80;
1335 ebc->bcr[0] = 0xFFE28000;
1336 for (i = 0; i < 8; i++) {
1337 ebc->bap[i] = 0x00000000;
1338 ebc->bcr[i] = 0x00000000;
1340 ebc->besr0 = 0x00000000;
1341 ebc->besr1 = 0x00000000;
1342 ebc->cfg = 0x07C00000;
1345 void ppc405_ebc_init (CPUState *env)
1349 ebc = qemu_mallocz(sizeof(ppc4xx_ebc_t));
1352 qemu_register_reset(&ebc_reset, ebc);
1353 ppc_dcr_register(env, EBC0_CFGADDR,
1354 ebc, &dcr_read_ebc, &dcr_write_ebc);
1355 ppc_dcr_register(env, EBC0_CFGDATA,
1356 ebc, &dcr_read_ebc, &dcr_write_ebc);
1360 /*****************************************************************************/
1361 /* DMA controller */
1389 typedef struct ppc405_dma_t ppc405_dma_t;
1390 struct ppc405_dma_t {
1403 static target_ulong dcr_read_dma (void *opaque, int dcrn)
1412 static void dcr_write_dma (void *opaque, int dcrn, target_ulong val)
1419 static void ppc405_dma_reset (void *opaque)
1425 for (i = 0; i < 4; i++) {
1426 dma->cr[i] = 0x00000000;
1427 dma->ct[i] = 0x00000000;
1428 dma->da[i] = 0x00000000;
1429 dma->sa[i] = 0x00000000;
1430 dma->sg[i] = 0x00000000;
1432 dma->sr = 0x00000000;
1433 dma->sgc = 0x00000000;
1434 dma->slp = 0x7C000000;
1435 dma->pol = 0x00000000;
1438 void ppc405_dma_init (CPUState *env, qemu_irq irqs[4])
1442 dma = qemu_mallocz(sizeof(ppc405_dma_t));
1444 memcpy(dma->irqs, irqs, 4 * sizeof(qemu_irq));
1445 ppc405_dma_reset(dma);
1446 qemu_register_reset(&ppc405_dma_reset, dma);
1447 ppc_dcr_register(env, DMA0_CR0,
1448 dma, &dcr_read_dma, &dcr_write_dma);
1449 ppc_dcr_register(env, DMA0_CT0,
1450 dma, &dcr_read_dma, &dcr_write_dma);
1451 ppc_dcr_register(env, DMA0_DA0,
1452 dma, &dcr_read_dma, &dcr_write_dma);
1453 ppc_dcr_register(env, DMA0_SA0,
1454 dma, &dcr_read_dma, &dcr_write_dma);
1455 ppc_dcr_register(env, DMA0_SG0,
1456 dma, &dcr_read_dma, &dcr_write_dma);
1457 ppc_dcr_register(env, DMA0_CR1,
1458 dma, &dcr_read_dma, &dcr_write_dma);
1459 ppc_dcr_register(env, DMA0_CT1,
1460 dma, &dcr_read_dma, &dcr_write_dma);
1461 ppc_dcr_register(env, DMA0_DA1,
1462 dma, &dcr_read_dma, &dcr_write_dma);
1463 ppc_dcr_register(env, DMA0_SA1,
1464 dma, &dcr_read_dma, &dcr_write_dma);
1465 ppc_dcr_register(env, DMA0_SG1,
1466 dma, &dcr_read_dma, &dcr_write_dma);
1467 ppc_dcr_register(env, DMA0_CR2,
1468 dma, &dcr_read_dma, &dcr_write_dma);
1469 ppc_dcr_register(env, DMA0_CT2,
1470 dma, &dcr_read_dma, &dcr_write_dma);
1471 ppc_dcr_register(env, DMA0_DA2,
1472 dma, &dcr_read_dma, &dcr_write_dma);
1473 ppc_dcr_register(env, DMA0_SA2,
1474 dma, &dcr_read_dma, &dcr_write_dma);
1475 ppc_dcr_register(env, DMA0_SG2,
1476 dma, &dcr_read_dma, &dcr_write_dma);
1477 ppc_dcr_register(env, DMA0_CR3,
1478 dma, &dcr_read_dma, &dcr_write_dma);
1479 ppc_dcr_register(env, DMA0_CT3,
1480 dma, &dcr_read_dma, &dcr_write_dma);
1481 ppc_dcr_register(env, DMA0_DA3,
1482 dma, &dcr_read_dma, &dcr_write_dma);
1483 ppc_dcr_register(env, DMA0_SA3,
1484 dma, &dcr_read_dma, &dcr_write_dma);
1485 ppc_dcr_register(env, DMA0_SG3,
1486 dma, &dcr_read_dma, &dcr_write_dma);
1487 ppc_dcr_register(env, DMA0_SR,
1488 dma, &dcr_read_dma, &dcr_write_dma);
1489 ppc_dcr_register(env, DMA0_SGC,
1490 dma, &dcr_read_dma, &dcr_write_dma);
1491 ppc_dcr_register(env, DMA0_SLP,
1492 dma, &dcr_read_dma, &dcr_write_dma);
1493 ppc_dcr_register(env, DMA0_POL,
1494 dma, &dcr_read_dma, &dcr_write_dma);
1498 /*****************************************************************************/
1500 typedef struct ppc405_gpio_t ppc405_gpio_t;
1501 struct ppc405_gpio_t {
1516 static uint32_t ppc405_gpio_readb (void *opaque, target_phys_addr_t addr)
1518 ppc405_gpio_t *gpio;
1522 printf("%s: addr " PADDRX "\n", __func__, addr);
1528 static void ppc405_gpio_writeb (void *opaque,
1529 target_phys_addr_t addr, uint32_t value)
1531 ppc405_gpio_t *gpio;
1535 printf("%s: addr " PADDRX " val %08x\n", __func__, addr, value);
1539 static uint32_t ppc405_gpio_readw (void *opaque, target_phys_addr_t addr)
1541 ppc405_gpio_t *gpio;
1545 printf("%s: addr " PADDRX "\n", __func__, addr);
1551 static void ppc405_gpio_writew (void *opaque,
1552 target_phys_addr_t addr, uint32_t value)
1554 ppc405_gpio_t *gpio;
1558 printf("%s: addr " PADDRX " val %08x\n", __func__, addr, value);
1562 static uint32_t ppc405_gpio_readl (void *opaque, target_phys_addr_t addr)
1564 ppc405_gpio_t *gpio;
1568 printf("%s: addr " PADDRX "\n", __func__, addr);
1574 static void ppc405_gpio_writel (void *opaque,
1575 target_phys_addr_t addr, uint32_t value)
1577 ppc405_gpio_t *gpio;
1581 printf("%s: addr " PADDRX " val %08x\n", __func__, addr, value);
1585 static CPUReadMemoryFunc *ppc405_gpio_read[] = {
1591 static CPUWriteMemoryFunc *ppc405_gpio_write[] = {
1592 &ppc405_gpio_writeb,
1593 &ppc405_gpio_writew,
1594 &ppc405_gpio_writel,
1597 static void ppc405_gpio_reset (void *opaque)
1599 ppc405_gpio_t *gpio;
1604 void ppc405_gpio_init (CPUState *env, ppc4xx_mmio_t *mmio, uint32_t offset)
1606 ppc405_gpio_t *gpio;
1608 gpio = qemu_mallocz(sizeof(ppc405_gpio_t));
1610 gpio->base = mmio->base + offset;
1611 ppc405_gpio_reset(gpio);
1612 qemu_register_reset(&ppc405_gpio_reset, gpio);
1614 printf("%s: offset=%08x\n", __func__, offset);
1616 ppc4xx_mmio_register(env, mmio, offset, 0x038,
1617 ppc405_gpio_read, ppc405_gpio_write, gpio);
1621 /*****************************************************************************/
1623 static CPUReadMemoryFunc *serial_mm_read[] = {
1629 static CPUWriteMemoryFunc *serial_mm_write[] = {
1635 void ppc405_serial_init (CPUState *env, ppc4xx_mmio_t *mmio,
1636 uint32_t offset, qemu_irq irq,
1637 CharDriverState *chr)
1642 printf("%s: offset=%08x\n", __func__, offset);
1644 serial = serial_mm_init(mmio->base + offset, 0, irq, chr, 0);
1645 ppc4xx_mmio_register(env, mmio, offset, 0x008,
1646 serial_mm_read, serial_mm_write, serial);
1649 /*****************************************************************************/
1650 /* On Chip Memory */
1653 OCM0_ISACNTL = 0x019,
1655 OCM0_DSACNTL = 0x01B,
1658 typedef struct ppc405_ocm_t ppc405_ocm_t;
1659 struct ppc405_ocm_t {
1660 target_ulong offset;
1667 static void ocm_update_mappings (ppc405_ocm_t *ocm,
1668 uint32_t isarc, uint32_t isacntl,
1669 uint32_t dsarc, uint32_t dsacntl)
1672 printf("OCM update ISA %08x %08x (%08x %08x) DSA %08x %08x (%08x %08x)\n",
1673 isarc, isacntl, dsarc, dsacntl,
1674 ocm->isarc, ocm->isacntl, ocm->dsarc, ocm->dsacntl);
1676 if (ocm->isarc != isarc ||
1677 (ocm->isacntl & 0x80000000) != (isacntl & 0x80000000)) {
1678 if (ocm->isacntl & 0x80000000) {
1679 /* Unmap previously assigned memory region */
1680 printf("OCM unmap ISA %08x\n", ocm->isarc);
1681 cpu_register_physical_memory(ocm->isarc, 0x04000000,
1684 if (isacntl & 0x80000000) {
1685 /* Map new instruction memory region */
1687 printf("OCM map ISA %08x\n", isarc);
1689 cpu_register_physical_memory(isarc, 0x04000000,
1690 ocm->offset | IO_MEM_RAM);
1693 if (ocm->dsarc != dsarc ||
1694 (ocm->dsacntl & 0x80000000) != (dsacntl & 0x80000000)) {
1695 if (ocm->dsacntl & 0x80000000) {
1696 /* Beware not to unmap the region we just mapped */
1697 if (!(isacntl & 0x80000000) || ocm->dsarc != isarc) {
1698 /* Unmap previously assigned memory region */
1700 printf("OCM unmap DSA %08x\n", ocm->dsarc);
1702 cpu_register_physical_memory(ocm->dsarc, 0x04000000,
1706 if (dsacntl & 0x80000000) {
1707 /* Beware not to remap the region we just mapped */
1708 if (!(isacntl & 0x80000000) || dsarc != isarc) {
1709 /* Map new data memory region */
1711 printf("OCM map DSA %08x\n", dsarc);
1713 cpu_register_physical_memory(dsarc, 0x04000000,
1714 ocm->offset | IO_MEM_RAM);
1720 static target_ulong dcr_read_ocm (void *opaque, int dcrn)
1747 static void dcr_write_ocm (void *opaque, int dcrn, target_ulong val)
1750 uint32_t isarc, dsarc, isacntl, dsacntl;
1755 isacntl = ocm->isacntl;
1756 dsacntl = ocm->dsacntl;
1759 isarc = val & 0xFC000000;
1762 isacntl = val & 0xC0000000;
1765 isarc = val & 0xFC000000;
1768 isacntl = val & 0xC0000000;
1771 ocm_update_mappings(ocm, isarc, isacntl, dsarc, dsacntl);
1774 ocm->isacntl = isacntl;
1775 ocm->dsacntl = dsacntl;
1778 static void ocm_reset (void *opaque)
1781 uint32_t isarc, dsarc, isacntl, dsacntl;
1785 isacntl = 0x00000000;
1787 dsacntl = 0x00000000;
1788 ocm_update_mappings(ocm, isarc, isacntl, dsarc, dsacntl);
1791 ocm->isacntl = isacntl;
1792 ocm->dsacntl = dsacntl;
1795 void ppc405_ocm_init (CPUState *env, unsigned long offset)
1799 ocm = qemu_mallocz(sizeof(ppc405_ocm_t));
1801 ocm->offset = offset;
1803 qemu_register_reset(&ocm_reset, ocm);
1804 ppc_dcr_register(env, OCM0_ISARC,
1805 ocm, &dcr_read_ocm, &dcr_write_ocm);
1806 ppc_dcr_register(env, OCM0_ISACNTL,
1807 ocm, &dcr_read_ocm, &dcr_write_ocm);
1808 ppc_dcr_register(env, OCM0_DSARC,
1809 ocm, &dcr_read_ocm, &dcr_write_ocm);
1810 ppc_dcr_register(env, OCM0_DSACNTL,
1811 ocm, &dcr_read_ocm, &dcr_write_ocm);
1815 /*****************************************************************************/
1816 /* I2C controller */
1817 typedef struct ppc4xx_i2c_t ppc4xx_i2c_t;
1818 struct ppc4xx_i2c_t {
1837 static uint32_t ppc4xx_i2c_readb (void *opaque, target_phys_addr_t addr)
1843 printf("%s: addr " PADDRX "\n", __func__, addr);
1846 switch (addr - i2c->base) {
1848 // i2c_readbyte(&i2c->mdata);
1888 ret = i2c->xtcntlss;
1891 ret = i2c->directcntl;
1898 printf("%s: addr " PADDRX " %02x\n", __func__, addr, ret);
1904 static void ppc4xx_i2c_writeb (void *opaque,
1905 target_phys_addr_t addr, uint32_t value)
1910 printf("%s: addr " PADDRX " val %08x\n", __func__, addr, value);
1913 switch (addr - i2c->base) {
1916 // i2c_sendbyte(&i2c->mdata);
1931 i2c->mdcntl = value & 0xDF;
1934 i2c->sts &= ~(value & 0x0A);
1937 i2c->extsts &= ~(value & 0x8F);
1946 i2c->clkdiv = value;
1949 i2c->intrmsk = value;
1952 i2c->xfrcnt = value & 0x77;
1955 i2c->xtcntlss = value;
1958 i2c->directcntl = value & 0x7;
1963 static uint32_t ppc4xx_i2c_readw (void *opaque, target_phys_addr_t addr)
1968 printf("%s: addr " PADDRX "\n", __func__, addr);
1970 ret = ppc4xx_i2c_readb(opaque, addr) << 8;
1971 ret |= ppc4xx_i2c_readb(opaque, addr + 1);
1976 static void ppc4xx_i2c_writew (void *opaque,
1977 target_phys_addr_t addr, uint32_t value)
1980 printf("%s: addr " PADDRX " val %08x\n", __func__, addr, value);
1982 ppc4xx_i2c_writeb(opaque, addr, value >> 8);
1983 ppc4xx_i2c_writeb(opaque, addr + 1, value);
1986 static uint32_t ppc4xx_i2c_readl (void *opaque, target_phys_addr_t addr)
1991 printf("%s: addr " PADDRX "\n", __func__, addr);
1993 ret = ppc4xx_i2c_readb(opaque, addr) << 24;
1994 ret |= ppc4xx_i2c_readb(opaque, addr + 1) << 16;
1995 ret |= ppc4xx_i2c_readb(opaque, addr + 2) << 8;
1996 ret |= ppc4xx_i2c_readb(opaque, addr + 3);
2001 static void ppc4xx_i2c_writel (void *opaque,
2002 target_phys_addr_t addr, uint32_t value)
2005 printf("%s: addr " PADDRX " val %08x\n", __func__, addr, value);
2007 ppc4xx_i2c_writeb(opaque, addr, value >> 24);
2008 ppc4xx_i2c_writeb(opaque, addr + 1, value >> 16);
2009 ppc4xx_i2c_writeb(opaque, addr + 2, value >> 8);
2010 ppc4xx_i2c_writeb(opaque, addr + 3, value);
2013 static CPUReadMemoryFunc *i2c_read[] = {
2019 static CPUWriteMemoryFunc *i2c_write[] = {
2025 static void ppc4xx_i2c_reset (void *opaque)
2038 i2c->directcntl = 0x0F;
2041 void ppc405_i2c_init (CPUState *env, ppc4xx_mmio_t *mmio, uint32_t offset)
2045 i2c = qemu_mallocz(sizeof(ppc4xx_i2c_t));
2047 i2c->base = mmio->base + offset;
2048 ppc4xx_i2c_reset(i2c);
2050 printf("%s: offset=%08x\n", __func__, offset);
2052 ppc4xx_mmio_register(env, mmio, offset, 0x011,
2053 i2c_read, i2c_write, i2c);
2054 qemu_register_reset(ppc4xx_i2c_reset, i2c);
2058 /*****************************************************************************/
2060 void ppc40x_core_reset (CPUState *env)
2064 printf("Reset PowerPC core\n");
2066 dbsr = env->spr[SPR_40x_DBSR];
2067 dbsr &= ~0x00000300;
2069 env->spr[SPR_40x_DBSR] = dbsr;
2073 void ppc40x_chip_reset (CPUState *env)
2077 printf("Reset PowerPC chip\n");
2079 /* XXX: TODO reset all internal peripherals */
2080 dbsr = env->spr[SPR_40x_DBSR];
2081 dbsr &= ~0x00000300;
2083 env->spr[SPR_40x_DBSR] = dbsr;
2087 void ppc40x_system_reset (CPUState *env)
2089 printf("Reset PowerPC system\n");
2090 qemu_system_reset_request();
2093 void store_40x_dbcr0 (CPUState *env, uint32_t val)
2095 switch ((val >> 28) & 0x3) {
2101 ppc40x_core_reset(env);
2105 ppc40x_chip_reset(env);
2109 ppc40x_system_reset(env);
2114 /*****************************************************************************/
2117 PPC405CR_CPC0_PLLMR = 0x0B0,
2118 PPC405CR_CPC0_CR0 = 0x0B1,
2119 PPC405CR_CPC0_CR1 = 0x0B2,
2120 PPC405CR_CPC0_PSR = 0x0B4,
2121 PPC405CR_CPC0_JTAGID = 0x0B5,
2122 PPC405CR_CPC0_ER = 0x0B9,
2123 PPC405CR_CPC0_FR = 0x0BA,
2124 PPC405CR_CPC0_SR = 0x0BB,
2127 typedef struct ppc405cr_cpc_t ppc405cr_cpc_t;
2128 struct ppc405cr_cpc_t {
2129 clk_setup_t clk_setup[7];
2140 static void ppc405cr_clk_setup (ppc405cr_cpc_t *cpc)
2142 uint64_t VCO_out, PLL_out;
2143 uint32_t CPU_clk, TMR_clk, SDRAM_clk, PLB_clk, OPB_clk, EXT_clk, UART_clk;
2146 D0 = ((cpc->pllmr >> 26) & 0x3) + 1; /* CBDV */
2147 if (cpc->pllmr & 0x80000000) {
2148 D1 = (((cpc->pllmr >> 20) - 1) & 0xF) + 1; /* FBDV */
2149 D2 = 8 - ((cpc->pllmr >> 16) & 0x7); /* FWDVA */
2151 VCO_out = cpc->sysclk * M;
2152 if (VCO_out < 400000000 || VCO_out > 800000000) {
2153 /* PLL cannot lock */
2154 cpc->pllmr &= ~0x80000000;
2157 PLL_out = VCO_out / D2;
2162 PLL_out = cpc->sysclk * M;
2165 if (cpc->cr1 & 0x00800000)
2166 TMR_clk = cpc->sysclk; /* Should have a separate clock */
2169 PLB_clk = CPU_clk / D0;
2170 SDRAM_clk = PLB_clk;
2171 D0 = ((cpc->pllmr >> 10) & 0x3) + 1;
2172 OPB_clk = PLB_clk / D0;
2173 D0 = ((cpc->pllmr >> 24) & 0x3) + 2;
2174 EXT_clk = PLB_clk / D0;
2175 D0 = ((cpc->cr0 >> 1) & 0x1F) + 1;
2176 UART_clk = CPU_clk / D0;
2177 /* Setup CPU clocks */
2178 clk_setup(&cpc->clk_setup[0], CPU_clk);
2179 /* Setup time-base clock */
2180 clk_setup(&cpc->clk_setup[1], TMR_clk);
2181 /* Setup PLB clock */
2182 clk_setup(&cpc->clk_setup[2], PLB_clk);
2183 /* Setup SDRAM clock */
2184 clk_setup(&cpc->clk_setup[3], SDRAM_clk);
2185 /* Setup OPB clock */
2186 clk_setup(&cpc->clk_setup[4], OPB_clk);
2187 /* Setup external clock */
2188 clk_setup(&cpc->clk_setup[5], EXT_clk);
2189 /* Setup UART clock */
2190 clk_setup(&cpc->clk_setup[6], UART_clk);
2193 static target_ulong dcr_read_crcpc (void *opaque, int dcrn)
2195 ppc405cr_cpc_t *cpc;
2200 case PPC405CR_CPC0_PLLMR:
2203 case PPC405CR_CPC0_CR0:
2206 case PPC405CR_CPC0_CR1:
2209 case PPC405CR_CPC0_PSR:
2212 case PPC405CR_CPC0_JTAGID:
2215 case PPC405CR_CPC0_ER:
2218 case PPC405CR_CPC0_FR:
2221 case PPC405CR_CPC0_SR:
2222 ret = ~(cpc->er | cpc->fr) & 0xFFFF0000;
2225 /* Avoid gcc warning */
2233 static void dcr_write_crcpc (void *opaque, int dcrn, target_ulong val)
2235 ppc405cr_cpc_t *cpc;
2239 case PPC405CR_CPC0_PLLMR:
2240 cpc->pllmr = val & 0xFFF77C3F;
2242 case PPC405CR_CPC0_CR0:
2243 cpc->cr0 = val & 0x0FFFFFFE;
2245 case PPC405CR_CPC0_CR1:
2246 cpc->cr1 = val & 0x00800000;
2248 case PPC405CR_CPC0_PSR:
2251 case PPC405CR_CPC0_JTAGID:
2254 case PPC405CR_CPC0_ER:
2255 cpc->er = val & 0xBFFC0000;
2257 case PPC405CR_CPC0_FR:
2258 cpc->fr = val & 0xBFFC0000;
2260 case PPC405CR_CPC0_SR:
2266 static void ppc405cr_cpc_reset (void *opaque)
2268 ppc405cr_cpc_t *cpc;
2272 /* Compute PLLMR value from PSR settings */
2273 cpc->pllmr = 0x80000000;
2275 switch ((cpc->psr >> 30) & 3) {
2278 cpc->pllmr &= ~0x80000000;
2282 cpc->pllmr |= 5 << 16;
2286 cpc->pllmr |= 4 << 16;
2290 cpc->pllmr |= 2 << 16;
2294 D = (cpc->psr >> 28) & 3;
2295 cpc->pllmr |= (D + 1) << 20;
2297 D = (cpc->psr >> 25) & 7;
2312 D = (cpc->psr >> 23) & 3;
2313 cpc->pllmr |= D << 26;
2315 D = (cpc->psr >> 21) & 3;
2316 cpc->pllmr |= D << 10;
2318 D = (cpc->psr >> 17) & 3;
2319 cpc->pllmr |= D << 24;
2320 cpc->cr0 = 0x0000003C;
2321 cpc->cr1 = 0x2B0D8800;
2322 cpc->er = 0x00000000;
2323 cpc->fr = 0x00000000;
2324 ppc405cr_clk_setup(cpc);
2327 static void ppc405cr_clk_init (ppc405cr_cpc_t *cpc)
2331 /* XXX: this should be read from IO pins */
2332 cpc->psr = 0x00000000; /* 8 bits ROM */
2334 D = 0x2; /* Divide by 4 */
2335 cpc->psr |= D << 30;
2337 D = 0x1; /* Divide by 2 */
2338 cpc->psr |= D << 28;
2340 D = 0x1; /* Divide by 2 */
2341 cpc->psr |= D << 23;
2343 D = 0x5; /* M = 16 */
2344 cpc->psr |= D << 25;
2346 D = 0x1; /* Divide by 2 */
2347 cpc->psr |= D << 21;
2349 D = 0x2; /* Divide by 4 */
2350 cpc->psr |= D << 17;
2353 static void ppc405cr_cpc_init (CPUState *env, clk_setup_t clk_setup[7],
2356 ppc405cr_cpc_t *cpc;
2358 cpc = qemu_mallocz(sizeof(ppc405cr_cpc_t));
2360 memcpy(cpc->clk_setup, clk_setup, 7 * sizeof(clk_setup_t));
2361 cpc->sysclk = sysclk;
2362 cpc->jtagid = 0x42051049;
2363 ppc_dcr_register(env, PPC405CR_CPC0_PSR, cpc,
2364 &dcr_read_crcpc, &dcr_write_crcpc);
2365 ppc_dcr_register(env, PPC405CR_CPC0_CR0, cpc,
2366 &dcr_read_crcpc, &dcr_write_crcpc);
2367 ppc_dcr_register(env, PPC405CR_CPC0_CR1, cpc,
2368 &dcr_read_crcpc, &dcr_write_crcpc);
2369 ppc_dcr_register(env, PPC405CR_CPC0_JTAGID, cpc,
2370 &dcr_read_crcpc, &dcr_write_crcpc);
2371 ppc_dcr_register(env, PPC405CR_CPC0_PLLMR, cpc,
2372 &dcr_read_crcpc, &dcr_write_crcpc);
2373 ppc_dcr_register(env, PPC405CR_CPC0_ER, cpc,
2374 &dcr_read_crcpc, &dcr_write_crcpc);
2375 ppc_dcr_register(env, PPC405CR_CPC0_FR, cpc,
2376 &dcr_read_crcpc, &dcr_write_crcpc);
2377 ppc_dcr_register(env, PPC405CR_CPC0_SR, cpc,
2378 &dcr_read_crcpc, &dcr_write_crcpc);
2379 ppc405cr_clk_init(cpc);
2380 qemu_register_reset(ppc405cr_cpc_reset, cpc);
2381 ppc405cr_cpc_reset(cpc);
2385 CPUState *ppc405cr_init (target_ulong ram_bases[4], target_ulong ram_sizes[4],
2386 uint32_t sysclk, qemu_irq **picp,
2387 ram_addr_t *offsetp)
2389 clk_setup_t clk_setup[7];
2390 qemu_irq dma_irqs[4];
2392 ppc4xx_mmio_t *mmio;
2393 qemu_irq *pic, *irqs;
2397 memset(clk_setup, 0, sizeof(clk_setup));
2398 env = ppc405_init("405cr", &clk_setup[0], &clk_setup[1], sysclk);
2399 /* Memory mapped devices registers */
2400 mmio = ppc4xx_mmio_init(env, 0xEF600000);
2402 ppc4xx_plb_init(env);
2403 /* PLB to OPB bridge */
2404 ppc4xx_pob_init(env);
2406 ppc4xx_opba_init(env, mmio, 0x600);
2407 /* Universal interrupt controller */
2408 irqs = qemu_mallocz(sizeof(qemu_irq) * PPCUIC_OUTPUT_NB);
2409 irqs[PPCUIC_OUTPUT_INT] =
2410 ((qemu_irq *)env->irq_inputs)[PPC405_INPUT_INT];
2411 irqs[PPCUIC_OUTPUT_CINT] =
2412 ((qemu_irq *)env->irq_inputs)[PPC405_INPUT_CINT];
2413 pic = ppcuic_init(env, irqs, 0x0C0, 0, 1);
2415 /* SDRAM controller */
2416 ppc405_sdram_init(env, pic[17], 1, ram_bases, ram_sizes);
2418 for (i = 0; i < 4; i++)
2419 offset += ram_sizes[i];
2420 /* External bus controller */
2421 ppc405_ebc_init(env);
2422 /* DMA controller */
2423 dma_irqs[0] = pic[5];
2424 dma_irqs[1] = pic[6];
2425 dma_irqs[2] = pic[7];
2426 dma_irqs[3] = pic[8];
2427 ppc405_dma_init(env, dma_irqs);
2429 if (serial_hds[0] != NULL) {
2430 ppc405_serial_init(env, mmio, 0x400, pic[0], serial_hds[0]);
2432 if (serial_hds[1] != NULL) {
2433 ppc405_serial_init(env, mmio, 0x300, pic[1], serial_hds[1]);
2435 /* IIC controller */
2436 ppc405_i2c_init(env, mmio, 0x500);
2438 ppc405_gpio_init(env, mmio, 0x700);
2440 ppc405cr_cpc_init(env, clk_setup, sysclk);
2446 /*****************************************************************************/
2450 PPC405EP_CPC0_PLLMR0 = 0x0F0,
2451 PPC405EP_CPC0_BOOT = 0x0F1,
2452 PPC405EP_CPC0_EPCTL = 0x0F3,
2453 PPC405EP_CPC0_PLLMR1 = 0x0F4,
2454 PPC405EP_CPC0_UCR = 0x0F5,
2455 PPC405EP_CPC0_SRR = 0x0F6,
2456 PPC405EP_CPC0_JTAGID = 0x0F7,
2457 PPC405EP_CPC0_PCI = 0x0F9,
2460 typedef struct ppc405ep_cpc_t ppc405ep_cpc_t;
2461 struct ppc405ep_cpc_t {
2463 clk_setup_t clk_setup[8];
2473 static void ppc405ep_compute_clocks (ppc405ep_cpc_t *cpc)
2475 uint32_t CPU_clk, PLB_clk, OPB_clk, EBC_clk, MAL_clk, PCI_clk;
2476 uint32_t UART0_clk, UART1_clk;
2477 uint64_t VCO_out, PLL_out;
2481 if ((cpc->pllmr[1] & 0x80000000) && !(cpc->pllmr[1] & 0x40000000)) {
2482 M = (((cpc->pllmr[1] >> 20) - 1) & 0xF) + 1; /* FBMUL */
2483 // printf("FBMUL %01x %d\n", (cpc->pllmr[1] >> 20) & 0xF, M);
2484 D = 8 - ((cpc->pllmr[1] >> 16) & 0x7); /* FWDA */
2485 // printf("FWDA %01x %d\n", (cpc->pllmr[1] >> 16) & 0x7, D);
2486 VCO_out = cpc->sysclk * M * D;
2487 if (VCO_out < 500000000UL || VCO_out > 1000000000UL) {
2488 /* Error - unlock the PLL */
2489 printf("VCO out of range %" PRIu64 "\n", VCO_out);
2491 cpc->pllmr[1] &= ~0x80000000;
2495 PLL_out = VCO_out / D;
2500 PLL_out = cpc->sysclk;
2502 /* Now, compute all other clocks */
2503 D = ((cpc->pllmr[0] >> 20) & 0x3) + 1; /* CCDV */
2505 // printf("CCDV %01x %d\n", (cpc->pllmr[0] >> 20) & 0x3, D);
2507 CPU_clk = PLL_out / D;
2508 D = ((cpc->pllmr[0] >> 16) & 0x3) + 1; /* CBDV */
2510 // printf("CBDV %01x %d\n", (cpc->pllmr[0] >> 16) & 0x3, D);
2512 PLB_clk = CPU_clk / D;
2513 D = ((cpc->pllmr[0] >> 12) & 0x3) + 1; /* OPDV */
2515 // printf("OPDV %01x %d\n", (cpc->pllmr[0] >> 12) & 0x3, D);
2517 OPB_clk = PLB_clk / D;
2518 D = ((cpc->pllmr[0] >> 8) & 0x3) + 2; /* EPDV */
2520 // printf("EPDV %01x %d\n", (cpc->pllmr[0] >> 8) & 0x3, D);
2522 EBC_clk = PLB_clk / D;
2523 D = ((cpc->pllmr[0] >> 4) & 0x3) + 1; /* MPDV */
2525 // printf("MPDV %01x %d\n", (cpc->pllmr[0] >> 4) & 0x3, D);
2527 MAL_clk = PLB_clk / D;
2528 D = (cpc->pllmr[0] & 0x3) + 1; /* PPDV */
2530 // printf("PPDV %01x %d\n", cpc->pllmr[0] & 0x3, D);
2532 PCI_clk = PLB_clk / D;
2533 D = ((cpc->ucr - 1) & 0x7F) + 1; /* U0DIV */
2535 // printf("U0DIV %01x %d\n", cpc->ucr & 0x7F, D);
2537 UART0_clk = PLL_out / D;
2538 D = (((cpc->ucr >> 8) - 1) & 0x7F) + 1; /* U1DIV */
2540 // printf("U1DIV %01x %d\n", (cpc->ucr >> 8) & 0x7F, D);
2542 UART1_clk = PLL_out / D;
2544 printf("Setup PPC405EP clocks - sysclk %d VCO %" PRIu64
2545 " PLL out %" PRIu64 " Hz\n", cpc->sysclk, VCO_out, PLL_out);
2546 printf("CPU %d PLB %d OPB %d EBC %d MAL %d PCI %d UART0 %d UART1 %d\n",
2547 CPU_clk, PLB_clk, OPB_clk, EBC_clk, MAL_clk, PCI_clk,
2548 UART0_clk, UART1_clk);
2550 /* Setup CPU clocks */
2551 clk_setup(&cpc->clk_setup[0], CPU_clk);
2552 /* Setup PLB clock */
2553 clk_setup(&cpc->clk_setup[1], PLB_clk);
2554 /* Setup OPB clock */
2555 clk_setup(&cpc->clk_setup[2], OPB_clk);
2556 /* Setup external clock */
2557 clk_setup(&cpc->clk_setup[3], EBC_clk);
2558 /* Setup MAL clock */
2559 clk_setup(&cpc->clk_setup[4], MAL_clk);
2560 /* Setup PCI clock */
2561 clk_setup(&cpc->clk_setup[5], PCI_clk);
2562 /* Setup UART0 clock */
2563 clk_setup(&cpc->clk_setup[6], UART0_clk);
2564 /* Setup UART1 clock */
2565 clk_setup(&cpc->clk_setup[7], UART0_clk);
2568 static target_ulong dcr_read_epcpc (void *opaque, int dcrn)
2570 ppc405ep_cpc_t *cpc;
2575 case PPC405EP_CPC0_BOOT:
2578 case PPC405EP_CPC0_EPCTL:
2581 case PPC405EP_CPC0_PLLMR0:
2582 ret = cpc->pllmr[0];
2584 case PPC405EP_CPC0_PLLMR1:
2585 ret = cpc->pllmr[1];
2587 case PPC405EP_CPC0_UCR:
2590 case PPC405EP_CPC0_SRR:
2593 case PPC405EP_CPC0_JTAGID:
2596 case PPC405EP_CPC0_PCI:
2600 /* Avoid gcc warning */
2608 static void dcr_write_epcpc (void *opaque, int dcrn, target_ulong val)
2610 ppc405ep_cpc_t *cpc;
2614 case PPC405EP_CPC0_BOOT:
2615 /* Read-only register */
2617 case PPC405EP_CPC0_EPCTL:
2618 /* Don't care for now */
2619 cpc->epctl = val & 0xC00000F3;
2621 case PPC405EP_CPC0_PLLMR0:
2622 cpc->pllmr[0] = val & 0x00633333;
2623 ppc405ep_compute_clocks(cpc);
2625 case PPC405EP_CPC0_PLLMR1:
2626 cpc->pllmr[1] = val & 0xC0F73FFF;
2627 ppc405ep_compute_clocks(cpc);
2629 case PPC405EP_CPC0_UCR:
2630 /* UART control - don't care for now */
2631 cpc->ucr = val & 0x003F7F7F;
2633 case PPC405EP_CPC0_SRR:
2636 case PPC405EP_CPC0_JTAGID:
2639 case PPC405EP_CPC0_PCI:
2645 static void ppc405ep_cpc_reset (void *opaque)
2647 ppc405ep_cpc_t *cpc = opaque;
2649 cpc->boot = 0x00000010; /* Boot from PCI - IIC EEPROM disabled */
2650 cpc->epctl = 0x00000000;
2651 cpc->pllmr[0] = 0x00011010;
2652 cpc->pllmr[1] = 0x40000000;
2653 cpc->ucr = 0x00000000;
2654 cpc->srr = 0x00040000;
2655 cpc->pci = 0x00000000;
2656 ppc405ep_compute_clocks(cpc);
2659 /* XXX: sysclk should be between 25 and 100 MHz */
2660 static void ppc405ep_cpc_init (CPUState *env, clk_setup_t clk_setup[8],
2663 ppc405ep_cpc_t *cpc;
2665 cpc = qemu_mallocz(sizeof(ppc405ep_cpc_t));
2667 memcpy(cpc->clk_setup, clk_setup, 7 * sizeof(clk_setup_t));
2668 cpc->jtagid = 0x20267049;
2669 cpc->sysclk = sysclk;
2670 ppc405ep_cpc_reset(cpc);
2671 qemu_register_reset(&ppc405ep_cpc_reset, cpc);
2672 ppc_dcr_register(env, PPC405EP_CPC0_BOOT, cpc,
2673 &dcr_read_epcpc, &dcr_write_epcpc);
2674 ppc_dcr_register(env, PPC405EP_CPC0_EPCTL, cpc,
2675 &dcr_read_epcpc, &dcr_write_epcpc);
2676 ppc_dcr_register(env, PPC405EP_CPC0_PLLMR0, cpc,
2677 &dcr_read_epcpc, &dcr_write_epcpc);
2678 ppc_dcr_register(env, PPC405EP_CPC0_PLLMR1, cpc,
2679 &dcr_read_epcpc, &dcr_write_epcpc);
2680 ppc_dcr_register(env, PPC405EP_CPC0_UCR, cpc,
2681 &dcr_read_epcpc, &dcr_write_epcpc);
2682 ppc_dcr_register(env, PPC405EP_CPC0_SRR, cpc,
2683 &dcr_read_epcpc, &dcr_write_epcpc);
2684 ppc_dcr_register(env, PPC405EP_CPC0_JTAGID, cpc,
2685 &dcr_read_epcpc, &dcr_write_epcpc);
2686 ppc_dcr_register(env, PPC405EP_CPC0_PCI, cpc,
2687 &dcr_read_epcpc, &dcr_write_epcpc);
2691 CPUState *ppc405ep_init (target_ulong ram_bases[2], target_ulong ram_sizes[2],
2692 uint32_t sysclk, qemu_irq **picp,
2693 ram_addr_t *offsetp)
2695 clk_setup_t clk_setup[8];
2696 qemu_irq dma_irqs[4];
2698 ppc4xx_mmio_t *mmio;
2699 qemu_irq *pic, *irqs;
2703 memset(clk_setup, 0, sizeof(clk_setup));
2705 env = ppc405_init("405ep", &clk_setup[0], &clk_setup[1], sysclk);
2706 /* Internal devices init */
2707 /* Memory mapped devices registers */
2708 mmio = ppc4xx_mmio_init(env, 0xEF600000);
2710 ppc4xx_plb_init(env);
2711 /* PLB to OPB bridge */
2712 ppc4xx_pob_init(env);
2714 ppc4xx_opba_init(env, mmio, 0x600);
2715 /* Universal interrupt controller */
2716 irqs = qemu_mallocz(sizeof(qemu_irq) * PPCUIC_OUTPUT_NB);
2717 irqs[PPCUIC_OUTPUT_INT] =
2718 ((qemu_irq *)env->irq_inputs)[PPC405_INPUT_INT];
2719 irqs[PPCUIC_OUTPUT_CINT] =
2720 ((qemu_irq *)env->irq_inputs)[PPC405_INPUT_CINT];
2721 pic = ppcuic_init(env, irqs, 0x0C0, 0, 1);
2723 /* SDRAM controller */
2724 ppc405_sdram_init(env, pic[17], 2, ram_bases, ram_sizes);
2726 for (i = 0; i < 2; i++)
2727 offset += ram_sizes[i];
2728 /* External bus controller */
2729 ppc405_ebc_init(env);
2730 /* DMA controller */
2731 dma_irqs[0] = pic[5];
2732 dma_irqs[1] = pic[6];
2733 dma_irqs[2] = pic[7];
2734 dma_irqs[3] = pic[8];
2735 ppc405_dma_init(env, dma_irqs);
2736 /* IIC controller */
2737 ppc405_i2c_init(env, mmio, 0x500);
2739 ppc405_gpio_init(env, mmio, 0x700);
2741 if (serial_hds[0] != NULL) {
2742 ppc405_serial_init(env, mmio, 0x300, pic[0], serial_hds[0]);
2744 if (serial_hds[1] != NULL) {
2745 ppc405_serial_init(env, mmio, 0x400, pic[1], serial_hds[1]);
2748 ppc405_ocm_init(env, ram_sizes[0] + ram_sizes[1]);
2752 ppc405ep_cpc_init(env, clk_setup, sysclk);