This device is not "Power Reduction" but power reduction registers can be implemented with it. All it does, whenever a bit is written the device raises an interrupt / IRQ. If you have a better name please advise.
On Mon, Dec 23, 2019 at 10:46 AM Aleksandar Markovic < aleksandar.m.m...@gmail.com> wrote: > > > On Wednesday, December 18, 2019, Michael Rolnik <mrol...@gmail.com> wrote: > >> Signed-off-by: Michael Rolnik <mrol...@gmail.com> >> --- > > > Hi, Michael. > > Please avoid empty commit messages. > > At the very beginning, there is a line: > > + * AVR Power Reduction > > Why is that? There is a power reduction register in the docs, but is it > covered in this patch? > > Further, "mask" is too genetic word. Pkease use more specific name bot fir > filename and variables within this patch. "interrupt controller", > "irq_masq", "IrqMask", "irq" are justsome of ideas. > > Yours, > Aleksandar > > >> include/hw/misc/avr_mask.h | 47 ++++++++++++++++ >> hw/misc/avr_mask.c | 112 +++++++++++++++++++++++++++++++++++++ >> hw/misc/Kconfig | 3 + >> hw/misc/Makefile.objs | 2 + >> 4 files changed, 164 insertions(+) >> create mode 100644 include/hw/misc/avr_mask.h >> create mode 100644 hw/misc/avr_mask.c >> >> diff --git a/include/hw/misc/avr_mask.h b/include/hw/misc/avr_mask.h >> new file mode 100644 >> index 0000000000..d3e21972d8 >> --- /dev/null >> +++ b/include/hw/misc/avr_mask.h >> @@ -0,0 +1,47 @@ >> +/* >> + * AVR Power Reduction >> + * >> + * Copyright (c) 2019 Michael Rolnik >> + * >> + * Permission is hereby granted, free of charge, to any person obtaining >> a copy >> + * of this software and associated documentation files (the "Software"), >> to deal >> + * in the Software without restriction, including without limitation the >> rights >> + * to use, copy, modify, merge, publish, distribute, sublicense, and/or >> sell >> + * copies of the Software, and to permit persons to whom the Software is >> + * furnished to do so, subject to the following conditions: >> + * >> + * The above copyright notice and this permission notice shall be >> included in >> + * all copies or substantial portions of the Software. >> + * >> + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, >> EXPRESS OR >> + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF >> MERCHANTABILITY, >> + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT >> SHALL >> + * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR >> OTHER >> + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, >> ARISING FROM, >> + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER >> DEALINGS IN >> + * THE SOFTWARE. >> + */ >> + >> +#ifndef HW_avr_mask_H >> +#define HW_avr_mask_H >> + >> +#include "hw/sysbus.h" >> +#include "chardev/char-fe.h" >> +#include "hw/hw.h" >> + >> + >> +#define TYPE_AVR_MASK "avr-mask" >> +#define AVR_MASK(obj) OBJECT_CHECK(AVRMaskState, (obj), TYPE_AVR_MASK) >> + >> +typedef struct { >> + /* <private> */ >> + SysBusDevice parent_obj; >> + >> + /* <public> */ >> + MemoryRegion iomem; >> + >> + uint8_t val; >> + qemu_irq irq[8]; >> +} AVRMaskState; >> + >> +#endif /* HW_avr_mask_H */ >> diff --git a/hw/misc/avr_mask.c b/hw/misc/avr_mask.c >> new file mode 100644 >> index 0000000000..3af82ed9c1 >> --- /dev/null >> +++ b/hw/misc/avr_mask.c >> @@ -0,0 +1,112 @@ >> +/* >> + * AVR Power Reduction >> + * >> + * Copyright (c) 2019 Michael Rolnik >> + * >> + * Permission is hereby granted, free of charge, to any person obtaining >> a copy >> + * of this software and associated documentation files (the "Software"), >> to deal >> + * in the Software without restriction, including without limitation the >> rights >> + * to use, copy, modify, merge, publish, distribute, sublicense, and/or >> sell >> + * copies of the Software, and to permit persons to whom the Software is >> + * furnished to do so, subject to the following conditions: >> + * >> + * The above copyright notice and this permission notice shall be >> included in >> + * all copies or substantial portions of the Software. >> + * >> + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, >> EXPRESS OR >> + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF >> MERCHANTABILITY, >> + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT >> SHALL >> + * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR >> OTHER >> + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, >> ARISING FROM, >> + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER >> DEALINGS IN >> + * THE SOFTWARE. >> + */ >> + >> +#include "qemu/osdep.h" >> +#include "hw/misc/avr_mask.h" >> +#include "qemu/log.h" >> +#include "hw/qdev-properties.h" >> +#include "hw/irq.h" >> + >> +#define DB_PRINT(fmt, args...) /* Nothing */ >> +/*#define DB_PRINT(fmt, args...) printf("%s: " fmt "\n", __func__, ## >> args)*/ >> + >> +static void avr_mask_reset(DeviceState *dev) >> +{ >> + AVRMaskState *s = AVR_MASK(dev); >> + >> + s->val = 0x00; >> + >> + for (int i = 0; i < 8; i++) { >> + qemu_set_irq(s->irq[i], 0); >> + } >> +} >> + >> +static uint64_t avr_mask_read(void *opaque, hwaddr offset, unsigned size) >> +{ >> + assert(size == 1); >> + assert(offset == 0); >> + AVRMaskState *s = opaque; >> + >> + return (uint64_t)s->val; >> +} >> + >> +static void avr_mask_write(void *opaque, hwaddr offset, >> + uint64_t val64, unsigned size) >> +{ >> + assert(size == 1); >> + assert(offset == 0); >> + AVRMaskState *s = opaque; >> + uint8_t val8 = val64; >> + >> + DB_PRINT("write %d to offset %d", val8, (uint8_t)offset); >> + >> + s->val = val8; >> + for (int i = 0; i < 8; i++) { >> + qemu_set_irq(s->irq[i], (val8 & (1 << i)) != 0); >> + } >> +} >> + >> +static const MemoryRegionOps avr_mask_ops = { >> + .read = avr_mask_read, >> + .write = avr_mask_write, >> + .endianness = DEVICE_NATIVE_ENDIAN, >> + .impl = {.max_access_size = 1} >> +}; >> + >> +static void avr_mask_init(Object *dev) >> +{ >> + AVRMaskState *s = AVR_MASK(dev); >> + SysBusDevice *busdev = SYS_BUS_DEVICE(dev); >> + >> + memory_region_init_io(&s->iomem, dev, &avr_mask_ops, s, >> TYPE_AVR_MASK, >> + 0x01); >> + sysbus_init_mmio(busdev, &s->iomem); >> + >> + for (int i = 0; i < 8; i++) { >> + sysbus_init_irq(busdev, &s->irq[i]); >> + } >> + s->val = 0x00; >> +} >> + >> +static void avr_mask_class_init(ObjectClass *klass, void *data) >> +{ >> + DeviceClass *dc = DEVICE_CLASS(klass); >> + >> + dc->reset = avr_mask_reset; >> +} >> + >> +static const TypeInfo avr_mask_info = { >> + .name = TYPE_AVR_MASK, >> + .parent = TYPE_SYS_BUS_DEVICE, >> + .instance_size = sizeof(AVRMaskState), >> + .class_init = avr_mask_class_init, >> + .instance_init = avr_mask_init, >> +}; >> + >> +static void avr_mask_register_types(void) >> +{ >> + type_register_static(&avr_mask_info); >> +} >> + >> +type_init(avr_mask_register_types) >> diff --git a/hw/misc/Kconfig b/hw/misc/Kconfig >> index 2164646553..e79841e3a4 100644 >> --- a/hw/misc/Kconfig >> +++ b/hw/misc/Kconfig >> @@ -125,4 +125,7 @@ config MAC_VIA >> select MOS6522 >> select ADB >> >> +config AVR_MASK >> + bool >> + >> source macio/Kconfig >> diff --git a/hw/misc/Makefile.objs b/hw/misc/Makefile.objs >> index ba898a5781..3a8093be6a 100644 >> --- a/hw/misc/Makefile.objs >> +++ b/hw/misc/Makefile.objs >> @@ -82,3 +82,5 @@ common-obj-$(CONFIG_NRF51_SOC) += nrf51_rng.o >> obj-$(CONFIG_MAC_VIA) += mac_via.o >> >> common-obj-$(CONFIG_GRLIB) += grlib_ahb_apb_pnp.o >> + >> +obj-$(CONFIG_AVR_MASK) += avr_mask.o >> -- >> 2.17.2 (Apple Git-113) >> >> -- Best Regards, Michael Rolnik