strongarm.c 44 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250125112521253125412551256125712581259126012611262126312641265126612671268126912701271127212731274127512761277127812791280128112821283128412851286128712881289129012911292129312941295129612971298129913001301130213031304130513061307130813091310131113121313131413151316131713181319132013211322132313241325132613271328132913301331133213331334133513361337133813391340134113421343134413451346134713481349135013511352135313541355135613571358135913601361136213631364136513661367136813691370137113721373137413751376137713781379138013811382138313841385138613871388138913901391139213931394139513961397139813991400140114021403140414051406140714081409141014111412141314141415141614171418141914201421142214231424142514261427142814291430143114321433143414351436143714381439144014411442144314441445144614471448144914501451145214531454145514561457145814591460146114621463146414651466146714681469147014711472147314741475147614771478147914801481148214831484148514861487148814891490149114921493149414951496149714981499150015011502150315041505150615071508150915101511151215131514151515161517151815191520152115221523152415251526152715281529153015311532153315341535153615371538153915401541154215431544154515461547154815491550155115521553155415551556155715581559156015611562156315641565156615671568156915701571157215731574157515761577157815791580158115821583158415851586158715881589159015911592159315941595159615971598159916001601160216031604160516061607160816091610161116121613161416151616161716181619162016211622162316241625162616271628162916301631163216331634163516361637163816391640164116421643164416451646164716481649165016511652165316541655165616571658165916601661166216631664166516661667166816691670
  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 const Property strongarm_uart_properties[] = {
  1109. DEFINE_PROP_CHR("chardev", StrongARMUARTState, chr),
  1110. };
  1111. static void strongarm_uart_class_init(ObjectClass *klass, void *data)
  1112. {
  1113. DeviceClass *dc = DEVICE_CLASS(klass);
  1114. dc->desc = "StrongARM UART controller";
  1115. device_class_set_legacy_reset(dc, strongarm_uart_reset);
  1116. dc->vmsd = &vmstate_strongarm_uart_regs;
  1117. device_class_set_props(dc, strongarm_uart_properties);
  1118. dc->realize = strongarm_uart_realize;
  1119. }
  1120. static const TypeInfo strongarm_uart_info = {
  1121. .name = TYPE_STRONGARM_UART,
  1122. .parent = TYPE_SYS_BUS_DEVICE,
  1123. .instance_size = sizeof(StrongARMUARTState),
  1124. .instance_init = strongarm_uart_init,
  1125. .class_init = strongarm_uart_class_init,
  1126. };
  1127. /* Synchronous Serial Ports */
  1128. #define TYPE_STRONGARM_SSP "strongarm-ssp"
  1129. OBJECT_DECLARE_SIMPLE_TYPE(StrongARMSSPState, STRONGARM_SSP)
  1130. struct StrongARMSSPState {
  1131. SysBusDevice parent_obj;
  1132. MemoryRegion iomem;
  1133. qemu_irq irq;
  1134. SSIBus *bus;
  1135. uint16_t sscr[2];
  1136. uint16_t sssr;
  1137. uint16_t rx_fifo[8];
  1138. uint8_t rx_level;
  1139. uint8_t rx_start;
  1140. };
  1141. #define SSCR0 0x60 /* SSP Control register 0 */
  1142. #define SSCR1 0x64 /* SSP Control register 1 */
  1143. #define SSDR 0x6c /* SSP Data register */
  1144. #define SSSR 0x74 /* SSP Status register */
  1145. /* Bitfields for above registers */
  1146. #define SSCR0_SPI(x) (((x) & 0x30) == 0x00)
  1147. #define SSCR0_SSP(x) (((x) & 0x30) == 0x10)
  1148. #define SSCR0_UWIRE(x) (((x) & 0x30) == 0x20)
  1149. #define SSCR0_PSP(x) (((x) & 0x30) == 0x30)
  1150. #define SSCR0_SSE (1 << 7)
  1151. #define SSCR0_DSS(x) (((x) & 0xf) + 1)
  1152. #define SSCR1_RIE (1 << 0)
  1153. #define SSCR1_TIE (1 << 1)
  1154. #define SSCR1_LBM (1 << 2)
  1155. #define SSSR_TNF (1 << 2)
  1156. #define SSSR_RNE (1 << 3)
  1157. #define SSSR_TFS (1 << 5)
  1158. #define SSSR_RFS (1 << 6)
  1159. #define SSSR_ROR (1 << 7)
  1160. #define SSSR_RW 0x0080
  1161. static void strongarm_ssp_int_update(StrongARMSSPState *s)
  1162. {
  1163. int level = 0;
  1164. level |= (s->sssr & SSSR_ROR);
  1165. level |= (s->sssr & SSSR_RFS) && (s->sscr[1] & SSCR1_RIE);
  1166. level |= (s->sssr & SSSR_TFS) && (s->sscr[1] & SSCR1_TIE);
  1167. qemu_set_irq(s->irq, level);
  1168. }
  1169. static void strongarm_ssp_fifo_update(StrongARMSSPState *s)
  1170. {
  1171. s->sssr &= ~SSSR_TFS;
  1172. s->sssr &= ~SSSR_TNF;
  1173. if (s->sscr[0] & SSCR0_SSE) {
  1174. if (s->rx_level >= 4) {
  1175. s->sssr |= SSSR_RFS;
  1176. } else {
  1177. s->sssr &= ~SSSR_RFS;
  1178. }
  1179. if (s->rx_level) {
  1180. s->sssr |= SSSR_RNE;
  1181. } else {
  1182. s->sssr &= ~SSSR_RNE;
  1183. }
  1184. /* TX FIFO is never filled, so it is always in underrun
  1185. condition if SSP is enabled */
  1186. s->sssr |= SSSR_TFS;
  1187. s->sssr |= SSSR_TNF;
  1188. }
  1189. strongarm_ssp_int_update(s);
  1190. }
  1191. static uint64_t strongarm_ssp_read(void *opaque, hwaddr addr,
  1192. unsigned size)
  1193. {
  1194. StrongARMSSPState *s = opaque;
  1195. uint32_t retval;
  1196. switch (addr) {
  1197. case SSCR0:
  1198. return s->sscr[0];
  1199. case SSCR1:
  1200. return s->sscr[1];
  1201. case SSSR:
  1202. return s->sssr;
  1203. case SSDR:
  1204. if (~s->sscr[0] & SSCR0_SSE) {
  1205. return 0xffffffff;
  1206. }
  1207. if (s->rx_level < 1) {
  1208. trace_strongarm_ssp_read_underrun();
  1209. return 0xffffffff;
  1210. }
  1211. s->rx_level--;
  1212. retval = s->rx_fifo[s->rx_start++];
  1213. s->rx_start &= 0x7;
  1214. strongarm_ssp_fifo_update(s);
  1215. return retval;
  1216. default:
  1217. qemu_log_mask(LOG_GUEST_ERROR,
  1218. "%s: Bad ssp register read 0x"HWADDR_FMT_plx"\n",
  1219. __func__, addr);
  1220. break;
  1221. }
  1222. return 0;
  1223. }
  1224. static void strongarm_ssp_write(void *opaque, hwaddr addr,
  1225. uint64_t value, unsigned size)
  1226. {
  1227. StrongARMSSPState *s = opaque;
  1228. switch (addr) {
  1229. case SSCR0:
  1230. s->sscr[0] = value & 0xffbf;
  1231. if ((s->sscr[0] & SSCR0_SSE) && SSCR0_DSS(value) < 4) {
  1232. qemu_log_mask(LOG_GUEST_ERROR, "%s: Wrong data size: %i bits\n",
  1233. __func__, (int)SSCR0_DSS(value));
  1234. }
  1235. if (!(value & SSCR0_SSE)) {
  1236. s->sssr = 0;
  1237. s->rx_level = 0;
  1238. }
  1239. strongarm_ssp_fifo_update(s);
  1240. break;
  1241. case SSCR1:
  1242. s->sscr[1] = value & 0x2f;
  1243. if (value & SSCR1_LBM) {
  1244. qemu_log_mask(LOG_GUEST_ERROR,
  1245. "%s: Attempt to use SSP LBM mode\n",
  1246. __func__);
  1247. }
  1248. strongarm_ssp_fifo_update(s);
  1249. break;
  1250. case SSSR:
  1251. s->sssr &= ~(value & SSSR_RW);
  1252. strongarm_ssp_int_update(s);
  1253. break;
  1254. case SSDR:
  1255. if (SSCR0_UWIRE(s->sscr[0])) {
  1256. value &= 0xff;
  1257. } else
  1258. /* Note how 32bits overflow does no harm here */
  1259. value &= (1 << SSCR0_DSS(s->sscr[0])) - 1;
  1260. /* Data goes from here to the Tx FIFO and is shifted out from
  1261. * there directly to the slave, no need to buffer it.
  1262. */
  1263. if (s->sscr[0] & SSCR0_SSE) {
  1264. uint32_t readval;
  1265. if (s->sscr[1] & SSCR1_LBM) {
  1266. readval = value;
  1267. } else {
  1268. readval = ssi_transfer(s->bus, value);
  1269. }
  1270. if (s->rx_level < 0x08) {
  1271. s->rx_fifo[(s->rx_start + s->rx_level++) & 0x7] = readval;
  1272. } else {
  1273. s->sssr |= SSSR_ROR;
  1274. }
  1275. }
  1276. strongarm_ssp_fifo_update(s);
  1277. break;
  1278. default:
  1279. qemu_log_mask(LOG_GUEST_ERROR,
  1280. "%s: Bad ssp register write 0x"HWADDR_FMT_plx"\n",
  1281. __func__, addr);
  1282. break;
  1283. }
  1284. }
  1285. static const MemoryRegionOps strongarm_ssp_ops = {
  1286. .read = strongarm_ssp_read,
  1287. .write = strongarm_ssp_write,
  1288. .endianness = DEVICE_NATIVE_ENDIAN,
  1289. };
  1290. static int strongarm_ssp_post_load(void *opaque, int version_id)
  1291. {
  1292. StrongARMSSPState *s = opaque;
  1293. strongarm_ssp_fifo_update(s);
  1294. return 0;
  1295. }
  1296. static void strongarm_ssp_init(Object *obj)
  1297. {
  1298. SysBusDevice *sbd = SYS_BUS_DEVICE(obj);
  1299. DeviceState *dev = DEVICE(sbd);
  1300. StrongARMSSPState *s = STRONGARM_SSP(dev);
  1301. sysbus_init_irq(sbd, &s->irq);
  1302. memory_region_init_io(&s->iomem, obj, &strongarm_ssp_ops, s,
  1303. "ssp", 0x1000);
  1304. sysbus_init_mmio(sbd, &s->iomem);
  1305. s->bus = ssi_create_bus(dev, "ssi");
  1306. }
  1307. static void strongarm_ssp_reset(DeviceState *dev)
  1308. {
  1309. StrongARMSSPState *s = STRONGARM_SSP(dev);
  1310. s->sssr = 0x03; /* 3 bit data, SPI, disabled */
  1311. s->rx_start = 0;
  1312. s->rx_level = 0;
  1313. }
  1314. static const VMStateDescription vmstate_strongarm_ssp_regs = {
  1315. .name = "strongarm-ssp",
  1316. .version_id = 0,
  1317. .minimum_version_id = 0,
  1318. .post_load = strongarm_ssp_post_load,
  1319. .fields = (const VMStateField[]) {
  1320. VMSTATE_UINT16_ARRAY(sscr, StrongARMSSPState, 2),
  1321. VMSTATE_UINT16(sssr, StrongARMSSPState),
  1322. VMSTATE_UINT16_ARRAY(rx_fifo, StrongARMSSPState, 8),
  1323. VMSTATE_UINT8(rx_start, StrongARMSSPState),
  1324. VMSTATE_UINT8(rx_level, StrongARMSSPState),
  1325. VMSTATE_END_OF_LIST(),
  1326. },
  1327. };
  1328. static void strongarm_ssp_class_init(ObjectClass *klass, void *data)
  1329. {
  1330. DeviceClass *dc = DEVICE_CLASS(klass);
  1331. dc->desc = "StrongARM SSP controller";
  1332. device_class_set_legacy_reset(dc, strongarm_ssp_reset);
  1333. dc->vmsd = &vmstate_strongarm_ssp_regs;
  1334. }
  1335. static const TypeInfo strongarm_ssp_info = {
  1336. .name = TYPE_STRONGARM_SSP,
  1337. .parent = TYPE_SYS_BUS_DEVICE,
  1338. .instance_size = sizeof(StrongARMSSPState),
  1339. .instance_init = strongarm_ssp_init,
  1340. .class_init = strongarm_ssp_class_init,
  1341. };
  1342. /* Main CPU functions */
  1343. StrongARMState *sa1110_init(const char *cpu_type)
  1344. {
  1345. StrongARMState *s;
  1346. int i;
  1347. s = g_new0(StrongARMState, 1);
  1348. if (strncmp(cpu_type, "sa1110", 6)) {
  1349. error_report("Machine requires a SA1110 processor.");
  1350. exit(1);
  1351. }
  1352. s->cpu = ARM_CPU(cpu_create(cpu_type));
  1353. s->pic = sysbus_create_varargs("strongarm_pic", 0x90050000,
  1354. qdev_get_gpio_in(DEVICE(s->cpu), ARM_CPU_IRQ),
  1355. qdev_get_gpio_in(DEVICE(s->cpu), ARM_CPU_FIQ),
  1356. NULL);
  1357. sysbus_create_varargs("pxa25x-timer", 0x90000000,
  1358. qdev_get_gpio_in(s->pic, SA_PIC_OSTC0),
  1359. qdev_get_gpio_in(s->pic, SA_PIC_OSTC1),
  1360. qdev_get_gpio_in(s->pic, SA_PIC_OSTC2),
  1361. qdev_get_gpio_in(s->pic, SA_PIC_OSTC3),
  1362. NULL);
  1363. sysbus_create_simple(TYPE_STRONGARM_RTC, 0x90010000,
  1364. qdev_get_gpio_in(s->pic, SA_PIC_RTC_ALARM));
  1365. s->gpio = strongarm_gpio_init(0x90040000, s->pic);
  1366. s->ppc = sysbus_create_varargs(TYPE_STRONGARM_PPC, 0x90060000, NULL);
  1367. for (i = 0; sa_serial[i].io_base; i++) {
  1368. DeviceState *dev = qdev_new(TYPE_STRONGARM_UART);
  1369. qdev_prop_set_chr(dev, "chardev", serial_hd(i));
  1370. sysbus_realize_and_unref(SYS_BUS_DEVICE(dev), &error_fatal);
  1371. sysbus_mmio_map(SYS_BUS_DEVICE(dev), 0,
  1372. sa_serial[i].io_base);
  1373. sysbus_connect_irq(SYS_BUS_DEVICE(dev), 0,
  1374. qdev_get_gpio_in(s->pic, sa_serial[i].irq));
  1375. }
  1376. s->ssp = sysbus_create_varargs(TYPE_STRONGARM_SSP, 0x80070000,
  1377. qdev_get_gpio_in(s->pic, SA_PIC_SSP), NULL);
  1378. s->ssp_bus = (SSIBus *)qdev_get_child_bus(s->ssp, "ssi");
  1379. return s;
  1380. }
  1381. static void strongarm_register_types(void)
  1382. {
  1383. type_register_static(&strongarm_pic_info);
  1384. type_register_static(&strongarm_rtc_sysbus_info);
  1385. type_register_static(&strongarm_gpio_info);
  1386. type_register_static(&strongarm_ppc_info);
  1387. type_register_static(&strongarm_uart_info);
  1388. type_register_static(&strongarm_ssp_info);
  1389. }
  1390. type_init(strongarm_register_types)