strongarm.c 44 KB

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