strongarm.c 41 KB

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