ppc4xx_devs.c 25 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886
  1. /*
  2. * QEMU PowerPC 4xx embedded processors shared devices emulation
  3. *
  4. * Copyright (c) 2007 Jocelyn Mayer
  5. *
  6. * Permission is hereby granted, free of charge, to any person obtaining a copy
  7. * of this software and associated documentation files (the "Software"), to deal
  8. * in the Software without restriction, including without limitation the rights
  9. * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
  10. * copies of the Software, and to permit persons to whom the Software is
  11. * furnished to do so, subject to the following conditions:
  12. *
  13. * The above copyright notice and this permission notice shall be included in
  14. * all copies or substantial portions of the Software.
  15. *
  16. * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
  17. * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
  18. * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
  19. * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
  20. * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
  21. * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
  22. * THE SOFTWARE.
  23. */
  24. #include "hw.h"
  25. #include "ppc.h"
  26. #include "ppc4xx.h"
  27. #include "sysemu.h"
  28. #include "qemu-log.h"
  29. //#define DEBUG_MMIO
  30. //#define DEBUG_UNASSIGNED
  31. #define DEBUG_UIC
  32. #ifdef DEBUG_UIC
  33. # define LOG_UIC(...) qemu_log_mask(CPU_LOG_INT, ## __VA_ARGS__)
  34. #else
  35. # define LOG_UIC(...) do { } while (0)
  36. #endif
  37. /*****************************************************************************/
  38. /* Generic PowerPC 4xx processor instanciation */
  39. CPUState *ppc4xx_init (const char *cpu_model,
  40. clk_setup_t *cpu_clk, clk_setup_t *tb_clk,
  41. uint32_t sysclk)
  42. {
  43. CPUState *env;
  44. /* init CPUs */
  45. env = cpu_init(cpu_model);
  46. if (!env) {
  47. fprintf(stderr, "Unable to find PowerPC %s CPU definition\n",
  48. cpu_model);
  49. exit(1);
  50. }
  51. cpu_clk->cb = NULL; /* We don't care about CPU clock frequency changes */
  52. cpu_clk->opaque = env;
  53. /* Set time-base frequency to sysclk */
  54. tb_clk->cb = ppc_emb_timers_init(env, sysclk);
  55. tb_clk->opaque = env;
  56. ppc_dcr_init(env, NULL, NULL);
  57. /* Register qemu callbacks */
  58. qemu_register_reset(&cpu_ppc_reset, env);
  59. return env;
  60. }
  61. /*****************************************************************************/
  62. /* Fake device used to map multiple devices in a single memory page */
  63. #define MMIO_AREA_BITS 8
  64. #define MMIO_AREA_LEN (1 << MMIO_AREA_BITS)
  65. #define MMIO_AREA_NB (1 << (TARGET_PAGE_BITS - MMIO_AREA_BITS))
  66. #define MMIO_IDX(addr) (((addr) >> MMIO_AREA_BITS) & (MMIO_AREA_NB - 1))
  67. struct ppc4xx_mmio_t {
  68. target_phys_addr_t base;
  69. CPUReadMemoryFunc **mem_read[MMIO_AREA_NB];
  70. CPUWriteMemoryFunc **mem_write[MMIO_AREA_NB];
  71. void *opaque[MMIO_AREA_NB];
  72. };
  73. static uint32_t unassigned_mmio_readb (void *opaque, target_phys_addr_t addr)
  74. {
  75. #ifdef DEBUG_UNASSIGNED
  76. ppc4xx_mmio_t *mmio;
  77. mmio = opaque;
  78. printf("Unassigned mmio read 0x" PADDRX " base " PADDRX "\n",
  79. addr, mmio->base);
  80. #endif
  81. return 0;
  82. }
  83. static void unassigned_mmio_writeb (void *opaque,
  84. target_phys_addr_t addr, uint32_t val)
  85. {
  86. #ifdef DEBUG_UNASSIGNED
  87. ppc4xx_mmio_t *mmio;
  88. mmio = opaque;
  89. printf("Unassigned mmio write 0x" PADDRX " = 0x%x base " PADDRX "\n",
  90. addr, val, mmio->base);
  91. #endif
  92. }
  93. static CPUReadMemoryFunc *unassigned_mmio_read[3] = {
  94. unassigned_mmio_readb,
  95. unassigned_mmio_readb,
  96. unassigned_mmio_readb,
  97. };
  98. static CPUWriteMemoryFunc *unassigned_mmio_write[3] = {
  99. unassigned_mmio_writeb,
  100. unassigned_mmio_writeb,
  101. unassigned_mmio_writeb,
  102. };
  103. static uint32_t mmio_readlen (ppc4xx_mmio_t *mmio,
  104. target_phys_addr_t addr, int len)
  105. {
  106. CPUReadMemoryFunc **mem_read;
  107. uint32_t ret;
  108. int idx;
  109. idx = MMIO_IDX(addr);
  110. #if defined(DEBUG_MMIO)
  111. printf("%s: mmio %p len %d addr " PADDRX " idx %d\n", __func__,
  112. mmio, len, addr, idx);
  113. #endif
  114. mem_read = mmio->mem_read[idx];
  115. ret = (*mem_read[len])(mmio->opaque[idx], addr);
  116. return ret;
  117. }
  118. static void mmio_writelen (ppc4xx_mmio_t *mmio,
  119. target_phys_addr_t addr, uint32_t value, int len)
  120. {
  121. CPUWriteMemoryFunc **mem_write;
  122. int idx;
  123. idx = MMIO_IDX(addr);
  124. #if defined(DEBUG_MMIO)
  125. printf("%s: mmio %p len %d addr " PADDRX " idx %d value %08" PRIx32 "\n",
  126. __func__, mmio, len, addr, idx, value);
  127. #endif
  128. mem_write = mmio->mem_write[idx];
  129. (*mem_write[len])(mmio->opaque[idx], addr, value);
  130. }
  131. static uint32_t mmio_readb (void *opaque, target_phys_addr_t addr)
  132. {
  133. #if defined(DEBUG_MMIO)
  134. printf("%s: addr " PADDRX "\n", __func__, addr);
  135. #endif
  136. return mmio_readlen(opaque, addr, 0);
  137. }
  138. static void mmio_writeb (void *opaque,
  139. target_phys_addr_t addr, uint32_t value)
  140. {
  141. #if defined(DEBUG_MMIO)
  142. printf("%s: addr " PADDRX " val %08" PRIx32 "\n", __func__, addr, value);
  143. #endif
  144. mmio_writelen(opaque, addr, value, 0);
  145. }
  146. static uint32_t mmio_readw (void *opaque, target_phys_addr_t addr)
  147. {
  148. #if defined(DEBUG_MMIO)
  149. printf("%s: addr " PADDRX "\n", __func__, addr);
  150. #endif
  151. return mmio_readlen(opaque, addr, 1);
  152. }
  153. static void mmio_writew (void *opaque,
  154. target_phys_addr_t addr, uint32_t value)
  155. {
  156. #if defined(DEBUG_MMIO)
  157. printf("%s: addr " PADDRX " val %08" PRIx32 "\n", __func__, addr, value);
  158. #endif
  159. mmio_writelen(opaque, addr, value, 1);
  160. }
  161. static uint32_t mmio_readl (void *opaque, target_phys_addr_t addr)
  162. {
  163. #if defined(DEBUG_MMIO)
  164. printf("%s: addr " PADDRX "\n", __func__, addr);
  165. #endif
  166. return mmio_readlen(opaque, addr, 2);
  167. }
  168. static void mmio_writel (void *opaque,
  169. target_phys_addr_t addr, uint32_t value)
  170. {
  171. #if defined(DEBUG_MMIO)
  172. printf("%s: addr " PADDRX " val %08" PRIx32 "\n", __func__, addr, value);
  173. #endif
  174. mmio_writelen(opaque, addr, value, 2);
  175. }
  176. static CPUReadMemoryFunc *mmio_read[] = {
  177. &mmio_readb,
  178. &mmio_readw,
  179. &mmio_readl,
  180. };
  181. static CPUWriteMemoryFunc *mmio_write[] = {
  182. &mmio_writeb,
  183. &mmio_writew,
  184. &mmio_writel,
  185. };
  186. int ppc4xx_mmio_register (CPUState *env, ppc4xx_mmio_t *mmio,
  187. target_phys_addr_t offset, uint32_t len,
  188. CPUReadMemoryFunc **mem_read,
  189. CPUWriteMemoryFunc **mem_write, void *opaque)
  190. {
  191. target_phys_addr_t end;
  192. int idx, eidx;
  193. if ((offset + len) > TARGET_PAGE_SIZE)
  194. return -1;
  195. idx = MMIO_IDX(offset);
  196. end = offset + len - 1;
  197. eidx = MMIO_IDX(end);
  198. #if defined(DEBUG_MMIO)
  199. printf("%s: offset " PADDRX " len %08" PRIx32 " " PADDRX " %d %d\n",
  200. __func__, offset, len, end, idx, eidx);
  201. #endif
  202. for (; idx <= eidx; idx++) {
  203. mmio->mem_read[idx] = mem_read;
  204. mmio->mem_write[idx] = mem_write;
  205. mmio->opaque[idx] = opaque;
  206. }
  207. return 0;
  208. }
  209. ppc4xx_mmio_t *ppc4xx_mmio_init (CPUState *env, target_phys_addr_t base)
  210. {
  211. ppc4xx_mmio_t *mmio;
  212. int mmio_memory;
  213. mmio = qemu_mallocz(sizeof(ppc4xx_mmio_t));
  214. mmio->base = base;
  215. mmio_memory = cpu_register_io_memory(0, mmio_read, mmio_write, mmio);
  216. #if defined(DEBUG_MMIO)
  217. printf("%s: base " PADDRX " len %08x %d\n", __func__,
  218. base, TARGET_PAGE_SIZE, mmio_memory);
  219. #endif
  220. cpu_register_physical_memory(base, TARGET_PAGE_SIZE, mmio_memory);
  221. ppc4xx_mmio_register(env, mmio, 0, TARGET_PAGE_SIZE,
  222. unassigned_mmio_read, unassigned_mmio_write,
  223. mmio);
  224. return mmio;
  225. }
  226. /*****************************************************************************/
  227. /* "Universal" Interrupt controller */
  228. enum {
  229. DCR_UICSR = 0x000,
  230. DCR_UICSRS = 0x001,
  231. DCR_UICER = 0x002,
  232. DCR_UICCR = 0x003,
  233. DCR_UICPR = 0x004,
  234. DCR_UICTR = 0x005,
  235. DCR_UICMSR = 0x006,
  236. DCR_UICVR = 0x007,
  237. DCR_UICVCR = 0x008,
  238. DCR_UICMAX = 0x009,
  239. };
  240. #define UIC_MAX_IRQ 32
  241. typedef struct ppcuic_t ppcuic_t;
  242. struct ppcuic_t {
  243. uint32_t dcr_base;
  244. int use_vectors;
  245. uint32_t level; /* Remembers the state of level-triggered interrupts. */
  246. uint32_t uicsr; /* Status register */
  247. uint32_t uicer; /* Enable register */
  248. uint32_t uiccr; /* Critical register */
  249. uint32_t uicpr; /* Polarity register */
  250. uint32_t uictr; /* Triggering register */
  251. uint32_t uicvcr; /* Vector configuration register */
  252. uint32_t uicvr;
  253. qemu_irq *irqs;
  254. };
  255. static void ppcuic_trigger_irq (ppcuic_t *uic)
  256. {
  257. uint32_t ir, cr;
  258. int start, end, inc, i;
  259. /* Trigger interrupt if any is pending */
  260. ir = uic->uicsr & uic->uicer & (~uic->uiccr);
  261. cr = uic->uicsr & uic->uicer & uic->uiccr;
  262. LOG_UIC("%s: uicsr %08" PRIx32 " uicer %08" PRIx32
  263. " uiccr %08" PRIx32 "\n"
  264. " %08" PRIx32 " ir %08" PRIx32 " cr %08" PRIx32 "\n",
  265. __func__, uic->uicsr, uic->uicer, uic->uiccr,
  266. uic->uicsr & uic->uicer, ir, cr);
  267. if (ir != 0x0000000) {
  268. LOG_UIC("Raise UIC interrupt\n");
  269. qemu_irq_raise(uic->irqs[PPCUIC_OUTPUT_INT]);
  270. } else {
  271. LOG_UIC("Lower UIC interrupt\n");
  272. qemu_irq_lower(uic->irqs[PPCUIC_OUTPUT_INT]);
  273. }
  274. /* Trigger critical interrupt if any is pending and update vector */
  275. if (cr != 0x0000000) {
  276. qemu_irq_raise(uic->irqs[PPCUIC_OUTPUT_CINT]);
  277. if (uic->use_vectors) {
  278. /* Compute critical IRQ vector */
  279. if (uic->uicvcr & 1) {
  280. start = 31;
  281. end = 0;
  282. inc = -1;
  283. } else {
  284. start = 0;
  285. end = 31;
  286. inc = 1;
  287. }
  288. uic->uicvr = uic->uicvcr & 0xFFFFFFFC;
  289. for (i = start; i <= end; i += inc) {
  290. if (cr & (1 << i)) {
  291. uic->uicvr += (i - start) * 512 * inc;
  292. break;
  293. }
  294. }
  295. }
  296. LOG_UIC("Raise UIC critical interrupt - "
  297. "vector %08" PRIx32 "\n", uic->uicvr);
  298. } else {
  299. LOG_UIC("Lower UIC critical interrupt\n");
  300. qemu_irq_lower(uic->irqs[PPCUIC_OUTPUT_CINT]);
  301. uic->uicvr = 0x00000000;
  302. }
  303. }
  304. static void ppcuic_set_irq (void *opaque, int irq_num, int level)
  305. {
  306. ppcuic_t *uic;
  307. uint32_t mask, sr;
  308. uic = opaque;
  309. mask = 1 << (31-irq_num);
  310. LOG_UIC("%s: irq %d level %d uicsr %08" PRIx32
  311. " mask %08" PRIx32 " => %08" PRIx32 " %08" PRIx32 "\n",
  312. __func__, irq_num, level,
  313. uic->uicsr, mask, uic->uicsr & mask, level << irq_num);
  314. if (irq_num < 0 || irq_num > 31)
  315. return;
  316. sr = uic->uicsr;
  317. /* Update status register */
  318. if (uic->uictr & mask) {
  319. /* Edge sensitive interrupt */
  320. if (level == 1)
  321. uic->uicsr |= mask;
  322. } else {
  323. /* Level sensitive interrupt */
  324. if (level == 1) {
  325. uic->uicsr |= mask;
  326. uic->level |= mask;
  327. } else {
  328. uic->uicsr &= ~mask;
  329. uic->level &= ~mask;
  330. }
  331. }
  332. LOG_UIC("%s: irq %d level %d sr %" PRIx32 " => "
  333. "%08" PRIx32 "\n", __func__, irq_num, level, uic->uicsr, sr);
  334. if (sr != uic->uicsr)
  335. ppcuic_trigger_irq(uic);
  336. }
  337. static target_ulong dcr_read_uic (void *opaque, int dcrn)
  338. {
  339. ppcuic_t *uic;
  340. target_ulong ret;
  341. uic = opaque;
  342. dcrn -= uic->dcr_base;
  343. switch (dcrn) {
  344. case DCR_UICSR:
  345. case DCR_UICSRS:
  346. ret = uic->uicsr;
  347. break;
  348. case DCR_UICER:
  349. ret = uic->uicer;
  350. break;
  351. case DCR_UICCR:
  352. ret = uic->uiccr;
  353. break;
  354. case DCR_UICPR:
  355. ret = uic->uicpr;
  356. break;
  357. case DCR_UICTR:
  358. ret = uic->uictr;
  359. break;
  360. case DCR_UICMSR:
  361. ret = uic->uicsr & uic->uicer;
  362. break;
  363. case DCR_UICVR:
  364. if (!uic->use_vectors)
  365. goto no_read;
  366. ret = uic->uicvr;
  367. break;
  368. case DCR_UICVCR:
  369. if (!uic->use_vectors)
  370. goto no_read;
  371. ret = uic->uicvcr;
  372. break;
  373. default:
  374. no_read:
  375. ret = 0x00000000;
  376. break;
  377. }
  378. return ret;
  379. }
  380. static void dcr_write_uic (void *opaque, int dcrn, target_ulong val)
  381. {
  382. ppcuic_t *uic;
  383. uic = opaque;
  384. dcrn -= uic->dcr_base;
  385. LOG_UIC("%s: dcr %d val " ADDRX "\n", __func__, dcrn, val);
  386. switch (dcrn) {
  387. case DCR_UICSR:
  388. uic->uicsr &= ~val;
  389. uic->uicsr |= uic->level;
  390. ppcuic_trigger_irq(uic);
  391. break;
  392. case DCR_UICSRS:
  393. uic->uicsr |= val;
  394. ppcuic_trigger_irq(uic);
  395. break;
  396. case DCR_UICER:
  397. uic->uicer = val;
  398. ppcuic_trigger_irq(uic);
  399. break;
  400. case DCR_UICCR:
  401. uic->uiccr = val;
  402. ppcuic_trigger_irq(uic);
  403. break;
  404. case DCR_UICPR:
  405. uic->uicpr = val;
  406. break;
  407. case DCR_UICTR:
  408. uic->uictr = val;
  409. ppcuic_trigger_irq(uic);
  410. break;
  411. case DCR_UICMSR:
  412. break;
  413. case DCR_UICVR:
  414. break;
  415. case DCR_UICVCR:
  416. uic->uicvcr = val & 0xFFFFFFFD;
  417. ppcuic_trigger_irq(uic);
  418. break;
  419. }
  420. }
  421. static void ppcuic_reset (void *opaque)
  422. {
  423. ppcuic_t *uic;
  424. uic = opaque;
  425. uic->uiccr = 0x00000000;
  426. uic->uicer = 0x00000000;
  427. uic->uicpr = 0x00000000;
  428. uic->uicsr = 0x00000000;
  429. uic->uictr = 0x00000000;
  430. if (uic->use_vectors) {
  431. uic->uicvcr = 0x00000000;
  432. uic->uicvr = 0x0000000;
  433. }
  434. }
  435. qemu_irq *ppcuic_init (CPUState *env, qemu_irq *irqs,
  436. uint32_t dcr_base, int has_ssr, int has_vr)
  437. {
  438. ppcuic_t *uic;
  439. int i;
  440. uic = qemu_mallocz(sizeof(ppcuic_t));
  441. uic->dcr_base = dcr_base;
  442. uic->irqs = irqs;
  443. if (has_vr)
  444. uic->use_vectors = 1;
  445. for (i = 0; i < DCR_UICMAX; i++) {
  446. ppc_dcr_register(env, dcr_base + i, uic,
  447. &dcr_read_uic, &dcr_write_uic);
  448. }
  449. qemu_register_reset(ppcuic_reset, uic);
  450. ppcuic_reset(uic);
  451. return qemu_allocate_irqs(&ppcuic_set_irq, uic, UIC_MAX_IRQ);
  452. }
  453. /*****************************************************************************/
  454. /* SDRAM controller */
  455. typedef struct ppc4xx_sdram_t ppc4xx_sdram_t;
  456. struct ppc4xx_sdram_t {
  457. uint32_t addr;
  458. int nbanks;
  459. target_phys_addr_t ram_bases[4];
  460. target_phys_addr_t ram_sizes[4];
  461. uint32_t besr0;
  462. uint32_t besr1;
  463. uint32_t bear;
  464. uint32_t cfg;
  465. uint32_t status;
  466. uint32_t rtr;
  467. uint32_t pmit;
  468. uint32_t bcr[4];
  469. uint32_t tr;
  470. uint32_t ecccfg;
  471. uint32_t eccesr;
  472. qemu_irq irq;
  473. };
  474. enum {
  475. SDRAM0_CFGADDR = 0x010,
  476. SDRAM0_CFGDATA = 0x011,
  477. };
  478. /* XXX: TOFIX: some patches have made this code become inconsistent:
  479. * there are type inconsistencies, mixing target_phys_addr_t, target_ulong
  480. * and uint32_t
  481. */
  482. static uint32_t sdram_bcr (target_phys_addr_t ram_base,
  483. target_phys_addr_t ram_size)
  484. {
  485. uint32_t bcr;
  486. switch (ram_size) {
  487. case (4 * 1024 * 1024):
  488. bcr = 0x00000000;
  489. break;
  490. case (8 * 1024 * 1024):
  491. bcr = 0x00020000;
  492. break;
  493. case (16 * 1024 * 1024):
  494. bcr = 0x00040000;
  495. break;
  496. case (32 * 1024 * 1024):
  497. bcr = 0x00060000;
  498. break;
  499. case (64 * 1024 * 1024):
  500. bcr = 0x00080000;
  501. break;
  502. case (128 * 1024 * 1024):
  503. bcr = 0x000A0000;
  504. break;
  505. case (256 * 1024 * 1024):
  506. bcr = 0x000C0000;
  507. break;
  508. default:
  509. printf("%s: invalid RAM size " PADDRX "\n", __func__, ram_size);
  510. return 0x00000000;
  511. }
  512. bcr |= ram_base & 0xFF800000;
  513. bcr |= 1;
  514. return bcr;
  515. }
  516. static always_inline target_phys_addr_t sdram_base (uint32_t bcr)
  517. {
  518. return bcr & 0xFF800000;
  519. }
  520. static target_ulong sdram_size (uint32_t bcr)
  521. {
  522. target_ulong size;
  523. int sh;
  524. sh = (bcr >> 17) & 0x7;
  525. if (sh == 7)
  526. size = -1;
  527. else
  528. size = (4 * 1024 * 1024) << sh;
  529. return size;
  530. }
  531. static void sdram_set_bcr (uint32_t *bcrp, uint32_t bcr, int enabled)
  532. {
  533. if (*bcrp & 0x00000001) {
  534. /* Unmap RAM */
  535. #ifdef DEBUG_SDRAM
  536. printf("%s: unmap RAM area " PADDRX " " ADDRX "\n",
  537. __func__, sdram_base(*bcrp), sdram_size(*bcrp));
  538. #endif
  539. cpu_register_physical_memory(sdram_base(*bcrp), sdram_size(*bcrp),
  540. IO_MEM_UNASSIGNED);
  541. }
  542. *bcrp = bcr & 0xFFDEE001;
  543. if (enabled && (bcr & 0x00000001)) {
  544. #ifdef DEBUG_SDRAM
  545. printf("%s: Map RAM area " PADDRX " " ADDRX "\n",
  546. __func__, sdram_base(bcr), sdram_size(bcr));
  547. #endif
  548. cpu_register_physical_memory(sdram_base(bcr), sdram_size(bcr),
  549. sdram_base(bcr) | IO_MEM_RAM);
  550. }
  551. }
  552. static void sdram_map_bcr (ppc4xx_sdram_t *sdram)
  553. {
  554. int i;
  555. for (i = 0; i < sdram->nbanks; i++) {
  556. if (sdram->ram_sizes[i] != 0) {
  557. sdram_set_bcr(&sdram->bcr[i],
  558. sdram_bcr(sdram->ram_bases[i], sdram->ram_sizes[i]),
  559. 1);
  560. } else {
  561. sdram_set_bcr(&sdram->bcr[i], 0x00000000, 0);
  562. }
  563. }
  564. }
  565. static void sdram_unmap_bcr (ppc4xx_sdram_t *sdram)
  566. {
  567. int i;
  568. for (i = 0; i < sdram->nbanks; i++) {
  569. #ifdef DEBUG_SDRAM
  570. printf("%s: Unmap RAM area " PADDRX " " ADDRX "\n",
  571. __func__, sdram_base(sdram->bcr[i]), sdram_size(sdram->bcr[i]));
  572. #endif
  573. cpu_register_physical_memory(sdram_base(sdram->bcr[i]),
  574. sdram_size(sdram->bcr[i]),
  575. IO_MEM_UNASSIGNED);
  576. }
  577. }
  578. static target_ulong dcr_read_sdram (void *opaque, int dcrn)
  579. {
  580. ppc4xx_sdram_t *sdram;
  581. target_ulong ret;
  582. sdram = opaque;
  583. switch (dcrn) {
  584. case SDRAM0_CFGADDR:
  585. ret = sdram->addr;
  586. break;
  587. case SDRAM0_CFGDATA:
  588. switch (sdram->addr) {
  589. case 0x00: /* SDRAM_BESR0 */
  590. ret = sdram->besr0;
  591. break;
  592. case 0x08: /* SDRAM_BESR1 */
  593. ret = sdram->besr1;
  594. break;
  595. case 0x10: /* SDRAM_BEAR */
  596. ret = sdram->bear;
  597. break;
  598. case 0x20: /* SDRAM_CFG */
  599. ret = sdram->cfg;
  600. break;
  601. case 0x24: /* SDRAM_STATUS */
  602. ret = sdram->status;
  603. break;
  604. case 0x30: /* SDRAM_RTR */
  605. ret = sdram->rtr;
  606. break;
  607. case 0x34: /* SDRAM_PMIT */
  608. ret = sdram->pmit;
  609. break;
  610. case 0x40: /* SDRAM_B0CR */
  611. ret = sdram->bcr[0];
  612. break;
  613. case 0x44: /* SDRAM_B1CR */
  614. ret = sdram->bcr[1];
  615. break;
  616. case 0x48: /* SDRAM_B2CR */
  617. ret = sdram->bcr[2];
  618. break;
  619. case 0x4C: /* SDRAM_B3CR */
  620. ret = sdram->bcr[3];
  621. break;
  622. case 0x80: /* SDRAM_TR */
  623. ret = -1; /* ? */
  624. break;
  625. case 0x94: /* SDRAM_ECCCFG */
  626. ret = sdram->ecccfg;
  627. break;
  628. case 0x98: /* SDRAM_ECCESR */
  629. ret = sdram->eccesr;
  630. break;
  631. default: /* Error */
  632. ret = -1;
  633. break;
  634. }
  635. break;
  636. default:
  637. /* Avoid gcc warning */
  638. ret = 0x00000000;
  639. break;
  640. }
  641. return ret;
  642. }
  643. static void dcr_write_sdram (void *opaque, int dcrn, target_ulong val)
  644. {
  645. ppc4xx_sdram_t *sdram;
  646. sdram = opaque;
  647. switch (dcrn) {
  648. case SDRAM0_CFGADDR:
  649. sdram->addr = val;
  650. break;
  651. case SDRAM0_CFGDATA:
  652. switch (sdram->addr) {
  653. case 0x00: /* SDRAM_BESR0 */
  654. sdram->besr0 &= ~val;
  655. break;
  656. case 0x08: /* SDRAM_BESR1 */
  657. sdram->besr1 &= ~val;
  658. break;
  659. case 0x10: /* SDRAM_BEAR */
  660. sdram->bear = val;
  661. break;
  662. case 0x20: /* SDRAM_CFG */
  663. val &= 0xFFE00000;
  664. if (!(sdram->cfg & 0x80000000) && (val & 0x80000000)) {
  665. #ifdef DEBUG_SDRAM
  666. printf("%s: enable SDRAM controller\n", __func__);
  667. #endif
  668. /* validate all RAM mappings */
  669. sdram_map_bcr(sdram);
  670. sdram->status &= ~0x80000000;
  671. } else if ((sdram->cfg & 0x80000000) && !(val & 0x80000000)) {
  672. #ifdef DEBUG_SDRAM
  673. printf("%s: disable SDRAM controller\n", __func__);
  674. #endif
  675. /* invalidate all RAM mappings */
  676. sdram_unmap_bcr(sdram);
  677. sdram->status |= 0x80000000;
  678. }
  679. if (!(sdram->cfg & 0x40000000) && (val & 0x40000000))
  680. sdram->status |= 0x40000000;
  681. else if ((sdram->cfg & 0x40000000) && !(val & 0x40000000))
  682. sdram->status &= ~0x40000000;
  683. sdram->cfg = val;
  684. break;
  685. case 0x24: /* SDRAM_STATUS */
  686. /* Read-only register */
  687. break;
  688. case 0x30: /* SDRAM_RTR */
  689. sdram->rtr = val & 0x3FF80000;
  690. break;
  691. case 0x34: /* SDRAM_PMIT */
  692. sdram->pmit = (val & 0xF8000000) | 0x07C00000;
  693. break;
  694. case 0x40: /* SDRAM_B0CR */
  695. sdram_set_bcr(&sdram->bcr[0], val, sdram->cfg & 0x80000000);
  696. break;
  697. case 0x44: /* SDRAM_B1CR */
  698. sdram_set_bcr(&sdram->bcr[1], val, sdram->cfg & 0x80000000);
  699. break;
  700. case 0x48: /* SDRAM_B2CR */
  701. sdram_set_bcr(&sdram->bcr[2], val, sdram->cfg & 0x80000000);
  702. break;
  703. case 0x4C: /* SDRAM_B3CR */
  704. sdram_set_bcr(&sdram->bcr[3], val, sdram->cfg & 0x80000000);
  705. break;
  706. case 0x80: /* SDRAM_TR */
  707. sdram->tr = val & 0x018FC01F;
  708. break;
  709. case 0x94: /* SDRAM_ECCCFG */
  710. sdram->ecccfg = val & 0x00F00000;
  711. break;
  712. case 0x98: /* SDRAM_ECCESR */
  713. val &= 0xFFF0F000;
  714. if (sdram->eccesr == 0 && val != 0)
  715. qemu_irq_raise(sdram->irq);
  716. else if (sdram->eccesr != 0 && val == 0)
  717. qemu_irq_lower(sdram->irq);
  718. sdram->eccesr = val;
  719. break;
  720. default: /* Error */
  721. break;
  722. }
  723. break;
  724. }
  725. }
  726. static void sdram_reset (void *opaque)
  727. {
  728. ppc4xx_sdram_t *sdram;
  729. sdram = opaque;
  730. sdram->addr = 0x00000000;
  731. sdram->bear = 0x00000000;
  732. sdram->besr0 = 0x00000000; /* No error */
  733. sdram->besr1 = 0x00000000; /* No error */
  734. sdram->cfg = 0x00000000;
  735. sdram->ecccfg = 0x00000000; /* No ECC */
  736. sdram->eccesr = 0x00000000; /* No error */
  737. sdram->pmit = 0x07C00000;
  738. sdram->rtr = 0x05F00000;
  739. sdram->tr = 0x00854009;
  740. /* We pre-initialize RAM banks */
  741. sdram->status = 0x00000000;
  742. sdram->cfg = 0x00800000;
  743. sdram_unmap_bcr(sdram);
  744. }
  745. void ppc4xx_sdram_init (CPUState *env, qemu_irq irq, int nbanks,
  746. target_phys_addr_t *ram_bases,
  747. target_phys_addr_t *ram_sizes,
  748. int do_init)
  749. {
  750. ppc4xx_sdram_t *sdram;
  751. sdram = qemu_mallocz(sizeof(ppc4xx_sdram_t));
  752. sdram->irq = irq;
  753. sdram->nbanks = nbanks;
  754. memset(sdram->ram_bases, 0, 4 * sizeof(target_phys_addr_t));
  755. memcpy(sdram->ram_bases, ram_bases,
  756. nbanks * sizeof(target_phys_addr_t));
  757. memset(sdram->ram_sizes, 0, 4 * sizeof(target_phys_addr_t));
  758. memcpy(sdram->ram_sizes, ram_sizes,
  759. nbanks * sizeof(target_phys_addr_t));
  760. sdram_reset(sdram);
  761. qemu_register_reset(&sdram_reset, sdram);
  762. ppc_dcr_register(env, SDRAM0_CFGADDR,
  763. sdram, &dcr_read_sdram, &dcr_write_sdram);
  764. ppc_dcr_register(env, SDRAM0_CFGDATA,
  765. sdram, &dcr_read_sdram, &dcr_write_sdram);
  766. if (do_init)
  767. sdram_map_bcr(sdram);
  768. }
  769. /* Fill in consecutive SDRAM banks with 'ram_size' bytes of memory.
  770. *
  771. * sdram_bank_sizes[] must be 0-terminated.
  772. *
  773. * The 4xx SDRAM controller supports a small number of banks, and each bank
  774. * must be one of a small set of sizes. The number of banks and the supported
  775. * sizes varies by SoC. */
  776. ram_addr_t ppc4xx_sdram_adjust(ram_addr_t ram_size, int nr_banks,
  777. target_phys_addr_t ram_bases[],
  778. target_phys_addr_t ram_sizes[],
  779. const unsigned int sdram_bank_sizes[])
  780. {
  781. ram_addr_t ram_end = 0;
  782. int i;
  783. int j;
  784. for (i = 0; i < nr_banks; i++) {
  785. for (j = 0; sdram_bank_sizes[j] != 0; j++) {
  786. unsigned int bank_size = sdram_bank_sizes[j];
  787. if (bank_size <= ram_size) {
  788. ram_bases[i] = ram_end;
  789. ram_sizes[i] = bank_size;
  790. ram_end += bank_size;
  791. ram_size -= bank_size;
  792. break;
  793. }
  794. }
  795. if (!ram_size) {
  796. /* No need to use the remaining banks. */
  797. break;
  798. }
  799. }
  800. if (ram_size)
  801. printf("Truncating memory to %d MiB to fit SDRAM controller limits.\n",
  802. (int)(ram_end >> 20));
  803. return ram_end;
  804. }