Skip to content

Commit 3c01933

Browse files
committed
Merge remote-tracking branch 'remotes/alistair23/tags/pull-riscv-to-apply-20211007' into staging
Third RISC-V PR for QEMU 6.2 - Add Zb[abcs] instruction support - Remove RVB support - Bug fix of setting mstatus_hs.[SD|FS] bits - Mark some UART devices as 'input' - QOMify PolarFire MMUART - Fixes for sifive PDMA - Mark shakti_c as not user creatable # gpg: Signature made Wed 06 Oct 2021 11:42:53 PM PDT # gpg: using RSA key F6C4AC46D4934868D3B8CE8F21E10D29DF977054 # gpg: Good signature from "Alistair Francis <[email protected]>" [full] * remotes/alistair23/tags/pull-riscv-to-apply-20211007: (26 commits) hw/riscv: shakti_c: Mark as not user creatable hw/dma: sifive_pdma: Don't run DMA when channel is disclaimed hw/dma: sifive_pdma: Fix Control.claim bit detection hw/char/mchp_pfsoc_mmuart: QOM'ify PolarFire MMUART hw/char/mchp_pfsoc_mmuart: Use a MemoryRegion container hw/char/mchp_pfsoc_mmuart: Simplify MCHP_PFSOC_MMUART_REG definition hw/char: sifive_uart: Register device in 'input' category hw/char: shakti_uart: Register device in 'input' category hw/char: ibex_uart: Register device in 'input' category target/riscv: Set mstatus_hs.[SD|FS] bits if Clean and V=1 in mark_fs_dirty() disas/riscv: Add Zb[abcs] instructions target/riscv: Remove RVB (replaced by Zb[abcs]) target/riscv: Add zext.h instructions to Zbb, removing pack/packu/packh target/riscv: Add rev8 instruction, removing grev/grevi target/riscv: Add a REQUIRE_32BIT macro target/riscv: Add orc.b instruction for Zbb, removing gorc/gorci target/riscv: Reassign instructions to the Zbb-extension target/riscv: Add instructions of the Zbc-extension target/riscv: Reassign instructions to the Zbs-extension target/riscv: Remove shift-one instructions (proposed Zbo in pre-0.93 draft-B) ... Signed-off-by: Richard Henderson <[email protected]>
2 parents ca61fa4 + 9ae6ecd commit 3c01933

File tree

15 files changed

+516
-479
lines changed

15 files changed

+516
-479
lines changed

disas/riscv.c

Lines changed: 154 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -478,6 +478,49 @@ typedef enum {
478478
rv_op_fsflags = 316,
479479
rv_op_fsrmi = 317,
480480
rv_op_fsflagsi = 318,
481+
rv_op_bseti = 319,
482+
rv_op_bclri = 320,
483+
rv_op_binvi = 321,
484+
rv_op_bexti = 322,
485+
rv_op_rori = 323,
486+
rv_op_clz = 324,
487+
rv_op_ctz = 325,
488+
rv_op_cpop = 326,
489+
rv_op_sext_h = 327,
490+
rv_op_sext_b = 328,
491+
rv_op_xnor = 329,
492+
rv_op_orn = 330,
493+
rv_op_andn = 331,
494+
rv_op_rol = 332,
495+
rv_op_ror = 333,
496+
rv_op_sh1add = 334,
497+
rv_op_sh2add = 335,
498+
rv_op_sh3add = 336,
499+
rv_op_sh1add_uw = 337,
500+
rv_op_sh2add_uw = 338,
501+
rv_op_sh3add_uw = 339,
502+
rv_op_clmul = 340,
503+
rv_op_clmulr = 341,
504+
rv_op_clmulh = 342,
505+
rv_op_min = 343,
506+
rv_op_minu = 344,
507+
rv_op_max = 345,
508+
rv_op_maxu = 346,
509+
rv_op_clzw = 347,
510+
rv_op_ctzw = 348,
511+
rv_op_cpopw = 349,
512+
rv_op_slli_uw = 350,
513+
rv_op_add_uw = 351,
514+
rv_op_rolw = 352,
515+
rv_op_rorw = 353,
516+
rv_op_rev8 = 354,
517+
rv_op_zext_h = 355,
518+
rv_op_roriw = 356,
519+
rv_op_orc_b = 357,
520+
rv_op_bset = 358,
521+
rv_op_bclr = 359,
522+
rv_op_binv = 360,
523+
rv_op_bext = 361,
481524
} rv_op;
482525

