10
#include "qemu/osdep.h"
12
#include "qemu/module.h"
13
#include "qemu/error-report.h"
14
#include "hw/misc/aspeed_sdmc.h"
15
#include "hw/qdev-properties.h"
16
#include "migration/vmstate.h"
17
#include "qapi/error.h"
19
#include "qemu/units.h"
20
#include "qemu/cutils.h"
21
#include "qapi/visitor.h"
24
#define R_PROT (0x00 / 4)
25
#define PROT_UNLOCKED 0x01
26
#define PROT_HARDLOCKED 0x10
27
#define PROT_SOFTLOCKED 0x00
29
#define PROT_KEY_UNLOCK 0xFC600309
30
#define PROT_2700_KEY_UNLOCK 0x1688A8A8
31
#define PROT_KEY_HARDLOCK 0xDEADDEAD
34
#define R_CONF (0x04 / 4)
37
#define R_ISR (0x50 / 4)
40
#define R_STATUS1 (0x60 / 4)
41
#define PHY_BUSY_STATE BIT(0)
42
#define PHY_PLL_LOCK_STATUS BIT(4)
45
#define R_MCR6C (0x6c / 4)
47
#define R_ECC_TEST_CTRL (0x70 / 4)
48
#define ECC_TEST_FINISHED BIT(12)
49
#define ECC_TEST_FAIL BIT(13)
51
#define R_TEST_START_LEN (0x74 / 4)
52
#define R_TEST_FAIL_DQ (0x78 / 4)
53
#define R_TEST_INIT_VAL (0x7c / 4)
54
#define R_DRAM_SW (0x88 / 4)
55
#define R_DRAM_TIME (0x8c / 4)
56
#define R_ECC_ERR_INJECT (0xb4 / 4)
59
#define R_2700_PROT (0x00 / 4)
60
#define R_INT_STATUS (0x04 / 4)
61
#define R_INT_CLEAR (0x08 / 4)
62
#define R_INT_MASK (0x0c / 4)
63
#define R_MAIN_CONF (0x10 / 4)
64
#define R_MAIN_CONTROL (0x14 / 4)
65
#define R_MAIN_STATUS (0x18 / 4)
66
#define R_ERR_STATUS (0x1c / 4)
67
#define R_ECC_FAIL_STATUS (0x78 / 4)
68
#define R_ECC_FAIL_ADDR (0x7c / 4)
69
#define R_ECC_TESTING_CONTROL (0x80 / 4)
70
#define R_PROT_REGION_LOCK_STATUS (0x94 / 4)
71
#define R_TEST_FAIL_ADDR (0xd4 / 4)
72
#define R_TEST_FAIL_D0 (0xd8 / 4)
73
#define R_TEST_FAIL_D1 (0xdc / 4)
74
#define R_TEST_FAIL_D2 (0xe0 / 4)
75
#define R_TEST_FAIL_D3 (0xe4 / 4)
76
#define R_DBG_STATUS (0xf4 / 4)
77
#define R_PHY_INTERFACE_STATUS (0xf8 / 4)
78
#define R_GRAPHIC_MEM_BASE_ADDR (0x10c / 4)
79
#define R_PORT0_INTERFACE_MONITOR0 (0x240 / 4)
80
#define R_PORT0_INTERFACE_MONITOR1 (0x244 / 4)
81
#define R_PORT0_INTERFACE_MONITOR2 (0x248 / 4)
82
#define R_PORT1_INTERFACE_MONITOR0 (0x2c0 / 4)
83
#define R_PORT1_INTERFACE_MONITOR1 (0x2c4 / 4)
84
#define R_PORT1_INTERFACE_MONITOR2 (0x2c8 / 4)
85
#define R_PORT2_INTERFACE_MONITOR0 (0x340 / 4)
86
#define R_PORT2_INTERFACE_MONITOR1 (0x344 / 4)
87
#define R_PORT2_INTERFACE_MONITOR2 (0x348 / 4)
88
#define R_PORT3_INTERFACE_MONITOR0 (0x3c0 / 4)
89
#define R_PORT3_INTERFACE_MONITOR1 (0x3c4 / 4)
90
#define R_PORT3_INTERFACE_MONITOR2 (0x3c8 / 4)
91
#define R_PORT4_INTERFACE_MONITOR0 (0x440 / 4)
92
#define R_PORT4_INTERFACE_MONITOR1 (0x444 / 4)
93
#define R_PORT4_INTERFACE_MONITOR2 (0x448 / 4)
94
#define R_PORT5_INTERFACE_MONITOR0 (0x4c0 / 4)
95
#define R_PORT5_INTERFACE_MONITOR1 (0x4c4 / 4)
96
#define R_PORT5_INTERFACE_MONITOR2 (0x4c8 / 4)
106
#define ASPEED_SDMC_RESERVED 0xFFFFF800
107
#define ASPEED_SDMC_AST2300_COMPAT (1 << 10)
108
#define ASPEED_SDMC_SCRAMBLE_PATTERN (1 << 9)
109
#define ASPEED_SDMC_DATA_SCRAMBLE (1 << 8)
110
#define ASPEED_SDMC_ECC_ENABLE (1 << 7)
111
#define ASPEED_SDMC_VGA_COMPAT (1 << 6)
112
#define ASPEED_SDMC_DRAM_BANK (1 << 5)
113
#define ASPEED_SDMC_DRAM_BURST (1 << 4)
114
#define ASPEED_SDMC_VGA_APERTURE(x) ((x & 0x3) << 2)
115
#define ASPEED_SDMC_VGA_8MB 0x0
116
#define ASPEED_SDMC_VGA_16MB 0x1
117
#define ASPEED_SDMC_VGA_32MB 0x2
118
#define ASPEED_SDMC_VGA_64MB 0x3
119
#define ASPEED_SDMC_DRAM_SIZE(x) (x & 0x3)
121
#define ASPEED_SDMC_READONLY_MASK \
122
(ASPEED_SDMC_RESERVED | ASPEED_SDMC_VGA_COMPAT | \
123
ASPEED_SDMC_VGA_APERTURE(ASPEED_SDMC_VGA_64MB))
130
#define ASPEED_SDMC_HW_VERSION(x) ((x & 0xf) << 28)
131
#define ASPEED_SDMC_SW_VERSION ((x & 0xff) << 20)
132
#define ASPEED_SDMC_CACHE_INITIAL_DONE (1 << 19)
133
#define ASPEED_SDMC_AST2500_RESERVED 0x7C000
134
#define ASPEED_SDMC_CACHE_DDR4_CONF (1 << 13)
135
#define ASPEED_SDMC_CACHE_INITIAL (1 << 12)
136
#define ASPEED_SDMC_CACHE_RANGE_CTRL (1 << 11)
137
#define ASPEED_SDMC_CACHE_ENABLE (1 << 10)
138
#define ASPEED_SDMC_DRAM_TYPE (1 << 4)
140
#define ASPEED_SDMC_AST2500_READONLY_MASK \
141
(ASPEED_SDMC_HW_VERSION(0xf) | ASPEED_SDMC_CACHE_INITIAL_DONE | \
142
ASPEED_SDMC_AST2500_RESERVED | ASPEED_SDMC_VGA_COMPAT | \
143
ASPEED_SDMC_VGA_APERTURE(ASPEED_SDMC_VGA_64MB))
149
#define ASPEED_SDMC_AST2700_RESERVED 0xFFFF2082
150
#define ASPEED_SDMC_AST2700_DATA_SCRAMBLE (1 << 8)
151
#define ASPEED_SDMC_AST2700_ECC_ENABLE (1 << 6)
152
#define ASPEED_SDMC_AST2700_PAGE_MATCHING_ENABLE (1 << 5)
153
#define ASPEED_SDMC_AST2700_DRAM_SIZE(x) ((x & 0x7) << 2)
155
#define ASPEED_SDMC_AST2700_READONLY_MASK \
156
(ASPEED_SDMC_AST2700_RESERVED)
158
static uint64_t aspeed_sdmc_read(void *opaque, hwaddr addr, unsigned size)
160
AspeedSDMCState *s = ASPEED_SDMC(opaque);
164
if (addr >= ARRAY_SIZE(s->regs)) {
165
qemu_log_mask(LOG_GUEST_ERROR,
166
"%s: Out-of-bounds read at offset 0x%" HWADDR_PRIx "\n",
171
trace_aspeed_sdmc_read(addr, s->regs[addr]);
172
return s->regs[addr];
175
static void aspeed_sdmc_write(void *opaque, hwaddr addr, uint64_t data,
178
AspeedSDMCState *s = ASPEED_SDMC(opaque);
179
AspeedSDMCClass *asc = ASPEED_SDMC_GET_CLASS(s);
183
if (addr >= ARRAY_SIZE(s->regs)) {
184
qemu_log_mask(LOG_GUEST_ERROR,
185
"%s: Out-of-bounds write at offset 0x%" HWADDR_PRIx "\n",
190
trace_aspeed_sdmc_write(addr, data);
191
asc->write(s, addr, data);
194
static const MemoryRegionOps aspeed_sdmc_ops = {
195
.read = aspeed_sdmc_read,
196
.write = aspeed_sdmc_write,
197
.endianness = DEVICE_LITTLE_ENDIAN,
198
.valid.min_access_size = 4,
199
.valid.max_access_size = 4,
202
static void aspeed_sdmc_reset(DeviceState *dev)
204
AspeedSDMCState *s = ASPEED_SDMC(dev);
205
AspeedSDMCClass *asc = ASPEED_SDMC_GET_CLASS(s);
207
memset(s->regs, 0, sizeof(s->regs));
210
s->regs[R_CONF] = asc->compute_conf(s, 0);
218
s->regs[0x100] = BIT(1);
221
s->regs[0x100 | (0x68 / 4)] = 0xff;
222
s->regs[0x100 | (0x7c / 4)] = 0xff;
223
s->regs[0x100 | (0x50 / 4)] = 0xfffffff;
226
static void aspeed_sdmc_get_ram_size(Object *obj, Visitor *v, const char *name,
227
void *opaque, Error **errp)
229
AspeedSDMCState *s = ASPEED_SDMC(obj);
230
int64_t value = s->ram_size;
232
visit_type_int(v, name, &value, errp);
235
static void aspeed_sdmc_set_ram_size(Object *obj, Visitor *v, const char *name,
236
void *opaque, Error **errp)
241
AspeedSDMCState *s = ASPEED_SDMC(obj);
242
AspeedSDMCClass *asc = ASPEED_SDMC_GET_CLASS(s);
244
if (!visit_type_int(v, name, &value, errp)) {
248
for (i = 0; asc->valid_ram_sizes[i]; i++) {
249
if (value == asc->valid_ram_sizes[i]) {
255
sz = size_to_str(value);
256
error_setg(errp, "Invalid RAM size %s", sz);
260
static void aspeed_sdmc_initfn(Object *obj)
262
object_property_add(obj, "ram-size", "int",
263
aspeed_sdmc_get_ram_size, aspeed_sdmc_set_ram_size,
267
static void aspeed_sdmc_realize(DeviceState *dev, Error **errp)
269
SysBusDevice *sbd = SYS_BUS_DEVICE(dev);
270
AspeedSDMCState *s = ASPEED_SDMC(dev);
271
AspeedSDMCClass *asc = ASPEED_SDMC_GET_CLASS(s);
273
assert(asc->max_ram_size < 4 * GiB || asc->is_bus64bit);
276
error_setg(errp, "RAM size is not set");
280
s->max_ram_size = asc->max_ram_size;
282
memory_region_init_io(&s->iomem, OBJECT(s), &aspeed_sdmc_ops, s,
283
TYPE_ASPEED_SDMC, 0x1000);
284
sysbus_init_mmio(sbd, &s->iomem);
287
static const VMStateDescription vmstate_aspeed_sdmc = {
288
.name = "aspeed.sdmc",
290
.minimum_version_id = 2,
291
.fields = (const VMStateField[]) {
292
VMSTATE_UINT32_ARRAY(regs, AspeedSDMCState, ASPEED_SDMC_NR_REGS),
293
VMSTATE_END_OF_LIST()
297
static Property aspeed_sdmc_properties[] = {
298
DEFINE_PROP_UINT64("max-ram-size", AspeedSDMCState, max_ram_size, 0),
299
DEFINE_PROP_BOOL("unlocked", AspeedSDMCState, unlocked, false),
300
DEFINE_PROP_END_OF_LIST(),
303
static void aspeed_sdmc_class_init(ObjectClass *klass, void *data)
305
DeviceClass *dc = DEVICE_CLASS(klass);
306
dc->realize = aspeed_sdmc_realize;
307
dc->reset = aspeed_sdmc_reset;
308
dc->desc = "ASPEED SDRAM Memory Controller";
309
dc->vmsd = &vmstate_aspeed_sdmc;
310
device_class_set_props(dc, aspeed_sdmc_properties);
313
static const TypeInfo aspeed_sdmc_info = {
314
.name = TYPE_ASPEED_SDMC,
315
.parent = TYPE_SYS_BUS_DEVICE,
316
.instance_size = sizeof(AspeedSDMCState),
317
.instance_init = aspeed_sdmc_initfn,
318
.class_init = aspeed_sdmc_class_init,
319
.class_size = sizeof(AspeedSDMCClass),
323
static int aspeed_sdmc_get_ram_bits(AspeedSDMCState *s)
325
AspeedSDMCClass *asc = ASPEED_SDMC_GET_CLASS(s);
332
for (i = 0; asc->valid_ram_sizes[i]; i++) {
333
if (s->ram_size == asc->valid_ram_sizes[i]) {
342
g_assert_not_reached();
345
static uint32_t aspeed_2400_sdmc_compute_conf(AspeedSDMCState *s, uint32_t data)
347
uint32_t fixed_conf = ASPEED_SDMC_VGA_COMPAT |
348
ASPEED_SDMC_DRAM_SIZE(aspeed_sdmc_get_ram_bits(s));
351
data &= ~ASPEED_SDMC_READONLY_MASK;
353
return data | fixed_conf;
356
static void aspeed_2400_sdmc_write(AspeedSDMCState *s, uint32_t reg,
361
(data == PROT_KEY_UNLOCK) ? PROT_UNLOCKED : PROT_SOFTLOCKED;
365
if (!s->regs[R_PROT]) {
366
qemu_log_mask(LOG_GUEST_ERROR, "%s: SDMC is locked!\n", __func__);
372
data = aspeed_2400_sdmc_compute_conf(s, data);
382
aspeed_2400_ram_sizes[] = { 64 * MiB, 128 * MiB, 256 * MiB, 512 * MiB, 0};
384
static void aspeed_2400_sdmc_class_init(ObjectClass *klass, void *data)
386
DeviceClass *dc = DEVICE_CLASS(klass);
387
AspeedSDMCClass *asc = ASPEED_SDMC_CLASS(klass);
389
dc->desc = "ASPEED 2400 SDRAM Memory Controller";
390
asc->max_ram_size = 512 * MiB;
391
asc->compute_conf = aspeed_2400_sdmc_compute_conf;
392
asc->write = aspeed_2400_sdmc_write;
393
asc->valid_ram_sizes = aspeed_2400_ram_sizes;
396
static const TypeInfo aspeed_2400_sdmc_info = {
397
.name = TYPE_ASPEED_2400_SDMC,
398
.parent = TYPE_ASPEED_SDMC,
399
.class_init = aspeed_2400_sdmc_class_init,
402
static uint32_t aspeed_2500_sdmc_compute_conf(AspeedSDMCState *s, uint32_t data)
404
uint32_t fixed_conf = ASPEED_SDMC_HW_VERSION(1) |
405
ASPEED_SDMC_VGA_APERTURE(ASPEED_SDMC_VGA_64MB) |
406
ASPEED_SDMC_CACHE_INITIAL_DONE |
407
ASPEED_SDMC_DRAM_SIZE(aspeed_sdmc_get_ram_bits(s));
410
data &= ~ASPEED_SDMC_AST2500_READONLY_MASK;
412
return data | fixed_conf;
415
static void aspeed_2500_sdmc_write(AspeedSDMCState *s, uint32_t reg,
420
(data == PROT_KEY_UNLOCK) ? PROT_UNLOCKED : PROT_SOFTLOCKED;
424
if (!s->regs[R_PROT]) {
425
qemu_log_mask(LOG_GUEST_ERROR, "%s: SDMC is locked!\n", __func__);
431
data = aspeed_2500_sdmc_compute_conf(s, data);
435
data &= ~PHY_BUSY_STATE;
437
case R_ECC_TEST_CTRL:
439
data |= ECC_TEST_FINISHED;
440
data &= ~ECC_TEST_FAIL;
450
aspeed_2500_ram_sizes[] = { 128 * MiB, 256 * MiB, 512 * MiB, 1024 * MiB, 0};
452
static void aspeed_2500_sdmc_class_init(ObjectClass *klass, void *data)
454
DeviceClass *dc = DEVICE_CLASS(klass);
455
AspeedSDMCClass *asc = ASPEED_SDMC_CLASS(klass);
457
dc->desc = "ASPEED 2500 SDRAM Memory Controller";
458
asc->max_ram_size = 1 * GiB;
459
asc->compute_conf = aspeed_2500_sdmc_compute_conf;
460
asc->write = aspeed_2500_sdmc_write;
461
asc->valid_ram_sizes = aspeed_2500_ram_sizes;
464
static const TypeInfo aspeed_2500_sdmc_info = {
465
.name = TYPE_ASPEED_2500_SDMC,
466
.parent = TYPE_ASPEED_SDMC,
467
.class_init = aspeed_2500_sdmc_class_init,
470
static uint32_t aspeed_2600_sdmc_compute_conf(AspeedSDMCState *s, uint32_t data)
472
uint32_t fixed_conf = ASPEED_SDMC_HW_VERSION(3) |
473
ASPEED_SDMC_VGA_APERTURE(ASPEED_SDMC_VGA_64MB) |
474
ASPEED_SDMC_DRAM_SIZE(aspeed_sdmc_get_ram_bits(s));
477
data &= ~ASPEED_SDMC_AST2500_READONLY_MASK;
479
return data | fixed_conf;
482
static void aspeed_2600_sdmc_write(AspeedSDMCState *s, uint32_t reg,
489
case R_TEST_START_LEN:
491
case R_TEST_INIT_VAL:
494
case R_ECC_ERR_INJECT:
499
if (s->regs[R_PROT] == PROT_HARDLOCKED) {
500
qemu_log_mask(LOG_GUEST_ERROR,
501
"%s: SDMC is locked until system reset!\n",
506
if (reg != R_PROT && s->regs[R_PROT] == PROT_SOFTLOCKED) {
507
qemu_log_mask(LOG_GUEST_ERROR,
508
"%s: SDMC is locked! (write to MCR%02x blocked)\n",
515
if (data == PROT_KEY_UNLOCK) {
516
data = PROT_UNLOCKED;
517
} else if (data == PROT_KEY_HARDLOCK) {
518
data = PROT_HARDLOCKED;
520
data = PROT_SOFTLOCKED;
524
data = aspeed_2600_sdmc_compute_conf(s, data);
528
data &= ~PHY_BUSY_STATE;
529
data |= PHY_PLL_LOCK_STATUS;
531
case R_ECC_TEST_CTRL:
533
data |= ECC_TEST_FINISHED;
534
data &= ~ECC_TEST_FAIL;
544
aspeed_2600_ram_sizes[] = { 256 * MiB, 512 * MiB, 1024 * MiB, 2048 * MiB, 0};
546
static void aspeed_2600_sdmc_class_init(ObjectClass *klass, void *data)
548
DeviceClass *dc = DEVICE_CLASS(klass);
549
AspeedSDMCClass *asc = ASPEED_SDMC_CLASS(klass);
551
dc->desc = "ASPEED 2600 SDRAM Memory Controller";
552
asc->max_ram_size = 2 * GiB;
553
asc->compute_conf = aspeed_2600_sdmc_compute_conf;
554
asc->write = aspeed_2600_sdmc_write;
555
asc->valid_ram_sizes = aspeed_2600_ram_sizes;
558
static const TypeInfo aspeed_2600_sdmc_info = {
559
.name = TYPE_ASPEED_2600_SDMC,
560
.parent = TYPE_ASPEED_SDMC,
561
.class_init = aspeed_2600_sdmc_class_init,
564
static void aspeed_2700_sdmc_reset(DeviceState *dev)
566
AspeedSDMCState *s = ASPEED_SDMC(dev);
567
AspeedSDMCClass *asc = ASPEED_SDMC_GET_CLASS(s);
569
memset(s->regs, 0, sizeof(s->regs));
572
s->regs[R_MAIN_CONF] = asc->compute_conf(s, 0);
575
s->regs[R_2700_PROT] = PROT_UNLOCKED;
579
static uint32_t aspeed_2700_sdmc_compute_conf(AspeedSDMCState *s, uint32_t data)
581
uint32_t fixed_conf = ASPEED_SDMC_AST2700_PAGE_MATCHING_ENABLE |
582
ASPEED_SDMC_AST2700_DRAM_SIZE(aspeed_sdmc_get_ram_bits(s));
585
data &= ~ASPEED_SDMC_AST2700_READONLY_MASK;
587
return data | fixed_conf;
590
static void aspeed_2700_sdmc_write(AspeedSDMCState *s, uint32_t reg,
599
case R_ECC_FAIL_STATUS:
600
case R_ECC_FAIL_ADDR:
601
case R_PROT_REGION_LOCK_STATUS:
602
case R_TEST_FAIL_ADDR:
608
case R_PHY_INTERFACE_STATUS:
609
case R_GRAPHIC_MEM_BASE_ADDR:
610
case R_PORT0_INTERFACE_MONITOR0:
611
case R_PORT0_INTERFACE_MONITOR1:
612
case R_PORT0_INTERFACE_MONITOR2:
613
case R_PORT1_INTERFACE_MONITOR0:
614
case R_PORT1_INTERFACE_MONITOR1:
615
case R_PORT1_INTERFACE_MONITOR2:
616
case R_PORT2_INTERFACE_MONITOR0:
617
case R_PORT2_INTERFACE_MONITOR1:
618
case R_PORT2_INTERFACE_MONITOR2:
619
case R_PORT3_INTERFACE_MONITOR0:
620
case R_PORT3_INTERFACE_MONITOR1:
621
case R_PORT3_INTERFACE_MONITOR2:
622
case R_PORT4_INTERFACE_MONITOR0:
623
case R_PORT4_INTERFACE_MONITOR1:
624
case R_PORT4_INTERFACE_MONITOR2:
625
case R_PORT5_INTERFACE_MONITOR0:
626
case R_PORT5_INTERFACE_MONITOR1:
627
case R_PORT5_INTERFACE_MONITOR2:
632
if (s->regs[R_2700_PROT] == PROT_HARDLOCKED) {
633
qemu_log_mask(LOG_GUEST_ERROR,
634
"%s: SDMC is locked until system reset!\n",
639
if (reg != R_2700_PROT && s->regs[R_2700_PROT] == PROT_SOFTLOCKED) {
640
qemu_log_mask(LOG_GUEST_ERROR,
641
"%s: SDMC is locked! (write to MCR%02x blocked)\n",
648
if (data == PROT_2700_KEY_UNLOCK) {
649
data = PROT_UNLOCKED;
650
} else if (data == PROT_KEY_HARDLOCK) {
651
data = PROT_HARDLOCKED;
653
data = PROT_SOFTLOCKED;
657
data = aspeed_2700_sdmc_compute_conf(s, data);
661
data &= ~PHY_BUSY_STATE;
671
aspeed_2700_ram_sizes[] = { 256 * MiB, 512 * MiB, 1024 * MiB,
672
2048 * MiB, 4096 * MiB, 8192 * MiB, 0};
674
static void aspeed_2700_sdmc_class_init(ObjectClass *klass, void *data)
676
DeviceClass *dc = DEVICE_CLASS(klass);
677
AspeedSDMCClass *asc = ASPEED_SDMC_CLASS(klass);
679
dc->desc = "ASPEED 2700 SDRAM Memory Controller";
680
dc->reset = aspeed_2700_sdmc_reset;
682
asc->is_bus64bit = true;
683
asc->max_ram_size = 8 * GiB;
684
asc->compute_conf = aspeed_2700_sdmc_compute_conf;
685
asc->write = aspeed_2700_sdmc_write;
686
asc->valid_ram_sizes = aspeed_2700_ram_sizes;
689
static const TypeInfo aspeed_2700_sdmc_info = {
690
.name = TYPE_ASPEED_2700_SDMC,
691
.parent = TYPE_ASPEED_SDMC,
692
.class_init = aspeed_2700_sdmc_class_init,
695
static void aspeed_sdmc_register_types(void)
697
type_register_static(&aspeed_sdmc_info);
698
type_register_static(&aspeed_2400_sdmc_info);
699
type_register_static(&aspeed_2500_sdmc_info);
700
type_register_static(&aspeed_2600_sdmc_info);
701
type_register_static(&aspeed_2700_sdmc_info);
704
type_init(aspeed_sdmc_register_types);