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() */
37 #include "exec/cpu-defs.h" /* target_ulong */
39 #include "hw/qdev-properties.h"
40 #include "hw/ppc/ppc4xx.h"
43 /*****************************************************************************/
44 /* Shared functions */
47 * Split RAM between SDRAM banks.
49 * sdram_bank_sizes[] must be in descending order, that is sizes[i] > sizes[i+1]
50 * and must be 0-terminated.
52 * The 4xx SDRAM controller supports a small number of banks, and each bank
53 * must be one of a small set of sizes. The number of banks and the supported
54 * sizes varies by SoC.
56 static void ppc4xx_sdram_banks(MemoryRegion
*ram
, int nr_banks
,
57 Ppc4xxSdramBank ram_banks
[],
58 const ram_addr_t sdram_bank_sizes
[])
60 ram_addr_t size_left
= memory_region_size(ram
);
66 for (i
= 0; i
< nr_banks
; i
++) {
67 for (j
= 0; sdram_bank_sizes
[j
] != 0; j
++) {
68 bank_size
= sdram_bank_sizes
[j
];
69 if (bank_size
<= size_left
) {
72 ram_banks
[i
].base
= base
;
73 ram_banks
[i
].size
= bank_size
;
75 size_left
-= bank_size
;
76 snprintf(name
, sizeof(name
), "ppc4xx.sdram%d", i
);
77 memory_region_init_alias(&ram_banks
[i
].ram
, NULL
, name
, ram
,
78 ram_banks
[i
].base
, ram_banks
[i
].size
);
83 /* No need to use the remaining banks. */
89 ram_addr_t used_size
= memory_region_size(ram
) - size_left
;
90 GString
*s
= g_string_new(NULL
);
92 for (i
= 0; sdram_bank_sizes
[i
]; i
++) {
93 g_string_append_printf(s
, "%" PRIi64
"%s",
94 sdram_bank_sizes
[i
] / MiB
,
95 sdram_bank_sizes
[i
+ 1] ? ", " : "");
97 error_report("at most %d bank%s of %s MiB each supported",
98 nr_banks
, nr_banks
== 1 ? "" : "s", s
->str
);
99 error_printf("Possible valid RAM size: %" PRIi64
" MiB\n",
100 used_size
? used_size
/ MiB
: sdram_bank_sizes
[i
- 1] / MiB
);
102 g_string_free(s
, true);
107 static void sdram_bank_map(Ppc4xxSdramBank
*bank
)
109 memory_region_init(&bank
->container
, NULL
, "sdram-container", bank
->size
);
110 memory_region_add_subregion(&bank
->container
, 0, &bank
->ram
);
111 memory_region_add_subregion(get_system_memory(), bank
->base
,
115 static void sdram_bank_unmap(Ppc4xxSdramBank
*bank
)
117 memory_region_del_subregion(get_system_memory(), &bank
->container
);
118 memory_region_del_subregion(&bank
->container
, &bank
->ram
);
119 object_unparent(OBJECT(&bank
->container
));
123 SDRAM0_CFGADDR
= 0x010,
124 SDRAM0_CFGDATA
= 0x011,
127 /*****************************************************************************/
128 /* DDR SDRAM controller */
130 * XXX: TOFIX: some patches have made this code become inconsistent:
131 * there are type inconsistencies, mixing hwaddr, target_ulong
134 static uint32_t sdram_ddr_bcr(hwaddr ram_base
, hwaddr ram_size
)
161 qemu_log_mask(LOG_GUEST_ERROR
,
162 "%s: invalid RAM size 0x%" HWADDR_PRIx
"\n", __func__
,
166 bcr
|= ram_base
& 0xFF800000;
172 static inline hwaddr
sdram_ddr_base(uint32_t bcr
)
174 return bcr
& 0xFF800000;
177 static target_ulong
sdram_ddr_size(uint32_t bcr
)
182 sh
= (bcr
>> 17) & 0x7;
186 size
= (4 * MiB
) << sh
;
192 static void sdram_ddr_set_bcr(Ppc4xxSdramDdrState
*sdram
, int i
,
193 uint32_t bcr
, int enabled
)
195 if (sdram
->bank
[i
].bcr
& 1) {
197 trace_ppc4xx_sdram_unmap(sdram_ddr_base(sdram
->bank
[i
].bcr
),
198 sdram_ddr_size(sdram
->bank
[i
].bcr
));
199 memory_region_del_subregion(get_system_memory(),
200 &sdram
->bank
[i
].container
);
201 memory_region_del_subregion(&sdram
->bank
[i
].container
,
202 &sdram
->bank
[i
].ram
);
203 object_unparent(OBJECT(&sdram
->bank
[i
].container
));
205 sdram
->bank
[i
].bcr
= bcr
& 0xFFDEE001;
206 if (enabled
&& (bcr
& 1)) {
207 trace_ppc4xx_sdram_map(sdram_ddr_base(bcr
), sdram_ddr_size(bcr
));
208 memory_region_init(&sdram
->bank
[i
].container
, NULL
, "sdram-container",
209 sdram_ddr_size(bcr
));
210 memory_region_add_subregion(&sdram
->bank
[i
].container
, 0,
211 &sdram
->bank
[i
].ram
);
212 memory_region_add_subregion(get_system_memory(),
214 &sdram
->bank
[i
].container
);
218 static void sdram_ddr_map_bcr(Ppc4xxSdramDdrState
*sdram
)
222 for (i
= 0; i
< sdram
->nbanks
; i
++) {
223 if (sdram
->bank
[i
].size
!= 0) {
224 sdram_ddr_set_bcr(sdram
, i
, sdram_ddr_bcr(sdram
->bank
[i
].base
,
225 sdram
->bank
[i
].size
), 1);
227 sdram_ddr_set_bcr(sdram
, i
, 0, 0);
232 static void sdram_ddr_unmap_bcr(Ppc4xxSdramDdrState
*sdram
)
236 for (i
= 0; i
< sdram
->nbanks
; i
++) {
237 trace_ppc4xx_sdram_unmap(sdram_ddr_base(sdram
->bank
[i
].bcr
),
238 sdram_ddr_size(sdram
->bank
[i
].bcr
));
239 memory_region_del_subregion(get_system_memory(),
240 &sdram
->bank
[i
].ram
);
244 static uint32_t sdram_ddr_dcr_read(void *opaque
, int dcrn
)
246 Ppc4xxSdramDdrState
*sdram
= opaque
;
254 switch (sdram
->addr
) {
255 case 0x00: /* SDRAM_BESR0 */
258 case 0x08: /* SDRAM_BESR1 */
261 case 0x10: /* SDRAM_BEAR */
264 case 0x20: /* SDRAM_CFG */
267 case 0x24: /* SDRAM_STATUS */
270 case 0x30: /* SDRAM_RTR */
273 case 0x34: /* SDRAM_PMIT */
276 case 0x40: /* SDRAM_B0CR */
277 ret
= sdram
->bank
[0].bcr
;
279 case 0x44: /* SDRAM_B1CR */
280 ret
= sdram
->bank
[1].bcr
;
282 case 0x48: /* SDRAM_B2CR */
283 ret
= sdram
->bank
[2].bcr
;
285 case 0x4C: /* SDRAM_B3CR */
286 ret
= sdram
->bank
[3].bcr
;
288 case 0x80: /* SDRAM_TR */
291 case 0x94: /* SDRAM_ECCCFG */
294 case 0x98: /* SDRAM_ECCESR */
303 /* Avoid gcc warning */
311 static void sdram_ddr_dcr_write(void *opaque
, int dcrn
, uint32_t val
)
313 Ppc4xxSdramDdrState
*sdram
= opaque
;
320 switch (sdram
->addr
) {
321 case 0x00: /* SDRAM_BESR0 */
322 sdram
->besr0
&= ~val
;
324 case 0x08: /* SDRAM_BESR1 */
325 sdram
->besr1
&= ~val
;
327 case 0x10: /* SDRAM_BEAR */
330 case 0x20: /* SDRAM_CFG */
332 if (!(sdram
->cfg
& 0x80000000) && (val
& 0x80000000)) {
333 trace_ppc4xx_sdram_enable("enable");
334 /* validate all RAM mappings */
335 sdram_ddr_map_bcr(sdram
);
336 sdram
->status
&= ~0x80000000;
337 } else if ((sdram
->cfg
& 0x80000000) && !(val
& 0x80000000)) {
338 trace_ppc4xx_sdram_enable("disable");
339 /* invalidate all RAM mappings */
340 sdram_ddr_unmap_bcr(sdram
);
341 sdram
->status
|= 0x80000000;
343 if (!(sdram
->cfg
& 0x40000000) && (val
& 0x40000000)) {
344 sdram
->status
|= 0x40000000;
345 } else if ((sdram
->cfg
& 0x40000000) && !(val
& 0x40000000)) {
346 sdram
->status
&= ~0x40000000;
350 case 0x24: /* SDRAM_STATUS */
351 /* Read-only register */
353 case 0x30: /* SDRAM_RTR */
354 sdram
->rtr
= val
& 0x3FF80000;
356 case 0x34: /* SDRAM_PMIT */
357 sdram
->pmit
= (val
& 0xF8000000) | 0x07C00000;
359 case 0x40: /* SDRAM_B0CR */
360 sdram_ddr_set_bcr(sdram
, 0, val
, sdram
->cfg
& 0x80000000);
362 case 0x44: /* SDRAM_B1CR */
363 sdram_ddr_set_bcr(sdram
, 1, val
, sdram
->cfg
& 0x80000000);
365 case 0x48: /* SDRAM_B2CR */
366 sdram_ddr_set_bcr(sdram
, 2, val
, sdram
->cfg
& 0x80000000);
368 case 0x4C: /* SDRAM_B3CR */
369 sdram_ddr_set_bcr(sdram
, 3, val
, sdram
->cfg
& 0x80000000);
371 case 0x80: /* SDRAM_TR */
372 sdram
->tr
= val
& 0x018FC01F;
374 case 0x94: /* SDRAM_ECCCFG */
375 sdram
->ecccfg
= val
& 0x00F00000;
377 case 0x98: /* SDRAM_ECCESR */
379 if (sdram
->eccesr
== 0 && val
!= 0) {
380 qemu_irq_raise(sdram
->irq
);
381 } else if (sdram
->eccesr
!= 0 && val
== 0) {
382 qemu_irq_lower(sdram
->irq
);
393 static void ppc4xx_sdram_ddr_reset(DeviceState
*dev
)
395 Ppc4xxSdramDdrState
*sdram
= PPC4xx_SDRAM_DDR(dev
);
399 sdram
->besr0
= 0; /* No error */
400 sdram
->besr1
= 0; /* No error */
402 sdram
->ecccfg
= 0; /* No ECC */
403 sdram
->eccesr
= 0; /* No error */
404 sdram
->pmit
= 0x07C00000;
405 sdram
->rtr
= 0x05F00000;
406 sdram
->tr
= 0x00854009;
407 /* We pre-initialize RAM banks */
409 sdram
->cfg
= 0x00800000;
412 static void ppc4xx_sdram_ddr_realize(DeviceState
*dev
, Error
**errp
)
414 Ppc4xxSdramDdrState
*s
= PPC4xx_SDRAM_DDR(dev
);
415 Ppc4xxDcrDeviceState
*dcr
= PPC4xx_DCR_DEVICE(dev
);
416 const ram_addr_t valid_bank_sizes
[] = {
417 256 * MiB
, 128 * MiB
, 64 * MiB
, 32 * MiB
, 16 * MiB
, 8 * MiB
, 4 * MiB
, 0
420 if (s
->nbanks
< 1 || s
->nbanks
> 4) {
421 error_setg(errp
, "Invalid number of RAM banks");
425 error_setg(errp
, "Missing dram memory region");
428 ppc4xx_sdram_banks(s
->dram_mr
, s
->nbanks
, s
->bank
, valid_bank_sizes
);
430 sysbus_init_irq(SYS_BUS_DEVICE(dev
), &s
->irq
);
432 ppc4xx_dcr_register(dcr
, SDRAM0_CFGADDR
,
433 s
, &sdram_ddr_dcr_read
, &sdram_ddr_dcr_write
);
434 ppc4xx_dcr_register(dcr
, SDRAM0_CFGDATA
,
435 s
, &sdram_ddr_dcr_read
, &sdram_ddr_dcr_write
);
438 static Property ppc4xx_sdram_ddr_props
[] = {
439 DEFINE_PROP_LINK("dram", Ppc4xxSdramDdrState
, dram_mr
, TYPE_MEMORY_REGION
,
441 DEFINE_PROP_UINT32("nbanks", Ppc4xxSdramDdrState
, nbanks
, 4),
442 DEFINE_PROP_END_OF_LIST(),
445 static void ppc4xx_sdram_ddr_class_init(ObjectClass
*oc
, void *data
)
447 DeviceClass
*dc
= DEVICE_CLASS(oc
);
449 dc
->realize
= ppc4xx_sdram_ddr_realize
;
450 dc
->reset
= ppc4xx_sdram_ddr_reset
;
451 /* Reason: only works as function of a ppc4xx SoC */
452 dc
->user_creatable
= false;
453 device_class_set_props(dc
, ppc4xx_sdram_ddr_props
);
456 void ppc4xx_sdram_ddr_enable(Ppc4xxSdramDdrState
*s
)
458 sdram_ddr_dcr_write(s
, SDRAM0_CFGADDR
, 0x20);
459 sdram_ddr_dcr_write(s
, SDRAM0_CFGDATA
, 0x80000000);
462 /*****************************************************************************/
463 /* DDR2 SDRAM controller */
469 SDRAM_CONF1HB
= 0x45,
470 SDRAM_PLBADDULL
= 0x4a,
471 SDRAM_CONF1LL
= 0x4b,
472 SDRAM_CONFPATHB
= 0x4f,
473 SDRAM_PLBADDUHB
= 0x50,
476 static uint32_t sdram_ddr2_bcr(hwaddr ram_base
, hwaddr ram_size
)
512 error_report("invalid RAM size " TARGET_FMT_plx
, ram_size
);
515 bcr
|= ram_base
>> 2 & 0xffe00000;
521 static inline hwaddr
sdram_ddr2_base(uint32_t bcr
)
523 return (bcr
& 0xffe00000) << 2;
526 static uint64_t sdram_ddr2_size(uint32_t bcr
)
531 sh
= 1024 - ((bcr
>> 6) & 0x3ff);
537 static void sdram_ddr2_set_bcr(Ppc4xxSdramDdr2State
*sdram
, int i
,
538 uint32_t bcr
, int enabled
)
540 if (sdram
->bank
[i
].bcr
& 1) {
541 /* First unmap RAM if enabled */
542 trace_ppc4xx_sdram_unmap(sdram_ddr2_base(sdram
->bank
[i
].bcr
),
543 sdram_ddr2_size(sdram
->bank
[i
].bcr
));
544 sdram_bank_unmap(&sdram
->bank
[i
]);
546 sdram
->bank
[i
].bcr
= bcr
& 0xffe0ffc1;
547 if (enabled
&& (bcr
& 1)) {
548 trace_ppc4xx_sdram_map(sdram_ddr2_base(bcr
), sdram_ddr2_size(bcr
));
549 sdram_bank_map(&sdram
->bank
[i
]);
553 static void sdram_ddr2_map_bcr(Ppc4xxSdramDdr2State
*sdram
)
557 for (i
= 0; i
< sdram
->nbanks
; i
++) {
558 if (sdram
->bank
[i
].size
) {
559 sdram_ddr2_set_bcr(sdram
, i
,
560 sdram_ddr2_bcr(sdram
->bank
[i
].base
,
561 sdram
->bank
[i
].size
), 1);
563 sdram_ddr2_set_bcr(sdram
, i
, 0, 0);
568 static void sdram_ddr2_unmap_bcr(Ppc4xxSdramDdr2State
*sdram
)
572 for (i
= 0; i
< sdram
->nbanks
; i
++) {
573 if (sdram
->bank
[i
].size
) {
574 sdram_ddr2_set_bcr(sdram
, i
, sdram
->bank
[i
].bcr
& ~1, 0);
579 static uint32_t sdram_ddr2_dcr_read(void *opaque
, int dcrn
)
581 Ppc4xxSdramDdr2State
*sdram
= opaque
;
589 if (sdram
->bank
[dcrn
- SDRAM_R0BAS
].size
) {
590 ret
= sdram_ddr2_bcr(sdram
->bank
[dcrn
- SDRAM_R0BAS
].base
,
591 sdram
->bank
[dcrn
- SDRAM_R0BAS
].size
);
596 case SDRAM_CONFPATHB
:
597 case SDRAM_PLBADDULL
:
598 case SDRAM_PLBADDUHB
:
604 switch (sdram
->addr
) {
605 case 0x14: /* SDRAM_MCSTAT (405EX) */
609 case 0x21: /* SDRAM_MCOPT2 */
612 case 0x40: /* SDRAM_MB0CF */
615 case 0x7A: /* SDRAM_DLCR */
618 case 0xE1: /* SDR0_DDR0 */
619 ret
= SDR0_DDR0_DDRM_ENCODE(1) | SDR0_DDR0_DDRM_DDR1
;
632 #define SDRAM_DDR2_MCOPT2_DCEN BIT(27)
634 static void sdram_ddr2_dcr_write(void *opaque
, int dcrn
, uint32_t val
)
636 Ppc4xxSdramDdr2State
*sdram
= opaque
;
645 case SDRAM_CONFPATHB
:
646 case SDRAM_PLBADDULL
:
647 case SDRAM_PLBADDUHB
:
653 switch (sdram
->addr
) {
654 case 0x00: /* B0CR */
656 case 0x21: /* SDRAM_MCOPT2 */
657 if (!(sdram
->mcopt2
& SDRAM_DDR2_MCOPT2_DCEN
) &&
658 (val
& SDRAM_DDR2_MCOPT2_DCEN
)) {
659 trace_ppc4xx_sdram_enable("enable");
660 /* validate all RAM mappings */
661 sdram_ddr2_map_bcr(sdram
);
662 sdram
->mcopt2
|= SDRAM_DDR2_MCOPT2_DCEN
;
663 } else if ((sdram
->mcopt2
& SDRAM_DDR2_MCOPT2_DCEN
) &&
664 !(val
& SDRAM_DDR2_MCOPT2_DCEN
)) {
665 trace_ppc4xx_sdram_enable("disable");
666 /* invalidate all RAM mappings */
667 sdram_ddr2_unmap_bcr(sdram
);
668 sdram
->mcopt2
&= ~SDRAM_DDR2_MCOPT2_DCEN
;
680 static void ppc4xx_sdram_ddr2_reset(DeviceState
*dev
)
682 Ppc4xxSdramDdr2State
*sdram
= PPC4xx_SDRAM_DDR2(dev
);
688 static void ppc4xx_sdram_ddr2_realize(DeviceState
*dev
, Error
**errp
)
690 Ppc4xxSdramDdr2State
*s
= PPC4xx_SDRAM_DDR2(dev
);
691 Ppc4xxDcrDeviceState
*dcr
= PPC4xx_DCR_DEVICE(dev
);
693 * SoC also has 4 GiB but that causes problem with 32 bit
694 * builds (4*GiB overflows the 32 bit ram_addr_t).
696 const ram_addr_t valid_bank_sizes
[] = {
697 2 * GiB
, 1 * GiB
, 512 * MiB
, 256 * MiB
, 128 * MiB
,
698 64 * MiB
, 32 * MiB
, 16 * MiB
, 8 * MiB
, 0
701 if (s
->nbanks
< 1 || s
->nbanks
> 4) {
702 error_setg(errp
, "Invalid number of RAM banks");
706 error_setg(errp
, "Missing dram memory region");
709 ppc4xx_sdram_banks(s
->dram_mr
, s
->nbanks
, s
->bank
, valid_bank_sizes
);
711 ppc4xx_dcr_register(dcr
, SDRAM0_CFGADDR
,
712 s
, &sdram_ddr2_dcr_read
, &sdram_ddr2_dcr_write
);
713 ppc4xx_dcr_register(dcr
, SDRAM0_CFGDATA
,
714 s
, &sdram_ddr2_dcr_read
, &sdram_ddr2_dcr_write
);
716 ppc4xx_dcr_register(dcr
, SDRAM_R0BAS
,
717 s
, &sdram_ddr2_dcr_read
, &sdram_ddr2_dcr_write
);
718 ppc4xx_dcr_register(dcr
, SDRAM_R1BAS
,
719 s
, &sdram_ddr2_dcr_read
, &sdram_ddr2_dcr_write
);
720 ppc4xx_dcr_register(dcr
, SDRAM_R2BAS
,
721 s
, &sdram_ddr2_dcr_read
, &sdram_ddr2_dcr_write
);
722 ppc4xx_dcr_register(dcr
, SDRAM_R3BAS
,
723 s
, &sdram_ddr2_dcr_read
, &sdram_ddr2_dcr_write
);
724 ppc4xx_dcr_register(dcr
, SDRAM_CONF1HB
,
725 s
, &sdram_ddr2_dcr_read
, &sdram_ddr2_dcr_write
);
726 ppc4xx_dcr_register(dcr
, SDRAM_PLBADDULL
,
727 s
, &sdram_ddr2_dcr_read
, &sdram_ddr2_dcr_write
);
728 ppc4xx_dcr_register(dcr
, SDRAM_CONF1LL
,
729 s
, &sdram_ddr2_dcr_read
, &sdram_ddr2_dcr_write
);
730 ppc4xx_dcr_register(dcr
, SDRAM_CONFPATHB
,
731 s
, &sdram_ddr2_dcr_read
, &sdram_ddr2_dcr_write
);
732 ppc4xx_dcr_register(dcr
, SDRAM_PLBADDUHB
,
733 s
, &sdram_ddr2_dcr_read
, &sdram_ddr2_dcr_write
);
736 static Property ppc4xx_sdram_ddr2_props
[] = {
737 DEFINE_PROP_LINK("dram", Ppc4xxSdramDdr2State
, dram_mr
, TYPE_MEMORY_REGION
,
739 DEFINE_PROP_UINT32("nbanks", Ppc4xxSdramDdr2State
, nbanks
, 4),
740 DEFINE_PROP_END_OF_LIST(),
743 static void ppc4xx_sdram_ddr2_class_init(ObjectClass
*oc
, void *data
)
745 DeviceClass
*dc
= DEVICE_CLASS(oc
);
747 dc
->realize
= ppc4xx_sdram_ddr2_realize
;
748 dc
->reset
= ppc4xx_sdram_ddr2_reset
;
749 /* Reason: only works as function of a ppc4xx SoC */
750 dc
->user_creatable
= false;
751 device_class_set_props(dc
, ppc4xx_sdram_ddr2_props
);
754 void ppc4xx_sdram_ddr2_enable(Ppc4xxSdramDdr2State
*s
)
756 sdram_ddr2_dcr_write(s
, SDRAM0_CFGADDR
, 0x21);
757 sdram_ddr2_dcr_write(s
, SDRAM0_CFGDATA
, 0x08000000);
760 static const TypeInfo ppc4xx_sdram_types
[] = {
762 .name
= TYPE_PPC4xx_SDRAM_DDR
,
763 .parent
= TYPE_PPC4xx_DCR_DEVICE
,
764 .instance_size
= sizeof(Ppc4xxSdramDdrState
),
765 .class_init
= ppc4xx_sdram_ddr_class_init
,
767 .name
= TYPE_PPC4xx_SDRAM_DDR2
,
768 .parent
= TYPE_PPC4xx_DCR_DEVICE
,
769 .instance_size
= sizeof(Ppc4xxSdramDdr2State
),
770 .class_init
= ppc4xx_sdram_ddr2_class_init
,
774 DEFINE_TYPES(ppc4xx_sdram_types
)