strongarm.c 42 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425142614271428142914301431143214331434143514361437143814391440144114421443144414451446144714481449145014511452145314541455145614571458145914601461146214631464146514661467146814691470147114721473147414751476147714781479148014811482148314841485148614871488148914901491149214931494149514961497149814991500150115021503150415051506150715081509151015111512151315141515151615171518151915201521152215231524152515261527152815291530153115321533153415351536153715381539154015411542154315441545154615471548154915501551155215531554155515561557155815591560156115621563156415651566156715681569157015711572157315741575157615771578157915801581158215831584158515861587158815891590159115921593159415951596159715981599160016011602160316041605160616071608160916101611161216131614161516161617161816191620162116221623
  1. /*
  2. * StrongARM SA-1100/SA-1110 emulation
  3. *
  4. * Copyright (C) 2011 Dmitry Eremin-Solenikov
  5. *
  6. * Largely based on StrongARM emulation:
  7. * Copyright (c) 2006 Openedhand Ltd.
  8. * Written by Andrzej Zaborowski <balrog@zabor.org>
  9. *
  10. * UART code based on QEMU 16550A UART emulation
  11. * Copyright (c) 2003-2004 Fabrice Bellard
  12. * Copyright (c) 2008 Citrix Systems, Inc.
  13. *
  14. * This program is free software; you can redistribute it and/or modify
  15. * it under the terms of the GNU General Public License version 2 as
  16. * published by the Free Software Foundation.
  17. *
  18. * This program is distributed in the hope that it will be useful,
  19. * but WITHOUT ANY WARRANTY; without even the implied warranty of
  20. * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  21. * GNU General Public License for more details.
  22. *
  23. * You should have received a copy of the GNU General Public License along
  24. * with this program; if not, see <http://www.gnu.org/licenses/>.
  25. *
  26. * Contributions after 2012-01-13 are licensed under the terms of the
  27. * GNU GPL, version 2 or (at your option) any later version.
  28. */
  29. #include "sysbus.h"
  30. #include "strongarm.h"
  31. #include "qemu/error-report.h"
  32. #include "arm-misc.h"
  33. #include "char/char.h"
  34. #include "sysemu/sysemu.h"
  35. #include "ssi.h"
  36. //#define DEBUG
  37. /*
  38. TODO
  39. - Implement cp15, c14 ?
  40. - Implement cp15, c15 !!! (idle used in L)
  41. - Implement idle mode handling/DIM
  42. - Implement sleep mode/Wake sources
  43. - Implement reset control
  44. - Implement memory control regs
  45. - PCMCIA handling
  46. - Maybe support MBGNT/MBREQ
  47. - DMA channels
  48. - GPCLK
  49. - IrDA
  50. - MCP
  51. - Enhance UART with modem signals
  52. */
  53. #ifdef DEBUG
  54. # define DPRINTF(format, ...) printf(format , ## __VA_ARGS__)
  55. #else
  56. # define DPRINTF(format, ...) do { } while (0)
  57. #endif
  58. static struct {
  59. hwaddr io_base;
  60. int irq;
  61. } sa_serial[] = {
  62. { 0x80010000, SA_PIC_UART1 },
  63. { 0x80030000, SA_PIC_UART2 },
  64. { 0x80050000, SA_PIC_UART3 },
  65. { 0, 0 }
  66. };
  67. /* Interrupt Controller */
  68. typedef struct {
  69. SysBusDevice busdev;
  70. MemoryRegion iomem;
  71. qemu_irq irq;
  72. qemu_irq fiq;
  73. uint32_t pending;
  74. uint32_t enabled;
  75. uint32_t is_fiq;
  76. uint32_t int_idle;
  77. } StrongARMPICState;
  78. #define ICIP 0x00
  79. #define ICMR 0x04
  80. #define ICLR 0x08
  81. #define ICFP 0x10
  82. #define ICPR 0x20
  83. #define ICCR 0x0c
  84. #define SA_PIC_SRCS 32
  85. static void strongarm_pic_update(void *opaque)
  86. {
  87. StrongARMPICState *s = opaque;
  88. /* FIXME: reflect DIM */
  89. qemu_set_irq(s->fiq, s->pending & s->enabled & s->is_fiq);
  90. qemu_set_irq(s->irq, s->pending & s->enabled & ~s->is_fiq);
  91. }
  92. static void strongarm_pic_set_irq(void *opaque, int irq, int level)
  93. {
  94. StrongARMPICState *s = opaque;
  95. if (level) {
  96. s->pending |= 1 << irq;
  97. } else {
  98. s->pending &= ~(1 << irq);
  99. }
  100. strongarm_pic_update(s);
  101. }
  102. static uint64_t strongarm_pic_mem_read(void *opaque, hwaddr offset,
  103. unsigned size)
  104. {
  105. StrongARMPICState *s = opaque;
  106. switch (offset) {
  107. case ICIP:
  108. return s->pending & ~s->is_fiq & s->enabled;
  109. case ICMR:
  110. return s->enabled;
  111. case ICLR:
  112. return s->is_fiq;
  113. case ICCR:
  114. return s->int_idle == 0;
  115. case ICFP:
  116. return s->pending & s->is_fiq & s->enabled;
  117. case ICPR:
  118. return s->pending;
  119. default:
  120. printf("%s: Bad register offset 0x" TARGET_FMT_plx "\n",
  121. __func__, offset);
  122. return 0;
  123. }
  124. }
  125. static void strongarm_pic_mem_write(void *opaque, hwaddr offset,
  126. uint64_t value, unsigned size)
  127. {
  128. StrongARMPICState *s = opaque;
  129. switch (offset) {
  130. case ICMR:
  131. s->enabled = value;
  132. break;
  133. case ICLR:
  134. s->is_fiq = value;
  135. break;
  136. case ICCR:
  137. s->int_idle = (value & 1) ? 0 : ~0;
  138. break;
  139. default:
  140. printf("%s: Bad register offset 0x" TARGET_FMT_plx "\n",
  141. __func__, offset);
  142. break;
  143. }
  144. strongarm_pic_update(s);
  145. }
  146. static const MemoryRegionOps strongarm_pic_ops = {
  147. .read = strongarm_pic_mem_read,
  148. .write = strongarm_pic_mem_write,
  149. .endianness = DEVICE_NATIVE_ENDIAN,
  150. };
  151. static int strongarm_pic_initfn(SysBusDevice *dev)
  152. {
  153. StrongARMPICState *s = FROM_SYSBUS(StrongARMPICState, dev);
  154. qdev_init_gpio_in(&dev->qdev, strongarm_pic_set_irq, SA_PIC_SRCS);
  155. memory_region_init_io(&s->iomem, &strongarm_pic_ops, s, "pic", 0x1000);
  156. sysbus_init_mmio(dev, &s->iomem);
  157. sysbus_init_irq(dev, &s->irq);
  158. sysbus_init_irq(dev, &s->fiq);
  159. return 0;
  160. }
  161. static int strongarm_pic_post_load(void *opaque, int version_id)
  162. {
  163. strongarm_pic_update(opaque);
  164. return 0;
  165. }
  166. static VMStateDescription vmstate_strongarm_pic_regs = {
  167. .name = "strongarm_pic",
  168. .version_id = 0,
  169. .minimum_version_id = 0,
  170. .minimum_version_id_old = 0,
  171. .post_load = strongarm_pic_post_load,
  172. .fields = (VMStateField[]) {
  173. VMSTATE_UINT32(pending, StrongARMPICState),
  174. VMSTATE_UINT32(enabled, StrongARMPICState),
  175. VMSTATE_UINT32(is_fiq, StrongARMPICState),
  176. VMSTATE_UINT32(int_idle, StrongARMPICState),
  177. VMSTATE_END_OF_LIST(),
  178. },
  179. };
  180. static void strongarm_pic_class_init(ObjectClass *klass, void *data)
  181. {
  182. DeviceClass *dc = DEVICE_CLASS(klass);
  183. SysBusDeviceClass *k = SYS_BUS_DEVICE_CLASS(klass);
  184. k->init = strongarm_pic_initfn;
  185. dc->desc = "StrongARM PIC";
  186. dc->vmsd = &vmstate_strongarm_pic_regs;
  187. }
  188. static const TypeInfo strongarm_pic_info = {
  189. .name = "strongarm_pic",
  190. .parent = TYPE_SYS_BUS_DEVICE,
  191. .instance_size = sizeof(StrongARMPICState),
  192. .class_init = strongarm_pic_class_init,
  193. };
  194. /* Real-Time Clock */
  195. #define RTAR 0x00 /* RTC Alarm register */
  196. #define RCNR 0x04 /* RTC Counter register */
  197. #define RTTR 0x08 /* RTC Timer Trim register */
  198. #define RTSR 0x10 /* RTC Status register */
  199. #define RTSR_AL (1 << 0) /* RTC Alarm detected */
  200. #define RTSR_HZ (1 << 1) /* RTC 1Hz detected */
  201. #define RTSR_ALE (1 << 2) /* RTC Alarm enable */
  202. #define RTSR_HZE (1 << 3) /* RTC 1Hz enable */
  203. /* 16 LSB of RTTR are clockdiv for internal trim logic,
  204. * trim delete isn't emulated, so
  205. * f = 32 768 / (RTTR_trim + 1) */
  206. typedef struct {
  207. SysBusDevice busdev;
  208. MemoryRegion iomem;
  209. uint32_t rttr;
  210. uint32_t rtsr;
  211. uint32_t rtar;
  212. uint32_t last_rcnr;
  213. int64_t last_hz;
  214. QEMUTimer *rtc_alarm;
  215. QEMUTimer *rtc_hz;
  216. qemu_irq rtc_irq;
  217. qemu_irq rtc_hz_irq;
  218. } StrongARMRTCState;
  219. static inline void strongarm_rtc_int_update(StrongARMRTCState *s)
  220. {
  221. qemu_set_irq(s->rtc_irq, s->rtsr & RTSR_AL);
  222. qemu_set_irq(s->rtc_hz_irq, s->rtsr & RTSR_HZ);
  223. }
  224. static void strongarm_rtc_hzupdate(StrongARMRTCState *s)
  225. {
  226. int64_t rt = qemu_get_clock_ms(rtc_clock);
  227. s->last_rcnr += ((rt - s->last_hz) << 15) /
  228. (1000 * ((s->rttr & 0xffff) + 1));
  229. s->last_hz = rt;
  230. }
  231. static inline void strongarm_rtc_timer_update(StrongARMRTCState *s)
  232. {
  233. if ((s->rtsr & RTSR_HZE) && !(s->rtsr & RTSR_HZ)) {
  234. qemu_mod_timer(s->rtc_hz, s->last_hz + 1000);
  235. } else {
  236. qemu_del_timer(s->rtc_hz);
  237. }
  238. if ((s->rtsr & RTSR_ALE) && !(s->rtsr & RTSR_AL)) {
  239. qemu_mod_timer(s->rtc_alarm, s->last_hz +
  240. (((s->rtar - s->last_rcnr) * 1000 *
  241. ((s->rttr & 0xffff) + 1)) >> 15));
  242. } else {
  243. qemu_del_timer(s->rtc_alarm);
  244. }
  245. }
  246. static inline void strongarm_rtc_alarm_tick(void *opaque)
  247. {
  248. StrongARMRTCState *s = opaque;
  249. s->rtsr |= RTSR_AL;
  250. strongarm_rtc_timer_update(s);
  251. strongarm_rtc_int_update(s);
  252. }
  253. static inline void strongarm_rtc_hz_tick(void *opaque)
  254. {
  255. StrongARMRTCState *s = opaque;
  256. s->rtsr |= RTSR_HZ;
  257. strongarm_rtc_timer_update(s);
  258. strongarm_rtc_int_update(s);
  259. }
  260. static uint64_t strongarm_rtc_read(void *opaque, hwaddr addr,
  261. unsigned size)
  262. {
  263. StrongARMRTCState *s = opaque;
  264. switch (addr) {
  265. case RTTR:
  266. return s->rttr;
  267. case RTSR:
  268. return s->rtsr;
  269. case RTAR:
  270. return s->rtar;
  271. case RCNR:
  272. return s->last_rcnr +
  273. ((qemu_get_clock_ms(rtc_clock) - s->last_hz) << 15) /
  274. (1000 * ((s->rttr & 0xffff) + 1));
  275. default:
  276. printf("%s: Bad register 0x" TARGET_FMT_plx "\n", __func__, addr);
  277. return 0;
  278. }
  279. }
  280. static void strongarm_rtc_write(void *opaque, hwaddr addr,
  281. uint64_t value, unsigned size)
  282. {
  283. StrongARMRTCState *s = opaque;
  284. uint32_t old_rtsr;
  285. switch (addr) {
  286. case RTTR:
  287. strongarm_rtc_hzupdate(s);
  288. s->rttr = value;
  289. strongarm_rtc_timer_update(s);
  290. break;
  291. case RTSR:
  292. old_rtsr = s->rtsr;
  293. s->rtsr = (value & (RTSR_ALE | RTSR_HZE)) |
  294. (s->rtsr & ~(value & (RTSR_AL | RTSR_HZ)));
  295. if (s->rtsr != old_rtsr) {
  296. strongarm_rtc_timer_update(s);
  297. }
  298. strongarm_rtc_int_update(s);
  299. break;
  300. case RTAR:
  301. s->rtar = value;
  302. strongarm_rtc_timer_update(s);
  303. break;
  304. case RCNR:
  305. strongarm_rtc_hzupdate(s);
  306. s->last_rcnr = value;
  307. strongarm_rtc_timer_update(s);
  308. break;
  309. default:
  310. printf("%s: Bad register 0x" TARGET_FMT_plx "\n", __func__, addr);
  311. }
  312. }
  313. static const MemoryRegionOps strongarm_rtc_ops = {
  314. .read = strongarm_rtc_read,
  315. .write = strongarm_rtc_write,
  316. .endianness = DEVICE_NATIVE_ENDIAN,
  317. };
  318. static int strongarm_rtc_init(SysBusDevice *dev)
  319. {
  320. StrongARMRTCState *s = FROM_SYSBUS(StrongARMRTCState, dev);
  321. struct tm tm;
  322. s->rttr = 0x0;
  323. s->rtsr = 0;
  324. qemu_get_timedate(&tm, 0);
  325. s->last_rcnr = (uint32_t) mktimegm(&tm);
  326. s->last_hz = qemu_get_clock_ms(rtc_clock);
  327. s->rtc_alarm = qemu_new_timer_ms(rtc_clock, strongarm_rtc_alarm_tick, s);
  328. s->rtc_hz = qemu_new_timer_ms(rtc_clock, strongarm_rtc_hz_tick, s);
  329. sysbus_init_irq(dev, &s->rtc_irq);
  330. sysbus_init_irq(dev, &s->rtc_hz_irq);
  331. memory_region_init_io(&s->iomem, &strongarm_rtc_ops, s, "rtc", 0x10000);
  332. sysbus_init_mmio(dev, &s->iomem);
  333. return 0;
  334. }
  335. static void strongarm_rtc_pre_save(void *opaque)
  336. {
  337. StrongARMRTCState *s = opaque;
  338. strongarm_rtc_hzupdate(s);
  339. }
  340. static int strongarm_rtc_post_load(void *opaque, int version_id)
  341. {
  342. StrongARMRTCState *s = opaque;
  343. strongarm_rtc_timer_update(s);
  344. strongarm_rtc_int_update(s);
  345. return 0;
  346. }
  347. static const VMStateDescription vmstate_strongarm_rtc_regs = {
  348. .name = "strongarm-rtc",
  349. .version_id = 0,
  350. .minimum_version_id = 0,
  351. .minimum_version_id_old = 0,
  352. .pre_save = strongarm_rtc_pre_save,
  353. .post_load = strongarm_rtc_post_load,
  354. .fields = (VMStateField[]) {
  355. VMSTATE_UINT32(rttr, StrongARMRTCState),
  356. VMSTATE_UINT32(rtsr, StrongARMRTCState),
  357. VMSTATE_UINT32(rtar, StrongARMRTCState),
  358. VMSTATE_UINT32(last_rcnr, StrongARMRTCState),
  359. VMSTATE_INT64(last_hz, StrongARMRTCState),
  360. VMSTATE_END_OF_LIST(),
  361. },
  362. };
  363. static void strongarm_rtc_sysbus_class_init(ObjectClass *klass, void *data)
  364. {
  365. DeviceClass *dc = DEVICE_CLASS(klass);
  366. SysBusDeviceClass *k = SYS_BUS_DEVICE_CLASS(klass);
  367. k->init = strongarm_rtc_init;
  368. dc->desc = "StrongARM RTC Controller";
  369. dc->vmsd = &vmstate_strongarm_rtc_regs;
  370. }
  371. static const TypeInfo strongarm_rtc_sysbus_info = {
  372. .name = "strongarm-rtc",
  373. .parent = TYPE_SYS_BUS_DEVICE,
  374. .instance_size = sizeof(StrongARMRTCState),
  375. .class_init = strongarm_rtc_sysbus_class_init,
  376. };
  377. /* GPIO */
  378. #define GPLR 0x00
  379. #define GPDR 0x04
  380. #define GPSR 0x08
  381. #define GPCR 0x0c
  382. #define GRER 0x10
  383. #define GFER 0x14
  384. #define GEDR 0x18
  385. #define GAFR 0x1c
  386. typedef struct StrongARMGPIOInfo StrongARMGPIOInfo;
  387. struct StrongARMGPIOInfo {
  388. SysBusDevice busdev;
  389. MemoryRegion iomem;
  390. qemu_irq handler[28];
  391. qemu_irq irqs[11];
  392. qemu_irq irqX;
  393. uint32_t ilevel;
  394. uint32_t olevel;
  395. uint32_t dir;
  396. uint32_t rising;
  397. uint32_t falling;
  398. uint32_t status;
  399. uint32_t gpsr;
  400. uint32_t gafr;
  401. uint32_t prev_level;
  402. };
  403. static void strongarm_gpio_irq_update(StrongARMGPIOInfo *s)
  404. {
  405. int i;
  406. for (i = 0; i < 11; i++) {
  407. qemu_set_irq(s->irqs[i], s->status & (1 << i));
  408. }
  409. qemu_set_irq(s->irqX, (s->status & ~0x7ff));
  410. }
  411. static void strongarm_gpio_set(void *opaque, int line, int level)
  412. {
  413. StrongARMGPIOInfo *s = opaque;
  414. uint32_t mask;
  415. mask = 1 << line;
  416. if (level) {
  417. s->status |= s->rising & mask &
  418. ~s->ilevel & ~s->dir;
  419. s->ilevel |= mask;
  420. } else {
  421. s->status |= s->falling & mask &
  422. s->ilevel & ~s->dir;
  423. s->ilevel &= ~mask;
  424. }
  425. if (s->status & mask) {
  426. strongarm_gpio_irq_update(s);
  427. }
  428. }
  429. static void strongarm_gpio_handler_update(StrongARMGPIOInfo *s)
  430. {
  431. uint32_t level, diff;
  432. int bit;
  433. level = s->olevel & s->dir;
  434. for (diff = s->prev_level ^ level; diff; diff ^= 1 << bit) {
  435. bit = ffs(diff) - 1;
  436. qemu_set_irq(s->handler[bit], (level >> bit) & 1);
  437. }
  438. s->prev_level = level;
  439. }
  440. static uint64_t strongarm_gpio_read(void *opaque, hwaddr offset,
  441. unsigned size)
  442. {
  443. StrongARMGPIOInfo *s = opaque;
  444. switch (offset) {
  445. case GPDR: /* GPIO Pin-Direction registers */
  446. return s->dir;
  447. case GPSR: /* GPIO Pin-Output Set registers */
  448. DPRINTF("%s: Read from a write-only register 0x" TARGET_FMT_plx "\n",
  449. __func__, offset);
  450. return s->gpsr; /* Return last written value. */
  451. case GPCR: /* GPIO Pin-Output Clear registers */
  452. DPRINTF("%s: Read from a write-only register 0x" TARGET_FMT_plx "\n",
  453. __func__, offset);
  454. return 31337; /* Specified as unpredictable in the docs. */
  455. case GRER: /* GPIO Rising-Edge Detect Enable registers */
  456. return s->rising;
  457. case GFER: /* GPIO Falling-Edge Detect Enable registers */
  458. return s->falling;
  459. case GAFR: /* GPIO Alternate Function registers */
  460. return s->gafr;
  461. case GPLR: /* GPIO Pin-Level registers */
  462. return (s->olevel & s->dir) |
  463. (s->ilevel & ~s->dir);
  464. case GEDR: /* GPIO Edge Detect Status registers */
  465. return s->status;
  466. default:
  467. printf("%s: Bad offset 0x" TARGET_FMT_plx "\n", __func__, offset);
  468. }
  469. return 0;
  470. }
  471. static void strongarm_gpio_write(void *opaque, hwaddr offset,
  472. uint64_t value, unsigned size)
  473. {
  474. StrongARMGPIOInfo *s = opaque;
  475. switch (offset) {
  476. case GPDR: /* GPIO Pin-Direction registers */
  477. s->dir = value;
  478. strongarm_gpio_handler_update(s);
  479. break;
  480. case GPSR: /* GPIO Pin-Output Set registers */
  481. s->olevel |= value;
  482. strongarm_gpio_handler_update(s);
  483. s->gpsr = value;
  484. break;
  485. case GPCR: /* GPIO Pin-Output Clear registers */
  486. s->olevel &= ~value;
  487. strongarm_gpio_handler_update(s);
  488. break;
  489. case GRER: /* GPIO Rising-Edge Detect Enable registers */
  490. s->rising = value;
  491. break;
  492. case GFER: /* GPIO Falling-Edge Detect Enable registers */
  493. s->falling = value;
  494. break;
  495. case GAFR: /* GPIO Alternate Function registers */
  496. s->gafr = value;
  497. break;
  498. case GEDR: /* GPIO Edge Detect Status registers */
  499. s->status &= ~value;
  500. strongarm_gpio_irq_update(s);
  501. break;
  502. default:
  503. printf("%s: Bad offset 0x" TARGET_FMT_plx "\n", __func__, offset);
  504. }
  505. }
  506. static const MemoryRegionOps strongarm_gpio_ops = {
  507. .read = strongarm_gpio_read,
  508. .write = strongarm_gpio_write,
  509. .endianness = DEVICE_NATIVE_ENDIAN,
  510. };
  511. static DeviceState *strongarm_gpio_init(hwaddr base,
  512. DeviceState *pic)
  513. {
  514. DeviceState *dev;
  515. int i;
  516. dev = qdev_create(NULL, "strongarm-gpio");
  517. qdev_init_nofail(dev);
  518. sysbus_mmio_map(SYS_BUS_DEVICE(dev), 0, base);
  519. for (i = 0; i < 12; i++)
  520. sysbus_connect_irq(SYS_BUS_DEVICE(dev), i,
  521. qdev_get_gpio_in(pic, SA_PIC_GPIO0_EDGE + i));
  522. return dev;
  523. }
  524. static int strongarm_gpio_initfn(SysBusDevice *dev)
  525. {
  526. StrongARMGPIOInfo *s;
  527. int i;
  528. s = FROM_SYSBUS(StrongARMGPIOInfo, dev);
  529. qdev_init_gpio_in(&dev->qdev, strongarm_gpio_set, 28);
  530. qdev_init_gpio_out(&dev->qdev, s->handler, 28);
  531. memory_region_init_io(&s->iomem, &strongarm_gpio_ops, s, "gpio", 0x1000);
  532. sysbus_init_mmio(dev, &s->iomem);
  533. for (i = 0; i < 11; i++) {
  534. sysbus_init_irq(dev, &s->irqs[i]);
  535. }
  536. sysbus_init_irq(dev, &s->irqX);
  537. return 0;
  538. }
  539. static const VMStateDescription vmstate_strongarm_gpio_regs = {
  540. .name = "strongarm-gpio",
  541. .version_id = 0,
  542. .minimum_version_id = 0,
  543. .minimum_version_id_old = 0,
  544. .fields = (VMStateField[]) {
  545. VMSTATE_UINT32(ilevel, StrongARMGPIOInfo),
  546. VMSTATE_UINT32(olevel, StrongARMGPIOInfo),
  547. VMSTATE_UINT32(dir, StrongARMGPIOInfo),
  548. VMSTATE_UINT32(rising, StrongARMGPIOInfo),
  549. VMSTATE_UINT32(falling, StrongARMGPIOInfo),
  550. VMSTATE_UINT32(status, StrongARMGPIOInfo),
  551. VMSTATE_UINT32(gafr, StrongARMGPIOInfo),
  552. VMSTATE_END_OF_LIST(),
  553. },
  554. };
  555. static void strongarm_gpio_class_init(ObjectClass *klass, void *data)
  556. {
  557. DeviceClass *dc = DEVICE_CLASS(klass);
  558. SysBusDeviceClass *k = SYS_BUS_DEVICE_CLASS(klass);
  559. k->init = strongarm_gpio_initfn;
  560. dc->desc = "StrongARM GPIO controller";
  561. }
  562. static const TypeInfo strongarm_gpio_info = {
  563. .name = "strongarm-gpio",
  564. .parent = TYPE_SYS_BUS_DEVICE,
  565. .instance_size = sizeof(StrongARMGPIOInfo),
  566. .class_init = strongarm_gpio_class_init,
  567. };
  568. /* Peripheral Pin Controller */
  569. #define PPDR 0x00
  570. #define PPSR 0x04
  571. #define PPAR 0x08
  572. #define PSDR 0x0c
  573. #define PPFR 0x10
  574. typedef struct StrongARMPPCInfo StrongARMPPCInfo;
  575. struct StrongARMPPCInfo {
  576. SysBusDevice busdev;
  577. MemoryRegion iomem;
  578. qemu_irq handler[28];
  579. uint32_t ilevel;
  580. uint32_t olevel;
  581. uint32_t dir;
  582. uint32_t ppar;
  583. uint32_t psdr;
  584. uint32_t ppfr;
  585. uint32_t prev_level;
  586. };
  587. static void strongarm_ppc_set(void *opaque, int line, int level)
  588. {
  589. StrongARMPPCInfo *s = opaque;
  590. if (level) {
  591. s->ilevel |= 1 << line;
  592. } else {
  593. s->ilevel &= ~(1 << line);
  594. }
  595. }
  596. static void strongarm_ppc_handler_update(StrongARMPPCInfo *s)
  597. {
  598. uint32_t level, diff;
  599. int bit;
  600. level = s->olevel & s->dir;
  601. for (diff = s->prev_level ^ level; diff; diff ^= 1 << bit) {
  602. bit = ffs(diff) - 1;
  603. qemu_set_irq(s->handler[bit], (level >> bit) & 1);
  604. }
  605. s->prev_level = level;
  606. }
  607. static uint64_t strongarm_ppc_read(void *opaque, hwaddr offset,
  608. unsigned size)
  609. {
  610. StrongARMPPCInfo *s = opaque;
  611. switch (offset) {
  612. case PPDR: /* PPC Pin Direction registers */
  613. return s->dir | ~0x3fffff;
  614. case PPSR: /* PPC Pin State registers */
  615. return (s->olevel & s->dir) |
  616. (s->ilevel & ~s->dir) |
  617. ~0x3fffff;
  618. case PPAR:
  619. return s->ppar | ~0x41000;
  620. case PSDR:
  621. return s->psdr;
  622. case PPFR:
  623. return s->ppfr | ~0x7f001;
  624. default:
  625. printf("%s: Bad offset 0x" TARGET_FMT_plx "\n", __func__, offset);
  626. }
  627. return 0;
  628. }
  629. static void strongarm_ppc_write(void *opaque, hwaddr offset,
  630. uint64_t value, unsigned size)
  631. {
  632. StrongARMPPCInfo *s = opaque;
  633. switch (offset) {
  634. case PPDR: /* PPC Pin Direction registers */
  635. s->dir = value & 0x3fffff;
  636. strongarm_ppc_handler_update(s);
  637. break;
  638. case PPSR: /* PPC Pin State registers */
  639. s->olevel = value & s->dir & 0x3fffff;
  640. strongarm_ppc_handler_update(s);
  641. break;
  642. case PPAR:
  643. s->ppar = value & 0x41000;
  644. break;
  645. case PSDR:
  646. s->psdr = value & 0x3fffff;
  647. break;
  648. case PPFR:
  649. s->ppfr = value & 0x7f001;
  650. break;
  651. default:
  652. printf("%s: Bad offset 0x" TARGET_FMT_plx "\n", __func__, offset);
  653. }
  654. }
  655. static const MemoryRegionOps strongarm_ppc_ops = {
  656. .read = strongarm_ppc_read,
  657. .write = strongarm_ppc_write,
  658. .endianness = DEVICE_NATIVE_ENDIAN,
  659. };
  660. static int strongarm_ppc_init(SysBusDevice *dev)
  661. {
  662. StrongARMPPCInfo *s;
  663. s = FROM_SYSBUS(StrongARMPPCInfo, dev);
  664. qdev_init_gpio_in(&dev->qdev, strongarm_ppc_set, 22);
  665. qdev_init_gpio_out(&dev->qdev, s->handler, 22);
  666. memory_region_init_io(&s->iomem, &strongarm_ppc_ops, s, "ppc", 0x1000);
  667. sysbus_init_mmio(dev, &s->iomem);
  668. return 0;
  669. }
  670. static const VMStateDescription vmstate_strongarm_ppc_regs = {
  671. .name = "strongarm-ppc",
  672. .version_id = 0,
  673. .minimum_version_id = 0,
  674. .minimum_version_id_old = 0,
  675. .fields = (VMStateField[]) {
  676. VMSTATE_UINT32(ilevel, StrongARMPPCInfo),
  677. VMSTATE_UINT32(olevel, StrongARMPPCInfo),
  678. VMSTATE_UINT32(dir, StrongARMPPCInfo),
  679. VMSTATE_UINT32(ppar, StrongARMPPCInfo),
  680. VMSTATE_UINT32(psdr, StrongARMPPCInfo),
  681. VMSTATE_UINT32(ppfr, StrongARMPPCInfo),
  682. VMSTATE_END_OF_LIST(),
  683. },
  684. };
  685. static void strongarm_ppc_class_init(ObjectClass *klass, void *data)
  686. {
  687. DeviceClass *dc = DEVICE_CLASS(klass);
  688. SysBusDeviceClass *k = SYS_BUS_DEVICE_CLASS(klass);
  689. k->init = strongarm_ppc_init;
  690. dc->desc = "StrongARM PPC controller";
  691. }
  692. static const TypeInfo strongarm_ppc_info = {
  693. .name = "strongarm-ppc",
  694. .parent = TYPE_SYS_BUS_DEVICE,
  695. .instance_size = sizeof(StrongARMPPCInfo),
  696. .class_init = strongarm_ppc_class_init,
  697. };
  698. /* UART Ports */
  699. #define UTCR0 0x00
  700. #define UTCR1 0x04
  701. #define UTCR2 0x08
  702. #define UTCR3 0x0c
  703. #define UTDR 0x14
  704. #define UTSR0 0x1c
  705. #define UTSR1 0x20
  706. #define UTCR0_PE (1 << 0) /* Parity enable */
  707. #define UTCR0_OES (1 << 1) /* Even parity */
  708. #define UTCR0_SBS (1 << 2) /* 2 stop bits */
  709. #define UTCR0_DSS (1 << 3) /* 8-bit data */
  710. #define UTCR3_RXE (1 << 0) /* Rx enable */
  711. #define UTCR3_TXE (1 << 1) /* Tx enable */
  712. #define UTCR3_BRK (1 << 2) /* Force Break */
  713. #define UTCR3_RIE (1 << 3) /* Rx int enable */
  714. #define UTCR3_TIE (1 << 4) /* Tx int enable */
  715. #define UTCR3_LBM (1 << 5) /* Loopback */
  716. #define UTSR0_TFS (1 << 0) /* Tx FIFO nearly empty */
  717. #define UTSR0_RFS (1 << 1) /* Rx FIFO nearly full */
  718. #define UTSR0_RID (1 << 2) /* Receiver Idle */
  719. #define UTSR0_RBB (1 << 3) /* Receiver begin break */
  720. #define UTSR0_REB (1 << 4) /* Receiver end break */
  721. #define UTSR0_EIF (1 << 5) /* Error in FIFO */
  722. #define UTSR1_RNE (1 << 1) /* Receive FIFO not empty */
  723. #define UTSR1_TNF (1 << 2) /* Transmit FIFO not full */
  724. #define UTSR1_PRE (1 << 3) /* Parity error */
  725. #define UTSR1_FRE (1 << 4) /* Frame error */
  726. #define UTSR1_ROR (1 << 5) /* Receive Over Run */
  727. #define RX_FIFO_PRE (1 << 8)
  728. #define RX_FIFO_FRE (1 << 9)
  729. #define RX_FIFO_ROR (1 << 10)
  730. typedef struct {
  731. SysBusDevice busdev;
  732. MemoryRegion iomem;
  733. CharDriverState *chr;
  734. qemu_irq irq;
  735. uint8_t utcr0;
  736. uint16_t brd;
  737. uint8_t utcr3;
  738. uint8_t utsr0;
  739. uint8_t utsr1;
  740. uint8_t tx_fifo[8];
  741. uint8_t tx_start;
  742. uint8_t tx_len;
  743. uint16_t rx_fifo[12]; /* value + error flags in high bits */
  744. uint8_t rx_start;
  745. uint8_t rx_len;
  746. uint64_t char_transmit_time; /* time to transmit a char in ticks*/
  747. bool wait_break_end;
  748. QEMUTimer *rx_timeout_timer;
  749. QEMUTimer *tx_timer;
  750. } StrongARMUARTState;
  751. static void strongarm_uart_update_status(StrongARMUARTState *s)
  752. {
  753. uint16_t utsr1 = 0;
  754. if (s->tx_len != 8) {
  755. utsr1 |= UTSR1_TNF;
  756. }
  757. if (s->rx_len != 0) {
  758. uint16_t ent = s->rx_fifo[s->rx_start];
  759. utsr1 |= UTSR1_RNE;
  760. if (ent & RX_FIFO_PRE) {
  761. s->utsr1 |= UTSR1_PRE;
  762. }
  763. if (ent & RX_FIFO_FRE) {
  764. s->utsr1 |= UTSR1_FRE;
  765. }
  766. if (ent & RX_FIFO_ROR) {
  767. s->utsr1 |= UTSR1_ROR;
  768. }
  769. }
  770. s->utsr1 = utsr1;
  771. }
  772. static void strongarm_uart_update_int_status(StrongARMUARTState *s)
  773. {
  774. uint16_t utsr0 = s->utsr0 &
  775. (UTSR0_REB | UTSR0_RBB | UTSR0_RID);
  776. int i;
  777. if ((s->utcr3 & UTCR3_TXE) &&
  778. (s->utcr3 & UTCR3_TIE) &&
  779. s->tx_len <= 4) {
  780. utsr0 |= UTSR0_TFS;
  781. }
  782. if ((s->utcr3 & UTCR3_RXE) &&
  783. (s->utcr3 & UTCR3_RIE) &&
  784. s->rx_len > 4) {
  785. utsr0 |= UTSR0_RFS;
  786. }
  787. for (i = 0; i < s->rx_len && i < 4; i++)
  788. if (s->rx_fifo[(s->rx_start + i) % 12] & ~0xff) {
  789. utsr0 |= UTSR0_EIF;
  790. break;
  791. }
  792. s->utsr0 = utsr0;
  793. qemu_set_irq(s->irq, utsr0);
  794. }
  795. static void strongarm_uart_update_parameters(StrongARMUARTState *s)
  796. {
  797. int speed, parity, data_bits, stop_bits, frame_size;
  798. QEMUSerialSetParams ssp;
  799. /* Start bit. */
  800. frame_size = 1;
  801. if (s->utcr0 & UTCR0_PE) {
  802. /* Parity bit. */
  803. frame_size++;
  804. if (s->utcr0 & UTCR0_OES) {
  805. parity = 'E';
  806. } else {
  807. parity = 'O';
  808. }
  809. } else {
  810. parity = 'N';
  811. }
  812. if (s->utcr0 & UTCR0_SBS) {
  813. stop_bits = 2;
  814. } else {
  815. stop_bits = 1;
  816. }
  817. data_bits = (s->utcr0 & UTCR0_DSS) ? 8 : 7;
  818. frame_size += data_bits + stop_bits;
  819. speed = 3686400 / 16 / (s->brd + 1);
  820. ssp.speed = speed;
  821. ssp.parity = parity;
  822. ssp.data_bits = data_bits;
  823. ssp.stop_bits = stop_bits;
  824. s->char_transmit_time = (get_ticks_per_sec() / speed) * frame_size;
  825. if (s->chr) {
  826. qemu_chr_fe_ioctl(s->chr, CHR_IOCTL_SERIAL_SET_PARAMS, &ssp);
  827. }
  828. DPRINTF(stderr, "%s speed=%d parity=%c data=%d stop=%d\n", s->chr->label,
  829. speed, parity, data_bits, stop_bits);
  830. }
  831. static void strongarm_uart_rx_to(void *opaque)
  832. {
  833. StrongARMUARTState *s = opaque;
  834. if (s->rx_len) {
  835. s->utsr0 |= UTSR0_RID;
  836. strongarm_uart_update_int_status(s);
  837. }
  838. }
  839. static void strongarm_uart_rx_push(StrongARMUARTState *s, uint16_t c)
  840. {
  841. if ((s->utcr3 & UTCR3_RXE) == 0) {
  842. /* rx disabled */
  843. return;
  844. }
  845. if (s->wait_break_end) {
  846. s->utsr0 |= UTSR0_REB;
  847. s->wait_break_end = false;
  848. }
  849. if (s->rx_len < 12) {
  850. s->rx_fifo[(s->rx_start + s->rx_len) % 12] = c;
  851. s->rx_len++;
  852. } else
  853. s->rx_fifo[(s->rx_start + 11) % 12] |= RX_FIFO_ROR;
  854. }
  855. static int strongarm_uart_can_receive(void *opaque)
  856. {
  857. StrongARMUARTState *s = opaque;
  858. if (s->rx_len == 12) {
  859. return 0;
  860. }
  861. /* It's best not to get more than 2/3 of RX FIFO, so advertise that much */
  862. if (s->rx_len < 8) {
  863. return 8 - s->rx_len;
  864. }
  865. return 1;
  866. }
  867. static void strongarm_uart_receive(void *opaque, const uint8_t *buf, int size)
  868. {
  869. StrongARMUARTState *s = opaque;
  870. int i;
  871. for (i = 0; i < size; i++) {
  872. strongarm_uart_rx_push(s, buf[i]);
  873. }
  874. /* call the timeout receive callback in 3 char transmit time */
  875. qemu_mod_timer(s->rx_timeout_timer,
  876. qemu_get_clock_ns(vm_clock) + s->char_transmit_time * 3);
  877. strongarm_uart_update_status(s);
  878. strongarm_uart_update_int_status(s);
  879. }
  880. static void strongarm_uart_event(void *opaque, int event)
  881. {
  882. StrongARMUARTState *s = opaque;
  883. if (event == CHR_EVENT_BREAK) {
  884. s->utsr0 |= UTSR0_RBB;
  885. strongarm_uart_rx_push(s, RX_FIFO_FRE);
  886. s->wait_break_end = true;
  887. strongarm_uart_update_status(s);
  888. strongarm_uart_update_int_status(s);
  889. }
  890. }
  891. static void strongarm_uart_tx(void *opaque)
  892. {
  893. StrongARMUARTState *s = opaque;
  894. uint64_t new_xmit_ts = qemu_get_clock_ns(vm_clock);
  895. if (s->utcr3 & UTCR3_LBM) /* loopback */ {
  896. strongarm_uart_receive(s, &s->tx_fifo[s->tx_start], 1);
  897. } else if (s->chr) {
  898. qemu_chr_fe_write(s->chr, &s->tx_fifo[s->tx_start], 1);
  899. }
  900. s->tx_start = (s->tx_start + 1) % 8;
  901. s->tx_len--;
  902. if (s->tx_len) {
  903. qemu_mod_timer(s->tx_timer, new_xmit_ts + s->char_transmit_time);
  904. }
  905. strongarm_uart_update_status(s);
  906. strongarm_uart_update_int_status(s);
  907. }
  908. static uint64_t strongarm_uart_read(void *opaque, hwaddr addr,
  909. unsigned size)
  910. {
  911. StrongARMUARTState *s = opaque;
  912. uint16_t ret;
  913. switch (addr) {
  914. case UTCR0:
  915. return s->utcr0;
  916. case UTCR1:
  917. return s->brd >> 8;
  918. case UTCR2:
  919. return s->brd & 0xff;
  920. case UTCR3:
  921. return s->utcr3;
  922. case UTDR:
  923. if (s->rx_len != 0) {
  924. ret = s->rx_fifo[s->rx_start];
  925. s->rx_start = (s->rx_start + 1) % 12;
  926. s->rx_len--;
  927. strongarm_uart_update_status(s);
  928. strongarm_uart_update_int_status(s);
  929. return ret;
  930. }
  931. return 0;
  932. case UTSR0:
  933. return s->utsr0;
  934. case UTSR1:
  935. return s->utsr1;
  936. default:
  937. printf("%s: Bad register 0x" TARGET_FMT_plx "\n", __func__, addr);
  938. return 0;
  939. }
  940. }
  941. static void strongarm_uart_write(void *opaque, hwaddr addr,
  942. uint64_t value, unsigned size)
  943. {
  944. StrongARMUARTState *s = opaque;
  945. switch (addr) {
  946. case UTCR0:
  947. s->utcr0 = value & 0x7f;
  948. strongarm_uart_update_parameters(s);
  949. break;
  950. case UTCR1:
  951. s->brd = (s->brd & 0xff) | ((value & 0xf) << 8);
  952. strongarm_uart_update_parameters(s);
  953. break;
  954. case UTCR2:
  955. s->brd = (s->brd & 0xf00) | (value & 0xff);
  956. strongarm_uart_update_parameters(s);
  957. break;
  958. case UTCR3:
  959. s->utcr3 = value & 0x3f;
  960. if ((s->utcr3 & UTCR3_RXE) == 0) {
  961. s->rx_len = 0;
  962. }
  963. if ((s->utcr3 & UTCR3_TXE) == 0) {
  964. s->tx_len = 0;
  965. }
  966. strongarm_uart_update_status(s);
  967. strongarm_uart_update_int_status(s);
  968. break;
  969. case UTDR:
  970. if ((s->utcr3 & UTCR3_TXE) && s->tx_len != 8) {
  971. s->tx_fifo[(s->tx_start + s->tx_len) % 8] = value;
  972. s->tx_len++;
  973. strongarm_uart_update_status(s);
  974. strongarm_uart_update_int_status(s);
  975. if (s->tx_len == 1) {
  976. strongarm_uart_tx(s);
  977. }
  978. }
  979. break;
  980. case UTSR0:
  981. s->utsr0 = s->utsr0 & ~(value &
  982. (UTSR0_REB | UTSR0_RBB | UTSR0_RID));
  983. strongarm_uart_update_int_status(s);
  984. break;
  985. default:
  986. printf("%s: Bad register 0x" TARGET_FMT_plx "\n", __func__, addr);
  987. }
  988. }
  989. static const MemoryRegionOps strongarm_uart_ops = {
  990. .read = strongarm_uart_read,
  991. .write = strongarm_uart_write,
  992. .endianness = DEVICE_NATIVE_ENDIAN,
  993. };
  994. static int strongarm_uart_init(SysBusDevice *dev)
  995. {
  996. StrongARMUARTState *s = FROM_SYSBUS(StrongARMUARTState, dev);
  997. memory_region_init_io(&s->iomem, &strongarm_uart_ops, s, "uart", 0x10000);
  998. sysbus_init_mmio(dev, &s->iomem);
  999. sysbus_init_irq(dev, &s->irq);
  1000. s->rx_timeout_timer = qemu_new_timer_ns(vm_clock, strongarm_uart_rx_to, s);
  1001. s->tx_timer = qemu_new_timer_ns(vm_clock, strongarm_uart_tx, s);
  1002. if (s->chr) {
  1003. qemu_chr_add_handlers(s->chr,
  1004. strongarm_uart_can_receive,
  1005. strongarm_uart_receive,
  1006. strongarm_uart_event,
  1007. s);
  1008. }
  1009. return 0;
  1010. }
  1011. static void strongarm_uart_reset(DeviceState *dev)
  1012. {
  1013. StrongARMUARTState *s = DO_UPCAST(StrongARMUARTState, busdev.qdev, dev);
  1014. s->utcr0 = UTCR0_DSS; /* 8 data, no parity */
  1015. s->brd = 23; /* 9600 */
  1016. /* enable send & recv - this actually violates spec */
  1017. s->utcr3 = UTCR3_TXE | UTCR3_RXE;
  1018. s->rx_len = s->tx_len = 0;
  1019. strongarm_uart_update_parameters(s);
  1020. strongarm_uart_update_status(s);
  1021. strongarm_uart_update_int_status(s);
  1022. }
  1023. static int strongarm_uart_post_load(void *opaque, int version_id)
  1024. {
  1025. StrongARMUARTState *s = opaque;
  1026. strongarm_uart_update_parameters(s);
  1027. strongarm_uart_update_status(s);
  1028. strongarm_uart_update_int_status(s);
  1029. /* tx and restart timer */
  1030. if (s->tx_len) {
  1031. strongarm_uart_tx(s);
  1032. }
  1033. /* restart rx timeout timer */
  1034. if (s->rx_len) {
  1035. qemu_mod_timer(s->rx_timeout_timer,
  1036. qemu_get_clock_ns(vm_clock) + s->char_transmit_time * 3);
  1037. }
  1038. return 0;
  1039. }
  1040. static const VMStateDescription vmstate_strongarm_uart_regs = {
  1041. .name = "strongarm-uart",
  1042. .version_id = 0,
  1043. .minimum_version_id = 0,
  1044. .minimum_version_id_old = 0,
  1045. .post_load = strongarm_uart_post_load,
  1046. .fields = (VMStateField[]) {
  1047. VMSTATE_UINT8(utcr0, StrongARMUARTState),
  1048. VMSTATE_UINT16(brd, StrongARMUARTState),
  1049. VMSTATE_UINT8(utcr3, StrongARMUARTState),
  1050. VMSTATE_UINT8(utsr0, StrongARMUARTState),
  1051. VMSTATE_UINT8_ARRAY(tx_fifo, StrongARMUARTState, 8),
  1052. VMSTATE_UINT8(tx_start, StrongARMUARTState),
  1053. VMSTATE_UINT8(tx_len, StrongARMUARTState),
  1054. VMSTATE_UINT16_ARRAY(rx_fifo, StrongARMUARTState, 12),
  1055. VMSTATE_UINT8(rx_start, StrongARMUARTState),
  1056. VMSTATE_UINT8(rx_len, StrongARMUARTState),
  1057. VMSTATE_BOOL(wait_break_end, StrongARMUARTState),
  1058. VMSTATE_END_OF_LIST(),
  1059. },
  1060. };
  1061. static Property strongarm_uart_properties[] = {
  1062. DEFINE_PROP_CHR("chardev", StrongARMUARTState, chr),
  1063. DEFINE_PROP_END_OF_LIST(),
  1064. };
  1065. static void strongarm_uart_class_init(ObjectClass *klass, void *data)
  1066. {
  1067. DeviceClass *dc = DEVICE_CLASS(klass);
  1068. SysBusDeviceClass *k = SYS_BUS_DEVICE_CLASS(klass);
  1069. k->init = strongarm_uart_init;
  1070. dc->desc = "StrongARM UART controller";
  1071. dc->reset = strongarm_uart_reset;
  1072. dc->vmsd = &vmstate_strongarm_uart_regs;
  1073. dc->props = strongarm_uart_properties;
  1074. }
  1075. static const TypeInfo strongarm_uart_info = {
  1076. .name = "strongarm-uart",
  1077. .parent = TYPE_SYS_BUS_DEVICE,
  1078. .instance_size = sizeof(StrongARMUARTState),
  1079. .class_init = strongarm_uart_class_init,
  1080. };
  1081. /* Synchronous Serial Ports */
  1082. typedef struct {
  1083. SysBusDevice busdev;
  1084. MemoryRegion iomem;
  1085. qemu_irq irq;
  1086. SSIBus *bus;
  1087. uint16_t sscr[2];
  1088. uint16_t sssr;
  1089. uint16_t rx_fifo[8];
  1090. uint8_t rx_level;
  1091. uint8_t rx_start;
  1092. } StrongARMSSPState;
  1093. #define SSCR0 0x60 /* SSP Control register 0 */
  1094. #define SSCR1 0x64 /* SSP Control register 1 */
  1095. #define SSDR 0x6c /* SSP Data register */
  1096. #define SSSR 0x74 /* SSP Status register */
  1097. /* Bitfields for above registers */
  1098. #define SSCR0_SPI(x) (((x) & 0x30) == 0x00)
  1099. #define SSCR0_SSP(x) (((x) & 0x30) == 0x10)
  1100. #define SSCR0_UWIRE(x) (((x) & 0x30) == 0x20)
  1101. #define SSCR0_PSP(x) (((x) & 0x30) == 0x30)
  1102. #define SSCR0_SSE (1 << 7)
  1103. #define SSCR0_DSS(x) (((x) & 0xf) + 1)
  1104. #define SSCR1_RIE (1 << 0)
  1105. #define SSCR1_TIE (1 << 1)
  1106. #define SSCR1_LBM (1 << 2)
  1107. #define SSSR_TNF (1 << 2)
  1108. #define SSSR_RNE (1 << 3)
  1109. #define SSSR_TFS (1 << 5)
  1110. #define SSSR_RFS (1 << 6)
  1111. #define SSSR_ROR (1 << 7)
  1112. #define SSSR_RW 0x0080
  1113. static void strongarm_ssp_int_update(StrongARMSSPState *s)
  1114. {
  1115. int level = 0;
  1116. level |= (s->sssr & SSSR_ROR);
  1117. level |= (s->sssr & SSSR_RFS) && (s->sscr[1] & SSCR1_RIE);
  1118. level |= (s->sssr & SSSR_TFS) && (s->sscr[1] & SSCR1_TIE);
  1119. qemu_set_irq(s->irq, level);
  1120. }
  1121. static void strongarm_ssp_fifo_update(StrongARMSSPState *s)
  1122. {
  1123. s->sssr &= ~SSSR_TFS;
  1124. s->sssr &= ~SSSR_TNF;
  1125. if (s->sscr[0] & SSCR0_SSE) {
  1126. if (s->rx_level >= 4) {
  1127. s->sssr |= SSSR_RFS;
  1128. } else {
  1129. s->sssr &= ~SSSR_RFS;
  1130. }
  1131. if (s->rx_level) {
  1132. s->sssr |= SSSR_RNE;
  1133. } else {
  1134. s->sssr &= ~SSSR_RNE;
  1135. }
  1136. /* TX FIFO is never filled, so it is always in underrun
  1137. condition if SSP is enabled */
  1138. s->sssr |= SSSR_TFS;
  1139. s->sssr |= SSSR_TNF;
  1140. }
  1141. strongarm_ssp_int_update(s);
  1142. }
  1143. static uint64_t strongarm_ssp_read(void *opaque, hwaddr addr,
  1144. unsigned size)
  1145. {
  1146. StrongARMSSPState *s = opaque;
  1147. uint32_t retval;
  1148. switch (addr) {
  1149. case SSCR0:
  1150. return s->sscr[0];
  1151. case SSCR1:
  1152. return s->sscr[1];
  1153. case SSSR:
  1154. return s->sssr;
  1155. case SSDR:
  1156. if (~s->sscr[0] & SSCR0_SSE) {
  1157. return 0xffffffff;
  1158. }
  1159. if (s->rx_level < 1) {
  1160. printf("%s: SSP Rx Underrun\n", __func__);
  1161. return 0xffffffff;
  1162. }
  1163. s->rx_level--;
  1164. retval = s->rx_fifo[s->rx_start++];
  1165. s->rx_start &= 0x7;
  1166. strongarm_ssp_fifo_update(s);
  1167. return retval;
  1168. default:
  1169. printf("%s: Bad register 0x" TARGET_FMT_plx "\n", __func__, addr);
  1170. break;
  1171. }
  1172. return 0;
  1173. }
  1174. static void strongarm_ssp_write(void *opaque, hwaddr addr,
  1175. uint64_t value, unsigned size)
  1176. {
  1177. StrongARMSSPState *s = opaque;
  1178. switch (addr) {
  1179. case SSCR0:
  1180. s->sscr[0] = value & 0xffbf;
  1181. if ((s->sscr[0] & SSCR0_SSE) && SSCR0_DSS(value) < 4) {
  1182. printf("%s: Wrong data size: %i bits\n", __func__,
  1183. (int)SSCR0_DSS(value));
  1184. }
  1185. if (!(value & SSCR0_SSE)) {
  1186. s->sssr = 0;
  1187. s->rx_level = 0;
  1188. }
  1189. strongarm_ssp_fifo_update(s);
  1190. break;
  1191. case SSCR1:
  1192. s->sscr[1] = value & 0x2f;
  1193. if (value & SSCR1_LBM) {
  1194. printf("%s: Attempt to use SSP LBM mode\n", __func__);
  1195. }
  1196. strongarm_ssp_fifo_update(s);
  1197. break;
  1198. case SSSR:
  1199. s->sssr &= ~(value & SSSR_RW);
  1200. strongarm_ssp_int_update(s);
  1201. break;
  1202. case SSDR:
  1203. if (SSCR0_UWIRE(s->sscr[0])) {
  1204. value &= 0xff;
  1205. } else
  1206. /* Note how 32bits overflow does no harm here */
  1207. value &= (1 << SSCR0_DSS(s->sscr[0])) - 1;
  1208. /* Data goes from here to the Tx FIFO and is shifted out from
  1209. * there directly to the slave, no need to buffer it.
  1210. */
  1211. if (s->sscr[0] & SSCR0_SSE) {
  1212. uint32_t readval;
  1213. if (s->sscr[1] & SSCR1_LBM) {
  1214. readval = value;
  1215. } else {
  1216. readval = ssi_transfer(s->bus, value);
  1217. }
  1218. if (s->rx_level < 0x08) {
  1219. s->rx_fifo[(s->rx_start + s->rx_level++) & 0x7] = readval;
  1220. } else {
  1221. s->sssr |= SSSR_ROR;
  1222. }
  1223. }
  1224. strongarm_ssp_fifo_update(s);
  1225. break;
  1226. default:
  1227. printf("%s: Bad register 0x" TARGET_FMT_plx "\n", __func__, addr);
  1228. break;
  1229. }
  1230. }
  1231. static const MemoryRegionOps strongarm_ssp_ops = {
  1232. .read = strongarm_ssp_read,
  1233. .write = strongarm_ssp_write,
  1234. .endianness = DEVICE_NATIVE_ENDIAN,
  1235. };
  1236. static int strongarm_ssp_post_load(void *opaque, int version_id)
  1237. {
  1238. StrongARMSSPState *s = opaque;
  1239. strongarm_ssp_fifo_update(s);
  1240. return 0;
  1241. }
  1242. static int strongarm_ssp_init(SysBusDevice *dev)
  1243. {
  1244. StrongARMSSPState *s = FROM_SYSBUS(StrongARMSSPState, dev);
  1245. sysbus_init_irq(dev, &s->irq);
  1246. memory_region_init_io(&s->iomem, &strongarm_ssp_ops, s, "ssp", 0x1000);
  1247. sysbus_init_mmio(dev, &s->iomem);
  1248. s->bus = ssi_create_bus(&dev->qdev, "ssi");
  1249. return 0;
  1250. }
  1251. static void strongarm_ssp_reset(DeviceState *dev)
  1252. {
  1253. StrongARMSSPState *s = DO_UPCAST(StrongARMSSPState, busdev.qdev, dev);
  1254. s->sssr = 0x03; /* 3 bit data, SPI, disabled */
  1255. s->rx_start = 0;
  1256. s->rx_level = 0;
  1257. }
  1258. static const VMStateDescription vmstate_strongarm_ssp_regs = {
  1259. .name = "strongarm-ssp",
  1260. .version_id = 0,
  1261. .minimum_version_id = 0,
  1262. .minimum_version_id_old = 0,
  1263. .post_load = strongarm_ssp_post_load,
  1264. .fields = (VMStateField[]) {
  1265. VMSTATE_UINT16_ARRAY(sscr, StrongARMSSPState, 2),
  1266. VMSTATE_UINT16(sssr, StrongARMSSPState),
  1267. VMSTATE_UINT16_ARRAY(rx_fifo, StrongARMSSPState, 8),
  1268. VMSTATE_UINT8(rx_start, StrongARMSSPState),
  1269. VMSTATE_UINT8(rx_level, StrongARMSSPState),
  1270. VMSTATE_END_OF_LIST(),
  1271. },
  1272. };
  1273. static void strongarm_ssp_class_init(ObjectClass *klass, void *data)
  1274. {
  1275. DeviceClass *dc = DEVICE_CLASS(klass);
  1276. SysBusDeviceClass *k = SYS_BUS_DEVICE_CLASS(klass);
  1277. k->init = strongarm_ssp_init;
  1278. dc->desc = "StrongARM SSP controller";
  1279. dc->reset = strongarm_ssp_reset;
  1280. dc->vmsd = &vmstate_strongarm_ssp_regs;
  1281. }
  1282. static const TypeInfo strongarm_ssp_info = {
  1283. .name = "strongarm-ssp",
  1284. .parent = TYPE_SYS_BUS_DEVICE,
  1285. .instance_size = sizeof(StrongARMSSPState),
  1286. .class_init = strongarm_ssp_class_init,
  1287. };
  1288. /* Main CPU functions */
  1289. StrongARMState *sa1110_init(MemoryRegion *sysmem,
  1290. unsigned int sdram_size, const char *rev)
  1291. {
  1292. StrongARMState *s;
  1293. qemu_irq *pic;
  1294. int i;
  1295. s = g_malloc0(sizeof(StrongARMState));
  1296. if (!rev) {
  1297. rev = "sa1110-b5";
  1298. }
  1299. if (strncmp(rev, "sa1110", 6)) {
  1300. error_report("Machine requires a SA1110 processor.");
  1301. exit(1);
  1302. }
  1303. s->cpu = cpu_arm_init(rev);
  1304. if (!s->cpu) {
  1305. error_report("Unable to find CPU definition");
  1306. exit(1);
  1307. }
  1308. memory_region_init_ram(&s->sdram, "strongarm.sdram", sdram_size);
  1309. vmstate_register_ram_global(&s->sdram);
  1310. memory_region_add_subregion(sysmem, SA_SDCS0, &s->sdram);
  1311. pic = arm_pic_init_cpu(s->cpu);
  1312. s->pic = sysbus_create_varargs("strongarm_pic", 0x90050000,
  1313. pic[ARM_PIC_CPU_IRQ], pic[ARM_PIC_CPU_FIQ], NULL);
  1314. sysbus_create_varargs("pxa25x-timer", 0x90000000,
  1315. qdev_get_gpio_in(s->pic, SA_PIC_OSTC0),
  1316. qdev_get_gpio_in(s->pic, SA_PIC_OSTC1),
  1317. qdev_get_gpio_in(s->pic, SA_PIC_OSTC2),
  1318. qdev_get_gpio_in(s->pic, SA_PIC_OSTC3),
  1319. NULL);
  1320. sysbus_create_simple("strongarm-rtc", 0x90010000,
  1321. qdev_get_gpio_in(s->pic, SA_PIC_RTC_ALARM));
  1322. s->gpio = strongarm_gpio_init(0x90040000, s->pic);
  1323. s->ppc = sysbus_create_varargs("strongarm-ppc", 0x90060000, NULL);
  1324. for (i = 0; sa_serial[i].io_base; i++) {
  1325. DeviceState *dev = qdev_create(NULL, "strongarm-uart");
  1326. qdev_prop_set_chr(dev, "chardev", serial_hds[i]);
  1327. qdev_init_nofail(dev);
  1328. sysbus_mmio_map(SYS_BUS_DEVICE(dev), 0,
  1329. sa_serial[i].io_base);
  1330. sysbus_connect_irq(SYS_BUS_DEVICE(dev), 0,
  1331. qdev_get_gpio_in(s->pic, sa_serial[i].irq));
  1332. }
  1333. s->ssp = sysbus_create_varargs("strongarm-ssp", 0x80070000,
  1334. qdev_get_gpio_in(s->pic, SA_PIC_SSP), NULL);
  1335. s->ssp_bus = (SSIBus *)qdev_get_child_bus(s->ssp, "ssi");
  1336. return s;
  1337. }
  1338. static void strongarm_register_types(void)
  1339. {
  1340. type_register_static(&strongarm_pic_info);
  1341. type_register_static(&strongarm_rtc_sysbus_info);
  1342. type_register_static(&strongarm_gpio_info);
  1343. type_register_static(&strongarm_ppc_info);
  1344. type_register_static(&strongarm_uart_info);
  1345. type_register_static(&strongarm_ssp_info);
  1346. }
  1347. type_init(strongarm_register_types)