Re: [PATCH 4/7] hw/misc: add K230 decomp gzip
Junze Cao <[email protected]> Sun, 26 Jul 2026 14:55:01 +0800
| Newsgroups | org.nongnu.qemu-riscv,org.nongnu.qemu-devel |
|---|---|
| Message-ID | <178504890121.906524.9693776132093948045.b4-review@b4> |
On Wed, 22 Jul 2026 00:13:32 +0800, Tao Ding <[email protected]> wrote: > diff --git a/hw/misc/k230_decomp_gzip.c b/hw/misc/k230_decomp_gzip.c > new file mode 100644 > index 0000000000..4284262259 > --- /dev/null > +++ b/hw/misc/k230_decomp_gzip.c > @@ -0,0 +1,498 @@ > [ ... skip 184 lines ... ] > + s->output_buf, produced)) { > + return false; > + } > + s->output.current_offset += produced; > + s->total_produced += produced; > + } > + > + if (consumed) { > + s->input.current_offset += consumed; > + } > + > + if (ret == Z_STREAM_END) { > + s->stream_end = true; > + if (s->total_produced != output_size) { > + return false; > + } > + } > + > + return true; > +} > + The current implementation calls a universal DEFLATE decoder, which natively supports three BType formats: 00, 01, and 10. Based on the K230 technical manual's semantics, the current settings support the Dynamic Huffman format. I believe we need to add a BType==10 validation. > [ ... skip 109 lines ... ] > + if (!(s->gzip_src_size & K230_DECOMP_GZIP_CTRL_EN) || > + input_size == 0 || s->gzip_out_size == 0) { > + k230_decomp_gzip_finish(s, false); > + return; > + } > + > + s->active = true; > + k230_decomp_gzip_update_ctrl_en(s); > + k230_decomp_gzip_kick(s); > +} > + > +static uint64_t k230_decomp_gzip_read(void *opaque, hwaddr offset, > + unsigned size) > +{ > + K230DecompGzipState *s = opaque; > + uint64_t value = 0; > + > + switch (offset) { > + case K230_DECOMP_GZIP_DECOMP_START: > + value = s->decomp_start; > + break; Bit 0 of this register, decomp_start, is write-only. I believe the semantics here are inconsistent with the manual. > [ ... skip 124 lines ... ] > + > + memory_region_init_io(&s->iomem, OBJECT(dev), &k230_decomp_gzip_ops, s, > + TYPE_K230_DECOMP_GZIP, > + K230_DECOMP_GZIP_MMIO_SIZE); > + sysbus_init_mmio(sbd, &s->iomem); > + qdev_init_gpio_in(dev, k230_decomp_gzip_handle_ack, > + K230_DECOMP_GZIP_NUM_GPIOS_IN); > + qdev_init_gpio_out(dev, s->signal_out, > + K230_DECOMP_GZIP_NUM_GPIOS_OUT); > +} > + > +static const Property k230_decomp_gzip_properties[] = { > + DEFINE_PROP_UINT64("sram-base", K230DecompGzipState, sram_base, 0), > +}; > + > +static void k230_decomp_gzip_class_init(ObjectClass *oc, const void *data) > +{ > + DeviceClass *dc = DEVICE_CLASS(oc); > + > + dc->realize = k230_decomp_gzip_realize; > + device_class_set_legacy_reset(dc, k230_decomp_gzip_reset); This interface has been deprecated; please refer to qdev.h for further details. This issue is similar to patch 1/7 (actually, it's identical). -- Junze Cao <[email protected]>