strongarm.c 43 KB

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