483526
/* structures */
@@ -1117,6 +1160,49 @@ const rv_opcode_data opcode_data[] = {
11171160
{ "fsflags", rv_codec_i_csr, rv_fmt_rd_rs1, NULL, 0, 0, 0 },
11181161
{ "fsrmi", rv_codec_i_csr, rv_fmt_rd_zimm, NULL, 0, 0, 0 },
11191162
{ "fsflagsi", rv_codec_i_csr, rv_fmt_rd_zimm, NULL, 0, 0, 0 },
1163+
{ "bseti", rv_codec_i_sh7, rv_fmt_rd_rs1_imm, NULL, 0, 0, 0 },
1164+
{ "bclri", rv_codec_i_sh7, rv_fmt_rd_rs1_imm, NULL, 0, 0, 0 },
1165+
{ "binvi", rv_codec_i_sh7, rv_fmt_rd_rs1_imm, NULL, 0, 0, 0 },
1166+
{ "bexti", rv_codec_i_sh7, rv_fmt_rd_rs1_imm, NULL, 0, 0, 0 },
1167+
{ "rori", rv_codec_i_sh7, rv_fmt_rd_rs1_imm, NULL, 0, 0, 0 },
1168+
{ "clz", rv_codec_r, rv_fmt_rd_rs1, NULL, 0, 0, 0 },
1169+
{ "ctz", rv_codec_r, rv_fmt_rd_rs1, NULL, 0, 0, 0 },
1170+
{ "cpop", rv_codec_r, rv_fmt_rd_rs1, NULL, 0, 0, 0 },
1171+
{ "sext.h", rv_codec_r, rv_fmt_rd_rs1, NULL, 0, 0, 0 },
1172+
{ "sext.b", rv_codec_r, rv_fmt_rd_rs1, NULL, 0, 0, 0 },
1173+
{ "xnor", rv_codec_r, rv_fmt_rd_rs1, NULL, 0, 0, 0 },
1174+
{ "orn", rv_codec_r, rv_fmt_rd_rs1, NULL, 0, 0, 0 },
1175+
{ "andn", rv_codec_r, rv_fmt_rd_rs1, NULL, 0, 0, 0 },
1176+
{ "rol", rv_codec_r, rv_fmt_rd_rs1_rs2, NULL, 0, 0, 0 },
1177+
{ "ror", rv_codec_r, rv_fmt_rd_rs1_rs2, NULL, 0, 0, 0 },
1178+
{ "sh1add", rv_codec_r, rv_fmt_rd_rs1_rs2, NULL, 0, 0, 0 },
1179+
{ "sh2add", rv_codec_r, rv_fmt_rd_rs1_rs2, NULL, 0, 0, 0 },
1180+
{ "sh3add", rv_codec_r, rv_fmt_rd_rs1_rs2, NULL, 0, 0, 0 },
1181+
{ "sh1add.uw", rv_codec_r, rv_fmt_rd_rs1_rs2, NULL, 0, 0, 0 },
1182+
{ "sh2add.uw", rv_codec_r, rv_fmt_rd_rs1_rs2, NULL, 0, 0, 0 },
1183+
{ "sh3add.uw", rv_codec_r, rv_fmt_rd_rs1_rs2, NULL, 0, 0, 0 },
1184+
{ "clmul", rv_codec_r, rv_fmt_rd_rs1_rs2, NULL, 0, 0, 0 },
1185+
{ "clmulr", rv_codec_r, rv_fmt_rd_rs1_rs2, NULL, 0, 0, 0 },
1186+
{ "clmulh", rv_codec_r, rv_fmt_rd_rs1_rs2, NULL, 0, 0, 0 },
1187+
{ "min", rv_codec_r, rv_fmt_rd_rs1_rs2, NULL, 0, 0, 0 },
1188+
{ "minu", rv_codec_r, rv_fmt_rd_rs1_rs2, NULL, 0, 0, 0 },
1189+
{ "max", rv_codec_r, rv_fmt_rd_rs1_rs2, NULL, 0, 0, 0 },
1190+
{ "maxu", rv_codec_r, rv_fmt_rd_rs1_rs2, NULL, 0, 0, 0 },
1191+
{ "clzw", rv_codec_r, rv_fmt_rd_rs1, NULL, 0, 0, 0 },
1192+
{ "clzw", rv_codec_r, rv_fmt_rd_rs1, NULL, 0, 0, 0 },
1193+
{ "cpopw", rv_codec_r, rv_fmt_rd_rs1, NULL, 0, 0, 0 },
1194+
{ "slli.uw", rv_codec_r, rv_fmt_rd_rs1_rs2, NULL, 0, 0, 0 },
1195+
{ "add.uw", rv_codec_r, rv_fmt_rd_rs1_rs2, NULL, 0, 0, 0 },
1196+
{ "rolw", rv_codec_r, rv_fmt_rd_rs1_rs2, NULL, 0, 0, 0 },
1197+
{ "rorw", rv_codec_r, rv_fmt_rd_rs1_rs2, NULL, 0, 0, 0 },
1198+
{ "rev8", rv_codec_r, rv_fmt_rd_rs1, NULL, 0, 0, 0 },
1199+
{ "zext.h", rv_codec_r, rv_fmt_rd_rs1, NULL, 0, 0, 0 },
1200+
{ "roriw", rv_codec_i_sh5, rv_fmt_rd_rs1_imm, NULL, 0, 0, 0 },
1201+
{ "orc.b", rv_codec_r, rv_fmt_rd_rs1, NULL, 0, 0, 0 },
1202+
{ "bset", rv_codec_r, rv_fmt_rd_rs1_rs2, NULL, 0, 0, 0 },
1203+
{ "bclr", rv_codec_r, rv_fmt_rd_rs1_rs2, NULL, 0, 0, 0 },
1204+
{ "binv", rv_codec_r, rv_fmt_rd_rs1_rs2, NULL, 0, 0, 0 },
1205+
{ "bext", rv_codec_r, rv_fmt_rd_rs1_rs2, NULL, 0, 0, 0 },
11201206
};
11211207

