lasi.c 6.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274
  1. /*
  2. * HP-PARISC Lasi chipset emulation.
  3. *
  4. * (C) 2019 by Helge Deller <deller@gmx.de>
  5. *
  6. * This work is licensed under the GNU GPL license version 2 or later.
  7. *
  8. * Documentation available at:
  9. * https://parisc.wiki.kernel.org/images-parisc/7/79/Lasi_ers.pdf
  10. */
  11. #include "qemu/osdep.h"
  12. #include "qemu/units.h"
  13. #include "qemu/log.h"
  14. #include "qapi/error.h"
  15. #include "trace.h"
  16. #include "hw/irq.h"
  17. #include "sysemu/sysemu.h"
  18. #include "sysemu/runstate.h"
  19. #include "migration/vmstate.h"
  20. #include "qom/object.h"
  21. #include "hw/misc/lasi.h"
  22. static bool lasi_chip_mem_valid(void *opaque, hwaddr addr,
  23. unsigned size, bool is_write,
  24. MemTxAttrs attrs)
  25. {
  26. bool ret = false;
  27. switch (addr) {
  28. case LASI_IRR:
  29. case LASI_IMR:
  30. case LASI_IPR:
  31. case LASI_ICR:
  32. case LASI_IAR:
  33. case LASI_LPT:
  34. case LASI_UART:
  35. case LASI_LAN:
  36. case LASI_RTC:
  37. case LASI_PCR ... LASI_AMR:
  38. ret = true;
  39. }
  40. trace_lasi_chip_mem_valid(addr, ret);
  41. return ret;
  42. }
  43. static MemTxResult lasi_chip_read_with_attrs(void *opaque, hwaddr addr,
  44. uint64_t *data, unsigned size,
  45. MemTxAttrs attrs)
  46. {
  47. LasiState *s = opaque;
  48. MemTxResult ret = MEMTX_OK;
  49. uint32_t val;
  50. switch (addr) {
  51. case LASI_IRR:
  52. val = s->irr;
  53. break;
  54. case LASI_IMR:
  55. val = s->imr;
  56. break;
  57. case LASI_IPR:
  58. val = s->ipr;
  59. /* Any read to IPR clears the register. */
  60. s->ipr = 0;
  61. break;
  62. case LASI_ICR:
  63. val = s->icr & ICR_BUS_ERROR_BIT; /* bus_error */
  64. break;
  65. case LASI_IAR:
  66. val = s->iar;
  67. break;
  68. case LASI_LPT:
  69. case LASI_UART:
  70. case LASI_LAN:
  71. val = 0;
  72. break;
  73. case LASI_RTC:
  74. val = time(NULL);
  75. val += s->rtc_ref;
  76. break;
  77. case LASI_PCR:
  78. case LASI_VER: /* only version 0 existed. */
  79. case LASI_IORESET:
  80. val = 0;
  81. break;
  82. case LASI_ERRLOG:
  83. val = s->errlog;
  84. break;
  85. case LASI_AMR:
  86. val = s->amr;
  87. break;
  88. default:
  89. /* Controlled by lasi_chip_mem_valid above. */
  90. g_assert_not_reached();
  91. }
  92. trace_lasi_chip_read(addr, val);
  93. *data = val;
  94. return ret;
  95. }
  96. static MemTxResult lasi_chip_write_with_attrs(void *opaque, hwaddr addr,
  97. uint64_t val, unsigned size,
  98. MemTxAttrs attrs)
  99. {
  100. LasiState *s = opaque;
  101. trace_lasi_chip_write(addr, val);
  102. switch (addr) {
  103. case LASI_IRR:
  104. /* read-only. */
  105. break;
  106. case LASI_IMR:
  107. s->imr = val;
  108. if (((val & LASI_IRQ_BITS) != val) && (val != 0xffffffff)) {
  109. qemu_log_mask(LOG_GUEST_ERROR,
  110. "LASI: tried to set invalid %lx IMR value.\n",
  111. (unsigned long) val);
  112. }
  113. break;
  114. case LASI_IPR:
  115. /* Any write to IPR clears the register. */
  116. s->ipr = 0;
  117. break;
  118. case LASI_ICR:
  119. s->icr = val;
  120. /* if (val & ICR_TOC_BIT) issue_toc(); */
  121. break;
  122. case LASI_IAR:
  123. s->iar = val;
  124. break;
  125. case LASI_LPT:
  126. /* XXX: reset parallel port */
  127. break;
  128. case LASI_UART:
  129. /* XXX: reset serial port */
  130. break;
  131. case LASI_LAN:
  132. /* XXX: reset LAN card */
  133. break;
  134. case LASI_RTC:
  135. s->rtc_ref = val - time(NULL);
  136. break;
  137. case LASI_PCR:
  138. if (val == 0x02) { /* immediately power off */
  139. qemu_system_shutdown_request(SHUTDOWN_CAUSE_GUEST_SHUTDOWN);
  140. }
  141. break;
  142. case LASI_ERRLOG:
  143. s->errlog = val;
  144. break;
  145. case LASI_VER:
  146. /* read-only. */
  147. break;
  148. case LASI_IORESET:
  149. break; /* XXX: TODO: Reset various devices. */
  150. case LASI_AMR:
  151. s->amr = val;
  152. break;
  153. default:
  154. /* Controlled by lasi_chip_mem_valid above. */
  155. g_assert_not_reached();
  156. }
  157. return MEMTX_OK;
  158. }
  159. static const MemoryRegionOps lasi_chip_ops = {
  160. .read_with_attrs = lasi_chip_read_with_attrs,
  161. .write_with_attrs = lasi_chip_write_with_attrs,
  162. .endianness = DEVICE_BIG_ENDIAN,
  163. .valid = {
  164. .min_access_size = 1,
  165. .max_access_size = 4,
  166. .accepts = lasi_chip_mem_valid,
  167. },
  168. .impl = {
  169. .min_access_size = 1,
  170. .max_access_size = 4,
  171. },
  172. };
  173. static const VMStateDescription vmstate_lasi = {
  174. .name = "Lasi",
  175. .version_id = 1,
  176. .minimum_version_id = 1,
  177. .fields = (VMStateField[]) {
  178. VMSTATE_UINT32(irr, LasiState),
  179. VMSTATE_UINT32(imr, LasiState),
  180. VMSTATE_UINT32(ipr, LasiState),
  181. VMSTATE_UINT32(icr, LasiState),
  182. VMSTATE_UINT32(iar, LasiState),
  183. VMSTATE_UINT32(errlog, LasiState),
  184. VMSTATE_UINT32(amr, LasiState),
  185. VMSTATE_END_OF_LIST()
  186. }
  187. };
  188. static void lasi_set_irq(void *opaque, int irq, int level)
  189. {
  190. LasiState *s = opaque;
  191. uint32_t bit = 1u << irq;
  192. if (level) {
  193. s->ipr |= bit;
  194. if (bit & s->imr) {
  195. uint32_t iar = s->iar;
  196. s->irr |= bit;
  197. if ((s->icr & ICR_BUS_ERROR_BIT) == 0) {
  198. stl_be_phys(&address_space_memory, iar & -32, iar & 31);
  199. }
  200. }
  201. }
  202. }
  203. static void lasi_reset(DeviceState *dev)
  204. {
  205. LasiState *s = LASI_CHIP(dev);
  206. s->iar = 0xFFFB0000 + 3; /* CPU_HPA + 3 */
  207. /* Real time clock (RTC), it's only one 32-bit counter @9000 */
  208. s->rtc = time(NULL);
  209. s->rtc_ref = 0;
  210. }
  211. static void lasi_init(Object *obj)
  212. {
  213. LasiState *s = LASI_CHIP(obj);
  214. SysBusDevice *sbd = SYS_BUS_DEVICE(obj);
  215. memory_region_init_io(&s->this_mem, OBJECT(s), &lasi_chip_ops,
  216. s, "lasi", 0x100000);
  217. sysbus_init_mmio(sbd, &s->this_mem);
  218. qdev_init_gpio_in(DEVICE(obj), lasi_set_irq, LASI_IRQS);
  219. }
  220. static void lasi_class_init(ObjectClass *klass, void *data)
  221. {
  222. DeviceClass *dc = DEVICE_CLASS(klass);
  223. dc->reset = lasi_reset;
  224. dc->vmsd = &vmstate_lasi;
  225. }
  226. static const TypeInfo lasi_pcihost_info = {
  227. .name = TYPE_LASI_CHIP,
  228. .parent = TYPE_SYS_BUS_DEVICE,
  229. .instance_init = lasi_init,
  230. .instance_size = sizeof(LasiState),
  231. .class_init = lasi_class_init,
  232. };
  233. static void lasi_register_types(void)
  234. {
  235. type_register_static(&lasi_pcihost_info);
  236. }
  237. type_init(lasi_register_types)