ibex_uart.c 17 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569
  1. /*
  2. * QEMU lowRISC Ibex UART device
  3. *
  4. * Copyright (c) 2020 Western Digital
  5. *
  6. * For details check the documentation here:
  7. * https://docs.opentitan.org/hw/ip/uart/doc/
  8. *
  9. * Permission is hereby granted, free of charge, to any person obtaining a copy
  10. * of this software and associated documentation files (the "Software"), to deal
  11. * in the Software without restriction, including without limitation the rights
  12. * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
  13. * copies of the Software, and to permit persons to whom the Software is
  14. * furnished to do so, subject to the following conditions:
  15. *
  16. * The above copyright notice and this permission notice shall be included in
  17. * all copies or substantial portions of the Software.
  18. *
  19. * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
  20. * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
  21. * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
  22. * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
  23. * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
  24. * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
  25. * THE SOFTWARE.
  26. */
  27. #include "qemu/osdep.h"
  28. #include "hw/char/ibex_uart.h"
  29. #include "hw/irq.h"
  30. #include "hw/qdev-clock.h"
  31. #include "hw/qdev-properties.h"
  32. #include "hw/qdev-properties-system.h"
  33. #include "hw/registerfields.h"
  34. #include "migration/vmstate.h"
  35. #include "qemu/log.h"
  36. #include "qemu/module.h"
  37. REG32(INTR_STATE, 0x00)
  38. FIELD(INTR_STATE, TX_WATERMARK, 0, 1)
  39. FIELD(INTR_STATE, RX_WATERMARK, 1, 1)
  40. FIELD(INTR_STATE, TX_EMPTY, 2, 1)
  41. FIELD(INTR_STATE, RX_OVERFLOW, 3, 1)
  42. REG32(INTR_ENABLE, 0x04)
  43. REG32(INTR_TEST, 0x08)
  44. REG32(ALERT_TEST, 0x0C)
  45. REG32(CTRL, 0x10)
  46. FIELD(CTRL, TX_ENABLE, 0, 1)
  47. FIELD(CTRL, RX_ENABLE, 1, 1)
  48. FIELD(CTRL, NF, 2, 1)
  49. FIELD(CTRL, SLPBK, 4, 1)
  50. FIELD(CTRL, LLPBK, 5, 1)
  51. FIELD(CTRL, PARITY_EN, 6, 1)
  52. FIELD(CTRL, PARITY_ODD, 7, 1)
  53. FIELD(CTRL, RXBLVL, 8, 2)
  54. FIELD(CTRL, NCO, 16, 16)
  55. REG32(STATUS, 0x14)
  56. FIELD(STATUS, TXFULL, 0, 1)
  57. FIELD(STATUS, RXFULL, 1, 1)
  58. FIELD(STATUS, TXEMPTY, 2, 1)
  59. FIELD(STATUS, RXIDLE, 4, 1)
  60. FIELD(STATUS, RXEMPTY, 5, 1)
  61. REG32(RDATA, 0x18)
  62. REG32(WDATA, 0x1C)
  63. REG32(FIFO_CTRL, 0x20)
  64. FIELD(FIFO_CTRL, RXRST, 0, 1)
  65. FIELD(FIFO_CTRL, TXRST, 1, 1)
  66. FIELD(FIFO_CTRL, RXILVL, 2, 3)
  67. FIELD(FIFO_CTRL, TXILVL, 5, 2)
  68. REG32(FIFO_STATUS, 0x24)
  69. FIELD(FIFO_STATUS, TXLVL, 0, 5)
  70. FIELD(FIFO_STATUS, RXLVL, 16, 5)
  71. REG32(OVRD, 0x28)
  72. REG32(VAL, 0x2C)
  73. REG32(TIMEOUT_CTRL, 0x30)
  74. static void ibex_uart_update_irqs(IbexUartState *s)
  75. {
  76. if (s->uart_intr_state & s->uart_intr_enable & R_INTR_STATE_TX_WATERMARK_MASK) {
  77. qemu_set_irq(s->tx_watermark, 1);
  78. } else {
  79. qemu_set_irq(s->tx_watermark, 0);
  80. }
  81. if (s->uart_intr_state & s->uart_intr_enable & R_INTR_STATE_RX_WATERMARK_MASK) {
  82. qemu_set_irq(s->rx_watermark, 1);
  83. } else {
  84. qemu_set_irq(s->rx_watermark, 0);
  85. }
  86. if (s->uart_intr_state & s->uart_intr_enable & R_INTR_STATE_TX_EMPTY_MASK) {
  87. qemu_set_irq(s->tx_empty, 1);
  88. } else {
  89. qemu_set_irq(s->tx_empty, 0);
  90. }
  91. if (s->uart_intr_state & s->uart_intr_enable & R_INTR_STATE_RX_OVERFLOW_MASK) {
  92. qemu_set_irq(s->rx_overflow, 1);
  93. } else {
  94. qemu_set_irq(s->rx_overflow, 0);
  95. }
  96. }
  97. static int ibex_uart_can_receive(void *opaque)
  98. {
  99. IbexUartState *s = opaque;
  100. if ((s->uart_ctrl & R_CTRL_RX_ENABLE_MASK)
  101. && !(s->uart_status & R_STATUS_RXFULL_MASK)) {
  102. return 1;
  103. }
  104. return 0;
  105. }
  106. static void ibex_uart_receive(void *opaque, const uint8_t *buf, int size)
  107. {
  108. IbexUartState *s = opaque;
  109. uint8_t rx_fifo_level = (s->uart_fifo_ctrl & R_FIFO_CTRL_RXILVL_MASK)
  110. >> R_FIFO_CTRL_RXILVL_SHIFT;
  111. s->uart_rdata = *buf;
  112. s->uart_status &= ~R_STATUS_RXIDLE_MASK;
  113. s->uart_status &= ~R_STATUS_RXEMPTY_MASK;
  114. /* The RXFULL is set after receiving a single byte
  115. * as the FIFO buffers are not yet implemented.
  116. */
  117. s->uart_status |= R_STATUS_RXFULL_MASK;
  118. s->rx_level += 1;
  119. if (size > rx_fifo_level) {
  120. s->uart_intr_state |= R_INTR_STATE_RX_WATERMARK_MASK;
  121. }
  122. ibex_uart_update_irqs(s);
  123. }
  124. static gboolean ibex_uart_xmit(void *do_not_use, GIOCondition cond,
  125. void *opaque)
  126. {
  127. IbexUartState *s = opaque;
  128. uint8_t tx_fifo_level = (s->uart_fifo_ctrl & R_FIFO_CTRL_TXILVL_MASK)
  129. >> R_FIFO_CTRL_TXILVL_SHIFT;
  130. int ret;
  131. /* instant drain the fifo when there's no back-end */
  132. if (!qemu_chr_fe_backend_connected(&s->chr)) {
  133. s->tx_level = 0;
  134. return G_SOURCE_REMOVE;
  135. }
  136. if (!s->tx_level) {
  137. s->uart_status &= ~R_STATUS_TXFULL_MASK;
  138. s->uart_status |= R_STATUS_TXEMPTY_MASK;
  139. s->uart_intr_state |= R_INTR_STATE_TX_EMPTY_MASK;
  140. s->uart_intr_state &= ~R_INTR_STATE_TX_WATERMARK_MASK;
  141. ibex_uart_update_irqs(s);
  142. return G_SOURCE_REMOVE;
  143. }
  144. ret = qemu_chr_fe_write(&s->chr, s->tx_fifo, s->tx_level);
  145. if (ret >= 0) {
  146. s->tx_level -= ret;
  147. memmove(s->tx_fifo, s->tx_fifo + ret, s->tx_level);
  148. }
  149. if (s->tx_level) {
  150. guint r = qemu_chr_fe_add_watch(&s->chr, G_IO_OUT | G_IO_HUP,
  151. ibex_uart_xmit, s);
  152. if (!r) {
  153. s->tx_level = 0;
  154. return G_SOURCE_REMOVE;
  155. }
  156. }
  157. /* Clear the TX Full bit */
  158. if (s->tx_level != IBEX_UART_TX_FIFO_SIZE) {
  159. s->uart_status &= ~R_STATUS_TXFULL_MASK;
  160. }
  161. /* Disable the TX_WATERMARK IRQ */
  162. if (s->tx_level < tx_fifo_level) {
  163. s->uart_intr_state &= ~R_INTR_STATE_TX_WATERMARK_MASK;
  164. }
  165. /* Set TX empty */
  166. if (s->tx_level == 0) {
  167. s->uart_status |= R_STATUS_TXEMPTY_MASK;
  168. s->uart_intr_state |= R_INTR_STATE_TX_EMPTY_MASK;
  169. }
  170. ibex_uart_update_irqs(s);
  171. return G_SOURCE_REMOVE;
  172. }
  173. static void uart_write_tx_fifo(IbexUartState *s, const uint8_t *buf,
  174. int size)
  175. {
  176. uint64_t current_time = qemu_clock_get_ns(QEMU_CLOCK_VIRTUAL);
  177. uint8_t tx_fifo_level = (s->uart_fifo_ctrl & R_FIFO_CTRL_TXILVL_MASK)
  178. >> R_FIFO_CTRL_TXILVL_SHIFT;
  179. if (size > IBEX_UART_TX_FIFO_SIZE - s->tx_level) {
  180. size = IBEX_UART_TX_FIFO_SIZE - s->tx_level;
  181. qemu_log_mask(LOG_GUEST_ERROR, "ibex_uart: TX FIFO overflow");
  182. }
  183. memcpy(s->tx_fifo + s->tx_level, buf, size);
  184. s->tx_level += size;
  185. if (s->tx_level > 0) {
  186. s->uart_status &= ~R_STATUS_TXEMPTY_MASK;
  187. }
  188. if (s->tx_level >= tx_fifo_level) {
  189. s->uart_intr_state |= R_INTR_STATE_TX_WATERMARK_MASK;
  190. ibex_uart_update_irqs(s);
  191. }
  192. if (s->tx_level == IBEX_UART_TX_FIFO_SIZE) {
  193. s->uart_status |= R_STATUS_TXFULL_MASK;
  194. }
  195. timer_mod(s->fifo_trigger_handle, current_time +
  196. (s->char_tx_time * 4));
  197. }
  198. static void ibex_uart_reset(DeviceState *dev)
  199. {
  200. IbexUartState *s = IBEX_UART(dev);
  201. s->uart_intr_state = 0x00000000;
  202. s->uart_intr_state = 0x00000000;
  203. s->uart_intr_enable = 0x00000000;
  204. s->uart_ctrl = 0x00000000;
  205. s->uart_status = 0x0000003c;
  206. s->uart_rdata = 0x00000000;
  207. s->uart_fifo_ctrl = 0x00000000;
  208. s->uart_fifo_status = 0x00000000;
  209. s->uart_ovrd = 0x00000000;
  210. s->uart_val = 0x00000000;
  211. s->uart_timeout_ctrl = 0x00000000;
  212. s->tx_level = 0;
  213. s->rx_level = 0;
  214. s->char_tx_time = (NANOSECONDS_PER_SECOND / 230400) * 10;
  215. ibex_uart_update_irqs(s);
  216. }
  217. static uint64_t ibex_uart_get_baud(IbexUartState *s)
  218. {
  219. uint64_t baud;
  220. baud = ((s->uart_ctrl & R_CTRL_NCO_MASK) >> 16);
  221. baud *= clock_get_hz(s->f_clk);
  222. baud >>= 20;
  223. return baud;
  224. }
  225. static uint64_t ibex_uart_read(void *opaque, hwaddr addr,
  226. unsigned int size)
  227. {
  228. IbexUartState *s = opaque;
  229. uint64_t retvalue = 0;
  230. switch (addr >> 2) {
  231. case R_INTR_STATE:
  232. retvalue = s->uart_intr_state;
  233. break;
  234. case R_INTR_ENABLE:
  235. retvalue = s->uart_intr_enable;
  236. break;
  237. case R_INTR_TEST:
  238. qemu_log_mask(LOG_GUEST_ERROR,
  239. "%s: wdata is write only\n", __func__);
  240. break;
  241. case R_CTRL:
  242. retvalue = s->uart_ctrl;
  243. break;
  244. case R_STATUS:
  245. retvalue = s->uart_status;
  246. break;
  247. case R_RDATA:
  248. retvalue = s->uart_rdata;
  249. if ((s->uart_ctrl & R_CTRL_RX_ENABLE_MASK) && (s->rx_level > 0)) {
  250. qemu_chr_fe_accept_input(&s->chr);
  251. s->rx_level -= 1;
  252. s->uart_status &= ~R_STATUS_RXFULL_MASK;
  253. if (s->rx_level == 0) {
  254. s->uart_status |= R_STATUS_RXIDLE_MASK;
  255. s->uart_status |= R_STATUS_RXEMPTY_MASK;
  256. }
  257. }
  258. break;
  259. case R_WDATA:
  260. qemu_log_mask(LOG_GUEST_ERROR,
  261. "%s: wdata is write only\n", __func__);
  262. break;
  263. case R_FIFO_CTRL:
  264. retvalue = s->uart_fifo_ctrl;
  265. break;
  266. case R_FIFO_STATUS:
  267. retvalue = s->uart_fifo_status;
  268. retvalue |= (s->rx_level & 0x1F) << R_FIFO_STATUS_RXLVL_SHIFT;
  269. retvalue |= (s->tx_level & 0x1F) << R_FIFO_STATUS_TXLVL_SHIFT;
  270. qemu_log_mask(LOG_UNIMP,
  271. "%s: RX fifos are not supported\n", __func__);
  272. break;
  273. case R_OVRD:
  274. retvalue = s->uart_ovrd;
  275. qemu_log_mask(LOG_UNIMP,
  276. "%s: ovrd is not supported\n", __func__);
  277. break;
  278. case R_VAL:
  279. retvalue = s->uart_val;
  280. qemu_log_mask(LOG_UNIMP,
  281. "%s: val is not supported\n", __func__);
  282. break;
  283. case R_TIMEOUT_CTRL:
  284. retvalue = s->uart_timeout_ctrl;
  285. qemu_log_mask(LOG_UNIMP,
  286. "%s: timeout_ctrl is not supported\n", __func__);
  287. break;
  288. default:
  289. qemu_log_mask(LOG_GUEST_ERROR,
  290. "%s: Bad offset 0x%"HWADDR_PRIx"\n", __func__, addr);
  291. return 0;
  292. }
  293. return retvalue;
  294. }
  295. static void ibex_uart_write(void *opaque, hwaddr addr,
  296. uint64_t val64, unsigned int size)
  297. {
  298. IbexUartState *s = opaque;
  299. uint32_t value = val64;
  300. switch (addr >> 2) {
  301. case R_INTR_STATE:
  302. /* Write 1 clear */
  303. s->uart_intr_state &= ~value;
  304. ibex_uart_update_irqs(s);
  305. break;
  306. case R_INTR_ENABLE:
  307. s->uart_intr_enable = value;
  308. ibex_uart_update_irqs(s);
  309. break;
  310. case R_INTR_TEST:
  311. s->uart_intr_state |= value;
  312. ibex_uart_update_irqs(s);
  313. break;
  314. case R_CTRL:
  315. s->uart_ctrl = value;
  316. if (value & R_CTRL_NF_MASK) {
  317. qemu_log_mask(LOG_UNIMP,
  318. "%s: UART_CTRL_NF is not supported\n", __func__);
  319. }
  320. if (value & R_CTRL_SLPBK_MASK) {
  321. qemu_log_mask(LOG_UNIMP,
  322. "%s: UART_CTRL_SLPBK is not supported\n", __func__);
  323. }
  324. if (value & R_CTRL_LLPBK_MASK) {
  325. qemu_log_mask(LOG_UNIMP,
  326. "%s: UART_CTRL_LLPBK is not supported\n", __func__);
  327. }
  328. if (value & R_CTRL_PARITY_EN_MASK) {
  329. qemu_log_mask(LOG_UNIMP,
  330. "%s: UART_CTRL_PARITY_EN is not supported\n",
  331. __func__);
  332. }
  333. if (value & R_CTRL_PARITY_ODD_MASK) {
  334. qemu_log_mask(LOG_UNIMP,
  335. "%s: UART_CTRL_PARITY_ODD is not supported\n",
  336. __func__);
  337. }
  338. if (value & R_CTRL_RXBLVL_MASK) {
  339. qemu_log_mask(LOG_UNIMP,
  340. "%s: UART_CTRL_RXBLVL is not supported\n", __func__);
  341. }
  342. if (value & R_CTRL_NCO_MASK) {
  343. uint64_t baud = ibex_uart_get_baud(s);
  344. s->char_tx_time = (NANOSECONDS_PER_SECOND / baud) * 10;
  345. }
  346. break;
  347. case R_STATUS:
  348. qemu_log_mask(LOG_GUEST_ERROR,
  349. "%s: status is read only\n", __func__);
  350. break;
  351. case R_RDATA:
  352. qemu_log_mask(LOG_GUEST_ERROR,
  353. "%s: rdata is read only\n", __func__);
  354. break;
  355. case R_WDATA:
  356. uart_write_tx_fifo(s, (uint8_t *) &value, 1);
  357. break;
  358. case R_FIFO_CTRL:
  359. s->uart_fifo_ctrl = value;
  360. if (value & R_FIFO_CTRL_RXRST_MASK) {
  361. s->rx_level = 0;
  362. qemu_log_mask(LOG_UNIMP,
  363. "%s: RX fifos are not supported\n", __func__);
  364. }
  365. if (value & R_FIFO_CTRL_TXRST_MASK) {
  366. s->tx_level = 0;
  367. }
  368. break;
  369. case R_FIFO_STATUS:
  370. qemu_log_mask(LOG_GUEST_ERROR,
  371. "%s: fifo_status is read only\n", __func__);
  372. break;
  373. case R_OVRD:
  374. s->uart_ovrd = value;
  375. qemu_log_mask(LOG_UNIMP,
  376. "%s: ovrd is not supported\n", __func__);
  377. break;
  378. case R_VAL:
  379. qemu_log_mask(LOG_GUEST_ERROR,
  380. "%s: val is read only\n", __func__);
  381. break;
  382. case R_TIMEOUT_CTRL:
  383. s->uart_timeout_ctrl = value;
  384. qemu_log_mask(LOG_UNIMP,
  385. "%s: timeout_ctrl is not supported\n", __func__);
  386. break;
  387. default:
  388. qemu_log_mask(LOG_GUEST_ERROR,
  389. "%s: Bad offset 0x%"HWADDR_PRIx"\n", __func__, addr);
  390. }
  391. }
  392. static void ibex_uart_clk_update(void *opaque, ClockEvent event)
  393. {
  394. IbexUartState *s = opaque;
  395. /* recompute uart's speed on clock change */
  396. uint64_t baud = ibex_uart_get_baud(s);
  397. s->char_tx_time = (NANOSECONDS_PER_SECOND / baud) * 10;
  398. }
  399. static void fifo_trigger_update(void *opaque)
  400. {
  401. IbexUartState *s = opaque;
  402. if (s->uart_ctrl & R_CTRL_TX_ENABLE_MASK) {
  403. ibex_uart_xmit(NULL, G_IO_OUT, s);
  404. }
  405. }
  406. static const MemoryRegionOps ibex_uart_ops = {
  407. .read = ibex_uart_read,
  408. .write = ibex_uart_write,
  409. .endianness = DEVICE_NATIVE_ENDIAN,
  410. .impl.min_access_size = 4,
  411. .impl.max_access_size = 4,
  412. };
  413. static int ibex_uart_post_load(void *opaque, int version_id)
  414. {
  415. IbexUartState *s = opaque;
  416. ibex_uart_update_irqs(s);
  417. return 0;
  418. }
  419. static const VMStateDescription vmstate_ibex_uart = {
  420. .name = TYPE_IBEX_UART,
  421. .version_id = 1,
  422. .minimum_version_id = 1,
  423. .post_load = ibex_uart_post_load,
  424. .fields = (const VMStateField[]) {
  425. VMSTATE_UINT8_ARRAY(tx_fifo, IbexUartState,
  426. IBEX_UART_TX_FIFO_SIZE),
  427. VMSTATE_UINT32(tx_level, IbexUartState),
  428. VMSTATE_UINT64(char_tx_time, IbexUartState),
  429. VMSTATE_TIMER_PTR(fifo_trigger_handle, IbexUartState),
  430. VMSTATE_UINT32(uart_intr_state, IbexUartState),
  431. VMSTATE_UINT32(uart_intr_enable, IbexUartState),
  432. VMSTATE_UINT32(uart_ctrl, IbexUartState),
  433. VMSTATE_UINT32(uart_status, IbexUartState),
  434. VMSTATE_UINT32(uart_rdata, IbexUartState),
  435. VMSTATE_UINT32(uart_fifo_ctrl, IbexUartState),
  436. VMSTATE_UINT32(uart_fifo_status, IbexUartState),
  437. VMSTATE_UINT32(uart_ovrd, IbexUartState),
  438. VMSTATE_UINT32(uart_val, IbexUartState),
  439. VMSTATE_UINT32(uart_timeout_ctrl, IbexUartState),
  440. VMSTATE_END_OF_LIST()
  441. }
  442. };
  443. static const Property ibex_uart_properties[] = {
  444. DEFINE_PROP_CHR("chardev", IbexUartState, chr),
  445. };
  446. static void ibex_uart_init(Object *obj)
  447. {
  448. IbexUartState *s = IBEX_UART(obj);
  449. s->f_clk = qdev_init_clock_in(DEVICE(obj), "f_clock",
  450. ibex_uart_clk_update, s, ClockUpdate);
  451. clock_set_hz(s->f_clk, IBEX_UART_CLOCK);
  452. sysbus_init_irq(SYS_BUS_DEVICE(obj), &s->tx_watermark);
  453. sysbus_init_irq(SYS_BUS_DEVICE(obj), &s->rx_watermark);
  454. sysbus_init_irq(SYS_BUS_DEVICE(obj), &s->tx_empty);
  455. sysbus_init_irq(SYS_BUS_DEVICE(obj), &s->rx_overflow);
  456. memory_region_init_io(&s->mmio, obj, &ibex_uart_ops, s,
  457. TYPE_IBEX_UART, 0x400);
  458. sysbus_init_mmio(SYS_BUS_DEVICE(obj), &s->mmio);
  459. }
  460. static void ibex_uart_realize(DeviceState *dev, Error **errp)
  461. {
  462. IbexUartState *s = IBEX_UART(dev);
  463. s->fifo_trigger_handle = timer_new_ns(QEMU_CLOCK_VIRTUAL,
  464. fifo_trigger_update, s);
  465. qemu_chr_fe_set_handlers(&s->chr, ibex_uart_can_receive,
  466. ibex_uart_receive, NULL, NULL,
  467. s, NULL, true);
  468. }
  469. static void ibex_uart_class_init(ObjectClass *klass, void *data)
  470. {
  471. DeviceClass *dc = DEVICE_CLASS(klass);
  472. device_class_set_legacy_reset(dc, ibex_uart_reset);
  473. dc->realize = ibex_uart_realize;
  474. dc->vmsd = &vmstate_ibex_uart;
  475. device_class_set_props(dc, ibex_uart_properties);
  476. set_bit(DEVICE_CATEGORY_INPUT, dc->categories);
  477. }
  478. static const TypeInfo ibex_uart_info = {
  479. .name = TYPE_IBEX_UART,
  480. .parent = TYPE_SYS_BUS_DEVICE,
  481. .instance_size = sizeof(IbexUartState),
  482. .instance_init = ibex_uart_init,
  483. .class_init = ibex_uart_class_init,
  484. };
  485. static void ibex_uart_register_types(void)
  486. {
  487. type_register_static(&ibex_uart_info);
  488. }
  489. type_init(ibex_uart_register_types)