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
)
198 sh
= (bcr
>> 17) & 0x7;
202 size
= (4 * MiB
) << sh
;
208 static uint32_t sdram_ddr_dcr_read(void *opaque
, int dcrn
)
210 Ppc4xxSdramDdrState
*s
= opaque
;
219 case 0x00: /* SDRAM_BESR0 */
222 case 0x08: /* SDRAM_BESR1 */
225 case 0x10: /* SDRAM_BEAR */
228 case 0x20: /* SDRAM_CFG */
231 case 0x24: /* SDRAM_STATUS */
234 case 0x30: /* SDRAM_RTR */
237 case 0x34: /* SDRAM_PMIT */
240 case 0x40: /* SDRAM_B0CR */
241 ret
= s
->bank
[0].bcr
;
243 case 0x44: /* SDRAM_B1CR */
244 ret
= s
->bank
[1].bcr
;
246 case 0x48: /* SDRAM_B2CR */
247 ret
= s
->bank
[2].bcr
;
249 case 0x4C: /* SDRAM_B3CR */
250 ret
= s
->bank
[3].bcr
;
252 case 0x80: /* SDRAM_TR */
255 case 0x94: /* SDRAM_ECCCFG */
258 case 0x98: /* SDRAM_ECCESR */
267 /* Avoid gcc warning */
275 static void sdram_ddr_dcr_write(void *opaque
, int dcrn
, uint32_t val
)
277 Ppc4xxSdramDdrState
*s
= opaque
;
286 case 0x00: /* SDRAM_BESR0 */
289 case 0x08: /* SDRAM_BESR1 */
292 case 0x10: /* SDRAM_BEAR */
295 case 0x20: /* SDRAM_CFG */
297 if (!(s
->cfg
& 0x80000000) && (val
& 0x80000000)) {
298 trace_ppc4xx_sdram_enable("enable");
299 /* validate all RAM mappings */
300 for (i
= 0; i
< s
->nbanks
; i
++) {
301 if (s
->bank
[i
].size
) {
302 sdram_bank_set_bcr(&s
->bank
[i
], s
->bank
[i
].bcr
,
303 s
->bank
[i
].base
, s
->bank
[i
].size
,
307 s
->status
&= ~0x80000000;
308 } else if ((s
->cfg
& 0x80000000) && !(val
& 0x80000000)) {
309 trace_ppc4xx_sdram_enable("disable");
310 /* invalidate all RAM mappings */
311 for (i
= 0; i
< s
->nbanks
; i
++) {
312 if (s
->bank
[i
].size
) {
313 sdram_bank_set_bcr(&s
->bank
[i
], s
->bank
[i
].bcr
,
314 s
->bank
[i
].base
, s
->bank
[i
].size
,
318 s
->status
|= 0x80000000;
320 if (!(s
->cfg
& 0x40000000) && (val
& 0x40000000)) {
321 s
->status
|= 0x40000000;
322 } else if ((s
->cfg
& 0x40000000) && !(val
& 0x40000000)) {
323 s
->status
&= ~0x40000000;
327 case 0x24: /* SDRAM_STATUS */
328 /* Read-only register */
330 case 0x30: /* SDRAM_RTR */
331 s
->rtr
= val
& 0x3FF80000;
333 case 0x34: /* SDRAM_PMIT */
334 s
->pmit
= (val
& 0xF8000000) | 0x07C00000;
336 case 0x40: /* SDRAM_B0CR */
337 case 0x44: /* SDRAM_B1CR */
338 case 0x48: /* SDRAM_B2CR */
339 case 0x4C: /* SDRAM_B3CR */
340 i
= (s
->addr
- 0x40) / 4;
341 val
&= SDRAM_DDR_BCR_MASK
;
342 if (s
->bank
[i
].size
) {
343 sdram_bank_set_bcr(&s
->bank
[i
], val
,
344 sdram_ddr_base(val
), sdram_ddr_size(val
),
345 s
->cfg
& 0x80000000);
348 case 0x80: /* SDRAM_TR */
349 s
->tr
= val
& 0x018FC01F;
351 case 0x94: /* SDRAM_ECCCFG */
352 s
->ecccfg
= val
& 0x00F00000;
354 case 0x98: /* SDRAM_ECCESR */
356 if (s
->eccesr
== 0 && val
!= 0) {
357 qemu_irq_raise(s
->irq
);
358 } else if (s
->eccesr
!= 0 && val
== 0) {
359 qemu_irq_lower(s
->irq
);
370 static void ppc4xx_sdram_ddr_reset(DeviceState
*dev
)
372 Ppc4xxSdramDdrState
*s
= PPC4xx_SDRAM_DDR(dev
);
376 s
->besr0
= 0; /* No error */
377 s
->besr1
= 0; /* No error */
379 s
->ecccfg
= 0; /* No ECC */
380 s
->eccesr
= 0; /* No error */
381 s
->pmit
= 0x07C00000;
384 /* We pre-initialize RAM banks */
389 static void ppc4xx_sdram_ddr_realize(DeviceState
*dev
, Error
**errp
)
391 Ppc4xxSdramDdrState
*s
= PPC4xx_SDRAM_DDR(dev
);
392 Ppc4xxDcrDeviceState
*dcr
= PPC4xx_DCR_DEVICE(dev
);
393 const ram_addr_t valid_bank_sizes
[] = {
394 256 * MiB
, 128 * MiB
, 64 * MiB
, 32 * MiB
, 16 * MiB
, 8 * MiB
, 4 * MiB
, 0
398 if (s
->nbanks
< 1 || s
->nbanks
> 4) {
399 error_setg(errp
, "Invalid number of RAM banks");
403 error_setg(errp
, "Missing dram memory region");
406 if (!ppc4xx_sdram_banks(s
->dram_mr
, s
->nbanks
, s
->bank
,
407 valid_bank_sizes
, errp
)) {
410 for (i
= 0; i
< s
->nbanks
; i
++) {
411 if (s
->bank
[i
].size
) {
412 s
->bank
[i
].bcr
= sdram_ddr_bcr(s
->bank
[i
].base
, s
->bank
[i
].size
);
413 sdram_bank_set_bcr(&s
->bank
[i
], s
->bank
[i
].bcr
,
414 s
->bank
[i
].base
, s
->bank
[i
].size
, 0);
416 sdram_bank_set_bcr(&s
->bank
[i
], 0, 0, 0, 0);
418 trace_ppc4xx_sdram_init(sdram_ddr_base(s
->bank
[i
].bcr
),
419 sdram_ddr_size(s
->bank
[i
].bcr
),
423 sysbus_init_irq(SYS_BUS_DEVICE(dev
), &s
->irq
);
425 ppc4xx_dcr_register(dcr
, SDRAM0_CFGADDR
,
426 s
, &sdram_ddr_dcr_read
, &sdram_ddr_dcr_write
);
427 ppc4xx_dcr_register(dcr
, SDRAM0_CFGDATA
,
428 s
, &sdram_ddr_dcr_read
, &sdram_ddr_dcr_write
);
431 static Property ppc4xx_sdram_ddr_props
[] = {
432 DEFINE_PROP_LINK("dram", Ppc4xxSdramDdrState
, dram_mr
, TYPE_MEMORY_REGION
,
434 DEFINE_PROP_UINT32("nbanks", Ppc4xxSdramDdrState
, nbanks
, 4),
435 DEFINE_PROP_END_OF_LIST(),
438 static void ppc4xx_sdram_ddr_class_init(ObjectClass
*oc
, void *data
)
440 DeviceClass
*dc
= DEVICE_CLASS(oc
);
442 dc
->realize
= ppc4xx_sdram_ddr_realize
;
443 dc
->reset
= ppc4xx_sdram_ddr_reset
;
444 /* Reason: only works as function of a ppc4xx SoC */
445 dc
->user_creatable
= false;
446 device_class_set_props(dc
, ppc4xx_sdram_ddr_props
);
449 void ppc4xx_sdram_ddr_enable(Ppc4xxSdramDdrState
*s
)
451 sdram_ddr_dcr_write(s
, SDRAM0_CFGADDR
, 0x20);
452 sdram_ddr_dcr_write(s
, SDRAM0_CFGDATA
, 0x80000000);
455 /*****************************************************************************/
456 /* DDR2 SDRAM controller */
457 #define SDRAM_DDR2_BCR_MASK 0xffe0ffc1
464 SDRAM_CONF1HB
= 0x45,
465 SDRAM_PLBADDULL
= 0x4a,
466 SDRAM_CONF1LL
= 0x4b,
467 SDRAM_CONFPATHB
= 0x4f,
468 SDRAM_PLBADDUHB
= 0x50,
471 static uint32_t sdram_ddr2_bcr(hwaddr ram_base
, hwaddr ram_size
)
507 error_report("invalid RAM size " TARGET_FMT_plx
, ram_size
);
510 bcr
|= ram_base
>> 2 & 0xffe00000;
516 static inline hwaddr
sdram_ddr2_base(uint32_t bcr
)
518 return (bcr
& 0xffe00000) << 2;
521 static hwaddr
sdram_ddr2_size(uint32_t bcr
)
526 sh
= 1024 - ((bcr
>> 6) & 0x3ff);
532 static uint32_t sdram_ddr2_dcr_read(void *opaque
, int dcrn
)
534 Ppc4xxSdramDdr2State
*s
= opaque
;
542 if (s
->bank
[dcrn
- SDRAM_R0BAS
].size
) {
543 ret
= sdram_ddr2_bcr(s
->bank
[dcrn
- SDRAM_R0BAS
].base
,
544 s
->bank
[dcrn
- SDRAM_R0BAS
].size
);
549 case SDRAM_CONFPATHB
:
550 case SDRAM_PLBADDULL
:
551 case SDRAM_PLBADDUHB
:
558 case 0x14: /* SDRAM_MCSTAT (405EX) */
562 case 0x21: /* SDRAM_MCOPT2 */
565 case 0x40: /* SDRAM_MB0CF */
568 case 0x7A: /* SDRAM_DLCR */
571 case 0xE1: /* SDR0_DDR0 */
572 ret
= SDR0_DDR0_DDRM_ENCODE(1) | SDR0_DDR0_DDRM_DDR1
;
585 #define SDRAM_DDR2_MCOPT2_DCEN BIT(27)
587 static void sdram_ddr2_dcr_write(void *opaque
, int dcrn
, uint32_t val
)
589 Ppc4xxSdramDdr2State
*s
= opaque
;
599 case SDRAM_CONFPATHB
:
600 case SDRAM_PLBADDULL
:
601 case SDRAM_PLBADDUHB
:
608 case 0x00: /* B0CR */
610 case 0x21: /* SDRAM_MCOPT2 */
611 if (!(s
->mcopt2
& SDRAM_DDR2_MCOPT2_DCEN
) &&
612 (val
& SDRAM_DDR2_MCOPT2_DCEN
)) {
613 trace_ppc4xx_sdram_enable("enable");
614 /* validate all RAM mappings */
615 for (i
= 0; i
< s
->nbanks
; i
++) {
616 if (s
->bank
[i
].size
) {
617 sdram_bank_set_bcr(&s
->bank
[i
], s
->bank
[i
].bcr
,
618 s
->bank
[i
].base
, s
->bank
[i
].size
,
622 s
->mcopt2
|= SDRAM_DDR2_MCOPT2_DCEN
;
623 } else if ((s
->mcopt2
& SDRAM_DDR2_MCOPT2_DCEN
) &&
624 !(val
& SDRAM_DDR2_MCOPT2_DCEN
)) {
625 trace_ppc4xx_sdram_enable("disable");
626 /* invalidate all RAM mappings */
627 for (i
= 0; i
< s
->nbanks
; i
++) {
628 if (s
->bank
[i
].size
) {
629 sdram_bank_set_bcr(&s
->bank
[i
], s
->bank
[i
].bcr
,
630 s
->bank
[i
].base
, s
->bank
[i
].size
,
634 s
->mcopt2
&= ~SDRAM_DDR2_MCOPT2_DCEN
;
646 static void ppc4xx_sdram_ddr2_reset(DeviceState
*dev
)
648 Ppc4xxSdramDdr2State
*s
= PPC4xx_SDRAM_DDR2(dev
);
654 static void ppc4xx_sdram_ddr2_realize(DeviceState
*dev
, Error
**errp
)
656 Ppc4xxSdramDdr2State
*s
= PPC4xx_SDRAM_DDR2(dev
);
657 Ppc4xxDcrDeviceState
*dcr
= PPC4xx_DCR_DEVICE(dev
);
659 * SoC also has 4 GiB but that causes problem with 32 bit
660 * builds (4*GiB overflows the 32 bit ram_addr_t).
662 const ram_addr_t valid_bank_sizes
[] = {
663 2 * GiB
, 1 * GiB
, 512 * MiB
, 256 * MiB
, 128 * MiB
,
664 64 * MiB
, 32 * MiB
, 16 * MiB
, 8 * MiB
, 0
668 if (s
->nbanks
< 1 || s
->nbanks
> 4) {
669 error_setg(errp
, "Invalid number of RAM banks");
673 error_setg(errp
, "Missing dram memory region");
676 if (!ppc4xx_sdram_banks(s
->dram_mr
, s
->nbanks
, s
->bank
,
677 valid_bank_sizes
, errp
)) {
680 for (i
= 0; i
< s
->nbanks
; i
++) {
681 if (s
->bank
[i
].size
) {
682 s
->bank
[i
].bcr
= sdram_ddr2_bcr(s
->bank
[i
].base
, s
->bank
[i
].size
);
683 s
->bank
[i
].bcr
&= SDRAM_DDR2_BCR_MASK
;
684 sdram_bank_set_bcr(&s
->bank
[i
], s
->bank
[i
].bcr
,
685 s
->bank
[i
].base
, s
->bank
[i
].size
, 0);
687 sdram_bank_set_bcr(&s
->bank
[i
], 0, 0, 0, 0);
689 trace_ppc4xx_sdram_init(sdram_ddr2_base(s
->bank
[i
].bcr
),
690 sdram_ddr2_size(s
->bank
[i
].bcr
),
694 ppc4xx_dcr_register(dcr
, SDRAM0_CFGADDR
,
695 s
, &sdram_ddr2_dcr_read
, &sdram_ddr2_dcr_write
);
696 ppc4xx_dcr_register(dcr
, SDRAM0_CFGDATA
,
697 s
, &sdram_ddr2_dcr_read
, &sdram_ddr2_dcr_write
);
699 ppc4xx_dcr_register(dcr
, SDRAM_R0BAS
,
700 s
, &sdram_ddr2_dcr_read
, &sdram_ddr2_dcr_write
);
701 ppc4xx_dcr_register(dcr
, SDRAM_R1BAS
,
702 s
, &sdram_ddr2_dcr_read
, &sdram_ddr2_dcr_write
);
703 ppc4xx_dcr_register(dcr
, SDRAM_R2BAS
,
704 s
, &sdram_ddr2_dcr_read
, &sdram_ddr2_dcr_write
);
705 ppc4xx_dcr_register(dcr
, SDRAM_R3BAS
,
706 s
, &sdram_ddr2_dcr_read
, &sdram_ddr2_dcr_write
);
707 ppc4xx_dcr_register(dcr
, SDRAM_CONF1HB
,
708 s
, &sdram_ddr2_dcr_read
, &sdram_ddr2_dcr_write
);
709 ppc4xx_dcr_register(dcr
, SDRAM_PLBADDULL
,
710 s
, &sdram_ddr2_dcr_read
, &sdram_ddr2_dcr_write
);
711 ppc4xx_dcr_register(dcr
, SDRAM_CONF1LL
,
712 s
, &sdram_ddr2_dcr_read
, &sdram_ddr2_dcr_write
);
713 ppc4xx_dcr_register(dcr
, SDRAM_CONFPATHB
,
714 s
, &sdram_ddr2_dcr_read
, &sdram_ddr2_dcr_write
);
715 ppc4xx_dcr_register(dcr
, SDRAM_PLBADDUHB
,
716 s
, &sdram_ddr2_dcr_read
, &sdram_ddr2_dcr_write
);
719 static Property ppc4xx_sdram_ddr2_props
[] = {
720 DEFINE_PROP_LINK("dram", Ppc4xxSdramDdr2State
, dram_mr
, TYPE_MEMORY_REGION
,
722 DEFINE_PROP_UINT32("nbanks", Ppc4xxSdramDdr2State
, nbanks
, 4),
723 DEFINE_PROP_END_OF_LIST(),
726 static void ppc4xx_sdram_ddr2_class_init(ObjectClass
*oc
, void *data
)
728 DeviceClass
*dc
= DEVICE_CLASS(oc
);
730 dc
->realize
= ppc4xx_sdram_ddr2_realize
;
731 dc
->reset
= ppc4xx_sdram_ddr2_reset
;
732 /* Reason: only works as function of a ppc4xx SoC */
733 dc
->user_creatable
= false;
734 device_class_set_props(dc
, ppc4xx_sdram_ddr2_props
);
737 void ppc4xx_sdram_ddr2_enable(Ppc4xxSdramDdr2State
*s
)
739 sdram_ddr2_dcr_write(s
, SDRAM0_CFGADDR
, 0x21);
740 sdram_ddr2_dcr_write(s
, SDRAM0_CFGDATA
, 0x08000000);
743 static const TypeInfo ppc4xx_sdram_types
[] = {
745 .name
= TYPE_PPC4xx_SDRAM_DDR
,
746 .parent
= TYPE_PPC4xx_DCR_DEVICE
,
747 .instance_size
= sizeof(Ppc4xxSdramDdrState
),
748 .class_init
= ppc4xx_sdram_ddr_class_init
,
750 .name
= TYPE_PPC4xx_SDRAM_DDR2
,
751 .parent
= TYPE_PPC4xx_DCR_DEVICE
,
752 .instance_size
= sizeof(Ppc4xxSdramDdr2State
),
753 .class_init
= ppc4xx_sdram_ddr2_class_init
,
757 DEFINE_TYPES(ppc4xx_sdram_types
)