xref: /qemu/hw/ppc/ppc440_uc.c (revision 75ac231c)
1 /*
2  * QEMU PowerPC 440 embedded processors emulation
3  *
4  * Copyright (c) 2012 François Revol
5  * Copyright (c) 2016-2019 BALATON Zoltan
6  *
7  * This work is licensed under the GNU GPL license version 2 or later.
8  *
9  */
10 
11 #include "qemu/osdep.h"
12 #include "qemu/units.h"
13 #include "qapi/error.h"
14 #include "qemu/log.h"
15 #include "hw/irq.h"
16 #include "hw/ppc/ppc4xx.h"
17 #include "hw/qdev-properties.h"
18 #include "hw/pci/pci.h"
19 #include "sysemu/reset.h"
20 #include "ppc440.h"
21 
22 /*****************************************************************************/
23 /* L2 Cache as SRAM */
24 /* FIXME:fix names */
25 enum {
26     DCR_L2CACHE_BASE  = 0x30,
27     DCR_L2CACHE_CFG   = DCR_L2CACHE_BASE,
28     DCR_L2CACHE_CMD,
29     DCR_L2CACHE_ADDR,
30     DCR_L2CACHE_DATA,
31     DCR_L2CACHE_STAT,
32     DCR_L2CACHE_CVER,
33     DCR_L2CACHE_SNP0,
34     DCR_L2CACHE_SNP1,
35     DCR_L2CACHE_END   = DCR_L2CACHE_SNP1,
36 };
37 
38 /* base is 460ex-specific, cf. U-Boot, ppc4xx-isram.h */
39 enum {
40     DCR_ISRAM0_BASE   = 0x20,
41     DCR_ISRAM0_SB0CR  = DCR_ISRAM0_BASE,
42     DCR_ISRAM0_SB1CR,
43     DCR_ISRAM0_SB2CR,
44     DCR_ISRAM0_SB3CR,
45     DCR_ISRAM0_BEAR,
46     DCR_ISRAM0_BESR0,
47     DCR_ISRAM0_BESR1,
48     DCR_ISRAM0_PMEG,
49     DCR_ISRAM0_CID,
50     DCR_ISRAM0_REVID,
51     DCR_ISRAM0_DPC,
52     DCR_ISRAM0_END    = DCR_ISRAM0_DPC
53 };
54 
55 enum {
56     DCR_ISRAM1_BASE   = 0xb0,
57     DCR_ISRAM1_SB0CR  = DCR_ISRAM1_BASE,
58     /* single bank */
59     DCR_ISRAM1_BEAR   = DCR_ISRAM1_BASE + 0x04,
60     DCR_ISRAM1_BESR0,
61     DCR_ISRAM1_BESR1,
62     DCR_ISRAM1_PMEG,
63     DCR_ISRAM1_CID,
64     DCR_ISRAM1_REVID,
65     DCR_ISRAM1_DPC,
66     DCR_ISRAM1_END    = DCR_ISRAM1_DPC
67 };
68 
69 typedef struct ppc4xx_l2sram_t {
70     MemoryRegion bank[4];
71     uint32_t l2cache[8];
72     uint32_t isram0[11];
73 } ppc4xx_l2sram_t;
74 
75 #ifdef MAP_L2SRAM
76 static void l2sram_update_mappings(ppc4xx_l2sram_t *l2sram,
77                                    uint32_t isarc, uint32_t isacntl,
78                                    uint32_t dsarc, uint32_t dsacntl)
79 {
80     if (l2sram->isarc != isarc ||
81         (l2sram->isacntl & 0x80000000) != (isacntl & 0x80000000)) {
82         if (l2sram->isacntl & 0x80000000) {
83             /* Unmap previously assigned memory region */
84             memory_region_del_subregion(get_system_memory(),
85                                         &l2sram->isarc_ram);
86         }
87         if (isacntl & 0x80000000) {
88             /* Map new instruction memory region */
89             memory_region_add_subregion(get_system_memory(), isarc,
90                                         &l2sram->isarc_ram);
91         }
92     }
93     if (l2sram->dsarc != dsarc ||
94         (l2sram->dsacntl & 0x80000000) != (dsacntl & 0x80000000)) {
95         if (l2sram->dsacntl & 0x80000000) {
96             /* Beware not to unmap the region we just mapped */
97             if (!(isacntl & 0x80000000) || l2sram->dsarc != isarc) {
98                 /* Unmap previously assigned memory region */
99                 memory_region_del_subregion(get_system_memory(),
100                                             &l2sram->dsarc_ram);
101             }
102         }
103         if (dsacntl & 0x80000000) {
104             /* Beware not to remap the region we just mapped */
105             if (!(isacntl & 0x80000000) || dsarc != isarc) {
106                 /* Map new data memory region */
107                 memory_region_add_subregion(get_system_memory(), dsarc,
108                                             &l2sram->dsarc_ram);
109             }
110         }
111     }
112 }
113 #endif
114 
115 static uint32_t dcr_read_l2sram(void *opaque, int dcrn)
116 {
117     ppc4xx_l2sram_t *l2sram = opaque;
118     uint32_t ret = 0;
119 
120     switch (dcrn) {
121     case DCR_L2CACHE_CFG:
122     case DCR_L2CACHE_CMD:
123     case DCR_L2CACHE_ADDR:
124     case DCR_L2CACHE_DATA:
125     case DCR_L2CACHE_STAT:
126     case DCR_L2CACHE_CVER:
127     case DCR_L2CACHE_SNP0:
128     case DCR_L2CACHE_SNP1:
129         ret = l2sram->l2cache[dcrn - DCR_L2CACHE_BASE];
130         break;
131 
132     case DCR_ISRAM0_SB0CR:
133     case DCR_ISRAM0_SB1CR:
134     case DCR_ISRAM0_SB2CR:
135     case DCR_ISRAM0_SB3CR:
136     case DCR_ISRAM0_BEAR:
137     case DCR_ISRAM0_BESR0:
138     case DCR_ISRAM0_BESR1:
139     case DCR_ISRAM0_PMEG:
140     case DCR_ISRAM0_CID:
141     case DCR_ISRAM0_REVID:
142     case DCR_ISRAM0_DPC:
143         ret = l2sram->isram0[dcrn - DCR_ISRAM0_BASE];
144         break;
145 
146     default:
147         break;
148     }
149 
150     return ret;
151 }
152 
153 static void dcr_write_l2sram(void *opaque, int dcrn, uint32_t val)
154 {
155     /*ppc4xx_l2sram_t *l2sram = opaque;*/
156     /* FIXME: Actually handle L2 cache mapping */
157 
158     switch (dcrn) {
159     case DCR_L2CACHE_CFG:
160     case DCR_L2CACHE_CMD:
161     case DCR_L2CACHE_ADDR:
162     case DCR_L2CACHE_DATA:
163     case DCR_L2CACHE_STAT:
164     case DCR_L2CACHE_CVER:
165     case DCR_L2CACHE_SNP0:
166     case DCR_L2CACHE_SNP1:
167         /*l2sram->l2cache[dcrn - DCR_L2CACHE_BASE] = val;*/
168         break;
169 
170     case DCR_ISRAM0_SB0CR:
171     case DCR_ISRAM0_SB1CR:
172     case DCR_ISRAM0_SB2CR:
173     case DCR_ISRAM0_SB3CR:
174     case DCR_ISRAM0_BEAR:
175     case DCR_ISRAM0_BESR0:
176     case DCR_ISRAM0_BESR1:
177     case DCR_ISRAM0_PMEG:
178     case DCR_ISRAM0_CID:
179     case DCR_ISRAM0_REVID:
180     case DCR_ISRAM0_DPC:
181         /*l2sram->isram0[dcrn - DCR_L2CACHE_BASE] = val;*/
182         break;
183 
184     case DCR_ISRAM1_SB0CR:
185     case DCR_ISRAM1_BEAR:
186     case DCR_ISRAM1_BESR0:
187     case DCR_ISRAM1_BESR1:
188     case DCR_ISRAM1_PMEG:
189     case DCR_ISRAM1_CID:
190     case DCR_ISRAM1_REVID:
191     case DCR_ISRAM1_DPC:
192         /*l2sram->isram1[dcrn - DCR_L2CACHE_BASE] = val;*/
193         break;
194     }
195     /*l2sram_update_mappings(l2sram, isarc, isacntl, dsarc, dsacntl);*/
196 }
197 
198 static void l2sram_reset(void *opaque)
199 {
200     ppc4xx_l2sram_t *l2sram = opaque;
201 
202     memset(l2sram->l2cache, 0, sizeof(l2sram->l2cache));
203     l2sram->l2cache[DCR_L2CACHE_STAT - DCR_L2CACHE_BASE] = 0x80000000;
204     memset(l2sram->isram0, 0, sizeof(l2sram->isram0));
205     /*l2sram_update_mappings(l2sram, isarc, isacntl, dsarc, dsacntl);*/
206 }
207 
208 void ppc4xx_l2sram_init(CPUPPCState *env)
209 {
210     ppc4xx_l2sram_t *l2sram;
211 
212     l2sram = g_malloc0(sizeof(*l2sram));
213     /* XXX: Size is 4*64kB for 460ex, cf. U-Boot, ppc4xx-isram.h */
214     memory_region_init_ram(&l2sram->bank[0], NULL, "ppc4xx.l2sram_bank0",
215                            64 * KiB, &error_abort);
216     memory_region_init_ram(&l2sram->bank[1], NULL, "ppc4xx.l2sram_bank1",
217                            64 * KiB, &error_abort);
218     memory_region_init_ram(&l2sram->bank[2], NULL, "ppc4xx.l2sram_bank2",
219                            64 * KiB, &error_abort);
220     memory_region_init_ram(&l2sram->bank[3], NULL, "ppc4xx.l2sram_bank3",
221                            64 * KiB, &error_abort);
222     qemu_register_reset(&l2sram_reset, l2sram);
223     ppc_dcr_register(env, DCR_L2CACHE_CFG,
224                      l2sram, &dcr_read_l2sram, &dcr_write_l2sram);
225     ppc_dcr_register(env, DCR_L2CACHE_CMD,
226                      l2sram, &dcr_read_l2sram, &dcr_write_l2sram);
227     ppc_dcr_register(env, DCR_L2CACHE_ADDR,
228                      l2sram, &dcr_read_l2sram, &dcr_write_l2sram);
229     ppc_dcr_register(env, DCR_L2CACHE_DATA,
230                      l2sram, &dcr_read_l2sram, &dcr_write_l2sram);
231     ppc_dcr_register(env, DCR_L2CACHE_STAT,
232                      l2sram, &dcr_read_l2sram, &dcr_write_l2sram);
233     ppc_dcr_register(env, DCR_L2CACHE_CVER,
234                      l2sram, &dcr_read_l2sram, &dcr_write_l2sram);
235     ppc_dcr_register(env, DCR_L2CACHE_SNP0,
236                      l2sram, &dcr_read_l2sram, &dcr_write_l2sram);
237     ppc_dcr_register(env, DCR_L2CACHE_SNP1,
238                      l2sram, &dcr_read_l2sram, &dcr_write_l2sram);
239 
240     ppc_dcr_register(env, DCR_ISRAM0_SB0CR,
241                      l2sram, &dcr_read_l2sram, &dcr_write_l2sram);
242     ppc_dcr_register(env, DCR_ISRAM0_SB1CR,
243                      l2sram, &dcr_read_l2sram, &dcr_write_l2sram);
244     ppc_dcr_register(env, DCR_ISRAM0_SB2CR,
245                      l2sram, &dcr_read_l2sram, &dcr_write_l2sram);
246     ppc_dcr_register(env, DCR_ISRAM0_SB3CR,
247                      l2sram, &dcr_read_l2sram, &dcr_write_l2sram);
248     ppc_dcr_register(env, DCR_ISRAM0_PMEG,
249                      l2sram, &dcr_read_l2sram, &dcr_write_l2sram);
250     ppc_dcr_register(env, DCR_ISRAM0_DPC,
251                      l2sram, &dcr_read_l2sram, &dcr_write_l2sram);
252 
253     ppc_dcr_register(env, DCR_ISRAM1_SB0CR,
254                      l2sram, &dcr_read_l2sram, &dcr_write_l2sram);
255     ppc_dcr_register(env, DCR_ISRAM1_PMEG,
256                      l2sram, &dcr_read_l2sram, &dcr_write_l2sram);
257     ppc_dcr_register(env, DCR_ISRAM1_DPC,
258                      l2sram, &dcr_read_l2sram, &dcr_write_l2sram);
259 }
260 
261 /*****************************************************************************/
262 /* Clocking Power on Reset */
263 enum {
264     CPR0_CFGADDR = 0xC,
265     CPR0_CFGDATA = 0xD,
266 
267     CPR0_PLLD = 0x060,
268     CPR0_PLBED = 0x080,
269     CPR0_OPBD = 0x0C0,
270     CPR0_PERD = 0x0E0,
271     CPR0_AHBD = 0x100,
272 };
273 
274 typedef struct ppc4xx_cpr_t {
275     uint32_t addr;
276 } ppc4xx_cpr_t;
277 
278 static uint32_t dcr_read_cpr(void *opaque, int dcrn)
279 {
280     ppc4xx_cpr_t *cpr = opaque;
281     uint32_t ret = 0;
282 
283     switch (dcrn) {
284     case CPR0_CFGADDR:
285         ret = cpr->addr;
286         break;
287     case CPR0_CFGDATA:
288         switch (cpr->addr) {
289         case CPR0_PLLD:
290             ret = (0xb5 << 24) | (1 << 16) | (9 << 8);
291             break;
292         case CPR0_PLBED:
293             ret = (5 << 24);
294             break;
295         case CPR0_OPBD:
296             ret = (2 << 24);
297             break;
298         case CPR0_PERD:
299         case CPR0_AHBD:
300             ret = (1 << 24);
301             break;
302         default:
303             break;
304         }
305         break;
306     default:
307         break;
308     }
309 
310     return ret;
311 }
312 
313 static void dcr_write_cpr(void *opaque, int dcrn, uint32_t val)
314 {
315     ppc4xx_cpr_t *cpr = opaque;
316 
317     switch (dcrn) {
318     case CPR0_CFGADDR:
319         cpr->addr = val;
320         break;
321     case CPR0_CFGDATA:
322         break;
323     default:
324         break;
325     }
326 }
327 
328 static void ppc4xx_cpr_reset(void *opaque)
329 {
330     ppc4xx_cpr_t *cpr = opaque;
331 
332     cpr->addr = 0;
333 }
334 
335 void ppc4xx_cpr_init(CPUPPCState *env)
336 {
337     ppc4xx_cpr_t *cpr;
338 
339     cpr = g_malloc0(sizeof(*cpr));
340     ppc_dcr_register(env, CPR0_CFGADDR, cpr, &dcr_read_cpr, &dcr_write_cpr);
341     ppc_dcr_register(env, CPR0_CFGDATA, cpr, &dcr_read_cpr, &dcr_write_cpr);
342     qemu_register_reset(ppc4xx_cpr_reset, cpr);
343 }
344 
345 /*****************************************************************************/
346 /* System DCRs */
347 typedef struct ppc4xx_sdr_t ppc4xx_sdr_t;
348 struct ppc4xx_sdr_t {
349     uint32_t addr;
350 };
351 
352 enum {
353     SDR0_CFGADDR = 0x00e,
354     SDR0_CFGDATA,
355     SDR0_STRP0 = 0x020,
356     SDR0_STRP1,
357     SDR0_102 = 0x66,
358     SDR0_103,
359     SDR0_128 = 0x80,
360     SDR0_ECID3 = 0x083,
361     SDR0_DDR0 = 0x0e1,
362     SDR0_USB0 = 0x320,
363 };
364 
365 enum {
366     PESDR0_LOOP = 0x303,
367     PESDR0_RCSSET,
368     PESDR0_RCSSTS,
369     PESDR0_RSTSTA = 0x310,
370     PESDR1_LOOP = 0x343,
371     PESDR1_RCSSET,
372     PESDR1_RCSSTS,
373     PESDR1_RSTSTA = 0x365,
374 };
375 
376 static uint32_t dcr_read_sdr(void *opaque, int dcrn)
377 {
378     ppc4xx_sdr_t *sdr = opaque;
379     uint32_t ret = 0;
380 
381     switch (dcrn) {
382     case SDR0_CFGADDR:
383         ret = sdr->addr;
384         break;
385     case SDR0_CFGDATA:
386         switch (sdr->addr) {
387         case SDR0_STRP0:
388             ret = (0xb5 << 8) | (1 << 4) | 9;
389             break;
390         case SDR0_STRP1:
391             ret = (5 << 29) | (2 << 26) | (1 << 24);
392             break;
393         case SDR0_ECID3:
394             ret = 1 << 20; /* No Security/Kasumi support */
395             break;
396         case SDR0_DDR0:
397             ret = SDR0_DDR0_DDRM_ENCODE(1) | SDR0_DDR0_DDRM_DDR1;
398             break;
399         case PESDR0_RCSSET:
400         case PESDR1_RCSSET:
401             ret = (1 << 24) | (1 << 16);
402             break;
403         case PESDR0_RCSSTS:
404         case PESDR1_RCSSTS:
405             ret = (1 << 16) | (1 << 12);
406             break;
407         case PESDR0_RSTSTA:
408         case PESDR1_RSTSTA:
409             ret = 1;
410             break;
411         case PESDR0_LOOP:
412         case PESDR1_LOOP:
413             ret = 1 << 12;
414             break;
415         default:
416             break;
417         }
418         break;
419     default:
420         break;
421     }
422 
423     return ret;
424 }
425 
426 static void dcr_write_sdr(void *opaque, int dcrn, uint32_t val)
427 {
428     ppc4xx_sdr_t *sdr = opaque;
429 
430     switch (dcrn) {
431     case SDR0_CFGADDR:
432         sdr->addr = val;
433         break;
434     case SDR0_CFGDATA:
435         switch (sdr->addr) {
436         case 0x00: /* B0CR */
437             break;
438         default:
439             break;
440         }
441         break;
442     default:
443         break;
444     }
445 }
446 
447 static void sdr_reset(void *opaque)
448 {
449     ppc4xx_sdr_t *sdr = opaque;
450 
451     sdr->addr = 0;
452 }
453 
454 void ppc4xx_sdr_init(CPUPPCState *env)
455 {
456     ppc4xx_sdr_t *sdr;
457 
458     sdr = g_malloc0(sizeof(*sdr));
459     qemu_register_reset(&sdr_reset, sdr);
460     ppc_dcr_register(env, SDR0_CFGADDR,
461                      sdr, &dcr_read_sdr, &dcr_write_sdr);
462     ppc_dcr_register(env, SDR0_CFGDATA,
463                      sdr, &dcr_read_sdr, &dcr_write_sdr);
464     ppc_dcr_register(env, SDR0_102,
465                      sdr, &dcr_read_sdr, &dcr_write_sdr);
466     ppc_dcr_register(env, SDR0_103,
467                      sdr, &dcr_read_sdr, &dcr_write_sdr);
468     ppc_dcr_register(env, SDR0_128,
469                      sdr, &dcr_read_sdr, &dcr_write_sdr);
470     ppc_dcr_register(env, SDR0_USB0,
471                      sdr, &dcr_read_sdr, &dcr_write_sdr);
472 }
473 
474 /*****************************************************************************/
475 /* PLB to AHB bridge */
476 enum {
477     AHB_TOP    = 0xA4,
478     AHB_BOT    = 0xA5,
479 };
480 
481 typedef struct ppc4xx_ahb_t {
482     uint32_t top;
483     uint32_t bot;
484 } ppc4xx_ahb_t;
485 
486 static uint32_t dcr_read_ahb(void *opaque, int dcrn)
487 {
488     ppc4xx_ahb_t *ahb = opaque;
489     uint32_t ret = 0;
490 
491     switch (dcrn) {
492     case AHB_TOP:
493         ret = ahb->top;
494         break;
495     case AHB_BOT:
496         ret = ahb->bot;
497         break;
498     default:
499         break;
500     }
501 
502     return ret;
503 }
504 
505 static void dcr_write_ahb(void *opaque, int dcrn, uint32_t val)
506 {
507     ppc4xx_ahb_t *ahb = opaque;
508 
509     switch (dcrn) {
510     case AHB_TOP:
511         ahb->top = val;
512         break;
513     case AHB_BOT:
514         ahb->bot = val;
515         break;
516     }
517 }
518 
519 static void ppc4xx_ahb_reset(void *opaque)
520 {
521     ppc4xx_ahb_t *ahb = opaque;
522 
523     /* No error */
524     ahb->top = 0;
525     ahb->bot = 0;
526 }
527 
528 void ppc4xx_ahb_init(CPUPPCState *env)
529 {
530     ppc4xx_ahb_t *ahb;
531 
532     ahb = g_malloc0(sizeof(*ahb));
533     ppc_dcr_register(env, AHB_TOP, ahb, &dcr_read_ahb, &dcr_write_ahb);
534     ppc_dcr_register(env, AHB_BOT, ahb, &dcr_read_ahb, &dcr_write_ahb);
535     qemu_register_reset(ppc4xx_ahb_reset, ahb);
536 }
537 
538 /*****************************************************************************/
539 /* DMA controller */
540 
541 #define DMA0_CR_CE  (1 << 31)
542 #define DMA0_CR_PW  (1 << 26 | 1 << 25)
543 #define DMA0_CR_DAI (1 << 24)
544 #define DMA0_CR_SAI (1 << 23)
545 #define DMA0_CR_DEC (1 << 2)
546 
547 enum {
548     DMA0_CR  = 0x00,
549     DMA0_CT,
550     DMA0_SAH,
551     DMA0_SAL,
552     DMA0_DAH,
553     DMA0_DAL,
554     DMA0_SGH,
555     DMA0_SGL,
556 
557     DMA0_SR  = 0x20,
558     DMA0_SGC = 0x23,
559     DMA0_SLP = 0x25,
560     DMA0_POL = 0x26,
561 };
562 
563 typedef struct {
564     uint32_t cr;
565     uint32_t ct;
566     uint64_t sa;
567     uint64_t da;
568     uint64_t sg;
569 } PPC4xxDmaChnl;
570 
571 typedef struct {
572     int base;
573     PPC4xxDmaChnl ch[4];
574     uint32_t sr;
575 } PPC4xxDmaState;
576 
577 static uint32_t dcr_read_dma(void *opaque, int dcrn)
578 {
579     PPC4xxDmaState *dma = opaque;
580     uint32_t val = 0;
581     int addr = dcrn - dma->base;
582     int chnl = addr / 8;
583 
584     switch (addr) {
585     case 0x00 ... 0x1f:
586         switch (addr % 8) {
587         case DMA0_CR:
588             val = dma->ch[chnl].cr;
589             break;
590         case DMA0_CT:
591             val = dma->ch[chnl].ct;
592             break;
593         case DMA0_SAH:
594             val = dma->ch[chnl].sa >> 32;
595             break;
596         case DMA0_SAL:
597             val = dma->ch[chnl].sa;
598             break;
599         case DMA0_DAH:
600             val = dma->ch[chnl].da >> 32;
601             break;
602         case DMA0_DAL:
603             val = dma->ch[chnl].da;
604             break;
605         case DMA0_SGH:
606             val = dma->ch[chnl].sg >> 32;
607             break;
608         case DMA0_SGL:
609             val = dma->ch[chnl].sg;
610             break;
611         }
612         break;
613     case DMA0_SR:
614         val = dma->sr;
615         break;
616     default:
617         qemu_log_mask(LOG_UNIMP, "%s: unimplemented register %x (%d, %x)\n",
618                       __func__, dcrn, chnl, addr);
619     }
620 
621     return val;
622 }
623 
624 static void dcr_write_dma(void *opaque, int dcrn, uint32_t val)
625 {
626     PPC4xxDmaState *dma = opaque;
627     int addr = dcrn - dma->base;
628     int chnl = addr / 8;
629 
630     switch (addr) {
631     case 0x00 ... 0x1f:
632         switch (addr % 8) {
633         case DMA0_CR:
634             dma->ch[chnl].cr = val;
635             if (val & DMA0_CR_CE) {
636                 int count = dma->ch[chnl].ct & 0xffff;
637 
638                 if (count) {
639                     int width, i, sidx, didx;
640                     uint8_t *rptr, *wptr;
641                     hwaddr rlen, wlen;
642                     hwaddr xferlen;
643 
644                     sidx = didx = 0;
645                     width = 1 << ((val & DMA0_CR_PW) >> 25);
646                     xferlen = count * width;
647                     wlen = rlen = xferlen;
648                     rptr = cpu_physical_memory_map(dma->ch[chnl].sa, &rlen,
649                                                    false);
650                     wptr = cpu_physical_memory_map(dma->ch[chnl].da, &wlen,
651                                                    true);
652                     if (rptr && rlen == xferlen && wptr && wlen == xferlen) {
653                         if (!(val & DMA0_CR_DEC) &&
654                             val & DMA0_CR_SAI && val & DMA0_CR_DAI) {
655                             /* optimise common case */
656                             memmove(wptr, rptr, count * width);
657                             sidx = didx = count * width;
658                         } else {
659                             /* do it the slow way */
660                             for (sidx = didx = i = 0; i < count; i++) {
661                                 uint64_t v = ldn_le_p(rptr + sidx, width);
662                                 stn_le_p(wptr + didx, width, v);
663                                 if (val & DMA0_CR_SAI) {
664                                     sidx += width;
665                                 }
666                                 if (val & DMA0_CR_DAI) {
667                                     didx += width;
668                                 }
669                             }
670                         }
671                     }
672                     if (wptr) {
673                         cpu_physical_memory_unmap(wptr, wlen, 1, didx);
674                     }
675                     if (rptr) {
676                         cpu_physical_memory_unmap(rptr, rlen, 0, sidx);
677                     }
678                 }
679             }
680             break;
681         case DMA0_CT:
682             dma->ch[chnl].ct = val;
683             break;
684         case DMA0_SAH:
685             dma->ch[chnl].sa &= 0xffffffffULL;
686             dma->ch[chnl].sa |= (uint64_t)val << 32;
687             break;
688         case DMA0_SAL:
689             dma->ch[chnl].sa &= 0xffffffff00000000ULL;
690             dma->ch[chnl].sa |= val;
691             break;
692         case DMA0_DAH:
693             dma->ch[chnl].da &= 0xffffffffULL;
694             dma->ch[chnl].da |= (uint64_t)val << 32;
695             break;
696         case DMA0_DAL:
697             dma->ch[chnl].da &= 0xffffffff00000000ULL;
698             dma->ch[chnl].da |= val;
699             break;
700         case DMA0_SGH:
701             dma->ch[chnl].sg &= 0xffffffffULL;
702             dma->ch[chnl].sg |= (uint64_t)val << 32;
703             break;
704         case DMA0_SGL:
705             dma->ch[chnl].sg &= 0xffffffff00000000ULL;
706             dma->ch[chnl].sg |= val;
707             break;
708         }
709         break;
710     case DMA0_SR:
711         dma->sr &= ~val;
712         break;
713     default:
714         qemu_log_mask(LOG_UNIMP, "%s: unimplemented register %x (%d, %x)\n",
715                       __func__, dcrn, chnl, addr);
716     }
717 }
718 
719 static void ppc4xx_dma_reset(void *opaque)
720 {
721     PPC4xxDmaState *dma = opaque;
722     int dma_base = dma->base;
723 
724     memset(dma, 0, sizeof(*dma));
725     dma->base = dma_base;
726 }
727 
728 void ppc4xx_dma_init(CPUPPCState *env, int dcr_base)
729 {
730     PPC4xxDmaState *dma;
731     int i;
732 
733     dma = g_malloc0(sizeof(*dma));
734     dma->base = dcr_base;
735     qemu_register_reset(&ppc4xx_dma_reset, dma);
736     for (i = 0; i < 4; i++) {
737         ppc_dcr_register(env, dcr_base + i * 8 + DMA0_CR,
738                          dma, &dcr_read_dma, &dcr_write_dma);
739         ppc_dcr_register(env, dcr_base + i * 8 + DMA0_CT,
740                          dma, &dcr_read_dma, &dcr_write_dma);
741         ppc_dcr_register(env, dcr_base + i * 8 + DMA0_SAH,
742                          dma, &dcr_read_dma, &dcr_write_dma);
743         ppc_dcr_register(env, dcr_base + i * 8 + DMA0_SAL,
744                          dma, &dcr_read_dma, &dcr_write_dma);
745         ppc_dcr_register(env, dcr_base + i * 8 + DMA0_DAH,
746                          dma, &dcr_read_dma, &dcr_write_dma);
747         ppc_dcr_register(env, dcr_base + i * 8 + DMA0_DAL,
748                          dma, &dcr_read_dma, &dcr_write_dma);
749         ppc_dcr_register(env, dcr_base + i * 8 + DMA0_SGH,
750                          dma, &dcr_read_dma, &dcr_write_dma);
751         ppc_dcr_register(env, dcr_base + i * 8 + DMA0_SGL,
752                          dma, &dcr_read_dma, &dcr_write_dma);
753     }
754     ppc_dcr_register(env, dcr_base + DMA0_SR,
755                      dma, &dcr_read_dma, &dcr_write_dma);
756     ppc_dcr_register(env, dcr_base + DMA0_SGC,
757                      dma, &dcr_read_dma, &dcr_write_dma);
758     ppc_dcr_register(env, dcr_base + DMA0_SLP,
759                      dma, &dcr_read_dma, &dcr_write_dma);
760     ppc_dcr_register(env, dcr_base + DMA0_POL,
761                      dma, &dcr_read_dma, &dcr_write_dma);
762 }
763 
764 /*****************************************************************************/
765 /* PCI Express controller */
766 /*
767  * FIXME: This is not complete and does not work, only implemented partially
768  * to allow firmware and guests to find an empty bus. Cards should use PCI.
769  */
770 #include "hw/pci/pcie_host.h"
771 
772 #define TYPE_PPC460EX_PCIE_HOST "ppc460ex-pcie-host"
773 OBJECT_DECLARE_SIMPLE_TYPE(PPC460EXPCIEState, PPC460EX_PCIE_HOST)
774 
775 struct PPC460EXPCIEState {
776     PCIExpressHost host;
777 
778     MemoryRegion iomem;
779     qemu_irq irq[4];
780     int32_t dcrn_base;
781 
782     uint64_t cfg_base;
783     uint32_t cfg_mask;
784     uint64_t msg_base;
785     uint32_t msg_mask;
786     uint64_t omr1_base;
787     uint64_t omr1_mask;
788     uint64_t omr2_base;
789     uint64_t omr2_mask;
790     uint64_t omr3_base;
791     uint64_t omr3_mask;
792     uint64_t reg_base;
793     uint32_t reg_mask;
794     uint32_t special;
795     uint32_t cfg;
796 };
797 
798 #define DCRN_PCIE0_BASE 0x100
799 #define DCRN_PCIE1_BASE 0x120
800 
801 enum {
802     PEGPL_CFGBAH = 0x0,
803     PEGPL_CFGBAL,
804     PEGPL_CFGMSK,
805     PEGPL_MSGBAH,
806     PEGPL_MSGBAL,
807     PEGPL_MSGMSK,
808     PEGPL_OMR1BAH,
809     PEGPL_OMR1BAL,
810     PEGPL_OMR1MSKH,
811     PEGPL_OMR1MSKL,
812     PEGPL_OMR2BAH,
813     PEGPL_OMR2BAL,
814     PEGPL_OMR2MSKH,
815     PEGPL_OMR2MSKL,
816     PEGPL_OMR3BAH,
817     PEGPL_OMR3BAL,
818     PEGPL_OMR3MSKH,
819     PEGPL_OMR3MSKL,
820     PEGPL_REGBAH,
821     PEGPL_REGBAL,
822     PEGPL_REGMSK,
823     PEGPL_SPECIAL,
824     PEGPL_CFG,
825 };
826 
827 static uint32_t dcr_read_pcie(void *opaque, int dcrn)
828 {
829     PPC460EXPCIEState *state = opaque;
830     uint32_t ret = 0;
831 
832     switch (dcrn - state->dcrn_base) {
833     case PEGPL_CFGBAH:
834         ret = state->cfg_base >> 32;
835         break;
836     case PEGPL_CFGBAL:
837         ret = state->cfg_base;
838         break;
839     case PEGPL_CFGMSK:
840         ret = state->cfg_mask;
841         break;
842     case PEGPL_MSGBAH:
843         ret = state->msg_base >> 32;
844         break;
845     case PEGPL_MSGBAL:
846         ret = state->msg_base;
847         break;
848     case PEGPL_MSGMSK:
849         ret = state->msg_mask;
850         break;
851     case PEGPL_OMR1BAH:
852         ret = state->omr1_base >> 32;
853         break;
854     case PEGPL_OMR1BAL:
855         ret = state->omr1_base;
856         break;
857     case PEGPL_OMR1MSKH:
858         ret = state->omr1_mask >> 32;
859         break;
860     case PEGPL_OMR1MSKL:
861         ret = state->omr1_mask;
862         break;
863     case PEGPL_OMR2BAH:
864         ret = state->omr2_base >> 32;
865         break;
866     case PEGPL_OMR2BAL:
867         ret = state->omr2_base;
868         break;
869     case PEGPL_OMR2MSKH:
870         ret = state->omr2_mask >> 32;
871         break;
872     case PEGPL_OMR2MSKL:
873         ret = state->omr3_mask;
874         break;
875     case PEGPL_OMR3BAH:
876         ret = state->omr3_base >> 32;
877         break;
878     case PEGPL_OMR3BAL:
879         ret = state->omr3_base;
880         break;
881     case PEGPL_OMR3MSKH:
882         ret = state->omr3_mask >> 32;
883         break;
884     case PEGPL_OMR3MSKL:
885         ret = state->omr3_mask;
886         break;
887     case PEGPL_REGBAH:
888         ret = state->reg_base >> 32;
889         break;
890     case PEGPL_REGBAL:
891         ret = state->reg_base;
892         break;
893     case PEGPL_REGMSK:
894         ret = state->reg_mask;
895         break;
896     case PEGPL_SPECIAL:
897         ret = state->special;
898         break;
899     case PEGPL_CFG:
900         ret = state->cfg;
901         break;
902     }
903 
904     return ret;
905 }
906 
907 static void dcr_write_pcie(void *opaque, int dcrn, uint32_t val)
908 {
909     PPC460EXPCIEState *s = opaque;
910     uint64_t size;
911 
912     switch (dcrn - s->dcrn_base) {
913     case PEGPL_CFGBAH:
914         s->cfg_base = ((uint64_t)val << 32) | (s->cfg_base & 0xffffffff);
915         break;
916     case PEGPL_CFGBAL:
917         s->cfg_base = (s->cfg_base & 0xffffffff00000000ULL) | val;
918         break;
919     case PEGPL_CFGMSK:
920         s->cfg_mask = val;
921         size = ~(val & 0xfffffffe) + 1;
922         /*
923          * Firmware sets this register to E0000001. Why we are not sure,
924          * but the current guess is anything above PCIE_MMCFG_SIZE_MAX is
925          * ignored.
926          */
927         if (size > PCIE_MMCFG_SIZE_MAX) {
928             size = PCIE_MMCFG_SIZE_MAX;
929         }
930         pcie_host_mmcfg_update(PCIE_HOST_BRIDGE(s), val & 1, s->cfg_base, size);
931         break;
932     case PEGPL_MSGBAH:
933         s->msg_base = ((uint64_t)val << 32) | (s->msg_base & 0xffffffff);
934         break;
935     case PEGPL_MSGBAL:
936         s->msg_base = (s->msg_base & 0xffffffff00000000ULL) | val;
937         break;
938     case PEGPL_MSGMSK:
939         s->msg_mask = val;
940         break;
941     case PEGPL_OMR1BAH:
942         s->omr1_base = ((uint64_t)val << 32) | (s->omr1_base & 0xffffffff);
943         break;
944     case PEGPL_OMR1BAL:
945         s->omr1_base = (s->omr1_base & 0xffffffff00000000ULL) | val;
946         break;
947     case PEGPL_OMR1MSKH:
948         s->omr1_mask = ((uint64_t)val << 32) | (s->omr1_mask & 0xffffffff);
949         break;
950     case PEGPL_OMR1MSKL:
951         s->omr1_mask = (s->omr1_mask & 0xffffffff00000000ULL) | val;
952         break;
953     case PEGPL_OMR2BAH:
954         s->omr2_base = ((uint64_t)val << 32) | (s->omr2_base & 0xffffffff);
955         break;
956     case PEGPL_OMR2BAL:
957         s->omr2_base = (s->omr2_base & 0xffffffff00000000ULL) | val;
958         break;
959     case PEGPL_OMR2MSKH:
960         s->omr2_mask = ((uint64_t)val << 32) | (s->omr2_mask & 0xffffffff);
961         break;
962     case PEGPL_OMR2MSKL:
963         s->omr2_mask = (s->omr2_mask & 0xffffffff00000000ULL) | val;
964         break;
965     case PEGPL_OMR3BAH:
966         s->omr3_base = ((uint64_t)val << 32) | (s->omr3_base & 0xffffffff);
967         break;
968     case PEGPL_OMR3BAL:
969         s->omr3_base = (s->omr3_base & 0xffffffff00000000ULL) | val;
970         break;
971     case PEGPL_OMR3MSKH:
972         s->omr3_mask = ((uint64_t)val << 32) | (s->omr3_mask & 0xffffffff);
973         break;
974     case PEGPL_OMR3MSKL:
975         s->omr3_mask = (s->omr3_mask & 0xffffffff00000000ULL) | val;
976         break;
977     case PEGPL_REGBAH:
978         s->reg_base = ((uint64_t)val << 32) | (s->reg_base & 0xffffffff);
979         break;
980     case PEGPL_REGBAL:
981         s->reg_base = (s->reg_base & 0xffffffff00000000ULL) | val;
982         break;
983     case PEGPL_REGMSK:
984         s->reg_mask = val;
985         /* FIXME: how is size encoded? */
986         size = (val == 0x7001 ? 4096 : ~(val & 0xfffffffe) + 1);
987         break;
988     case PEGPL_SPECIAL:
989         s->special = val;
990         break;
991     case PEGPL_CFG:
992         s->cfg = val;
993         break;
994     }
995 }
996 
997 static void ppc460ex_set_irq(void *opaque, int irq_num, int level)
998 {
999        PPC460EXPCIEState *s = opaque;
1000        qemu_set_irq(s->irq[irq_num], level);
1001 }
1002 
1003 static void ppc460ex_pcie_realize(DeviceState *dev, Error **errp)
1004 {
1005     PPC460EXPCIEState *s = PPC460EX_PCIE_HOST(dev);
1006     PCIHostState *pci = PCI_HOST_BRIDGE(dev);
1007     int i, id;
1008     char buf[16];
1009 
1010     switch (s->dcrn_base) {
1011     case DCRN_PCIE0_BASE:
1012         id = 0;
1013         break;
1014     case DCRN_PCIE1_BASE:
1015         id = 1;
1016         break;
1017     default:
1018         error_setg(errp, "invalid PCIe DCRN base");
1019         return;
1020     }
1021     snprintf(buf, sizeof(buf), "pcie%d-io", id);
1022     memory_region_init(&s->iomem, OBJECT(s), buf, UINT64_MAX);
1023     for (i = 0; i < 4; i++) {
1024         sysbus_init_irq(SYS_BUS_DEVICE(dev), &s->irq[i]);
1025     }
1026     snprintf(buf, sizeof(buf), "pcie.%d", id);
1027     pci->bus = pci_register_root_bus(DEVICE(s), buf, ppc460ex_set_irq,
1028                                 pci_swizzle_map_irq_fn, s, &s->iomem,
1029                                 get_system_io(), 0, 4, TYPE_PCIE_BUS);
1030 }
1031 
1032 static Property ppc460ex_pcie_props[] = {
1033     DEFINE_PROP_INT32("dcrn-base", PPC460EXPCIEState, dcrn_base, -1),
1034     DEFINE_PROP_END_OF_LIST(),
1035 };
1036 
1037 static void ppc460ex_pcie_class_init(ObjectClass *klass, void *data)
1038 {
1039     DeviceClass *dc = DEVICE_CLASS(klass);
1040 
1041     set_bit(DEVICE_CATEGORY_BRIDGE, dc->categories);
1042     dc->realize = ppc460ex_pcie_realize;
1043     device_class_set_props(dc, ppc460ex_pcie_props);
1044     dc->hotpluggable = false;
1045 }
1046 
1047 static const TypeInfo ppc460ex_pcie_host_info = {
1048     .name = TYPE_PPC460EX_PCIE_HOST,
1049     .parent = TYPE_PCIE_HOST_BRIDGE,
1050     .instance_size = sizeof(PPC460EXPCIEState),
1051     .class_init = ppc460ex_pcie_class_init,
1052 };
1053 
1054 static void ppc460ex_pcie_register(void)
1055 {
1056     type_register_static(&ppc460ex_pcie_host_info);
1057 }
1058 
1059 type_init(ppc460ex_pcie_register)
1060 
1061 static void ppc460ex_pcie_register_dcrs(PPC460EXPCIEState *s, CPUPPCState *env)
1062 {
1063     ppc_dcr_register(env, s->dcrn_base + PEGPL_CFGBAH, s,
1064                      &dcr_read_pcie, &dcr_write_pcie);
1065     ppc_dcr_register(env, s->dcrn_base + PEGPL_CFGBAL, s,
1066                      &dcr_read_pcie, &dcr_write_pcie);
1067     ppc_dcr_register(env, s->dcrn_base + PEGPL_CFGMSK, s,
1068                      &dcr_read_pcie, &dcr_write_pcie);
1069     ppc_dcr_register(env, s->dcrn_base + PEGPL_MSGBAH, s,
1070                      &dcr_read_pcie, &dcr_write_pcie);
1071     ppc_dcr_register(env, s->dcrn_base + PEGPL_MSGBAL, s,
1072                      &dcr_read_pcie, &dcr_write_pcie);
1073     ppc_dcr_register(env, s->dcrn_base + PEGPL_MSGMSK, s,
1074                      &dcr_read_pcie, &dcr_write_pcie);
1075     ppc_dcr_register(env, s->dcrn_base + PEGPL_OMR1BAH, s,
1076                      &dcr_read_pcie, &dcr_write_pcie);
1077     ppc_dcr_register(env, s->dcrn_base + PEGPL_OMR1BAL, s,
1078                      &dcr_read_pcie, &dcr_write_pcie);
1079     ppc_dcr_register(env, s->dcrn_base + PEGPL_OMR1MSKH, s,
1080                      &dcr_read_pcie, &dcr_write_pcie);
1081     ppc_dcr_register(env, s->dcrn_base + PEGPL_OMR1MSKL, s,
1082                      &dcr_read_pcie, &dcr_write_pcie);
1083     ppc_dcr_register(env, s->dcrn_base + PEGPL_OMR2BAH, s,
1084                      &dcr_read_pcie, &dcr_write_pcie);
1085     ppc_dcr_register(env, s->dcrn_base + PEGPL_OMR2BAL, s,
1086                      &dcr_read_pcie, &dcr_write_pcie);
1087     ppc_dcr_register(env, s->dcrn_base + PEGPL_OMR2MSKH, s,
1088                      &dcr_read_pcie, &dcr_write_pcie);
1089     ppc_dcr_register(env, s->dcrn_base + PEGPL_OMR2MSKL, s,
1090                      &dcr_read_pcie, &dcr_write_pcie);
1091     ppc_dcr_register(env, s->dcrn_base + PEGPL_OMR3BAH, s,
1092                      &dcr_read_pcie, &dcr_write_pcie);
1093     ppc_dcr_register(env, s->dcrn_base + PEGPL_OMR3BAL, s,
1094                      &dcr_read_pcie, &dcr_write_pcie);
1095     ppc_dcr_register(env, s->dcrn_base + PEGPL_OMR3MSKH, s,
1096                      &dcr_read_pcie, &dcr_write_pcie);
1097     ppc_dcr_register(env, s->dcrn_base + PEGPL_OMR3MSKL, s,
1098                      &dcr_read_pcie, &dcr_write_pcie);
1099     ppc_dcr_register(env, s->dcrn_base + PEGPL_REGBAH, s,
1100                      &dcr_read_pcie, &dcr_write_pcie);
1101     ppc_dcr_register(env, s->dcrn_base + PEGPL_REGBAL, s,
1102                      &dcr_read_pcie, &dcr_write_pcie);
1103     ppc_dcr_register(env, s->dcrn_base + PEGPL_REGMSK, s,
1104                      &dcr_read_pcie, &dcr_write_pcie);
1105     ppc_dcr_register(env, s->dcrn_base + PEGPL_SPECIAL, s,
1106                      &dcr_read_pcie, &dcr_write_pcie);
1107     ppc_dcr_register(env, s->dcrn_base + PEGPL_CFG, s,
1108                      &dcr_read_pcie, &dcr_write_pcie);
1109 }
1110 
1111 void ppc460ex_pcie_init(CPUPPCState *env)
1112 {
1113     DeviceState *dev;
1114 
1115     dev = qdev_new(TYPE_PPC460EX_PCIE_HOST);
1116     qdev_prop_set_int32(dev, "dcrn-base", DCRN_PCIE0_BASE);
1117     sysbus_realize_and_unref(SYS_BUS_DEVICE(dev), &error_fatal);
1118     ppc460ex_pcie_register_dcrs(PPC460EX_PCIE_HOST(dev), env);
1119 
1120     dev = qdev_new(TYPE_PPC460EX_PCIE_HOST);
1121     qdev_prop_set_int32(dev, "dcrn-base", DCRN_PCIE1_BASE);
1122     sysbus_realize_and_unref(SYS_BUS_DEVICE(dev), &error_fatal);
1123     ppc460ex_pcie_register_dcrs(PPC460EX_PCIE_HOST(dev), env);
1124 }
1125