aspeed_sdmc.c 15 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523
  1. /*
  2. * ASPEED SDRAM Memory Controller
  3. *
  4. * Copyright (C) 2016 IBM Corp.
  5. *
  6. * This code is licensed under the GPL version 2 or later. See
  7. * the COPYING file in the top-level directory.
  8. */
  9. #include "qemu/osdep.h"
  10. #include "qemu/log.h"
  11. #include "qemu/module.h"
  12. #include "qemu/error-report.h"
  13. #include "hw/misc/aspeed_sdmc.h"
  14. #include "hw/qdev-properties.h"
  15. #include "migration/vmstate.h"
  16. #include "qapi/error.h"
  17. #include "trace.h"
  18. #include "qemu/units.h"
  19. #include "qemu/cutils.h"
  20. #include "qapi/visitor.h"
  21. /* Protection Key Register */
  22. #define R_PROT (0x00 / 4)
  23. #define PROT_UNLOCKED 0x01
  24. #define PROT_HARDLOCKED 0x10 /* AST2600 */
  25. #define PROT_SOFTLOCKED 0x00
  26. #define PROT_KEY_UNLOCK 0xFC600309
  27. #define PROT_KEY_HARDLOCK 0xDEADDEAD /* AST2600 */
  28. /* Configuration Register */
  29. #define R_CONF (0x04 / 4)
  30. /* Interrupt control/status */
  31. #define R_ISR (0x50 / 4)
  32. /* Control/Status Register #1 (ast2500) */
  33. #define R_STATUS1 (0x60 / 4)
  34. #define PHY_BUSY_STATE BIT(0)
  35. #define PHY_PLL_LOCK_STATUS BIT(4)
  36. /* Reserved */
  37. #define R_MCR6C (0x6c / 4)
  38. #define R_ECC_TEST_CTRL (0x70 / 4)
  39. #define ECC_TEST_FINISHED BIT(12)
  40. #define ECC_TEST_FAIL BIT(13)
  41. #define R_TEST_START_LEN (0x74 / 4)
  42. #define R_TEST_FAIL_DQ (0x78 / 4)
  43. #define R_TEST_INIT_VAL (0x7c / 4)
  44. #define R_DRAM_SW (0x88 / 4)
  45. #define R_DRAM_TIME (0x8c / 4)
  46. #define R_ECC_ERR_INJECT (0xb4 / 4)
  47. /*
  48. * Configuration register Ox4 (for Aspeed AST2400 SOC)
  49. *
  50. * These are for the record and future use. ASPEED_SDMC_DRAM_SIZE is
  51. * what we care about right now as it is checked by U-Boot to
  52. * determine the RAM size.
  53. */
  54. #define ASPEED_SDMC_RESERVED 0xFFFFF800 /* 31:11 reserved */
  55. #define ASPEED_SDMC_AST2300_COMPAT (1 << 10)
  56. #define ASPEED_SDMC_SCRAMBLE_PATTERN (1 << 9)
  57. #define ASPEED_SDMC_DATA_SCRAMBLE (1 << 8)
  58. #define ASPEED_SDMC_ECC_ENABLE (1 << 7)
  59. #define ASPEED_SDMC_VGA_COMPAT (1 << 6) /* readonly */
  60. #define ASPEED_SDMC_DRAM_BANK (1 << 5)
  61. #define ASPEED_SDMC_DRAM_BURST (1 << 4)
  62. #define ASPEED_SDMC_VGA_APERTURE(x) ((x & 0x3) << 2) /* readonly */
  63. #define ASPEED_SDMC_VGA_8MB 0x0
  64. #define ASPEED_SDMC_VGA_16MB 0x1
  65. #define ASPEED_SDMC_VGA_32MB 0x2
  66. #define ASPEED_SDMC_VGA_64MB 0x3
  67. #define ASPEED_SDMC_DRAM_SIZE(x) (x & 0x3)
  68. #define ASPEED_SDMC_DRAM_64MB 0x0
  69. #define ASPEED_SDMC_DRAM_128MB 0x1
  70. #define ASPEED_SDMC_DRAM_256MB 0x2
  71. #define ASPEED_SDMC_DRAM_512MB 0x3
  72. #define ASPEED_SDMC_READONLY_MASK \
  73. (ASPEED_SDMC_RESERVED | ASPEED_SDMC_VGA_COMPAT | \
  74. ASPEED_SDMC_VGA_APERTURE(ASPEED_SDMC_VGA_64MB))
  75. /*
  76. * Configuration register Ox4 (for Aspeed AST2500 SOC and higher)
  77. *
  78. * Incompatibilities are annotated in the list. ASPEED_SDMC_HW_VERSION
  79. * should be set to 1 for the AST2500 SOC.
  80. */
  81. #define ASPEED_SDMC_HW_VERSION(x) ((x & 0xf) << 28) /* readonly */
  82. #define ASPEED_SDMC_SW_VERSION ((x & 0xff) << 20)
  83. #define ASPEED_SDMC_CACHE_INITIAL_DONE (1 << 19) /* readonly */
  84. #define ASPEED_SDMC_AST2500_RESERVED 0x7C000 /* 18:14 reserved */
  85. #define ASPEED_SDMC_CACHE_DDR4_CONF (1 << 13)
  86. #define ASPEED_SDMC_CACHE_INITIAL (1 << 12)
  87. #define ASPEED_SDMC_CACHE_RANGE_CTRL (1 << 11)
  88. #define ASPEED_SDMC_CACHE_ENABLE (1 << 10) /* differs from AST2400 */
  89. #define ASPEED_SDMC_DRAM_TYPE (1 << 4) /* differs from AST2400 */
  90. /* DRAM size definitions differs */
  91. #define ASPEED_SDMC_AST2500_128MB 0x0
  92. #define ASPEED_SDMC_AST2500_256MB 0x1
  93. #define ASPEED_SDMC_AST2500_512MB 0x2
  94. #define ASPEED_SDMC_AST2500_1024MB 0x3
  95. #define ASPEED_SDMC_AST2600_256MB 0x0
  96. #define ASPEED_SDMC_AST2600_512MB 0x1
  97. #define ASPEED_SDMC_AST2600_1024MB 0x2
  98. #define ASPEED_SDMC_AST2600_2048MB 0x3
  99. #define ASPEED_SDMC_AST2500_READONLY_MASK \
  100. (ASPEED_SDMC_HW_VERSION(0xf) | ASPEED_SDMC_CACHE_INITIAL_DONE | \
  101. ASPEED_SDMC_AST2500_RESERVED | ASPEED_SDMC_VGA_COMPAT | \
  102. ASPEED_SDMC_VGA_APERTURE(ASPEED_SDMC_VGA_64MB))
  103. static uint64_t aspeed_sdmc_read(void *opaque, hwaddr addr, unsigned size)
  104. {
  105. AspeedSDMCState *s = ASPEED_SDMC(opaque);
  106. addr >>= 2;
  107. if (addr >= ARRAY_SIZE(s->regs)) {
  108. qemu_log_mask(LOG_GUEST_ERROR,
  109. "%s: Out-of-bounds read at offset 0x%" HWADDR_PRIx "\n",
  110. __func__, addr * 4);
  111. return 0;
  112. }
  113. trace_aspeed_sdmc_read(addr, s->regs[addr]);
  114. return s->regs[addr];
  115. }
  116. static void aspeed_sdmc_write(void *opaque, hwaddr addr, uint64_t data,
  117. unsigned int size)
  118. {
  119. AspeedSDMCState *s = ASPEED_SDMC(opaque);
  120. AspeedSDMCClass *asc = ASPEED_SDMC_GET_CLASS(s);
  121. addr >>= 2;
  122. if (addr >= ARRAY_SIZE(s->regs)) {
  123. qemu_log_mask(LOG_GUEST_ERROR,
  124. "%s: Out-of-bounds write at offset 0x%" HWADDR_PRIx "\n",
  125. __func__, addr);
  126. return;
  127. }
  128. trace_aspeed_sdmc_write(addr, data);
  129. asc->write(s, addr, data);
  130. }
  131. static const MemoryRegionOps aspeed_sdmc_ops = {
  132. .read = aspeed_sdmc_read,
  133. .write = aspeed_sdmc_write,
  134. .endianness = DEVICE_LITTLE_ENDIAN,
  135. .valid.min_access_size = 4,
  136. .valid.max_access_size = 4,
  137. };
  138. static void aspeed_sdmc_reset(DeviceState *dev)
  139. {
  140. AspeedSDMCState *s = ASPEED_SDMC(dev);
  141. AspeedSDMCClass *asc = ASPEED_SDMC_GET_CLASS(s);
  142. memset(s->regs, 0, sizeof(s->regs));
  143. /* Set ram size bit and defaults values */
  144. s->regs[R_CONF] = asc->compute_conf(s, 0);
  145. /*
  146. * PHY status:
  147. * - set phy status ok (set bit 1)
  148. * - initial PVT calibration ok (clear bit 3)
  149. * - runtime calibration ok (clear bit 5)
  150. */
  151. s->regs[0x100] = BIT(1);
  152. /* PHY eye window: set all as passing */
  153. s->regs[0x100 | (0x68 / 4)] = 0xff;
  154. s->regs[0x100 | (0x7c / 4)] = 0xff;
  155. s->regs[0x100 | (0x50 / 4)] = 0xfffffff;
  156. }
  157. static void aspeed_sdmc_get_ram_size(Object *obj, Visitor *v, const char *name,
  158. void *opaque, Error **errp)
  159. {
  160. AspeedSDMCState *s = ASPEED_SDMC(obj);
  161. int64_t value = s->ram_size;
  162. visit_type_int(v, name, &value, errp);
  163. }
  164. static void aspeed_sdmc_set_ram_size(Object *obj, Visitor *v, const char *name,
  165. void *opaque, Error **errp)
  166. {
  167. int i;
  168. char *sz;
  169. int64_t value;
  170. AspeedSDMCState *s = ASPEED_SDMC(obj);
  171. AspeedSDMCClass *asc = ASPEED_SDMC_GET_CLASS(s);
  172. if (!visit_type_int(v, name, &value, errp)) {
  173. return;
  174. }
  175. for (i = 0; asc->valid_ram_sizes[i]; i++) {
  176. if (value == asc->valid_ram_sizes[i]) {
  177. s->ram_size = value;
  178. return;
  179. }
  180. }
  181. sz = size_to_str(value);
  182. error_setg(errp, "Invalid RAM size %s", sz);
  183. g_free(sz);
  184. }
  185. static void aspeed_sdmc_initfn(Object *obj)
  186. {
  187. object_property_add(obj, "ram-size", "int",
  188. aspeed_sdmc_get_ram_size, aspeed_sdmc_set_ram_size,
  189. NULL, NULL);
  190. }
  191. static void aspeed_sdmc_realize(DeviceState *dev, Error **errp)
  192. {
  193. SysBusDevice *sbd = SYS_BUS_DEVICE(dev);
  194. AspeedSDMCState *s = ASPEED_SDMC(dev);
  195. AspeedSDMCClass *asc = ASPEED_SDMC_GET_CLASS(s);
  196. assert(asc->max_ram_size < 4 * GiB); /* 32-bit address bus */
  197. s->max_ram_size = asc->max_ram_size;
  198. memory_region_init_io(&s->iomem, OBJECT(s), &aspeed_sdmc_ops, s,
  199. TYPE_ASPEED_SDMC, 0x1000);
  200. sysbus_init_mmio(sbd, &s->iomem);
  201. }
  202. static const VMStateDescription vmstate_aspeed_sdmc = {
  203. .name = "aspeed.sdmc",
  204. .version_id = 1,
  205. .minimum_version_id = 1,
  206. .fields = (VMStateField[]) {
  207. VMSTATE_UINT32_ARRAY(regs, AspeedSDMCState, ASPEED_SDMC_NR_REGS),
  208. VMSTATE_END_OF_LIST()
  209. }
  210. };
  211. static Property aspeed_sdmc_properties[] = {
  212. DEFINE_PROP_UINT64("max-ram-size", AspeedSDMCState, max_ram_size, 0),
  213. DEFINE_PROP_END_OF_LIST(),
  214. };
  215. static void aspeed_sdmc_class_init(ObjectClass *klass, void *data)
  216. {
  217. DeviceClass *dc = DEVICE_CLASS(klass);
  218. dc->realize = aspeed_sdmc_realize;
  219. dc->reset = aspeed_sdmc_reset;
  220. dc->desc = "ASPEED SDRAM Memory Controller";
  221. dc->vmsd = &vmstate_aspeed_sdmc;
  222. device_class_set_props(dc, aspeed_sdmc_properties);
  223. }
  224. static const TypeInfo aspeed_sdmc_info = {
  225. .name = TYPE_ASPEED_SDMC,
  226. .parent = TYPE_SYS_BUS_DEVICE,
  227. .instance_size = sizeof(AspeedSDMCState),
  228. .instance_init = aspeed_sdmc_initfn,
  229. .class_init = aspeed_sdmc_class_init,
  230. .class_size = sizeof(AspeedSDMCClass),
  231. .abstract = true,
  232. };
  233. static int aspeed_sdmc_get_ram_bits(AspeedSDMCState *s)
  234. {
  235. AspeedSDMCClass *asc = ASPEED_SDMC_GET_CLASS(s);
  236. int i;
  237. /*
  238. * The bitfield value encoding the RAM size is the index of the
  239. * possible RAM size array
  240. */
  241. for (i = 0; asc->valid_ram_sizes[i]; i++) {
  242. if (s->ram_size == asc->valid_ram_sizes[i]) {
  243. return i;
  244. }
  245. }
  246. /*
  247. * Invalid RAM sizes should have been excluded when setting the
  248. * SoC RAM size.
  249. */
  250. g_assert_not_reached();
  251. }
  252. static uint32_t aspeed_2400_sdmc_compute_conf(AspeedSDMCState *s, uint32_t data)
  253. {
  254. uint32_t fixed_conf = ASPEED_SDMC_VGA_COMPAT |
  255. ASPEED_SDMC_DRAM_SIZE(aspeed_sdmc_get_ram_bits(s));
  256. /* Make sure readonly bits are kept */
  257. data &= ~ASPEED_SDMC_READONLY_MASK;
  258. return data | fixed_conf;
  259. }
  260. static void aspeed_2400_sdmc_write(AspeedSDMCState *s, uint32_t reg,
  261. uint32_t data)
  262. {
  263. if (reg == R_PROT) {
  264. s->regs[reg] = (data == PROT_KEY_UNLOCK) ? PROT_UNLOCKED : PROT_SOFTLOCKED;
  265. return;
  266. }
  267. if (!s->regs[R_PROT]) {
  268. qemu_log_mask(LOG_GUEST_ERROR, "%s: SDMC is locked!\n", __func__);
  269. return;
  270. }
  271. switch (reg) {
  272. case R_CONF:
  273. data = aspeed_2400_sdmc_compute_conf(s, data);
  274. break;
  275. default:
  276. break;
  277. }
  278. s->regs[reg] = data;
  279. }
  280. static const uint64_t
  281. aspeed_2400_ram_sizes[] = { 64 * MiB, 128 * MiB, 256 * MiB, 512 * MiB, 0};
  282. static void aspeed_2400_sdmc_class_init(ObjectClass *klass, void *data)
  283. {
  284. DeviceClass *dc = DEVICE_CLASS(klass);
  285. AspeedSDMCClass *asc = ASPEED_SDMC_CLASS(klass);
  286. dc->desc = "ASPEED 2400 SDRAM Memory Controller";
  287. asc->max_ram_size = 512 * MiB;
  288. asc->compute_conf = aspeed_2400_sdmc_compute_conf;
  289. asc->write = aspeed_2400_sdmc_write;
  290. asc->valid_ram_sizes = aspeed_2400_ram_sizes;
  291. }
  292. static const TypeInfo aspeed_2400_sdmc_info = {
  293. .name = TYPE_ASPEED_2400_SDMC,
  294. .parent = TYPE_ASPEED_SDMC,
  295. .class_init = aspeed_2400_sdmc_class_init,
  296. };
  297. static uint32_t aspeed_2500_sdmc_compute_conf(AspeedSDMCState *s, uint32_t data)
  298. {
  299. uint32_t fixed_conf = ASPEED_SDMC_HW_VERSION(1) |
  300. ASPEED_SDMC_VGA_APERTURE(ASPEED_SDMC_VGA_64MB) |
  301. ASPEED_SDMC_CACHE_INITIAL_DONE |
  302. ASPEED_SDMC_DRAM_SIZE(aspeed_sdmc_get_ram_bits(s));
  303. /* Make sure readonly bits are kept */
  304. data &= ~ASPEED_SDMC_AST2500_READONLY_MASK;
  305. return data | fixed_conf;
  306. }
  307. static void aspeed_2500_sdmc_write(AspeedSDMCState *s, uint32_t reg,
  308. uint32_t data)
  309. {
  310. if (reg == R_PROT) {
  311. s->regs[reg] = (data == PROT_KEY_UNLOCK) ? PROT_UNLOCKED : PROT_SOFTLOCKED;
  312. return;
  313. }
  314. if (!s->regs[R_PROT]) {
  315. qemu_log_mask(LOG_GUEST_ERROR, "%s: SDMC is locked!\n", __func__);
  316. return;
  317. }
  318. switch (reg) {
  319. case R_CONF:
  320. data = aspeed_2500_sdmc_compute_conf(s, data);
  321. break;
  322. case R_STATUS1:
  323. /* Will never return 'busy' */
  324. data &= ~PHY_BUSY_STATE;
  325. break;
  326. case R_ECC_TEST_CTRL:
  327. /* Always done, always happy */
  328. data |= ECC_TEST_FINISHED;
  329. data &= ~ECC_TEST_FAIL;
  330. break;
  331. default:
  332. break;
  333. }
  334. s->regs[reg] = data;
  335. }
  336. static const uint64_t
  337. aspeed_2500_ram_sizes[] = { 128 * MiB, 256 * MiB, 512 * MiB, 1024 * MiB, 0};
  338. static void aspeed_2500_sdmc_class_init(ObjectClass *klass, void *data)
  339. {
  340. DeviceClass *dc = DEVICE_CLASS(klass);
  341. AspeedSDMCClass *asc = ASPEED_SDMC_CLASS(klass);
  342. dc->desc = "ASPEED 2500 SDRAM Memory Controller";
  343. asc->max_ram_size = 1 * GiB;
  344. asc->compute_conf = aspeed_2500_sdmc_compute_conf;
  345. asc->write = aspeed_2500_sdmc_write;
  346. asc->valid_ram_sizes = aspeed_2500_ram_sizes;
  347. }
  348. static const TypeInfo aspeed_2500_sdmc_info = {
  349. .name = TYPE_ASPEED_2500_SDMC,
  350. .parent = TYPE_ASPEED_SDMC,
  351. .class_init = aspeed_2500_sdmc_class_init,
  352. };
  353. static uint32_t aspeed_2600_sdmc_compute_conf(AspeedSDMCState *s, uint32_t data)
  354. {
  355. uint32_t fixed_conf = ASPEED_SDMC_HW_VERSION(3) |
  356. ASPEED_SDMC_VGA_APERTURE(ASPEED_SDMC_VGA_64MB) |
  357. ASPEED_SDMC_DRAM_SIZE(aspeed_sdmc_get_ram_bits(s));
  358. /* Make sure readonly bits are kept (use ast2500 mask) */
  359. data &= ~ASPEED_SDMC_AST2500_READONLY_MASK;
  360. return data | fixed_conf;
  361. }
  362. static void aspeed_2600_sdmc_write(AspeedSDMCState *s, uint32_t reg,
  363. uint32_t data)
  364. {
  365. /* Unprotected registers */
  366. switch (reg) {
  367. case R_ISR:
  368. case R_MCR6C:
  369. case R_TEST_START_LEN:
  370. case R_TEST_FAIL_DQ:
  371. case R_TEST_INIT_VAL:
  372. case R_DRAM_SW:
  373. case R_DRAM_TIME:
  374. case R_ECC_ERR_INJECT:
  375. s->regs[reg] = data;
  376. return;
  377. }
  378. if (s->regs[R_PROT] == PROT_HARDLOCKED) {
  379. qemu_log_mask(LOG_GUEST_ERROR, "%s: SDMC is locked until system reset!\n",
  380. __func__);
  381. return;
  382. }
  383. if (reg != R_PROT && s->regs[R_PROT] == PROT_SOFTLOCKED) {
  384. qemu_log_mask(LOG_GUEST_ERROR,
  385. "%s: SDMC is locked! (write to MCR%02x blocked)\n",
  386. __func__, reg * 4);
  387. return;
  388. }
  389. switch (reg) {
  390. case R_PROT:
  391. if (data == PROT_KEY_UNLOCK) {
  392. data = PROT_UNLOCKED;
  393. } else if (data == PROT_KEY_HARDLOCK) {
  394. data = PROT_HARDLOCKED;
  395. } else {
  396. data = PROT_SOFTLOCKED;
  397. }
  398. break;
  399. case R_CONF:
  400. data = aspeed_2600_sdmc_compute_conf(s, data);
  401. break;
  402. case R_STATUS1:
  403. /* Will never return 'busy'. 'lock status' is always set */
  404. data &= ~PHY_BUSY_STATE;
  405. data |= PHY_PLL_LOCK_STATUS;
  406. break;
  407. case R_ECC_TEST_CTRL:
  408. /* Always done, always happy */
  409. data |= ECC_TEST_FINISHED;
  410. data &= ~ECC_TEST_FAIL;
  411. break;
  412. default:
  413. break;
  414. }
  415. s->regs[reg] = data;
  416. }
  417. static const uint64_t
  418. aspeed_2600_ram_sizes[] = { 256 * MiB, 512 * MiB, 1024 * MiB, 2048 * MiB, 0};
  419. static void aspeed_2600_sdmc_class_init(ObjectClass *klass, void *data)
  420. {
  421. DeviceClass *dc = DEVICE_CLASS(klass);
  422. AspeedSDMCClass *asc = ASPEED_SDMC_CLASS(klass);
  423. dc->desc = "ASPEED 2600 SDRAM Memory Controller";
  424. asc->max_ram_size = 2 * GiB;
  425. asc->compute_conf = aspeed_2600_sdmc_compute_conf;
  426. asc->write = aspeed_2600_sdmc_write;
  427. asc->valid_ram_sizes = aspeed_2600_ram_sizes;
  428. }
  429. static const TypeInfo aspeed_2600_sdmc_info = {
  430. .name = TYPE_ASPEED_2600_SDMC,
  431. .parent = TYPE_ASPEED_SDMC,
  432. .class_init = aspeed_2600_sdmc_class_init,
  433. };
  434. static void aspeed_sdmc_register_types(void)
  435. {
  436. type_register_static(&aspeed_sdmc_info);
  437. type_register_static(&aspeed_2400_sdmc_info);
  438. type_register_static(&aspeed_2500_sdmc_info);
  439. type_register_static(&aspeed_2600_sdmc_info);
  440. }
  441. type_init(aspeed_sdmc_register_types);