slavio_timer.c 13 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415
  1. /*
  2. * QEMU Sparc SLAVIO timer controller emulation
  3. *
  4. * Copyright (c) 2003-2005 Fabrice Bellard
  5. *
  6. * Permission is hereby granted, free of charge, to any person obtaining a copy
  7. * of this software and associated documentation files (the "Software"), to deal
  8. * in the Software without restriction, including without limitation the rights
  9. * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
  10. * copies of the Software, and to permit persons to whom the Software is
  11. * furnished to do so, subject to the following conditions:
  12. *
  13. * The above copyright notice and this permission notice shall be included in
  14. * all copies or substantial portions of the Software.
  15. *
  16. * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
  17. * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
  18. * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
  19. * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
  20. * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
  21. * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
  22. * THE SOFTWARE.
  23. */
  24. #include "hw.h"
  25. #include "sun4m.h"
  26. #include "qemu-timer.h"
  27. //#define DEBUG_TIMER
  28. #ifdef DEBUG_TIMER
  29. #define DPRINTF(fmt, args...) \
  30. do { printf("TIMER: " fmt , ##args); } while (0)
  31. #else
  32. #define DPRINTF(fmt, args...) do {} while (0)
  33. #endif
  34. /*
  35. * Registers of hardware timer in sun4m.
  36. *
  37. * This is the timer/counter part of chip STP2001 (Slave I/O), also
  38. * produced as NCR89C105. See
  39. * http://www.ibiblio.org/pub/historic-linux/early-ports/Sparc/NCR/NCR89C105.txt
  40. *
  41. * The 31-bit counter is incremented every 500ns by bit 9. Bits 8..0
  42. * are zero. Bit 31 is 1 when count has been reached.
  43. *
  44. * Per-CPU timers interrupt local CPU, system timer uses normal
  45. * interrupt routing.
  46. *
  47. */
  48. #define MAX_CPUS 16
  49. typedef struct SLAVIO_TIMERState {
  50. qemu_irq irq;
  51. ptimer_state *timer;
  52. uint32_t count, counthigh, reached;
  53. uint64_t limit;
  54. // processor only
  55. uint32_t running;
  56. struct SLAVIO_TIMERState *master;
  57. uint32_t slave_index;
  58. // system only
  59. uint32_t num_slaves;
  60. struct SLAVIO_TIMERState *slave[MAX_CPUS];
  61. uint32_t slave_mode;
  62. } SLAVIO_TIMERState;
  63. #define SYS_TIMER_SIZE 0x14
  64. #define CPU_TIMER_SIZE 0x10
  65. #define SYS_TIMER_OFFSET 0x10000ULL
  66. #define CPU_TIMER_OFFSET(cpu) (0x1000ULL * cpu)
  67. #define TIMER_LIMIT 0
  68. #define TIMER_COUNTER 1
  69. #define TIMER_COUNTER_NORST 2
  70. #define TIMER_STATUS 3
  71. #define TIMER_MODE 4
  72. #define TIMER_COUNT_MASK32 0xfffffe00
  73. #define TIMER_LIMIT_MASK32 0x7fffffff
  74. #define TIMER_MAX_COUNT64 0x7ffffffffffffe00ULL
  75. #define TIMER_MAX_COUNT32 0x7ffffe00ULL
  76. #define TIMER_REACHED 0x80000000
  77. #define TIMER_PERIOD 500ULL // 500ns
  78. #define LIMIT_TO_PERIODS(l) ((l) >> 9)
  79. #define PERIODS_TO_LIMIT(l) ((l) << 9)
  80. static int slavio_timer_is_user(SLAVIO_TIMERState *s)
  81. {
  82. return s->master && (s->master->slave_mode & (1 << s->slave_index));
  83. }
  84. // Update count, set irq, update expire_time
  85. // Convert from ptimer countdown units
  86. static void slavio_timer_get_out(SLAVIO_TIMERState *s)
  87. {
  88. uint64_t count, limit;
  89. if (s->limit == 0) /* free-run processor or system counter */
  90. limit = TIMER_MAX_COUNT32;
  91. else
  92. limit = s->limit;
  93. if (s->timer)
  94. count = limit - PERIODS_TO_LIMIT(ptimer_get_count(s->timer));
  95. else
  96. count = 0;
  97. DPRINTF("get_out: limit %" PRIx64 " count %x%08x\n", s->limit,
  98. s->counthigh, s->count);
  99. s->count = count & TIMER_COUNT_MASK32;
  100. s->counthigh = count >> 32;
  101. }
  102. // timer callback
  103. static void slavio_timer_irq(void *opaque)
  104. {
  105. SLAVIO_TIMERState *s = opaque;
  106. slavio_timer_get_out(s);
  107. DPRINTF("callback: count %x%08x\n", s->counthigh, s->count);
  108. s->reached = TIMER_REACHED;
  109. if (!slavio_timer_is_user(s))
  110. qemu_irq_raise(s->irq);
  111. }
  112. static uint32_t slavio_timer_mem_readl(void *opaque, target_phys_addr_t addr)
  113. {
  114. SLAVIO_TIMERState *s = opaque;
  115. uint32_t saddr, ret;
  116. saddr = addr >> 2;
  117. switch (saddr) {
  118. case TIMER_LIMIT:
  119. // read limit (system counter mode) or read most signifying
  120. // part of counter (user mode)
  121. if (slavio_timer_is_user(s)) {
  122. // read user timer MSW
  123. slavio_timer_get_out(s);
  124. ret = s->counthigh | s->reached;
  125. } else {
  126. // read limit
  127. // clear irq
  128. qemu_irq_lower(s->irq);
  129. s->reached = 0;
  130. ret = s->limit & TIMER_LIMIT_MASK32;
  131. }
  132. break;
  133. case TIMER_COUNTER:
  134. // read counter and reached bit (system mode) or read lsbits
  135. // of counter (user mode)
  136. slavio_timer_get_out(s);
  137. if (slavio_timer_is_user(s)) // read user timer LSW
  138. ret = s->count & TIMER_MAX_COUNT64;
  139. else // read limit
  140. ret = (s->count & TIMER_MAX_COUNT32) | s->reached;
  141. break;
  142. case TIMER_STATUS:
  143. // only available in processor counter/timer
  144. // read start/stop status
  145. ret = s->running;
  146. break;
  147. case TIMER_MODE:
  148. // only available in system counter
  149. // read user/system mode
  150. ret = s->slave_mode;
  151. break;
  152. default:
  153. DPRINTF("invalid read address " TARGET_FMT_plx "\n", addr);
  154. ret = 0;
  155. break;
  156. }
  157. DPRINTF("read " TARGET_FMT_plx " = %08x\n", addr, ret);
  158. return ret;
  159. }
  160. static void slavio_timer_mem_writel(void *opaque, target_phys_addr_t addr,
  161. uint32_t val)
  162. {
  163. SLAVIO_TIMERState *s = opaque;
  164. uint32_t saddr;
  165. DPRINTF("write " TARGET_FMT_plx " %08x\n", addr, val);
  166. saddr = addr >> 2;
  167. switch (saddr) {
  168. case TIMER_LIMIT:
  169. if (slavio_timer_is_user(s)) {
  170. uint64_t count;
  171. // set user counter MSW, reset counter
  172. s->limit = TIMER_MAX_COUNT64;
  173. s->counthigh = val & (TIMER_MAX_COUNT64 >> 32);
  174. s->reached = 0;
  175. count = ((uint64_t)s->counthigh << 32) | s->count;
  176. DPRINTF("processor %d user timer set to %016llx\n", s->slave_index,
  177. count);
  178. if (s->timer)
  179. ptimer_set_count(s->timer, LIMIT_TO_PERIODS(s->limit - count));
  180. } else {
  181. // set limit, reset counter
  182. qemu_irq_lower(s->irq);
  183. s->limit = val & TIMER_MAX_COUNT32;
  184. if (s->timer) {
  185. if (s->limit == 0) /* free-run */
  186. ptimer_set_limit(s->timer,
  187. LIMIT_TO_PERIODS(TIMER_MAX_COUNT32), 1);
  188. else
  189. ptimer_set_limit(s->timer, LIMIT_TO_PERIODS(s->limit), 1);
  190. }
  191. }
  192. break;
  193. case TIMER_COUNTER:
  194. if (slavio_timer_is_user(s)) {
  195. uint64_t count;
  196. // set user counter LSW, reset counter
  197. s->limit = TIMER_MAX_COUNT64;
  198. s->count = val & TIMER_MAX_COUNT64;
  199. s->reached = 0;
  200. count = ((uint64_t)s->counthigh) << 32 | s->count;
  201. DPRINTF("processor %d user timer set to %016llx\n", s->slave_index,
  202. count);
  203. if (s->timer)
  204. ptimer_set_count(s->timer, LIMIT_TO_PERIODS(s->limit - count));
  205. } else
  206. DPRINTF("not user timer\n");
  207. break;
  208. case TIMER_COUNTER_NORST:
  209. // set limit without resetting counter
  210. s->limit = val & TIMER_MAX_COUNT32;
  211. if (s->timer) {
  212. if (s->limit == 0) /* free-run */
  213. ptimer_set_limit(s->timer,
  214. LIMIT_TO_PERIODS(TIMER_MAX_COUNT32), 0);
  215. else
  216. ptimer_set_limit(s->timer, LIMIT_TO_PERIODS(s->limit), 0);
  217. }
  218. break;
  219. case TIMER_STATUS:
  220. if (slavio_timer_is_user(s)) {
  221. // start/stop user counter
  222. if ((val & 1) && !s->running) {
  223. DPRINTF("processor %d user timer started\n", s->slave_index);
  224. if (s->timer)
  225. ptimer_run(s->timer, 0);
  226. s->running = 1;
  227. } else if (!(val & 1) && s->running) {
  228. DPRINTF("processor %d user timer stopped\n", s->slave_index);
  229. if (s->timer)
  230. ptimer_stop(s->timer);
  231. s->running = 0;
  232. }
  233. }
  234. break;
  235. case TIMER_MODE:
  236. if (s->master == NULL) {
  237. unsigned int i;
  238. for (i = 0; i < s->num_slaves; i++) {
  239. unsigned int processor = 1 << i;
  240. // check for a change in timer mode for this processor
  241. if ((val & processor) != (s->slave_mode & processor)) {
  242. if (val & processor) { // counter -> user timer
  243. qemu_irq_lower(s->slave[i]->irq);
  244. // counters are always running
  245. ptimer_stop(s->slave[i]->timer);
  246. s->slave[i]->running = 0;
  247. // user timer limit is always the same
  248. s->slave[i]->limit = TIMER_MAX_COUNT64;
  249. ptimer_set_limit(s->slave[i]->timer,
  250. LIMIT_TO_PERIODS(s->slave[i]->limit),
  251. 1);
  252. // set this processors user timer bit in config
  253. // register
  254. s->slave_mode |= processor;
  255. DPRINTF("processor %d changed from counter to user "
  256. "timer\n", s->slave[i]->slave_index);
  257. } else { // user timer -> counter
  258. // stop the user timer if it is running
  259. if (s->slave[i]->running)
  260. ptimer_stop(s->slave[i]->timer);
  261. // start the counter
  262. ptimer_run(s->slave[i]->timer, 0);
  263. s->slave[i]->running = 1;
  264. // clear this processors user timer bit in config
  265. // register
  266. s->slave_mode &= ~processor;
  267. DPRINTF("processor %d changed from user timer to "
  268. "counter\n", s->slave[i]->slave_index);
  269. }
  270. }
  271. }
  272. } else
  273. DPRINTF("not system timer\n");
  274. break;
  275. default:
  276. DPRINTF("invalid write address " TARGET_FMT_plx "\n", addr);
  277. break;
  278. }
  279. }
  280. static CPUReadMemoryFunc *slavio_timer_mem_read[3] = {
  281. NULL,
  282. NULL,
  283. slavio_timer_mem_readl,
  284. };
  285. static CPUWriteMemoryFunc *slavio_timer_mem_write[3] = {
  286. NULL,
  287. NULL,
  288. slavio_timer_mem_writel,
  289. };
  290. static void slavio_timer_save(QEMUFile *f, void *opaque)
  291. {
  292. SLAVIO_TIMERState *s = opaque;
  293. qemu_put_be64s(f, &s->limit);
  294. qemu_put_be32s(f, &s->count);
  295. qemu_put_be32s(f, &s->counthigh);
  296. qemu_put_be32s(f, &s->reached);
  297. qemu_put_be32s(f, &s->running);
  298. if (s->timer)
  299. qemu_put_ptimer(f, s->timer);
  300. }
  301. static int slavio_timer_load(QEMUFile *f, void *opaque, int version_id)
  302. {
  303. SLAVIO_TIMERState *s = opaque;
  304. if (version_id != 3)
  305. return -EINVAL;
  306. qemu_get_be64s(f, &s->limit);
  307. qemu_get_be32s(f, &s->count);
  308. qemu_get_be32s(f, &s->counthigh);
  309. qemu_get_be32s(f, &s->reached);
  310. qemu_get_be32s(f, &s->running);
  311. if (s->timer)
  312. qemu_get_ptimer(f, s->timer);
  313. return 0;
  314. }
  315. static void slavio_timer_reset(void *opaque)
  316. {
  317. SLAVIO_TIMERState *s = opaque;
  318. s->limit = 0;
  319. s->count = 0;
  320. s->reached = 0;
  321. s->slave_mode = 0;
  322. if (!s->master || s->slave_index < s->master->num_slaves) {
  323. ptimer_set_limit(s->timer, LIMIT_TO_PERIODS(TIMER_MAX_COUNT32), 1);
  324. ptimer_run(s->timer, 0);
  325. }
  326. s->running = 1;
  327. qemu_irq_lower(s->irq);
  328. }
  329. static SLAVIO_TIMERState *slavio_timer_init(target_phys_addr_t addr,
  330. qemu_irq irq,
  331. SLAVIO_TIMERState *master,
  332. uint32_t slave_index)
  333. {
  334. int slavio_timer_io_memory;
  335. SLAVIO_TIMERState *s;
  336. QEMUBH *bh;
  337. s = qemu_mallocz(sizeof(SLAVIO_TIMERState));
  338. s->irq = irq;
  339. s->master = master;
  340. s->slave_index = slave_index;
  341. if (!master || slave_index < master->num_slaves) {
  342. bh = qemu_bh_new(slavio_timer_irq, s);
  343. s->timer = ptimer_init(bh);
  344. ptimer_set_period(s->timer, TIMER_PERIOD);
  345. }
  346. slavio_timer_io_memory = cpu_register_io_memory(0, slavio_timer_mem_read,
  347. slavio_timer_mem_write, s);
  348. if (master)
  349. cpu_register_physical_memory(addr, CPU_TIMER_SIZE,
  350. slavio_timer_io_memory);
  351. else
  352. cpu_register_physical_memory(addr, SYS_TIMER_SIZE,
  353. slavio_timer_io_memory);
  354. register_savevm("slavio_timer", addr, 3, slavio_timer_save,
  355. slavio_timer_load, s);
  356. qemu_register_reset(slavio_timer_reset, s);
  357. slavio_timer_reset(s);
  358. return s;
  359. }
  360. void slavio_timer_init_all(target_phys_addr_t base, qemu_irq master_irq,
  361. qemu_irq *cpu_irqs, unsigned int num_cpus)
  362. {
  363. SLAVIO_TIMERState *master;
  364. unsigned int i;
  365. master = slavio_timer_init(base + SYS_TIMER_OFFSET, master_irq, NULL, 0);
  366. master->num_slaves = num_cpus;
  367. for (i = 0; i < MAX_CPUS; i++) {
  368. master->slave[i] = slavio_timer_init(base + (target_phys_addr_t)
  369. CPU_TIMER_OFFSET(i),
  370. cpu_irqs[i], master, i);
  371. }
  372. }