37
36
//#define DEBUG_I2C
40
40
#define DEBUG_CLOCKS
41
//#define DEBUG_CLOCKS_LL
43
ram_addr_t ppc405_set_bootinfo (CPUState *env, ppc4xx_bd_info_t *bd,
41
//#define DEBUG_UNASSIGNED
43
/*****************************************************************************/
44
/* Generic PowerPC 405 processor instanciation */
45
CPUState *ppc405_init (const unsigned char *cpu_model,
46
clk_setup_t *cpu_clk, clk_setup_t *tb_clk,
54
qemu_register_reset(&cpu_ppc_reset, env);
55
register_savevm("cpu", 0, 3, cpu_save, cpu_load, env);
56
ppc_find_by_name(cpu_model, &def);
58
cpu_abort(env, "Unable to find PowerPC %s CPU definition\n",
61
cpu_ppc_register(env, def);
62
cpu_clk->cb = NULL; /* We don't care about CPU clock frequency changes */
63
cpu_clk->opaque = env;
64
/* Set time-base frequency to sysclk */
65
tb_clk->cb = ppc_emb_timers_init(env, sysclk);
67
ppc_dcr_init(env, NULL, NULL);
72
ram_addr_t ppc405_set_bootinfo (CPUState *env, ppc4xx_bd_info_t *bd)
93
121
/* Shared peripherals */
95
123
/*****************************************************************************/
124
/* Fake device used to map multiple devices in a single memory page */
125
#define MMIO_AREA_BITS 8
126
#define MMIO_AREA_LEN (1 << MMIO_AREA_BITS)
127
#define MMIO_AREA_NB (1 << (TARGET_PAGE_BITS - MMIO_AREA_BITS))
128
#define MMIO_IDX(addr) (((addr) >> MMIO_AREA_BITS) & (MMIO_AREA_NB - 1))
129
struct ppc4xx_mmio_t {
130
target_phys_addr_t base;
131
CPUReadMemoryFunc **mem_read[MMIO_AREA_NB];
132
CPUWriteMemoryFunc **mem_write[MMIO_AREA_NB];
133
void *opaque[MMIO_AREA_NB];
136
static uint32_t unassigned_mmio_readb (void *opaque, target_phys_addr_t addr)
138
#ifdef DEBUG_UNASSIGNED
142
printf("Unassigned mmio read 0x" PADDRX " base " PADDRX "\n",
149
static void unassigned_mmio_writeb (void *opaque,
150
target_phys_addr_t addr, uint32_t val)
152
#ifdef DEBUG_UNASSIGNED
156
printf("Unassigned mmio write 0x" PADDRX " = 0x%x base " PADDRX "\n",
157
addr, val, mmio->base);
161
static CPUReadMemoryFunc *unassigned_mmio_read[3] = {
162
unassigned_mmio_readb,
163
unassigned_mmio_readb,
164
unassigned_mmio_readb,
167
static CPUWriteMemoryFunc *unassigned_mmio_write[3] = {
168
unassigned_mmio_writeb,
169
unassigned_mmio_writeb,
170
unassigned_mmio_writeb,
173
static uint32_t mmio_readlen (ppc4xx_mmio_t *mmio,
174
target_phys_addr_t addr, int len)
176
CPUReadMemoryFunc **mem_read;
180
idx = MMIO_IDX(addr - mmio->base);
181
#if defined(DEBUG_MMIO)
182
printf("%s: mmio %p len %d addr " PADDRX " idx %d\n", __func__,
183
mmio, len, addr, idx);
185
mem_read = mmio->mem_read[idx];
186
ret = (*mem_read[len])(mmio->opaque[idx], addr - mmio->base);
191
static void mmio_writelen (ppc4xx_mmio_t *mmio,
192
target_phys_addr_t addr, uint32_t value, int len)
194
CPUWriteMemoryFunc **mem_write;
197
idx = MMIO_IDX(addr - mmio->base);
198
#if defined(DEBUG_MMIO)
199
printf("%s: mmio %p len %d addr " PADDRX " idx %d value %08x\n", __func__,
200
mmio, len, addr, idx, value);
202
mem_write = mmio->mem_write[idx];
203
(*mem_write[len])(mmio->opaque[idx], addr - mmio->base, value);
206
static uint32_t mmio_readb (void *opaque, target_phys_addr_t addr)
208
#if defined(DEBUG_MMIO)
209
printf("%s: addr " PADDRX "\n", __func__, addr);
212
return mmio_readlen(opaque, addr, 0);
215
static void mmio_writeb (void *opaque,
216
target_phys_addr_t addr, uint32_t value)
218
#if defined(DEBUG_MMIO)
219
printf("%s: addr " PADDRX " val %08x\n", __func__, addr, value);
221
mmio_writelen(opaque, addr, value, 0);
224
static uint32_t mmio_readw (void *opaque, target_phys_addr_t addr)
226
#if defined(DEBUG_MMIO)
227
printf("%s: addr " PADDRX "\n", __func__, addr);
230
return mmio_readlen(opaque, addr, 1);
233
static void mmio_writew (void *opaque,
234
target_phys_addr_t addr, uint32_t value)
236
#if defined(DEBUG_MMIO)
237
printf("%s: addr " PADDRX " val %08x\n", __func__, addr, value);
239
mmio_writelen(opaque, addr, value, 1);
242
static uint32_t mmio_readl (void *opaque, target_phys_addr_t addr)
244
#if defined(DEBUG_MMIO)
245
printf("%s: addr " PADDRX "\n", __func__, addr);
248
return mmio_readlen(opaque, addr, 2);
251
static void mmio_writel (void *opaque,
252
target_phys_addr_t addr, uint32_t value)
254
#if defined(DEBUG_MMIO)
255
printf("%s: addr " PADDRX " val %08x\n", __func__, addr, value);
257
mmio_writelen(opaque, addr, value, 2);
260
static CPUReadMemoryFunc *mmio_read[] = {
266
static CPUWriteMemoryFunc *mmio_write[] = {
272
int ppc4xx_mmio_register (CPUState *env, ppc4xx_mmio_t *mmio,
273
target_phys_addr_t offset, uint32_t len,
274
CPUReadMemoryFunc **mem_read,
275
CPUWriteMemoryFunc **mem_write, void *opaque)
280
if ((offset + len) > TARGET_PAGE_SIZE)
282
idx = MMIO_IDX(offset);
283
end = offset + len - 1;
284
eidx = MMIO_IDX(end);
285
#if defined(DEBUG_MMIO)
286
printf("%s: offset %08x len %08x %08x %d %d\n", __func__, offset, len,
289
for (; idx <= eidx; idx++) {
290
mmio->mem_read[idx] = mem_read;
291
mmio->mem_write[idx] = mem_write;
292
mmio->opaque[idx] = opaque;
298
ppc4xx_mmio_t *ppc4xx_mmio_init (CPUState *env, target_phys_addr_t base)
303
mmio = qemu_mallocz(sizeof(ppc4xx_mmio_t));
306
mmio_memory = cpu_register_io_memory(0, mmio_read, mmio_write, mmio);
307
#if defined(DEBUG_MMIO)
308
printf("%s: %p base %08x len %08x %d\n", __func__,
309
mmio, base, TARGET_PAGE_SIZE, mmio_memory);
311
cpu_register_physical_memory(base, TARGET_PAGE_SIZE, mmio_memory);
312
ppc4xx_mmio_register(env, mmio, 0, TARGET_PAGE_SIZE,
313
unassigned_mmio_read, unassigned_mmio_write,
320
/*****************************************************************************/
96
321
/* Peripheral local bus arbitrer */
98
323
PLB0_BESR = 0x084,
399
624
/*****************************************************************************/
625
/* "Universal" Interrupt controller */
639
#define UIC_MAX_IRQ 32
640
typedef struct ppcuic_t ppcuic_t;
644
uint32_t uicsr; /* Status register */
645
uint32_t uicer; /* Enable register */
646
uint32_t uiccr; /* Critical register */
647
uint32_t uicpr; /* Polarity register */
648
uint32_t uictr; /* Triggering register */
649
uint32_t uicvcr; /* Vector configuration register */
654
static void ppcuic_trigger_irq (ppcuic_t *uic)
657
int start, end, inc, i;
659
/* Trigger interrupt if any is pending */
660
ir = uic->uicsr & uic->uicer & (~uic->uiccr);
661
cr = uic->uicsr & uic->uicer & uic->uiccr;
663
if (loglevel & CPU_LOG_INT) {
664
fprintf(logfile, "%s: uicsr %08x uicer %08x uiccr %08x\n"
665
" %08x ir %08x cr %08x\n", __func__,
666
uic->uicsr, uic->uicer, uic->uiccr,
667
uic->uicsr & uic->uicer, ir, cr);
670
if (ir != 0x0000000) {
672
if (loglevel & CPU_LOG_INT) {
673
fprintf(logfile, "Raise UIC interrupt\n");
676
qemu_irq_raise(uic->irqs[PPCUIC_OUTPUT_INT]);
679
if (loglevel & CPU_LOG_INT) {
680
fprintf(logfile, "Lower UIC interrupt\n");
683
qemu_irq_lower(uic->irqs[PPCUIC_OUTPUT_INT]);
685
/* Trigger critical interrupt if any is pending and update vector */
686
if (cr != 0x0000000) {
687
qemu_irq_raise(uic->irqs[PPCUIC_OUTPUT_CINT]);
688
if (uic->use_vectors) {
689
/* Compute critical IRQ vector */
690
if (uic->uicvcr & 1) {
699
uic->uicvr = uic->uicvcr & 0xFFFFFFFC;
700
for (i = start; i <= end; i += inc) {
702
uic->uicvr += (i - start) * 512 * inc;
708
if (loglevel & CPU_LOG_INT) {
709
fprintf(logfile, "Raise UIC critical interrupt - vector %08x\n",
715
if (loglevel & CPU_LOG_INT) {
716
fprintf(logfile, "Lower UIC critical interrupt\n");
719
qemu_irq_lower(uic->irqs[PPCUIC_OUTPUT_CINT]);
720
uic->uicvr = 0x00000000;
724
static void ppcuic_set_irq (void *opaque, int irq_num, int level)
732
if (loglevel & CPU_LOG_INT) {
733
fprintf(logfile, "%s: irq %d level %d uicsr %08x mask %08x => %08x "
734
"%08x\n", __func__, irq_num, level,
735
uic->uicsr, mask, uic->uicsr & mask, level << irq_num);
738
if (irq_num < 0 || irq_num > 31)
741
if (!(uic->uicpr & mask)) {
742
/* Negatively asserted IRQ */
743
level = level == 0 ? 1 : 0;
745
/* Update status register */
746
if (uic->uictr & mask) {
747
/* Edge sensitive interrupt */
751
/* Level sensitive interrupt */
758
if (loglevel & CPU_LOG_INT) {
759
fprintf(logfile, "%s: irq %d level %d sr %08x => %08x\n", __func__,
760
irq_num, level, uic->uicsr, sr);
763
if (sr != uic->uicsr)
764
ppcuic_trigger_irq(uic);
767
static target_ulong dcr_read_uic (void *opaque, int dcrn)
773
dcrn -= uic->dcr_base;
792
ret = uic->uicsr & uic->uicer;
795
if (!uic->use_vectors)
800
if (!uic->use_vectors)
813
static void dcr_write_uic (void *opaque, int dcrn, target_ulong val)
818
dcrn -= uic->dcr_base;
820
if (loglevel & CPU_LOG_INT) {
821
fprintf(logfile, "%s: dcr %d val " ADDRX "\n", __func__, dcrn, val);
827
ppcuic_trigger_irq(uic);
831
ppcuic_trigger_irq(uic);
835
ppcuic_trigger_irq(uic);
839
ppcuic_trigger_irq(uic);
843
ppcuic_trigger_irq(uic);
847
ppcuic_trigger_irq(uic);
854
uic->uicvcr = val & 0xFFFFFFFD;
855
ppcuic_trigger_irq(uic);
860
static void ppcuic_reset (void *opaque)
865
uic->uiccr = 0x00000000;
866
uic->uicer = 0x00000000;
867
uic->uicpr = 0x00000000;
868
uic->uicsr = 0x00000000;
869
uic->uictr = 0x00000000;
870
if (uic->use_vectors) {
871
uic->uicvcr = 0x00000000;
872
uic->uicvr = 0x0000000;
876
qemu_irq *ppcuic_init (CPUState *env, qemu_irq *irqs,
877
uint32_t dcr_base, int has_ssr, int has_vr)
882
uic = qemu_mallocz(sizeof(ppcuic_t));
884
uic->dcr_base = dcr_base;
887
uic->use_vectors = 1;
888
for (i = 0; i < DCR_UICMAX; i++) {
889
ppc_dcr_register(env, dcr_base + i, uic,
890
&dcr_read_uic, &dcr_write_uic);
892
qemu_register_reset(ppcuic_reset, uic);
896
return qemu_allocate_irqs(&ppcuic_set_irq, uic, UIC_MAX_IRQ);
899
/*****************************************************************************/
400
900
/* Code decompression controller */
2585
3070
ppc405_dma_init(env, dma_irqs);
2586
3071
/* Serial ports */
2587
3072
if (serial_hds[0] != NULL) {
2588
ppc405_serial_init(env, mmio, 0x300, pic[0], serial_hds[0]);
3073
ppc405_serial_init(env, mmio, 0x300, pic[31], serial_hds[0]);
2590
3075
if (serial_hds[1] != NULL) {
2591
ppc405_serial_init(env, mmio, 0x400, pic[1], serial_hds[1]);
3076
ppc405_serial_init(env, mmio, 0x400, pic[30], serial_hds[1]);
2593
3078
/* IIC controller */
2594
ppc405_i2c_init(env, mmio, 0x500, pic[2]);
3079
ppc405_i2c_init(env, mmio, 0x500, pic[29]);
2596
3081
ppc405_gpio_init(env, mmio, 0x700);
2597
3082
/* CPU control */
2691
3172
/* Now, compute all other clocks */
2692
3173
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);
3175
// printf("CCDV %01x %d\n", (cpc->pllmr[0] >> 20) & 0x3, D);
2696
3177
CPU_clk = PLL_out / D;
2697
3178
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);
3180
// printf("CBDV %01x %d\n", (cpc->pllmr[0] >> 16) & 0x3, D);
2701
3182
PLB_clk = CPU_clk / D;
2702
3183
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);
3185
// printf("OPDV %01x %d\n", (cpc->pllmr[0] >> 12) & 0x3, D);
2706
3187
OPB_clk = PLB_clk / D;
2707
3188
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);
3190
// printf("EPDV %01x %d\n", (cpc->pllmr[0] >> 8) & 0x3, D);
2711
3192
EBC_clk = PLB_clk / D;
2712
3193
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);
3195
// printf("MPDV %01x %d\n", (cpc->pllmr[0] >> 4) & 0x3, D);
2716
3197
MAL_clk = PLB_clk / D;
2717
3198
D = (cpc->pllmr[0] & 0x3) + 1; /* PPDV */
2718
#ifdef DEBUG_CLOCKS_LL
2719
printf("PPDV %01" PRIx32 " %d\n", cpc->pllmr[0] & 0x3, D);
3200
// printf("PPDV %01x %d\n", cpc->pllmr[0] & 0x3, D);
2721
3202
PCI_clk = PLB_clk / D;
2722
3203
D = ((cpc->ucr - 1) & 0x7F) + 1; /* U0DIV */
2723
#ifdef DEBUG_CLOCKS_LL
2724
printf("U0DIV %01" PRIx32 " %d\n", cpc->ucr & 0x7F, D);
3205
// printf("U0DIV %01x %d\n", cpc->ucr & 0x7F, D);
2726
3207
UART0_clk = PLL_out / D;
2727
3208
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);
3210
// printf("U1DIV %01x %d\n", (cpc->ucr >> 8) & 0x7F, D);
2731
3212
UART1_clk = PLL_out / D;
2732
3213
#ifdef DEBUG_CLOCKS
2733
printf("Setup PPC405EP clocks - sysclk %" PRIu32 " VCO %" PRIu64
3214
printf("Setup PPC405EP clocks - sysclk %d VCO %" PRIu64
2734
3215
" 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",
3216
printf("CPU %d PLB %d OPB %d EBC %d MAL %d PCI %d UART0 %d UART1 %d\n",
2738
3217
CPU_clk, PLB_clk, OPB_clk, EBC_clk, MAL_clk, PCI_clk,
2739
3218
UART0_clk, UART1_clk);
3219
printf("CB %p opaque %p\n", cpc->clk_setup[PPC405EP_CPU_CLK].cb,
3220
cpc->clk_setup[PPC405EP_CPU_CLK].opaque);
2741
3222
/* Setup CPU clocks */
2742
3223
clk_setup(&cpc->clk_setup[PPC405EP_CPU_CLK], CPU_clk);
2922
3403
/* Universal interrupt controller */
2923
3404
irqs = qemu_mallocz(sizeof(qemu_irq) * PPCUIC_OUTPUT_NB);
2924
3405
irqs[PPCUIC_OUTPUT_INT] =
2925
((qemu_irq *)env->irq_inputs)[PPC40x_INPUT_INT];
3406
((qemu_irq *)env->irq_inputs)[PPC405_INPUT_INT];
2926
3407
irqs[PPCUIC_OUTPUT_CINT] =
2927
((qemu_irq *)env->irq_inputs)[PPC40x_INPUT_CINT];
3408
((qemu_irq *)env->irq_inputs)[PPC405_INPUT_CINT];
2928
3409
pic = ppcuic_init(env, irqs, 0x0C0, 0, 1);
2930
3411
/* SDRAM controller */
2931
/* XXX 405EP has no ECC interrupt */
2932
ppc405_sdram_init(env, pic[17], 2, ram_bases, ram_sizes, do_init);
3412
ppc405_sdram_init(env, pic[14], 2, ram_bases, ram_sizes, do_init);
2934
3414
for (i = 0; i < 2; i++)
2935
3415
offset += ram_sizes[i];
2936
3416
/* External bus controller */
2937
3417
ppc405_ebc_init(env);
2938
3418
/* 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];
3419
dma_irqs[0] = pic[26];
3420
dma_irqs[1] = pic[25];
3421
dma_irqs[2] = pic[24];
3422
dma_irqs[3] = pic[23];
2943
3423
ppc405_dma_init(env, dma_irqs);
2944
3424
/* IIC controller */
2945
ppc405_i2c_init(env, mmio, 0x500, pic[2]);
3425
ppc405_i2c_init(env, mmio, 0x500, pic[29]);
2947
3427
ppc405_gpio_init(env, mmio, 0x700);
2948
3428
/* Serial ports */
2949
3429
if (serial_hds[0] != NULL) {
2950
ppc405_serial_init(env, mmio, 0x300, pic[0], serial_hds[0]);
3430
ppc405_serial_init(env, mmio, 0x300, pic[31], serial_hds[0]);
2952
3432
if (serial_hds[1] != NULL) {
2953
ppc405_serial_init(env, mmio, 0x400, pic[1], serial_hds[1]);
3433
ppc405_serial_init(env, mmio, 0x400, pic[30], serial_hds[1]);
2956
3436
ppc405_ocm_init(env, ram_sizes[0] + ram_sizes[1]);
2957
3437
offset += 4096;
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];
3439
gpt_irqs[0] = pic[12];
3440
gpt_irqs[1] = pic[11];
3441
gpt_irqs[2] = pic[10];
3442
gpt_irqs[3] = pic[9];
3443
gpt_irqs[4] = pic[8];
2964
3444
ppc4xx_gpt_init(env, mmio, 0x000, gpt_irqs);
2966
/* Uses pic[3], pic[16], pic[18] */
3446
/* Uses pic[28], pic[15], pic[13] */
2968
mal_irqs[0] = pic[11];
2969
mal_irqs[1] = pic[12];
2970
mal_irqs[2] = pic[13];
2971
mal_irqs[3] = pic[14];
3448
mal_irqs[0] = pic[20];
3449
mal_irqs[1] = pic[19];
3450
mal_irqs[2] = pic[18];
3451
mal_irqs[3] = pic[17];
2972
3452
ppc405_mal_init(env, mal_irqs);
2974
/* Uses pic[9], pic[15], pic[17] */
3454
/* Uses pic[22], pic[16], pic[14] */
2975
3455
/* CPU control */
2976
3456
ppc405ep_cpc_init(env, clk_setup, sysclk);
2977
3457
*offsetp = offset;