11221208
/* CSR names */
@@ -1507,16 +1593,37 @@ static void decode_inst_opcode(rv_decode *dec, rv_isa isa)
15071593
case 0: op = rv_op_addi; break;
15081594
case 1:
15091595
switch (((inst >> 27) & 0b11111)) {
1510-
case 0: op = rv_op_slli; break;
1596+
case 0b00000: op = rv_op_slli; break;
1597+
case 0b00101: op = rv_op_bseti; break;
1598+
case 0b01001: op = rv_op_bclri; break;
1599+
case 0b01101: op = rv_op_binvi; break;
1600+
case 0b01100:
1601+
switch (((inst >> 20) & 0b1111111)) {
1602+
case 0b0000000: op = rv_op_clz; break;
1603+
case 0b0000001: op = rv_op_ctz; break;
1604+
case 0b0000010: op = rv_op_cpop; break;
1605+
/* 0b0000011 */
1606+
case 0b0000100: op = rv_op_sext_b; break;
1607+
case 0b0000101: op = rv_op_sext_h; break;
1608+
}
1609+
break;
15111610
}
15121611
break;
15131612
case 2: op = rv_op_slti; break;
15141613
case 3: op = rv_op_sltiu; break;
15151614
case 4: op = rv_op_xori; break;
15161615
case 5:
15171616
switch (((inst >> 27) & 0b11111)) {
1518-
case 0: op = rv_op_srli; break;
1519-
case 8: op = rv_op_srai; break;
1617+
case 0b00000: op = rv_op_srli; break;
1618+
case 0b00101: op = rv_op_orc_b; break;
1619+
case 0b01000: op = rv_op_srai; break;
1620+
case 0b01001: op = rv_op_bexti; break;
1621+
case 0b01100: op = rv_op_rori; break;
1622+
case 0b01101:
1623+
switch ((inst >> 20) & 0b1111111) {
1624+
case 0b0111000: op = rv_op_rev8; break;
1625+
}
1626+
break;
15201627
}
15211628
break;
15221629
case 6: op = rv_op_ori; break;
@@ -1530,12 +1637,21 @@ static void decode_inst_opcode(rv_decode *dec, rv_isa isa)
15301637
case 1:
15311638
switch (((inst >> 25) & 0b1111111)) {
15321639
case 0: op = rv_op_slliw; break;
1640+
case 4: op = rv_op_slli_uw; break;
1641+
case 48:
1642+
switch ((inst >> 20) & 0b11111) {
1643+
case 0b00000: op = rv_op_clzw; break;
1644+
case 0b00001: op = rv_op_ctzw; break;
1645+
case 0b00010: op = rv_op_cpopw; break;
1646+
}
1647+
break;
15331648
}
15341649
break;
15351650
case 5:
15361651
switch (((inst >> 25) & 0b1111111)) {
15371652
case 0: op = rv_op_srliw; break;
15381653
case 32: op = rv_op_sraiw; break;
1654+
case 48: op = rv_op_roriw; break;
15391655
}
15401656
break;
15411657
}
@@ -1623,8 +1739,32 @@ static void decode_inst_opcode(rv_decode *dec, rv_isa isa)
16231739
case 13: op = rv_op_divu; break;
16241740
case 14: op = rv_op_rem; break;
16251741
case 15: op = rv_op_remu; break;
1742+
case 36:
1743+
switch ((inst >> 20) & 0b11111) {
1744+
case 0: op = rv_op_zext_h; break;
1745+
}
1746+
break;
1747+
case 41: op = rv_op_clmul; break;
1748+
case 42: op = rv_op_clmulr; break;
1749+
case 43: op = rv_op_clmulh; break;
1750+
case 44: op = rv_op_min; break;
1751+
case 45: op = rv_op_minu; break;
1752+
case 46: op = rv_op_max; break;
1753+
case 47: op = rv_op_maxu; break;
1754+
case 130: op = rv_op_sh1add; break;
1755+
case 132: op = rv_op_sh2add; break;
1756+
case 134: op = rv_op_sh3add; break;
1757+
case 161: op = rv_op_bset; break;
16261758
case 256: op = rv_op_sub; break;
1759+
case 260: op = rv_op_xnor; break;
16271760
case 261: op = rv_op_sra; break;
1761+
case 262: op = rv_op_orn; break;
1762+
case 263: op = rv_op_andn; break;
1763+
case 289: op = rv_op_bclr; break;
1764+
case 293: op = rv_op_bext; break;
1765+
case 385: op = rv_op_rol; break;
1766+
case 386: op = rv_op_ror; break;
1767+
case 417: op = rv_op_binv; break;
16281768
}
16291769
break;
16301770
case 13: op = rv_op_lui; break;
@@ -1638,8 +1778,19 @@ static void decode_inst_opcode(rv_decode *dec, rv_isa isa)
16381778
case 13: op = rv_op_divuw; break;
16391779
case 14: op = rv_op_remw; break;
16401780
case 15: op = rv_op_remuw; break;
1781+
case 32: op = rv_op_add_uw; break;
1782+
case 36:
1783+
switch ((inst >> 20) & 0b11111) {
1784+
case 0: op = rv_op_zext_h; break;
1785+
}
1786+
break;
1787+
case 130: op = rv_op_sh1add_uw; break;
1788+
case 132: op = rv_op_sh2add_uw; break;
1789+
case 134: op = rv_op_sh3add_uw; break;
16411790
case 256: op = rv_op_subw; break;
16421791
case 261: op = rv_op_sraw; break;
1792+
case 385: op = rv_op_rolw; break;
1793+
case 389: op = rv_op_rorw; break;
16431794
}
16441795
break;
16451796
case 16:

