2
0

imx_epit.c 10.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410
  1. /*
  2. * IMX EPIT Timer
  3. *
  4. * Copyright (c) 2008 OK Labs
  5. * Copyright (c) 2011 NICTA Pty Ltd
  6. * Originally written by Hans Jiang
  7. * Updated by Peter Chubb
  8. * Updated by Jean-Christophe Dubois
  9. *
  10. * This code is licensed under GPL version 2 or later. See
  11. * the COPYING file in the top-level directory.
  12. *
  13. */
  14. #include "hw/hw.h"
  15. #include "qemu/bitops.h"
  16. #include "qemu/timer.h"
  17. #include "hw/ptimer.h"
  18. #include "hw/sysbus.h"
  19. #include "hw/arm/imx.h"
  20. #include "qemu/main-loop.h"
  21. #define TYPE_IMX_EPIT "imx.epit"
  22. #define DEBUG_TIMER 0
  23. #if DEBUG_TIMER
  24. static char const *imx_epit_reg_name(uint32_t reg)
  25. {
  26. switch (reg) {
  27. case 0:
  28. return "CR";
  29. case 1:
  30. return "SR";
  31. case 2:
  32. return "LR";
  33. case 3:
  34. return "CMP";
  35. case 4:
  36. return "CNT";
  37. default:
  38. return "[?]";
  39. }
  40. }
  41. # define DPRINTF(fmt, args...) \
  42. do { fprintf(stderr, "%s: " fmt , __func__, ##args); } while (0)
  43. #else
  44. # define DPRINTF(fmt, args...) do {} while (0)
  45. #endif
  46. /*
  47. * Define to 1 for messages about attempts to
  48. * access unimplemented registers or similar.
  49. */
  50. #define DEBUG_IMPLEMENTATION 1
  51. #if DEBUG_IMPLEMENTATION
  52. # define IPRINTF(fmt, args...) \
  53. do { fprintf(stderr, "%s: " fmt, __func__, ##args); } while (0)
  54. #else
  55. # define IPRINTF(fmt, args...) do {} while (0)
  56. #endif
  57. #define IMX_EPIT(obj) \
  58. OBJECT_CHECK(IMXEPITState, (obj), TYPE_IMX_EPIT)
  59. /*
  60. * EPIT: Enhanced periodic interrupt timer
  61. */
  62. #define CR_EN (1 << 0)
  63. #define CR_ENMOD (1 << 1)
  64. #define CR_OCIEN (1 << 2)
  65. #define CR_RLD (1 << 3)
  66. #define CR_PRESCALE_SHIFT (4)
  67. #define CR_PRESCALE_MASK (0xfff)
  68. #define CR_SWR (1 << 16)
  69. #define CR_IOVW (1 << 17)
  70. #define CR_DBGEN (1 << 18)
  71. #define CR_WAITEN (1 << 19)
  72. #define CR_DOZEN (1 << 20)
  73. #define CR_STOPEN (1 << 21)
  74. #define CR_CLKSRC_SHIFT (24)
  75. #define CR_CLKSRC_MASK (0x3 << CR_CLKSRC_SHIFT)
  76. #define TIMER_MAX 0XFFFFFFFFUL
  77. /*
  78. * Exact clock frequencies vary from board to board.
  79. * These are typical.
  80. */
  81. static const IMXClk imx_epit_clocks[] = {
  82. 0, /* 00 disabled */
  83. IPG, /* 01 ipg_clk, ~532MHz */
  84. IPG, /* 10 ipg_clk_highfreq */
  85. CLK_32k, /* 11 ipg_clk_32k -- ~32kHz */
  86. };
  87. typedef struct {
  88. SysBusDevice busdev;
  89. ptimer_state *timer_reload;
  90. ptimer_state *timer_cmp;
  91. MemoryRegion iomem;
  92. DeviceState *ccm;
  93. uint32_t cr;
  94. uint32_t sr;
  95. uint32_t lr;
  96. uint32_t cmp;
  97. uint32_t cnt;
  98. uint32_t freq;
  99. qemu_irq irq;
  100. } IMXEPITState;
  101. /*
  102. * Update interrupt status
  103. */
  104. static void imx_epit_update_int(IMXEPITState *s)
  105. {
  106. if (s->sr && (s->cr & CR_OCIEN) && (s->cr & CR_EN)) {
  107. qemu_irq_raise(s->irq);
  108. } else {
  109. qemu_irq_lower(s->irq);
  110. }
  111. }
  112. static void imx_epit_set_freq(IMXEPITState *s)
  113. {
  114. uint32_t clksrc;
  115. uint32_t prescaler;
  116. uint32_t freq;
  117. clksrc = extract32(s->cr, CR_CLKSRC_SHIFT, 2);
  118. prescaler = 1 + extract32(s->cr, CR_PRESCALE_SHIFT, 12);
  119. freq = imx_clock_frequency(s->ccm, imx_epit_clocks[clksrc]) / prescaler;
  120. s->freq = freq;
  121. DPRINTF("Setting ptimer frequency to %u\n", freq);
  122. if (freq) {
  123. ptimer_set_freq(s->timer_reload, freq);
  124. ptimer_set_freq(s->timer_cmp, freq);
  125. }
  126. }
  127. static void imx_epit_reset(DeviceState *dev)
  128. {
  129. IMXEPITState *s = IMX_EPIT(dev);
  130. /*
  131. * Soft reset doesn't touch some bits; hard reset clears them
  132. */
  133. s->cr &= (CR_EN|CR_ENMOD|CR_STOPEN|CR_DOZEN|CR_WAITEN|CR_DBGEN);
  134. s->sr = 0;
  135. s->lr = TIMER_MAX;
  136. s->cmp = 0;
  137. s->cnt = 0;
  138. /* stop both timers */
  139. ptimer_stop(s->timer_cmp);
  140. ptimer_stop(s->timer_reload);
  141. /* compute new frequency */
  142. imx_epit_set_freq(s);
  143. /* init both timers to TIMER_MAX */
  144. ptimer_set_limit(s->timer_cmp, TIMER_MAX, 1);
  145. ptimer_set_limit(s->timer_reload, TIMER_MAX, 1);
  146. if (s->freq && (s->cr & CR_EN)) {
  147. /* if the timer is still enabled, restart it */
  148. ptimer_run(s->timer_reload, 0);
  149. }
  150. }
  151. static uint32_t imx_epit_update_count(IMXEPITState *s)
  152. {
  153. s->cnt = ptimer_get_count(s->timer_reload);
  154. return s->cnt;
  155. }
  156. static uint64_t imx_epit_read(void *opaque, hwaddr offset, unsigned size)
  157. {
  158. IMXEPITState *s = IMX_EPIT(opaque);
  159. uint32_t reg_value = 0;
  160. uint32_t reg = offset >> 2;
  161. switch (reg) {
  162. case 0: /* Control Register */
  163. reg_value = s->cr;
  164. break;
  165. case 1: /* Status Register */
  166. reg_value = s->sr;
  167. break;
  168. case 2: /* LR - ticks*/
  169. reg_value = s->lr;
  170. break;
  171. case 3: /* CMP */
  172. reg_value = s->cmp;
  173. break;
  174. case 4: /* CNT */
  175. imx_epit_update_count(s);
  176. reg_value = s->cnt;
  177. break;
  178. default:
  179. IPRINTF("Bad offset %x\n", reg);
  180. break;
  181. }
  182. DPRINTF("(%s) = 0x%08x\n", imx_epit_reg_name(reg), reg_value);
  183. return reg_value;
  184. }
  185. static void imx_epit_reload_compare_timer(IMXEPITState *s)
  186. {
  187. if ((s->cr & (CR_EN | CR_OCIEN)) == (CR_EN | CR_OCIEN)) {
  188. /* if the compare feature is on and timers are running */
  189. uint32_t tmp = imx_epit_update_count(s);
  190. uint64_t next;
  191. if (tmp > s->cmp) {
  192. /* It'll fire in this round of the timer */
  193. next = tmp - s->cmp;
  194. } else { /* catch it next time around */
  195. next = tmp - s->cmp + ((s->cr & CR_RLD) ? TIMER_MAX : s->lr);
  196. }
  197. ptimer_set_count(s->timer_cmp, next);
  198. }
  199. }
  200. static void imx_epit_write(void *opaque, hwaddr offset, uint64_t value,
  201. unsigned size)
  202. {
  203. IMXEPITState *s = IMX_EPIT(opaque);
  204. uint32_t reg = offset >> 2;
  205. uint64_t oldcr;
  206. DPRINTF("(%s, value = 0x%08x)\n", imx_epit_reg_name(reg), (uint32_t)value);
  207. switch (reg) {
  208. case 0: /* CR */
  209. oldcr = s->cr;
  210. s->cr = value & 0x03ffffff;
  211. if (s->cr & CR_SWR) {
  212. /* handle the reset */
  213. imx_epit_reset(DEVICE(s));
  214. } else {
  215. imx_epit_set_freq(s);
  216. }
  217. if (s->freq && (s->cr & CR_EN) && !(oldcr & CR_EN)) {
  218. if (s->cr & CR_ENMOD) {
  219. if (s->cr & CR_RLD) {
  220. ptimer_set_limit(s->timer_reload, s->lr, 1);
  221. ptimer_set_limit(s->timer_cmp, s->lr, 1);
  222. } else {
  223. ptimer_set_limit(s->timer_reload, TIMER_MAX, 1);
  224. ptimer_set_limit(s->timer_cmp, TIMER_MAX, 1);
  225. }
  226. }
  227. imx_epit_reload_compare_timer(s);
  228. ptimer_run(s->timer_reload, 0);
  229. if (s->cr & CR_OCIEN) {
  230. ptimer_run(s->timer_cmp, 0);
  231. } else {
  232. ptimer_stop(s->timer_cmp);
  233. }
  234. } else if (!(s->cr & CR_EN)) {
  235. /* stop both timers */
  236. ptimer_stop(s->timer_reload);
  237. ptimer_stop(s->timer_cmp);
  238. } else if (s->cr & CR_OCIEN) {
  239. if (!(oldcr & CR_OCIEN)) {
  240. imx_epit_reload_compare_timer(s);
  241. ptimer_run(s->timer_cmp, 0);
  242. }
  243. } else {
  244. ptimer_stop(s->timer_cmp);
  245. }
  246. break;
  247. case 1: /* SR - ACK*/
  248. /* writing 1 to OCIF clear the OCIF bit */
  249. if (value & 0x01) {
  250. s->sr = 0;
  251. imx_epit_update_int(s);
  252. }
  253. break;
  254. case 2: /* LR - set ticks */
  255. s->lr = value;
  256. if (s->cr & CR_RLD) {
  257. /* Also set the limit if the LRD bit is set */
  258. /* If IOVW bit is set then set the timer value */
  259. ptimer_set_limit(s->timer_reload, s->lr, s->cr & CR_IOVW);
  260. ptimer_set_limit(s->timer_cmp, s->lr, 0);
  261. } else if (s->cr & CR_IOVW) {
  262. /* If IOVW bit is set then set the timer value */
  263. ptimer_set_count(s->timer_reload, s->lr);
  264. }
  265. imx_epit_reload_compare_timer(s);
  266. break;
  267. case 3: /* CMP */
  268. s->cmp = value;
  269. imx_epit_reload_compare_timer(s);
  270. break;
  271. default:
  272. IPRINTF("Bad offset %x\n", reg);
  273. break;
  274. }
  275. }
  276. static void imx_epit_cmp(void *opaque)
  277. {
  278. IMXEPITState *s = IMX_EPIT(opaque);
  279. DPRINTF("sr was %d\n", s->sr);
  280. s->sr = 1;
  281. imx_epit_update_int(s);
  282. }
  283. void imx_timerp_create(const hwaddr addr, qemu_irq irq, DeviceState *ccm)
  284. {
  285. IMXEPITState *pp;
  286. DeviceState *dev;
  287. dev = sysbus_create_simple(TYPE_IMX_EPIT, addr, irq);
  288. pp = IMX_EPIT(dev);
  289. pp->ccm = ccm;
  290. }
  291. static const MemoryRegionOps imx_epit_ops = {
  292. .read = imx_epit_read,
  293. .write = imx_epit_write,
  294. .endianness = DEVICE_NATIVE_ENDIAN,
  295. };
  296. static const VMStateDescription vmstate_imx_timer_epit = {
  297. .name = "imx.epit",
  298. .version_id = 2,
  299. .minimum_version_id = 2,
  300. .fields = (VMStateField[]) {
  301. VMSTATE_UINT32(cr, IMXEPITState),
  302. VMSTATE_UINT32(sr, IMXEPITState),
  303. VMSTATE_UINT32(lr, IMXEPITState),
  304. VMSTATE_UINT32(cmp, IMXEPITState),
  305. VMSTATE_UINT32(cnt, IMXEPITState),
  306. VMSTATE_UINT32(freq, IMXEPITState),
  307. VMSTATE_PTIMER(timer_reload, IMXEPITState),
  308. VMSTATE_PTIMER(timer_cmp, IMXEPITState),
  309. VMSTATE_END_OF_LIST()
  310. }
  311. };
  312. static void imx_epit_realize(DeviceState *dev, Error **errp)
  313. {
  314. IMXEPITState *s = IMX_EPIT(dev);
  315. SysBusDevice *sbd = SYS_BUS_DEVICE(dev);
  316. QEMUBH *bh;
  317. DPRINTF("\n");
  318. sysbus_init_irq(sbd, &s->irq);
  319. memory_region_init_io(&s->iomem, OBJECT(s), &imx_epit_ops, s, TYPE_IMX_EPIT,
  320. 0x00001000);
  321. sysbus_init_mmio(sbd, &s->iomem);
  322. s->timer_reload = ptimer_init(NULL);
  323. bh = qemu_bh_new(imx_epit_cmp, s);
  324. s->timer_cmp = ptimer_init(bh);
  325. }
  326. static void imx_epit_class_init(ObjectClass *klass, void *data)
  327. {
  328. DeviceClass *dc = DEVICE_CLASS(klass);
  329. dc->realize = imx_epit_realize;
  330. dc->reset = imx_epit_reset;
  331. dc->vmsd = &vmstate_imx_timer_epit;
  332. dc->desc = "i.MX periodic timer";
  333. }
  334. static const TypeInfo imx_epit_info = {
  335. .name = TYPE_IMX_EPIT,
  336. .parent = TYPE_SYS_BUS_DEVICE,
  337. .instance_size = sizeof(IMXEPITState),
  338. .class_init = imx_epit_class_init,
  339. };
  340. static void imx_epit_register_types(void)
  341. {
  342. type_register_static(&imx_epit_info);
  343. }
  344. type_init(imx_epit_register_types)