2 * QEMU PowerPC 4xx embedded processors SDRAM controller emulation
4 * DDR SDRAM controller:
5 * Copyright (c) 2007 Jocelyn Mayer
7 * Permission is hereby granted, free of charge, to any person obtaining a copy
8 * of this software and associated documentation files (the "Software"), to deal
9 * in the Software without restriction, including without limitation the rights
10 * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
11 * copies of the Software, and to permit persons to whom the Software is
12 * furnished to do so, subject to the following conditions:
14 * The above copyright notice and this permission notice shall be included in
15 * all copies or substantial portions of the Software.
17 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
18 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
19 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
20 * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
21 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
22 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
25 * DDR2 SDRAM controller:
26 * Copyright (c) 2012 François Revol
27 * Copyright (c) 2016-2019 BALATON Zoltan
29 * This work is licensed under the GNU GPL license version 2 or later.
32 #include "qemu/osdep.h"
33 #include "qemu/units.h"
34 #include "qapi/error.h"
36 #include "exec/address-spaces.h" /* get_system_memory() */
38 #include "hw/qdev-properties.h"
39 #include "hw/ppc/ppc4xx.h"
42 /*****************************************************************************/
43 /* Shared functions */
46 * Split RAM between SDRAM banks.
48 * sdram_bank_sizes[] must be in descending order, that is sizes[i] > sizes[i+1]
49 * and must be 0-terminated.
51 * The 4xx SDRAM controller supports a small number of banks, and each bank
52 * must be one of a small set of sizes. The number of banks and the supported
53 * sizes varies by SoC.
55 static bool ppc4xx_sdram_banks(MemoryRegion
*ram
, int nr_banks
,
56 Ppc4xxSdramBank ram_banks
[],
57 const ram_addr_t sdram_bank_sizes
[],
61 ram_addr_t size_left
= memory_region_size(ram
);
67 for (i
= 0; i
< nr_banks
; i
++) {
68 for (j
= 0; sdram_bank_sizes
[j
] != 0; j
++) {
69 bank_size
= sdram_bank_sizes
[j
];
70 if (bank_size
<= size_left
) {
73 ram_banks
[i
].base
= base
;
74 ram_banks
[i
].size
= bank_size
;
76 size_left
-= bank_size
;
77 snprintf(name
, sizeof(name
), "ppc4xx.sdram%d", i
);
78 memory_region_init_alias(&ram_banks
[i
].ram
, NULL
, name
, ram
,
79 ram_banks
[i
].base
, ram_banks
[i
].size
);
84 /* No need to use the remaining banks. */
90 ram_addr_t used_size
= memory_region_size(ram
) - size_left
;
91 GString
*s
= g_string_new(NULL
);
93 for (i
= 0; sdram_bank_sizes
[i
]; i
++) {
94 g_string_append_printf(s
, "%" PRIi64
"%s",
95 sdram_bank_sizes
[i
] / MiB
,
96 sdram_bank_sizes
[i
+ 1] ? ", " : "");
98 error_setg(errp
, "Invalid SDRAM banks");
99 error_append_hint(errp
, "at most %d bank%s of %s MiB each supported\n",
100 nr_banks
, nr_banks
== 1 ? "" : "s", s
->str
);
101 error_append_hint(errp
, "Possible valid RAM size: %" PRIi64
" MiB\n",
102 used_size
? used_size
/ MiB
: sdram_bank_sizes
[i
- 1] / MiB
);
104 g_string_free(s
, true);
110 static void sdram_bank_map(Ppc4xxSdramBank
*bank
)
112 trace_ppc4xx_sdram_map(bank
->base
, bank
->size
);
113 memory_region_init(&bank
->container
, NULL
, "sdram-container", bank
->size
);
114 memory_region_add_subregion(&bank
->container
, 0, &bank
->ram
);
115 memory_region_add_subregion(get_system_memory(), bank
->base
,
119 static void sdram_bank_unmap(Ppc4xxSdramBank
*bank
)
121 trace_ppc4xx_sdram_unmap(bank
->base
, bank
->size
);
122 memory_region_del_subregion(get_system_memory(), &bank
->container
);
123 memory_region_del_subregion(&bank
->container
, &bank
->ram
);
124 object_unparent(OBJECT(&bank
->container
));
127 static void sdram_bank_set_bcr(Ppc4xxSdramBank
*bank
, uint32_t bcr
,
128 hwaddr base
, hwaddr size
, int enabled
)
130 if (memory_region_is_mapped(&bank
->container
)) {
131 sdram_bank_unmap(bank
);
136 if (enabled
&& (bcr
& 1)) {
137 sdram_bank_map(bank
);
142 SDRAM0_CFGADDR
= 0x010,
143 SDRAM0_CFGDATA
= 0x011,
146 /*****************************************************************************/
147 /* DDR SDRAM controller */
148 #define SDRAM_DDR_BCR_MASK 0xFFDEE001
150 static uint32_t sdram_ddr_bcr(hwaddr ram_base
, hwaddr ram_size
)
177 qemu_log_mask(LOG_GUEST_ERROR
,
178 "%s: invalid RAM size 0x%" HWADDR_PRIx
"\n", __func__
,
182 bcr
|= ram_base
& 0xFF800000;
188 static inline hwaddr
sdram_ddr_base(uint32_t bcr
)
190 return bcr
& 0xFF800000;
193 static hwaddr
sdram_ddr_size(uint32_t bcr
)
195 int sh
= (bcr
>> 17) & 0x7;
201 return (4 * MiB
) << sh
;
204 static uint32_t sdram_ddr_dcr_read(void *opaque
, int dcrn
)
206 Ppc4xxSdramDdrState
*s
= opaque
;
215 case 0x00: /* SDRAM_BESR0 */
218 case 0x08: /* SDRAM_BESR1 */
221 case 0x10: /* SDRAM_BEAR */
224 case 0x20: /* SDRAM_CFG */
227 case 0x24: /* SDRAM_STATUS */
230 case 0x30: /* SDRAM_RTR */
233 case 0x34: /* SDRAM_PMIT */
236 case 0x40: /* SDRAM_B0CR */
237 ret
= s
->bank
[0].bcr
;
239 case 0x44: /* SDRAM_B1CR */
240 ret
= s
->bank
[1].bcr
;
242 case 0x48: /* SDRAM_B2CR */
243 ret
= s
->bank
[2].bcr
;
245 case 0x4C: /* SDRAM_B3CR */
246 ret
= s
->bank
[3].bcr
;
248 case 0x80: /* SDRAM_TR */
251 case 0x94: /* SDRAM_ECCCFG */
254 case 0x98: /* SDRAM_ECCESR */
263 /* Avoid gcc warning */
271 static void sdram_ddr_dcr_write(void *opaque
, int dcrn
, uint32_t val
)
273 Ppc4xxSdramDdrState
*s
= opaque
;
282 case 0x00: /* SDRAM_BESR0 */
285 case 0x08: /* SDRAM_BESR1 */
288 case 0x10: /* SDRAM_BEAR */
291 case 0x20: /* SDRAM_CFG */
293 if (!(s
->cfg
& 0x80000000) && (val
& 0x80000000)) {
294 trace_ppc4xx_sdram_enable("enable");
295 /* validate all RAM mappings */
296 for (i
= 0; i
< s
->nbanks
; i
++) {
297 if (s
->bank
[i
].size
) {
298 sdram_bank_set_bcr(&s
->bank
[i
], s
->bank
[i
].bcr
,
299 s
->bank
[i
].base
, s
->bank
[i
].size
,
303 s
->status
&= ~0x80000000;
304 } else if ((s
->cfg
& 0x80000000) && !(val
& 0x80000000)) {
305 trace_ppc4xx_sdram_enable("disable");
306 /* invalidate all RAM mappings */
307 for (i
= 0; i
< s
->nbanks
; i
++) {
308 if (s
->bank
[i
].size
) {
309 sdram_bank_set_bcr(&s
->bank
[i
], s
->bank
[i
].bcr
,
310 s
->bank
[i
].base
, s
->bank
[i
].size
,
314 s
->status
|= 0x80000000;
316 if (!(s
->cfg
& 0x40000000) && (val
& 0x40000000)) {
317 s
->status
|= 0x40000000;
318 } else if ((s
->cfg
& 0x40000000) && !(val
& 0x40000000)) {
319 s
->status
&= ~0x40000000;
323 case 0x24: /* SDRAM_STATUS */
324 /* Read-only register */
326 case 0x30: /* SDRAM_RTR */
327 s
->rtr
= val
& 0x3FF80000;
329 case 0x34: /* SDRAM_PMIT */
330 s
->pmit
= (val
& 0xF8000000) | 0x07C00000;
332 case 0x40: /* SDRAM_B0CR */
333 case 0x44: /* SDRAM_B1CR */
334 case 0x48: /* SDRAM_B2CR */
335 case 0x4C: /* SDRAM_B3CR */
336 i
= (s
->addr
- 0x40) / 4;
337 val
&= SDRAM_DDR_BCR_MASK
;
338 if (s
->bank
[i
].size
) {
339 sdram_bank_set_bcr(&s
->bank
[i
], val
,
340 sdram_ddr_base(val
), sdram_ddr_size(val
),
341 s
->cfg
& 0x80000000);
344 case 0x80: /* SDRAM_TR */
345 s
->tr
= val
& 0x018FC01F;
347 case 0x94: /* SDRAM_ECCCFG */
348 s
->ecccfg
= val
& 0x00F00000;
350 case 0x98: /* SDRAM_ECCESR */
352 if (s
->eccesr
== 0 && val
!= 0) {
353 qemu_irq_raise(s
->irq
);
354 } else if (s
->eccesr
!= 0 && val
== 0) {
355 qemu_irq_lower(s
->irq
);
366 static void ppc4xx_sdram_ddr_reset(DeviceState
*dev
)
368 Ppc4xxSdramDdrState
*s
= PPC4xx_SDRAM_DDR(dev
);
372 s
->besr0
= 0; /* No error */
373 s
->besr1
= 0; /* No error */
375 s
->ecccfg
= 0; /* No ECC */
376 s
->eccesr
= 0; /* No error */
377 s
->pmit
= 0x07C00000;
380 /* We pre-initialize RAM banks */
385 static void ppc4xx_sdram_ddr_realize(DeviceState
*dev
, Error
**errp
)
387 Ppc4xxSdramDdrState
*s
= PPC4xx_SDRAM_DDR(dev
);
388 Ppc4xxDcrDeviceState
*dcr
= PPC4xx_DCR_DEVICE(dev
);
389 const ram_addr_t valid_bank_sizes
[] = {
390 256 * MiB
, 128 * MiB
, 64 * MiB
, 32 * MiB
, 16 * MiB
, 8 * MiB
, 4 * MiB
, 0
394 if (s
->nbanks
< 1 || s
->nbanks
> 4) {
395 error_setg(errp
, "Invalid number of RAM banks");
399 error_setg(errp
, "Missing dram memory region");
402 if (!ppc4xx_sdram_banks(s
->dram_mr
, s
->nbanks
, s
->bank
,
403 valid_bank_sizes
, errp
)) {
406 for (i
= 0; i
< s
->nbanks
; i
++) {
407 if (s
->bank
[i
].size
) {
408 s
->bank
[i
].bcr
= sdram_ddr_bcr(s
->bank
[i
].base
, s
->bank
[i
].size
);
409 sdram_bank_set_bcr(&s
->bank
[i
], s
->bank
[i
].bcr
,
410 s
->bank
[i
].base
, s
->bank
[i
].size
, 0);
412 sdram_bank_set_bcr(&s
->bank
[i
], 0, 0, 0, 0);
414 trace_ppc4xx_sdram_init(sdram_ddr_base(s
->bank
[i
].bcr
),
415 sdram_ddr_size(s
->bank
[i
].bcr
),
419 sysbus_init_irq(SYS_BUS_DEVICE(dev
), &s
->irq
);
421 ppc4xx_dcr_register(dcr
, SDRAM0_CFGADDR
,
422 s
, &sdram_ddr_dcr_read
, &sdram_ddr_dcr_write
);
423 ppc4xx_dcr_register(dcr
, SDRAM0_CFGDATA
,
424 s
, &sdram_ddr_dcr_read
, &sdram_ddr_dcr_write
);
427 static Property ppc4xx_sdram_ddr_props
[] = {
428 DEFINE_PROP_LINK("dram", Ppc4xxSdramDdrState
, dram_mr
, TYPE_MEMORY_REGION
,
430 DEFINE_PROP_UINT32("nbanks", Ppc4xxSdramDdrState
, nbanks
, 4),
431 DEFINE_PROP_END_OF_LIST(),
434 static void ppc4xx_sdram_ddr_class_init(ObjectClass
*oc
, void *data
)
436 DeviceClass
*dc
= DEVICE_CLASS(oc
);
438 dc
->realize
= ppc4xx_sdram_ddr_realize
;
439 dc
->reset
= ppc4xx_sdram_ddr_reset
;
440 /* Reason: only works as function of a ppc4xx SoC */
441 dc
->user_creatable
= false;
442 device_class_set_props(dc
, ppc4xx_sdram_ddr_props
);
445 void ppc4xx_sdram_ddr_enable(Ppc4xxSdramDdrState
*s
)
447 sdram_ddr_dcr_write(s
, SDRAM0_CFGADDR
, 0x20);
448 sdram_ddr_dcr_write(s
, SDRAM0_CFGDATA
, 0x80000000);
451 /*****************************************************************************/
452 /* DDR2 SDRAM controller */
453 #define SDRAM_DDR2_BCR_MASK 0xffe0ffc1
460 SDRAM_CONF1HB
= 0x45,
461 SDRAM_PLBADDULL
= 0x4a,
462 SDRAM_CONF1LL
= 0x4b,
463 SDRAM_CONFPATHB
= 0x4f,
464 SDRAM_PLBADDUHB
= 0x50,
467 static uint32_t sdram_ddr2_bcr(hwaddr ram_base
, hwaddr ram_size
)
503 error_report("invalid RAM size " HWADDR_FMT_plx
, ram_size
);
506 bcr
|= ram_base
>> 2 & 0xffe00000;
512 static inline hwaddr
sdram_ddr2_base(uint32_t bcr
)
514 return (bcr
& 0xffe00000) << 2;
517 static hwaddr
sdram_ddr2_size(uint32_t bcr
)
521 sh
= 1024 - ((bcr
>> 6) & 0x3ff);
525 static uint32_t sdram_ddr2_dcr_read(void *opaque
, int dcrn
)
527 Ppc4xxSdramDdr2State
*s
= opaque
;
535 if (s
->bank
[dcrn
- SDRAM_R0BAS
].size
) {
536 ret
= sdram_ddr2_bcr(s
->bank
[dcrn
- SDRAM_R0BAS
].base
,
537 s
->bank
[dcrn
- SDRAM_R0BAS
].size
);
542 case SDRAM_CONFPATHB
:
543 case SDRAM_PLBADDULL
:
544 case SDRAM_PLBADDUHB
:
551 case 0x14: /* SDRAM_MCSTAT (405EX) */
555 case 0x21: /* SDRAM_MCOPT2 */
558 case 0x40: /* SDRAM_MB0CF */
561 case 0x7A: /* SDRAM_DLCR */
564 case 0xE1: /* SDR0_DDR0 */
565 ret
= SDR0_DDR0_DDRM_ENCODE(1) | SDR0_DDR0_DDRM_DDR1
;
578 #define SDRAM_DDR2_MCOPT2_DCEN BIT(27)
580 static void sdram_ddr2_dcr_write(void *opaque
, int dcrn
, uint32_t val
)
582 Ppc4xxSdramDdr2State
*s
= opaque
;
592 case SDRAM_CONFPATHB
:
593 case SDRAM_PLBADDULL
:
594 case SDRAM_PLBADDUHB
:
601 case 0x00: /* B0CR */
603 case 0x21: /* SDRAM_MCOPT2 */
604 if (!(s
->mcopt2
& SDRAM_DDR2_MCOPT2_DCEN
) &&
605 (val
& SDRAM_DDR2_MCOPT2_DCEN
)) {
606 trace_ppc4xx_sdram_enable("enable");
607 /* validate all RAM mappings */
608 for (i
= 0; i
< s
->nbanks
; i
++) {
609 if (s
->bank
[i
].size
) {
610 sdram_bank_set_bcr(&s
->bank
[i
], s
->bank
[i
].bcr
,
611 s
->bank
[i
].base
, s
->bank
[i
].size
,
615 s
->mcopt2
|= SDRAM_DDR2_MCOPT2_DCEN
;
616 } else if ((s
->mcopt2
& SDRAM_DDR2_MCOPT2_DCEN
) &&
617 !(val
& SDRAM_DDR2_MCOPT2_DCEN
)) {
618 trace_ppc4xx_sdram_enable("disable");
619 /* invalidate all RAM mappings */
620 for (i
= 0; i
< s
->nbanks
; i
++) {
621 if (s
->bank
[i
].size
) {
622 sdram_bank_set_bcr(&s
->bank
[i
], s
->bank
[i
].bcr
,
623 s
->bank
[i
].base
, s
->bank
[i
].size
,
627 s
->mcopt2
&= ~SDRAM_DDR2_MCOPT2_DCEN
;
639 static void ppc4xx_sdram_ddr2_reset(DeviceState
*dev
)
641 Ppc4xxSdramDdr2State
*s
= PPC4xx_SDRAM_DDR2(dev
);
647 static void ppc4xx_sdram_ddr2_realize(DeviceState
*dev
, Error
**errp
)
649 Ppc4xxSdramDdr2State
*s
= PPC4xx_SDRAM_DDR2(dev
);
650 Ppc4xxDcrDeviceState
*dcr
= PPC4xx_DCR_DEVICE(dev
);
652 * SoC also has 4 GiB but that causes problem with 32 bit
653 * builds (4*GiB overflows the 32 bit ram_addr_t).
655 const ram_addr_t valid_bank_sizes
[] = {
656 2 * GiB
, 1 * GiB
, 512 * MiB
, 256 * MiB
, 128 * MiB
,
657 64 * MiB
, 32 * MiB
, 16 * MiB
, 8 * MiB
, 0
661 if (s
->nbanks
< 1 || s
->nbanks
> 4) {
662 error_setg(errp
, "Invalid number of RAM banks");
666 error_setg(errp
, "Missing dram memory region");
669 if (!ppc4xx_sdram_banks(s
->dram_mr
, s
->nbanks
, s
->bank
,
670 valid_bank_sizes
, errp
)) {
673 for (i
= 0; i
< s
->nbanks
; i
++) {
674 if (s
->bank
[i
].size
) {
675 s
->bank
[i
].bcr
= sdram_ddr2_bcr(s
->bank
[i
].base
, s
->bank
[i
].size
);
676 s
->bank
[i
].bcr
&= SDRAM_DDR2_BCR_MASK
;
677 sdram_bank_set_bcr(&s
->bank
[i
], s
->bank
[i
].bcr
,
678 s
->bank
[i
].base
, s
->bank
[i
].size
, 0);
680 sdram_bank_set_bcr(&s
->bank
[i
], 0, 0, 0, 0);
682 trace_ppc4xx_sdram_init(sdram_ddr2_base(s
->bank
[i
].bcr
),
683 sdram_ddr2_size(s
->bank
[i
].bcr
),
687 ppc4xx_dcr_register(dcr
, SDRAM0_CFGADDR
,
688 s
, &sdram_ddr2_dcr_read
, &sdram_ddr2_dcr_write
);
689 ppc4xx_dcr_register(dcr
, SDRAM0_CFGDATA
,
690 s
, &sdram_ddr2_dcr_read
, &sdram_ddr2_dcr_write
);
692 ppc4xx_dcr_register(dcr
, SDRAM_R0BAS
,
693 s
, &sdram_ddr2_dcr_read
, &sdram_ddr2_dcr_write
);
694 ppc4xx_dcr_register(dcr
, SDRAM_R1BAS
,
695 s
, &sdram_ddr2_dcr_read
, &sdram_ddr2_dcr_write
);
696 ppc4xx_dcr_register(dcr
, SDRAM_R2BAS
,
697 s
, &sdram_ddr2_dcr_read
, &sdram_ddr2_dcr_write
);
698 ppc4xx_dcr_register(dcr
, SDRAM_R3BAS
,
699 s
, &sdram_ddr2_dcr_read
, &sdram_ddr2_dcr_write
);
700 ppc4xx_dcr_register(dcr
, SDRAM_CONF1HB
,
701 s
, &sdram_ddr2_dcr_read
, &sdram_ddr2_dcr_write
);
702 ppc4xx_dcr_register(dcr
, SDRAM_PLBADDULL
,
703 s
, &sdram_ddr2_dcr_read
, &sdram_ddr2_dcr_write
);
704 ppc4xx_dcr_register(dcr
, SDRAM_CONF1LL
,
705 s
, &sdram_ddr2_dcr_read
, &sdram_ddr2_dcr_write
);
706 ppc4xx_dcr_register(dcr
, SDRAM_CONFPATHB
,
707 s
, &sdram_ddr2_dcr_read
, &sdram_ddr2_dcr_write
);
708 ppc4xx_dcr_register(dcr
, SDRAM_PLBADDUHB
,
709 s
, &sdram_ddr2_dcr_read
, &sdram_ddr2_dcr_write
);
712 static Property ppc4xx_sdram_ddr2_props
[] = {
713 DEFINE_PROP_LINK("dram", Ppc4xxSdramDdr2State
, dram_mr
, TYPE_MEMORY_REGION
,
715 DEFINE_PROP_UINT32("nbanks", Ppc4xxSdramDdr2State
, nbanks
, 4),
716 DEFINE_PROP_END_OF_LIST(),
719 static void ppc4xx_sdram_ddr2_class_init(ObjectClass
*oc
, void *data
)
721 DeviceClass
*dc
= DEVICE_CLASS(oc
);
723 dc
->realize
= ppc4xx_sdram_ddr2_realize
;
724 dc
->reset
= ppc4xx_sdram_ddr2_reset
;
725 /* Reason: only works as function of a ppc4xx SoC */
726 dc
->user_creatable
= false;
727 device_class_set_props(dc
, ppc4xx_sdram_ddr2_props
);
730 void ppc4xx_sdram_ddr2_enable(Ppc4xxSdramDdr2State
*s
)
732 sdram_ddr2_dcr_write(s
, SDRAM0_CFGADDR
, 0x21);
733 sdram_ddr2_dcr_write(s
, SDRAM0_CFGDATA
, 0x08000000);
736 static const TypeInfo ppc4xx_sdram_types
[] = {
738 .name
= TYPE_PPC4xx_SDRAM_DDR
,
739 .parent
= TYPE_PPC4xx_DCR_DEVICE
,
740 .instance_size
= sizeof(Ppc4xxSdramDdrState
),
741 .class_init
= ppc4xx_sdram_ddr_class_init
,
743 .name
= TYPE_PPC4xx_SDRAM_DDR2
,
744 .parent
= TYPE_PPC4xx_DCR_DEVICE
,
745 .instance_size
= sizeof(Ppc4xxSdramDdr2State
),
746 .class_init
= ppc4xx_sdram_ddr2_class_init
,
750 DEFINE_TYPES(ppc4xx_sdram_types
)