hw/char/ibex_uart.c

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -550,6 +550,7 @@ static void ibex_uart_class_init(ObjectClass *klass, void *data)
550550
dc->realize = ibex_uart_realize;
551551
dc->vmsd = &vmstate_ibex_uart;
552552
device_class_set_props(dc, ibex_uart_properties);
553+
set_bit(DEVICE_CATEGORY_INPUT, dc->categories);
553554
}
554555

555556
static const TypeInfo ibex_uart_info = {

hw/char/mchp_pfsoc_mmuart.c

Lines changed: 97 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -22,20 +22,25 @@
2222

2323
#include "qemu/osdep.h"
2424
#include "qemu/log.h"
25-
#include "chardev/char.h"
25+
#include "qapi/error.h"
26+
#include "migration/vmstate.h"
2627
#include "hw/char/mchp_pfsoc_mmuart.h"
28+
#include "hw/qdev-properties.h"
29+
30+
#define REGS_OFFSET 0x20
2731

2832
static uint64_t mchp_pfsoc_mmuart_read(void *opaque, hwaddr addr, unsigned size)
2933
{
3034
MchpPfSoCMMUartState *s = opaque;
3135

32-
if (addr >= MCHP_PFSOC_MMUART_REG_SIZE) {
36+
addr >>= 2;
37+
if (addr >= MCHP_PFSOC_MMUART_REG_COUNT) {
3338
qemu_log_mask(LOG_GUEST_ERROR, "%s: read: addr=0x%" HWADDR_PRIx "\n",
34-
__func__, addr);
39+
__func__, addr << 2);
3540
return 0;
3641
}
3742

38-
return s->reg[addr / sizeof(uint32_t)];
43+
return s->reg[addr];
3944
}
4045

4146
static void mchp_pfsoc_mmuart_write(void *opaque, hwaddr addr,
@@ -44,13 +49,14 @@ static void mchp_pfsoc_mmuart_write(void *opaque, hwaddr addr,
4449
MchpPfSoCMMUartState *s = opaque;
4550
uint32_t val32 = (uint32_t)value;
4651

47-
if (addr >= MCHP_PFSOC_MMUART_REG_SIZE) {
52+
addr >>= 2;
53+
if (addr >= MCHP_PFSOC_MMUART_REG_COUNT) {
4854
qemu_log_mask(LOG_GUEST_ERROR, "%s: bad write: addr=0x%" HWADDR_PRIx
49-
" v=0x%x\n", __func__, addr, val32);
55+
" v=0x%x\n", __func__, addr << 2, val32);
5056
return;
5157
}
5258

53-
s->reg[addr / sizeof(uint32_t)] = val32;
59+
s->reg[addr] = val32;
5460
}
5561

5662
static const MemoryRegionOps mchp_pfsoc_mmuart_ops = {
@@ -63,23 +69,95 @@ static const MemoryRegionOps mchp_pfsoc_mmuart_ops = {
6369
},
6470
};
6571

66-
MchpPfSoCMMUartState *mchp_pfsoc_mmuart_create(MemoryRegion *sysmem,
67-
hwaddr base, qemu_irq irq, Chardev *chr)
72+
static void mchp_pfsoc_mmuart_reset(DeviceState *dev)
73+
{
74+
MchpPfSoCMMUartState *s = MCHP_PFSOC_UART(dev);
75+
76+
memset(s->reg, 0, sizeof(s->reg));
77+
device_cold_reset(DEVICE(&s->serial_mm));
78+
}
79+
80+
static void mchp_pfsoc_mmuart_init(Object *obj)
81+
{
82+
MchpPfSoCMMUartState *s = MCHP_PFSOC_UART(obj);
83+
84+
object_initialize_child(obj, "serial-mm", &s->serial_mm, TYPE_SERIAL_MM);
85+
object_property_add_alias(obj, "chardev", OBJECT(&s->serial_mm), "chardev");
86+
}
87+
88+
static void mchp_pfsoc_mmuart_realize(DeviceState *dev, Error **errp)
6889
{
69-
MchpPfSoCMMUartState *s;
90+
MchpPfSoCMMUartState *s = MCHP_PFSOC_UART(dev);
91+
92+
qdev_prop_set_uint8(DEVICE(&s->serial_mm), "regshift", 2);
93+
qdev_prop_set_uint32(DEVICE(&s->serial_mm), "baudbase", 399193);
94+
qdev_prop_set_uint8(DEVICE(&s->serial_mm), "endianness",
95+
DEVICE_LITTLE_ENDIAN);
96+
if (!sysbus_realize(SYS_BUS_DEVICE(&s->serial_mm), errp)) {
97+
return;
98+
}
99+
100+
sysbus_pass_irq(SYS_BUS_DEVICE(dev), SYS_BUS_DEVICE(&s->serial_mm));
70101

71-
s = g_new0(MchpPfSoCMMUartState, 1);
102+
memory_region_init(&s->container, OBJECT(s), "mchp.pfsoc.mmuart", 0x1000);
103+
sysbus_init_mmio(SYS_BUS_DEVICE(dev), &s->container);
72104

73-
memory_region_init_io(&s->iomem, NULL, &mchp_pfsoc_mmuart_ops, s,
74-
"mchp.pfsoc.mmuart", 0x1000);
105+
memory_region_add_subregion(&s->container, 0,
106+
sysbus_mmio_get_region(SYS_BUS_DEVICE(&s->serial_mm), 0));
107+
108+
memory_region_init_io(&s->iomem, OBJECT(s), &mchp_pfsoc_mmuart_ops, s,
109+
"mchp.pfsoc.mmuart.regs", 0x1000 - REGS_OFFSET);
110+
memory_region_add_subregion(&s->container, REGS_OFFSET, &s->iomem);
111+
}
75112

76-
s->base = base;
77-
s->irq = irq;
113+
static const VMStateDescription mchp_pfsoc_mmuart_vmstate = {
114+
.name = "mchp.pfsoc.uart",
115+
.version_id = 0,
116+
.minimum_version_id = 0,
117+
.fields = (VMStateField[]) {
118+
VMSTATE_UINT32_ARRAY(reg, MchpPfSoCMMUartState,
119+
MCHP_PFSOC_MMUART_REG_COUNT),
120+
VMSTATE_END_OF_LIST()
121+
}
122+
};
123+
124+
static void mchp_pfsoc_mmuart_class_init(ObjectClass *oc, void *data)
125+
{
126+
DeviceClass *dc = DEVICE_CLASS(oc);
127+
128+
dc->realize = mchp_pfsoc_mmuart_realize;
129+
dc->reset = mchp_pfsoc_mmuart_reset;
130+
dc->vmsd = &mchp_pfsoc_mmuart_vmstate;
131+
set_bit(DEVICE_CATEGORY_INPUT, dc->categories);
132+
}
133+
134+
static const TypeInfo mchp_pfsoc_mmuart_info = {
135+
.name = TYPE_MCHP_PFSOC_UART,
136+
.parent = TYPE_SYS_BUS_DEVICE,
137+
.instance_size = sizeof(MchpPfSoCMMUartState),
138+
.instance_init = mchp_pfsoc_mmuart_init,
139+
.class_init = mchp_pfsoc_mmuart_class_init,
140+
};
141+
142+
static void mchp_pfsoc_mmuart_register_types(void)
143+
{
144+
type_register_static(&mchp_pfsoc_mmuart_info);
145+
}
146+
147+
type_init(mchp_pfsoc_mmuart_register_types)
148+
149+
MchpPfSoCMMUartState *mchp_pfsoc_mmuart_create(MemoryRegion *sysmem,
150+
hwaddr base,
151+
qemu_irq irq, Chardev *chr)
152+
{
153+
DeviceState *dev = qdev_new(TYPE_MCHP_PFSOC_UART);
154+
SysBusDevice *sbd = SYS_BUS_DEVICE(dev);
78155

79-
s->serial = serial_mm_init(sysmem, base, 2, irq, 399193, chr,
80-
DEVICE_LITTLE_ENDIAN);
156+
qdev_prop_set_chr(dev, "chardev", chr);
157+
sysbus_realize(sbd, &error_fatal);
81158

82-
memory_region_add_subregion(sysmem, base + 0x20, &s->iomem);
159+
memory_region_add_subregion(sysmem, base, sysbus_mmio_get_region(sbd, 0));
160+
sysbus_connect_irq(sbd, 0, irq);
83161

84-
return s;
162+
return MCHP_PFSOC_UART(dev);
85163
}

hw/char/shakti_uart.c

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -168,6 +168,7 @@ static void shakti_uart_class_init(ObjectClass *klass, void *data)
168168
dc->reset = shakti_uart_reset;
169169
dc->realize = shakti_uart_realize;
170170
device_class_set_props(dc, shakti_uart_properties);
171+
set_bit(DEVICE_CATEGORY_INPUT, dc->categories);
171172
}
172173

173174
static const TypeInfo shakti_uart_info = {

hw/char/sifive_uart.c

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -248,6 +248,7 @@ static void sifive_uart_class_init(ObjectClass *oc, void *data)
248248
rc->phases.enter = sifive_uart_reset_enter;
249249
rc->phases.hold = sifive_uart_reset_hold;
250250
device_class_set_props(dc, sifive_uart_properties);
251+
set_bit(DEVICE_CATEGORY_INPUT, dc->categories);
251252
}
252253

253254
static const TypeInfo sifive_uart_info = {

0 commit comments

Comments
 (0)