Re: [PATCH v3 14/33] serial-mm: add "regshift" property
On Wed, 20 Nov 2019 at 07:54, Marc-André Lureau wrote: > > Hi > > On Mon, Nov 18, 2019 at 6:54 PM Peter Maydell > wrote: > > > > On Wed, 23 Oct 2019 at 18:34, Marc-André Lureau > > wrote: > > > +static Property serial_mm_properties[] = { > > > +DEFINE_PROP_UINT8("regshift", SerialMM, regshift, 0), > > > > This could use a comment describing what the property does. > > "Set the register shift value"? Half-kidding, do you have better > comment to make? Otherwise, it's probably not worth. > > From what I understand, it's just applying a shift on the IO addr, > probably for alignment/access arch-specific reasons. You probably know > better than me ;) What this is doing is defining the spacing between adjacent registers. Some MMIO-based 16550 implementations have the registers at byte offsets from each other (that's regshift 0). Some have them at halfword offsets (regshift 1); and some use 4-byte offsets (regshift 2). Something like this will do: /* * Set the spacing between adjacent memory-mapped UART registers. * Each register will be at (1 << regshift) bytes after the previous one. */ (basically the comment bridges the gap between what I know as somebody trying to use the 16550 model, ie the behaviour of the hardware I'm trying to model, and what I need to do to configure the QEMU code to give that behaviour.) thanks -- PMM
Re: [PATCH v3 14/33] serial-mm: add "regshift" property
Hi On Mon, Nov 18, 2019 at 6:54 PM Peter Maydell wrote: > > On Wed, 23 Oct 2019 at 18:34, Marc-André Lureau > wrote: > > > > And a property and rename "it_shift" field to "regshift", as it seems > > to be more popular (and I don't know what "it" stands for). > > > > Signed-off-by: Marc-André Lureau > > I have no idea what it_shift means either (I had a look in the > git history but it seems to have been added with that name > very early on when the commit logs were generally not very > informative); 'regshift' sounds good to me too. > > > +static Property serial_mm_properties[] = { > > +DEFINE_PROP_UINT8("regshift", SerialMM, regshift, 0), > > This could use a comment describing what the property does. "Set the register shift value"? Half-kidding, do you have better comment to make? Otherwise, it's probably not worth. >From what I understand, it's just applying a shift on the IO addr, probably for alignment/access arch-specific reasons. You probably know better than me ;) > > > +DEFINE_PROP_END_OF_LIST(), > > Otherwise > Reviewed-by: Peter Maydell > thanks
Re: [PATCH v3 14/33] serial-mm: add "regshift" property
On Wed, 23 Oct 2019 at 18:34, Marc-André Lureau wrote: > > And a property and rename "it_shift" field to "regshift", as it seems > to be more popular (and I don't know what "it" stands for). > > Signed-off-by: Marc-André Lureau I have no idea what it_shift means either (I had a look in the git history but it seems to have been added with that name very early on when the commit logs were generally not very informative); 'regshift' sounds good to me too. > +static Property serial_mm_properties[] = { > +DEFINE_PROP_UINT8("regshift", SerialMM, regshift, 0), This could use a comment describing what the property does. > +DEFINE_PROP_END_OF_LIST(), Otherwise Reviewed-by: Peter Maydell thanks -- PMM
[PATCH v3 14/33] serial-mm: add "regshift" property
And a property and rename "it_shift" field to "regshift", as it seems to be more popular (and I don't know what "it" stands for). Signed-off-by: Marc-André Lureau --- hw/char/serial.c | 23 ++- include/hw/char/serial.h | 4 ++-- 2 files changed, 20 insertions(+), 7 deletions(-) diff --git a/hw/char/serial.c b/hw/char/serial.c index 0290b3c633..c28cfc94fd 100644 --- a/hw/char/serial.c +++ b/hw/char/serial.c @@ -1033,7 +1033,7 @@ static uint64_t serial_mm_read(void *opaque, hwaddr addr, unsigned size) { SerialMM *s = SERIAL_MM(opaque); -return serial_ioport_read(>serial, addr >> s->it_shift, 1); +return serial_ioport_read(>serial, addr >> s->regshift, 1); } static void serial_mm_write(void *opaque, hwaddr addr, @@ -1041,7 +1041,7 @@ static void serial_mm_write(void *opaque, hwaddr addr, { SerialMM *s = SERIAL_MM(opaque); value &= 255; -serial_ioport_write(>serial, addr >> s->it_shift, value, 1); +serial_ioport_write(>serial, addr >> s->regshift, value, 1); } static const MemoryRegionOps serial_mm_ops[3] = { @@ -1069,14 +1069,14 @@ static const MemoryRegionOps serial_mm_ops[3] = { }; SerialMM *serial_mm_init(MemoryRegion *address_space, -hwaddr base, int it_shift, +hwaddr base, int regshift, qemu_irq irq, int baudbase, Chardev *chr, enum device_endian end) { SerialMM *self = SERIAL_MM(qdev_create(NULL, TYPE_SERIAL_MM)); SerialState *s = >serial; -self->it_shift = it_shift; +qdev_prop_set_uint8(DEVICE(self), "regshift", regshift); s->irq = irq; qdev_prop_set_uint32(DEVICE(s), "baudbase", baudbase); qdev_prop_set_chr(DEVICE(s), "chardev", chr); @@ -1086,7 +1086,7 @@ SerialMM *serial_mm_init(MemoryRegion *address_space, qdev_init_nofail(DEVICE(self)); memory_region_init_io(>io, NULL, _mm_ops[end], self, - "serial", 8 << it_shift); + "serial", 8 << regshift); memory_region_add_subregion(address_space, base, >io); return self; @@ -1100,11 +1100,24 @@ static void serial_mm_instance_init(Object *o) TYPE_SERIAL, _abort, NULL); } +static Property serial_mm_properties[] = { +DEFINE_PROP_UINT8("regshift", SerialMM, regshift, 0), +DEFINE_PROP_END_OF_LIST(), +}; + +static void serial_mm_class_init(ObjectClass *klass, void* data) +{ +DeviceClass *dc = DEVICE_CLASS(klass); + +dc->props = serial_mm_properties; +} + static const TypeInfo serial_mm_info = { .name = TYPE_SERIAL_MM, .parent = TYPE_SYS_BUS_DEVICE, .instance_init = serial_mm_instance_init, .instance_size = sizeof(SerialMM), +.class_init = serial_mm_class_init, }; static void serial_register_types(void) diff --git a/include/hw/char/serial.h b/include/hw/char/serial.h index f146d426c2..759c85976d 100644 --- a/include/hw/char/serial.h +++ b/include/hw/char/serial.h @@ -85,7 +85,7 @@ typedef struct SerialMM { SerialState serial; -int it_shift; +uint8_t regshift; } SerialMM; extern const VMStateDescription vmstate_serial; @@ -102,7 +102,7 @@ void serial_set_frequency(SerialState *s, uint32_t frequency); SerialState *serial_init(int base, qemu_irq irq, int baudbase, Chardev *chr, MemoryRegion *system_io); SerialMM *serial_mm_init(MemoryRegion *address_space, - hwaddr base, int it_shift, + hwaddr base, int regshift, qemu_irq irq, int baudbase, Chardev *chr, enum device_endian end); -- 2.23.0.606.g08da6496b6