2
0

pxa2xx_timer.c 15 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536
  1. /*
  2. * Intel XScale PXA255/270 OS Timers.
  3. *
  4. * Copyright (c) 2006 Openedhand Ltd.
  5. * Copyright (c) 2006 Thorsten Zitterell
  6. *
  7. * This code is licensed under the GPL.
  8. */
  9. #include "hw.h"
  10. #include "qemu-timer.h"
  11. #include "sysemu.h"
  12. #include "pxa.h"
  13. #include "sysbus.h"
  14. #define OSMR0 0x00
  15. #define OSMR1 0x04
  16. #define OSMR2 0x08
  17. #define OSMR3 0x0c
  18. #define OSMR4 0x80
  19. #define OSMR5 0x84
  20. #define OSMR6 0x88
  21. #define OSMR7 0x8c
  22. #define OSMR8 0x90
  23. #define OSMR9 0x94
  24. #define OSMR10 0x98
  25. #define OSMR11 0x9c
  26. #define OSCR 0x10 /* OS Timer Count */
  27. #define OSCR4 0x40
  28. #define OSCR5 0x44
  29. #define OSCR6 0x48
  30. #define OSCR7 0x4c
  31. #define OSCR8 0x50
  32. #define OSCR9 0x54
  33. #define OSCR10 0x58
  34. #define OSCR11 0x5c
  35. #define OSSR 0x14 /* Timer status register */
  36. #define OWER 0x18
  37. #define OIER 0x1c /* Interrupt enable register 3-0 to E3-E0 */
  38. #define OMCR4 0xc0 /* OS Match Control registers */
  39. #define OMCR5 0xc4
  40. #define OMCR6 0xc8
  41. #define OMCR7 0xcc
  42. #define OMCR8 0xd0
  43. #define OMCR9 0xd4
  44. #define OMCR10 0xd8
  45. #define OMCR11 0xdc
  46. #define OSNR 0x20
  47. #define PXA25X_FREQ 3686400 /* 3.6864 MHz */
  48. #define PXA27X_FREQ 3250000 /* 3.25 MHz */
  49. static int pxa2xx_timer4_freq[8] = {
  50. [0] = 0,
  51. [1] = 32768,
  52. [2] = 1000,
  53. [3] = 1,
  54. [4] = 1000000,
  55. /* [5] is the "Externally supplied clock". Assign if necessary. */
  56. [5 ... 7] = 0,
  57. };
  58. typedef struct PXA2xxTimerInfo PXA2xxTimerInfo;
  59. typedef struct {
  60. uint32_t value;
  61. qemu_irq irq;
  62. QEMUTimer *qtimer;
  63. int num;
  64. PXA2xxTimerInfo *info;
  65. } PXA2xxTimer0;
  66. typedef struct {
  67. PXA2xxTimer0 tm;
  68. int32_t oldclock;
  69. int32_t clock;
  70. uint64_t lastload;
  71. uint32_t freq;
  72. uint32_t control;
  73. } PXA2xxTimer4;
  74. struct PXA2xxTimerInfo {
  75. SysBusDevice busdev;
  76. MemoryRegion iomem;
  77. uint32_t flags;
  78. int32_t clock;
  79. int32_t oldclock;
  80. uint64_t lastload;
  81. uint32_t freq;
  82. PXA2xxTimer0 timer[4];
  83. uint32_t events;
  84. uint32_t irq_enabled;
  85. uint32_t reset3;
  86. uint32_t snapshot;
  87. qemu_irq irq4;
  88. PXA2xxTimer4 tm4[8];
  89. };
  90. #define PXA2XX_TIMER_HAVE_TM4 0
  91. static inline int pxa2xx_timer_has_tm4(PXA2xxTimerInfo *s)
  92. {
  93. return s->flags & (1 << PXA2XX_TIMER_HAVE_TM4);
  94. }
  95. static void pxa2xx_timer_update(void *opaque, uint64_t now_qemu)
  96. {
  97. PXA2xxTimerInfo *s = (PXA2xxTimerInfo *) opaque;
  98. int i;
  99. uint32_t now_vm;
  100. uint64_t new_qemu;
  101. now_vm = s->clock +
  102. muldiv64(now_qemu - s->lastload, s->freq, get_ticks_per_sec());
  103. for (i = 0; i < 4; i ++) {
  104. new_qemu = now_qemu + muldiv64((uint32_t) (s->timer[i].value - now_vm),
  105. get_ticks_per_sec(), s->freq);
  106. qemu_mod_timer(s->timer[i].qtimer, new_qemu);
  107. }
  108. }
  109. static void pxa2xx_timer_update4(void *opaque, uint64_t now_qemu, int n)
  110. {
  111. PXA2xxTimerInfo *s = (PXA2xxTimerInfo *) opaque;
  112. uint32_t now_vm;
  113. uint64_t new_qemu;
  114. static const int counters[8] = { 0, 0, 0, 0, 4, 4, 6, 6 };
  115. int counter;
  116. if (s->tm4[n].control & (1 << 7))
  117. counter = n;
  118. else
  119. counter = counters[n];
  120. if (!s->tm4[counter].freq) {
  121. qemu_del_timer(s->tm4[n].tm.qtimer);
  122. return;
  123. }
  124. now_vm = s->tm4[counter].clock + muldiv64(now_qemu -
  125. s->tm4[counter].lastload,
  126. s->tm4[counter].freq, get_ticks_per_sec());
  127. new_qemu = now_qemu + muldiv64((uint32_t) (s->tm4[n].tm.value - now_vm),
  128. get_ticks_per_sec(), s->tm4[counter].freq);
  129. qemu_mod_timer(s->tm4[n].tm.qtimer, new_qemu);
  130. }
  131. static uint64_t pxa2xx_timer_read(void *opaque, target_phys_addr_t offset,
  132. unsigned size)
  133. {
  134. PXA2xxTimerInfo *s = (PXA2xxTimerInfo *) opaque;
  135. int tm = 0;
  136. switch (offset) {
  137. case OSMR3: tm ++;
  138. case OSMR2: tm ++;
  139. case OSMR1: tm ++;
  140. case OSMR0:
  141. return s->timer[tm].value;
  142. case OSMR11: tm ++;
  143. case OSMR10: tm ++;
  144. case OSMR9: tm ++;
  145. case OSMR8: tm ++;
  146. case OSMR7: tm ++;
  147. case OSMR6: tm ++;
  148. case OSMR5: tm ++;
  149. case OSMR4:
  150. if (!pxa2xx_timer_has_tm4(s))
  151. goto badreg;
  152. return s->tm4[tm].tm.value;
  153. case OSCR:
  154. return s->clock + muldiv64(qemu_get_clock_ns(vm_clock) -
  155. s->lastload, s->freq, get_ticks_per_sec());
  156. case OSCR11: tm ++;
  157. case OSCR10: tm ++;
  158. case OSCR9: tm ++;
  159. case OSCR8: tm ++;
  160. case OSCR7: tm ++;
  161. case OSCR6: tm ++;
  162. case OSCR5: tm ++;
  163. case OSCR4:
  164. if (!pxa2xx_timer_has_tm4(s))
  165. goto badreg;
  166. if ((tm == 9 - 4 || tm == 11 - 4) && (s->tm4[tm].control & (1 << 9))) {
  167. if (s->tm4[tm - 1].freq)
  168. s->snapshot = s->tm4[tm - 1].clock + muldiv64(
  169. qemu_get_clock_ns(vm_clock) -
  170. s->tm4[tm - 1].lastload,
  171. s->tm4[tm - 1].freq, get_ticks_per_sec());
  172. else
  173. s->snapshot = s->tm4[tm - 1].clock;
  174. }
  175. if (!s->tm4[tm].freq)
  176. return s->tm4[tm].clock;
  177. return s->tm4[tm].clock + muldiv64(qemu_get_clock_ns(vm_clock) -
  178. s->tm4[tm].lastload, s->tm4[tm].freq, get_ticks_per_sec());
  179. case OIER:
  180. return s->irq_enabled;
  181. case OSSR: /* Status register */
  182. return s->events;
  183. case OWER:
  184. return s->reset3;
  185. case OMCR11: tm ++;
  186. case OMCR10: tm ++;
  187. case OMCR9: tm ++;
  188. case OMCR8: tm ++;
  189. case OMCR7: tm ++;
  190. case OMCR6: tm ++;
  191. case OMCR5: tm ++;
  192. case OMCR4:
  193. if (!pxa2xx_timer_has_tm4(s))
  194. goto badreg;
  195. return s->tm4[tm].control;
  196. case OSNR:
  197. return s->snapshot;
  198. default:
  199. badreg:
  200. hw_error("pxa2xx_timer_read: Bad offset " REG_FMT "\n", offset);
  201. }
  202. return 0;
  203. }
  204. static void pxa2xx_timer_write(void *opaque, target_phys_addr_t offset,
  205. uint64_t value, unsigned size)
  206. {
  207. int i, tm = 0;
  208. PXA2xxTimerInfo *s = (PXA2xxTimerInfo *) opaque;
  209. switch (offset) {
  210. case OSMR3: tm ++;
  211. case OSMR2: tm ++;
  212. case OSMR1: tm ++;
  213. case OSMR0:
  214. s->timer[tm].value = value;
  215. pxa2xx_timer_update(s, qemu_get_clock_ns(vm_clock));
  216. break;
  217. case OSMR11: tm ++;
  218. case OSMR10: tm ++;
  219. case OSMR9: tm ++;
  220. case OSMR8: tm ++;
  221. case OSMR7: tm ++;
  222. case OSMR6: tm ++;
  223. case OSMR5: tm ++;
  224. case OSMR4:
  225. if (!pxa2xx_timer_has_tm4(s))
  226. goto badreg;
  227. s->tm4[tm].tm.value = value;
  228. pxa2xx_timer_update4(s, qemu_get_clock_ns(vm_clock), tm);
  229. break;
  230. case OSCR:
  231. s->oldclock = s->clock;
  232. s->lastload = qemu_get_clock_ns(vm_clock);
  233. s->clock = value;
  234. pxa2xx_timer_update(s, s->lastload);
  235. break;
  236. case OSCR11: tm ++;
  237. case OSCR10: tm ++;
  238. case OSCR9: tm ++;
  239. case OSCR8: tm ++;
  240. case OSCR7: tm ++;
  241. case OSCR6: tm ++;
  242. case OSCR5: tm ++;
  243. case OSCR4:
  244. if (!pxa2xx_timer_has_tm4(s))
  245. goto badreg;
  246. s->tm4[tm].oldclock = s->tm4[tm].clock;
  247. s->tm4[tm].lastload = qemu_get_clock_ns(vm_clock);
  248. s->tm4[tm].clock = value;
  249. pxa2xx_timer_update4(s, s->tm4[tm].lastload, tm);
  250. break;
  251. case OIER:
  252. s->irq_enabled = value & 0xfff;
  253. break;
  254. case OSSR: /* Status register */
  255. value &= s->events;
  256. s->events &= ~value;
  257. for (i = 0; i < 4; i ++, value >>= 1)
  258. if (value & 1)
  259. qemu_irq_lower(s->timer[i].irq);
  260. if (pxa2xx_timer_has_tm4(s) && !(s->events & 0xff0) && value)
  261. qemu_irq_lower(s->irq4);
  262. break;
  263. case OWER: /* XXX: Reset on OSMR3 match? */
  264. s->reset3 = value;
  265. break;
  266. case OMCR7: tm ++;
  267. case OMCR6: tm ++;
  268. case OMCR5: tm ++;
  269. case OMCR4:
  270. if (!pxa2xx_timer_has_tm4(s))
  271. goto badreg;
  272. s->tm4[tm].control = value & 0x0ff;
  273. /* XXX Stop if running (shouldn't happen) */
  274. if ((value & (1 << 7)) || tm == 0)
  275. s->tm4[tm].freq = pxa2xx_timer4_freq[value & 7];
  276. else {
  277. s->tm4[tm].freq = 0;
  278. pxa2xx_timer_update4(s, qemu_get_clock_ns(vm_clock), tm);
  279. }
  280. break;
  281. case OMCR11: tm ++;
  282. case OMCR10: tm ++;
  283. case OMCR9: tm ++;
  284. case OMCR8: tm += 4;
  285. if (!pxa2xx_timer_has_tm4(s))
  286. goto badreg;
  287. s->tm4[tm].control = value & 0x3ff;
  288. /* XXX Stop if running (shouldn't happen) */
  289. if ((value & (1 << 7)) || !(tm & 1))
  290. s->tm4[tm].freq =
  291. pxa2xx_timer4_freq[(value & (1 << 8)) ? 0 : (value & 7)];
  292. else {
  293. s->tm4[tm].freq = 0;
  294. pxa2xx_timer_update4(s, qemu_get_clock_ns(vm_clock), tm);
  295. }
  296. break;
  297. default:
  298. badreg:
  299. hw_error("pxa2xx_timer_write: Bad offset " REG_FMT "\n", offset);
  300. }
  301. }
  302. static const MemoryRegionOps pxa2xx_timer_ops = {
  303. .read = pxa2xx_timer_read,
  304. .write = pxa2xx_timer_write,
  305. .endianness = DEVICE_NATIVE_ENDIAN,
  306. };
  307. static void pxa2xx_timer_tick(void *opaque)
  308. {
  309. PXA2xxTimer0 *t = (PXA2xxTimer0 *) opaque;
  310. PXA2xxTimerInfo *i = t->info;
  311. if (i->irq_enabled & (1 << t->num)) {
  312. i->events |= 1 << t->num;
  313. qemu_irq_raise(t->irq);
  314. }
  315. if (t->num == 3)
  316. if (i->reset3 & 1) {
  317. i->reset3 = 0;
  318. qemu_system_reset_request();
  319. }
  320. }
  321. static void pxa2xx_timer_tick4(void *opaque)
  322. {
  323. PXA2xxTimer4 *t = (PXA2xxTimer4 *) opaque;
  324. PXA2xxTimerInfo *i = (PXA2xxTimerInfo *) t->tm.info;
  325. pxa2xx_timer_tick(&t->tm);
  326. if (t->control & (1 << 3))
  327. t->clock = 0;
  328. if (t->control & (1 << 6))
  329. pxa2xx_timer_update4(i, qemu_get_clock_ns(vm_clock), t->tm.num - 4);
  330. if (i->events & 0xff0)
  331. qemu_irq_raise(i->irq4);
  332. }
  333. static int pxa25x_timer_post_load(void *opaque, int version_id)
  334. {
  335. PXA2xxTimerInfo *s = (PXA2xxTimerInfo *) opaque;
  336. int64_t now;
  337. int i;
  338. now = qemu_get_clock_ns(vm_clock);
  339. pxa2xx_timer_update(s, now);
  340. if (pxa2xx_timer_has_tm4(s))
  341. for (i = 0; i < 8; i ++)
  342. pxa2xx_timer_update4(s, now, i);
  343. return 0;
  344. }
  345. static int pxa2xx_timer_init(SysBusDevice *dev)
  346. {
  347. int i;
  348. PXA2xxTimerInfo *s;
  349. s = FROM_SYSBUS(PXA2xxTimerInfo, dev);
  350. s->irq_enabled = 0;
  351. s->oldclock = 0;
  352. s->clock = 0;
  353. s->lastload = qemu_get_clock_ns(vm_clock);
  354. s->reset3 = 0;
  355. for (i = 0; i < 4; i ++) {
  356. s->timer[i].value = 0;
  357. sysbus_init_irq(dev, &s->timer[i].irq);
  358. s->timer[i].info = s;
  359. s->timer[i].num = i;
  360. s->timer[i].qtimer = qemu_new_timer_ns(vm_clock,
  361. pxa2xx_timer_tick, &s->timer[i]);
  362. }
  363. if (s->flags & (1 << PXA2XX_TIMER_HAVE_TM4)) {
  364. sysbus_init_irq(dev, &s->irq4);
  365. for (i = 0; i < 8; i ++) {
  366. s->tm4[i].tm.value = 0;
  367. s->tm4[i].tm.info = s;
  368. s->tm4[i].tm.num = i + 4;
  369. s->tm4[i].freq = 0;
  370. s->tm4[i].control = 0x0;
  371. s->tm4[i].tm.qtimer = qemu_new_timer_ns(vm_clock,
  372. pxa2xx_timer_tick4, &s->tm4[i]);
  373. }
  374. }
  375. memory_region_init_io(&s->iomem, &pxa2xx_timer_ops, s,
  376. "pxa2xx-timer", 0x00001000);
  377. sysbus_init_mmio(dev, &s->iomem);
  378. return 0;
  379. }
  380. static const VMStateDescription vmstate_pxa2xx_timer0_regs = {
  381. .name = "pxa2xx_timer0",
  382. .version_id = 2,
  383. .minimum_version_id = 2,
  384. .minimum_version_id_old = 2,
  385. .fields = (VMStateField[]) {
  386. VMSTATE_UINT32(value, PXA2xxTimer0),
  387. VMSTATE_END_OF_LIST(),
  388. },
  389. };
  390. static const VMStateDescription vmstate_pxa2xx_timer4_regs = {
  391. .name = "pxa2xx_timer4",
  392. .version_id = 1,
  393. .minimum_version_id = 1,
  394. .minimum_version_id_old = 1,
  395. .fields = (VMStateField[]) {
  396. VMSTATE_STRUCT(tm, PXA2xxTimer4, 1,
  397. vmstate_pxa2xx_timer0_regs, PXA2xxTimer0),
  398. VMSTATE_INT32(oldclock, PXA2xxTimer4),
  399. VMSTATE_INT32(clock, PXA2xxTimer4),
  400. VMSTATE_UINT64(lastload, PXA2xxTimer4),
  401. VMSTATE_UINT32(freq, PXA2xxTimer4),
  402. VMSTATE_UINT32(control, PXA2xxTimer4),
  403. VMSTATE_END_OF_LIST(),
  404. },
  405. };
  406. static bool pxa2xx_timer_has_tm4_test(void *opaque, int version_id)
  407. {
  408. return pxa2xx_timer_has_tm4(opaque);
  409. }
  410. static const VMStateDescription vmstate_pxa2xx_timer_regs = {
  411. .name = "pxa2xx_timer",
  412. .version_id = 1,
  413. .minimum_version_id = 1,
  414. .minimum_version_id_old = 1,
  415. .post_load = pxa25x_timer_post_load,
  416. .fields = (VMStateField[]) {
  417. VMSTATE_INT32(clock, PXA2xxTimerInfo),
  418. VMSTATE_INT32(oldclock, PXA2xxTimerInfo),
  419. VMSTATE_UINT64(lastload, PXA2xxTimerInfo),
  420. VMSTATE_STRUCT_ARRAY(timer, PXA2xxTimerInfo, 4, 1,
  421. vmstate_pxa2xx_timer0_regs, PXA2xxTimer0),
  422. VMSTATE_UINT32(events, PXA2xxTimerInfo),
  423. VMSTATE_UINT32(irq_enabled, PXA2xxTimerInfo),
  424. VMSTATE_UINT32(reset3, PXA2xxTimerInfo),
  425. VMSTATE_UINT32(snapshot, PXA2xxTimerInfo),
  426. VMSTATE_STRUCT_ARRAY_TEST(tm4, PXA2xxTimerInfo, 8,
  427. pxa2xx_timer_has_tm4_test, 0,
  428. vmstate_pxa2xx_timer4_regs, PXA2xxTimer4),
  429. VMSTATE_END_OF_LIST(),
  430. }
  431. };
  432. static Property pxa25x_timer_dev_properties[] = {
  433. DEFINE_PROP_UINT32("freq", PXA2xxTimerInfo, freq, PXA25X_FREQ),
  434. DEFINE_PROP_BIT("tm4", PXA2xxTimerInfo, flags,
  435. PXA2XX_TIMER_HAVE_TM4, false),
  436. DEFINE_PROP_END_OF_LIST(),
  437. };
  438. static void pxa25x_timer_dev_class_init(ObjectClass *klass, void *data)
  439. {
  440. DeviceClass *dc = DEVICE_CLASS(klass);
  441. SysBusDeviceClass *k = SYS_BUS_DEVICE_CLASS(klass);
  442. k->init = pxa2xx_timer_init;
  443. dc->desc = "PXA25x timer";
  444. dc->vmsd = &vmstate_pxa2xx_timer_regs;
  445. dc->props = pxa25x_timer_dev_properties;
  446. }
  447. static TypeInfo pxa25x_timer_dev_info = {
  448. .name = "pxa25x-timer",
  449. .parent = TYPE_SYS_BUS_DEVICE,
  450. .instance_size = sizeof(PXA2xxTimerInfo),
  451. .class_init = pxa25x_timer_dev_class_init,
  452. };
  453. static Property pxa27x_timer_dev_properties[] = {
  454. DEFINE_PROP_UINT32("freq", PXA2xxTimerInfo, freq, PXA27X_FREQ),
  455. DEFINE_PROP_BIT("tm4", PXA2xxTimerInfo, flags,
  456. PXA2XX_TIMER_HAVE_TM4, true),
  457. DEFINE_PROP_END_OF_LIST(),
  458. };
  459. static void pxa27x_timer_dev_class_init(ObjectClass *klass, void *data)
  460. {
  461. DeviceClass *dc = DEVICE_CLASS(klass);
  462. SysBusDeviceClass *k = SYS_BUS_DEVICE_CLASS(klass);
  463. k->init = pxa2xx_timer_init;
  464. dc->desc = "PXA27x timer";
  465. dc->vmsd = &vmstate_pxa2xx_timer_regs;
  466. dc->props = pxa27x_timer_dev_properties;
  467. }
  468. static TypeInfo pxa27x_timer_dev_info = {
  469. .name = "pxa27x-timer",
  470. .parent = TYPE_SYS_BUS_DEVICE,
  471. .instance_size = sizeof(PXA2xxTimerInfo),
  472. .class_init = pxa27x_timer_dev_class_init,
  473. };
  474. static void pxa2xx_timer_register_types(void)
  475. {
  476. type_register_static(&pxa25x_timer_dev_info);
  477. type_register_static(&pxa27x_timer_dev_info);
  478. }
  479. type_init(pxa2xx_timer_register_types)