* [Qemu-devel] [PATCH v3 0/2] integrator/cp: Working SD card support @ 2015-02-23 12:21 Jan Kiszka 2015-02-23 12:21 ` [Qemu-devel] [PATCH v3 1/2] integrator/cp: Model CP control registers as sysbus device Jan Kiszka 2015-02-23 12:21 ` [Qemu-devel] [PATCH v3 2/2] integrator/cp: Implement CARDIN and WPROT signals Jan Kiszka 0 siblings, 2 replies; 10+ messages in thread From: Jan Kiszka @ 2015-02-23 12:21 UTC (permalink / raw) To: qemu-devel, Peter Maydell; +Cc: Peter Crosthwaite Addressing Peter Crosthwaite's comments on v2 (thanks!). Jan Jan Kiszka (2): integrator/cp: Model CP control registers as sysbus device integrator/cp: Implement CARDIN and WPROT signals hw/arm/integratorcp.c | 95 ++++++++++++++++++++++++++++++++++++++++++++------- 1 file changed, 82 insertions(+), 13 deletions(-) -- 2.1.4 ^ permalink raw reply [flat|nested] 10+ messages in thread
* [Qemu-devel] [PATCH v3 1/2] integrator/cp: Model CP control registers as sysbus device 2015-02-23 12:21 [Qemu-devel] [PATCH v3 0/2] integrator/cp: Working SD card support Jan Kiszka @ 2015-02-23 12:21 ` Jan Kiszka 2015-02-24 1:29 ` Peter Crosthwaite 2015-02-23 12:21 ` [Qemu-devel] [PATCH v3 2/2] integrator/cp: Implement CARDIN and WPROT signals Jan Kiszka 1 sibling, 1 reply; 10+ messages in thread From: Jan Kiszka @ 2015-02-23 12:21 UTC (permalink / raw) To: qemu-devel, Peter Maydell; +Cc: Peter Crosthwaite No new features yet, just encapsulation. Signed-off-by: Jan Kiszka <jan.kiszka@siemens.com> --- hw/arm/integratorcp.c | 35 +++++++++++++++++++++++++++-------- 1 file changed, 27 insertions(+), 8 deletions(-) diff --git a/hw/arm/integratorcp.c b/hw/arm/integratorcp.c index 8c48b68..2d62275 100644 --- a/hw/arm/integratorcp.c +++ b/hw/arm/integratorcp.c @@ -406,6 +406,18 @@ static int icp_pic_init(SysBusDevice *sbd) /* CP control registers. */ +#define TYPE_ICP_CONTROL_REGS "icp_ctrl_regs" +#define ICP_CONTROL_REGS(obj) \ + OBJECT_CHECK(ICPCtrlRegsState, (obj), TYPE_ICP_CONTROL_REGS) + +typedef struct ICPCtrlRegsState { + /*< private >*/ + SysBusDevice parent_obj; + /*< public >*/ + + MemoryRegion iomem; +} ICPCtrlRegsState; + static uint64_t icp_control_read(void *opaque, hwaddr offset, unsigned size) { @@ -444,15 +456,14 @@ static const MemoryRegionOps icp_control_ops = { .endianness = DEVICE_NATIVE_ENDIAN, }; -static void icp_control_init(hwaddr base) +static void icp_control_init(Object *obj) { - MemoryRegion *io; + SysBusDevice *sbd = SYS_BUS_DEVICE(obj); + ICPCtrlRegsState *s = ICP_CONTROL_REGS(obj); - io = (MemoryRegion *)g_malloc0(sizeof(MemoryRegion)); - memory_region_init_io(io, NULL, &icp_control_ops, NULL, - "control", 0x00800000); - memory_region_add_subregion(get_system_memory(), base, io); - /* ??? Save/restore. */ + memory_region_init_io(&s->iomem, OBJECT(s), &icp_control_ops, s, + "icp_ctrl_regs", 0x00800000); + sysbus_init_mmio(sbd, &s->iomem); } @@ -541,7 +552,7 @@ static void integratorcp_init(MachineState *machine) sysbus_create_simple("pl031", 0x15000000, pic[8]); sysbus_create_simple("pl011", 0x16000000, pic[1]); sysbus_create_simple("pl011", 0x17000000, pic[2]); - icp_control_init(0xcb000000); + sysbus_create_simple(TYPE_ICP_CONTROL_REGS, 0xcb000000, NULL); sysbus_create_simple("pl050_keyboard", 0x18000000, pic[3]); sysbus_create_simple("pl050_mouse", 0x19000000, pic[4]); sysbus_create_simple(TYPE_INTEGRATOR_DEBUG, 0x1a000000, 0); @@ -606,10 +617,18 @@ static const TypeInfo icp_pic_info = { .class_init = icp_pic_class_init, }; +static const TypeInfo icp_ctrl_regs_info = { + .name = TYPE_ICP_CONTROL_REGS, + .parent = TYPE_SYS_BUS_DEVICE, + .instance_size = sizeof(ICPCtrlRegsState), + .instance_init = icp_control_init, +}; + static void integratorcp_register_types(void) { type_register_static(&icp_pic_info); type_register_static(&core_info); + type_register_static(&icp_ctrl_regs_info); } type_init(integratorcp_register_types) -- 2.1.4 ^ permalink raw reply related [flat|nested] 10+ messages in thread
* Re: [Qemu-devel] [PATCH v3 1/2] integrator/cp: Model CP control registers as sysbus device 2015-02-23 12:21 ` [Qemu-devel] [PATCH v3 1/2] integrator/cp: Model CP control registers as sysbus device Jan Kiszka @ 2015-02-24 1:29 ` Peter Crosthwaite 2015-02-24 7:03 ` [Qemu-devel] [PATCH v4 " Jan Kiszka 0 siblings, 1 reply; 10+ messages in thread From: Peter Crosthwaite @ 2015-02-24 1:29 UTC (permalink / raw) To: Jan Kiszka; +Cc: Peter Maydell, qemu-devel On Mon, Feb 23, 2015 at 4:21 AM, Jan Kiszka <jan.kiszka@siemens.com> wrote: > No new features yet, just encapsulation. > > Signed-off-by: Jan Kiszka <jan.kiszka@siemens.com> > --- > hw/arm/integratorcp.c | 35 +++++++++++++++++++++++++++-------- > 1 file changed, 27 insertions(+), 8 deletions(-) > > diff --git a/hw/arm/integratorcp.c b/hw/arm/integratorcp.c > index 8c48b68..2d62275 100644 > --- a/hw/arm/integratorcp.c > +++ b/hw/arm/integratorcp.c > @@ -406,6 +406,18 @@ static int icp_pic_init(SysBusDevice *sbd) > > /* CP control registers. */ > > +#define TYPE_ICP_CONTROL_REGS "icp_ctrl_regs" Sorry I missed this first time. Type name should use "-" instead of "_". otherwise Reviewed-by: Peter Crosthwaite <peter.crosthwaite@xilinx.com> > +#define ICP_CONTROL_REGS(obj) \ > + OBJECT_CHECK(ICPCtrlRegsState, (obj), TYPE_ICP_CONTROL_REGS) > + > +typedef struct ICPCtrlRegsState { > + /*< private >*/ > + SysBusDevice parent_obj; > + /*< public >*/ > + > + MemoryRegion iomem; > +} ICPCtrlRegsState; > + > static uint64_t icp_control_read(void *opaque, hwaddr offset, > unsigned size) > { > @@ -444,15 +456,14 @@ static const MemoryRegionOps icp_control_ops = { > .endianness = DEVICE_NATIVE_ENDIAN, > }; > > -static void icp_control_init(hwaddr base) > +static void icp_control_init(Object *obj) > { > - MemoryRegion *io; > + SysBusDevice *sbd = SYS_BUS_DEVICE(obj); > + ICPCtrlRegsState *s = ICP_CONTROL_REGS(obj); > > - io = (MemoryRegion *)g_malloc0(sizeof(MemoryRegion)); > - memory_region_init_io(io, NULL, &icp_control_ops, NULL, > - "control", 0x00800000); > - memory_region_add_subregion(get_system_memory(), base, io); > - /* ??? Save/restore. */ > + memory_region_init_io(&s->iomem, OBJECT(s), &icp_control_ops, s, > + "icp_ctrl_regs", 0x00800000); > + sysbus_init_mmio(sbd, &s->iomem); > } > > > @@ -541,7 +552,7 @@ static void integratorcp_init(MachineState *machine) > sysbus_create_simple("pl031", 0x15000000, pic[8]); > sysbus_create_simple("pl011", 0x16000000, pic[1]); > sysbus_create_simple("pl011", 0x17000000, pic[2]); > - icp_control_init(0xcb000000); > + sysbus_create_simple(TYPE_ICP_CONTROL_REGS, 0xcb000000, NULL); > sysbus_create_simple("pl050_keyboard", 0x18000000, pic[3]); > sysbus_create_simple("pl050_mouse", 0x19000000, pic[4]); > sysbus_create_simple(TYPE_INTEGRATOR_DEBUG, 0x1a000000, 0); > @@ -606,10 +617,18 @@ static const TypeInfo icp_pic_info = { > .class_init = icp_pic_class_init, > }; > > +static const TypeInfo icp_ctrl_regs_info = { > + .name = TYPE_ICP_CONTROL_REGS, > + .parent = TYPE_SYS_BUS_DEVICE, > + .instance_size = sizeof(ICPCtrlRegsState), > + .instance_init = icp_control_init, > +}; > + > static void integratorcp_register_types(void) > { > type_register_static(&icp_pic_info); > type_register_static(&core_info); > + type_register_static(&icp_ctrl_regs_info); > } > > type_init(integratorcp_register_types) > -- > 2.1.4 > > ^ permalink raw reply [flat|nested] 10+ messages in thread
* [Qemu-devel] [PATCH v4 1/2] integrator/cp: Model CP control registers as sysbus device 2015-02-24 1:29 ` Peter Crosthwaite @ 2015-02-24 7:03 ` Jan Kiszka 2015-02-24 7:07 ` Peter Crosthwaite 2015-03-10 16:03 ` Peter Maydell 0 siblings, 2 replies; 10+ messages in thread From: Jan Kiszka @ 2015-02-24 7:03 UTC (permalink / raw) To: qemu-devel, Peter Maydell; +Cc: Peter Crosthwaite No new features yet, just encapsulation. Signed-off-by: Jan Kiszka <jan.kiszka@siemens.com> --- Changes in v4: - fixed up type name as Peter suggested hw/arm/integratorcp.c | 35 +++++++++++++++++++++++++++-------- 1 file changed, 27 insertions(+), 8 deletions(-) diff --git a/hw/arm/integratorcp.c b/hw/arm/integratorcp.c index 8c48b68..5c44c34 100644 --- a/hw/arm/integratorcp.c +++ b/hw/arm/integratorcp.c @@ -406,6 +406,18 @@ static int icp_pic_init(SysBusDevice *sbd) /* CP control registers. */ +#define TYPE_ICP_CONTROL_REGS "icp-ctrl-regs" +#define ICP_CONTROL_REGS(obj) \ + OBJECT_CHECK(ICPCtrlRegsState, (obj), TYPE_ICP_CONTROL_REGS) + +typedef struct ICPCtrlRegsState { + /*< private >*/ + SysBusDevice parent_obj; + /*< public >*/ + + MemoryRegion iomem; +} ICPCtrlRegsState; + static uint64_t icp_control_read(void *opaque, hwaddr offset, unsigned size) { @@ -444,15 +456,14 @@ static const MemoryRegionOps icp_control_ops = { .endianness = DEVICE_NATIVE_ENDIAN, }; -static void icp_control_init(hwaddr base) +static void icp_control_init(Object *obj) { - MemoryRegion *io; + SysBusDevice *sbd = SYS_BUS_DEVICE(obj); + ICPCtrlRegsState *s = ICP_CONTROL_REGS(obj); - io = (MemoryRegion *)g_malloc0(sizeof(MemoryRegion)); - memory_region_init_io(io, NULL, &icp_control_ops, NULL, - "control", 0x00800000); - memory_region_add_subregion(get_system_memory(), base, io); - /* ??? Save/restore. */ + memory_region_init_io(&s->iomem, OBJECT(s), &icp_control_ops, s, + "icp_ctrl_regs", 0x00800000); + sysbus_init_mmio(sbd, &s->iomem); } @@ -541,7 +552,7 @@ static void integratorcp_init(MachineState *machine) sysbus_create_simple("pl031", 0x15000000, pic[8]); sysbus_create_simple("pl011", 0x16000000, pic[1]); sysbus_create_simple("pl011", 0x17000000, pic[2]); - icp_control_init(0xcb000000); + sysbus_create_simple(TYPE_ICP_CONTROL_REGS, 0xcb000000, NULL); sysbus_create_simple("pl050_keyboard", 0x18000000, pic[3]); sysbus_create_simple("pl050_mouse", 0x19000000, pic[4]); sysbus_create_simple(TYPE_INTEGRATOR_DEBUG, 0x1a000000, 0); @@ -606,10 +617,18 @@ static const TypeInfo icp_pic_info = { .class_init = icp_pic_class_init, }; +static const TypeInfo icp_ctrl_regs_info = { + .name = TYPE_ICP_CONTROL_REGS, + .parent = TYPE_SYS_BUS_DEVICE, + .instance_size = sizeof(ICPCtrlRegsState), + .instance_init = icp_control_init, +}; + static void integratorcp_register_types(void) { type_register_static(&icp_pic_info); type_register_static(&core_info); + type_register_static(&icp_ctrl_regs_info); } type_init(integratorcp_register_types) -- 2.1.4 ^ permalink raw reply related [flat|nested] 10+ messages in thread
* Re: [Qemu-devel] [PATCH v4 1/2] integrator/cp: Model CP control registers as sysbus device 2015-02-24 7:03 ` [Qemu-devel] [PATCH v4 " Jan Kiszka @ 2015-02-24 7:07 ` Peter Crosthwaite 2015-03-10 16:03 ` Peter Maydell 1 sibling, 0 replies; 10+ messages in thread From: Peter Crosthwaite @ 2015-02-24 7:07 UTC (permalink / raw) To: Jan Kiszka; +Cc: Peter Maydell, qemu-devel On Mon, Feb 23, 2015 at 11:03 PM, Jan Kiszka <jan.kiszka@siemens.com> wrote: > No new features yet, just encapsulation. > > Signed-off-by: Jan Kiszka <jan.kiszka@siemens.com> Reviewed-by: Peter Crosthwaite <peter.crosthwaite@xilinx.com> > --- > > Changes in v4: > - fixed up type name as Peter suggested > > hw/arm/integratorcp.c | 35 +++++++++++++++++++++++++++-------- > 1 file changed, 27 insertions(+), 8 deletions(-) > > diff --git a/hw/arm/integratorcp.c b/hw/arm/integratorcp.c > index 8c48b68..5c44c34 100644 > --- a/hw/arm/integratorcp.c > +++ b/hw/arm/integratorcp.c > @@ -406,6 +406,18 @@ static int icp_pic_init(SysBusDevice *sbd) > > /* CP control registers. */ > > +#define TYPE_ICP_CONTROL_REGS "icp-ctrl-regs" > +#define ICP_CONTROL_REGS(obj) \ > + OBJECT_CHECK(ICPCtrlRegsState, (obj), TYPE_ICP_CONTROL_REGS) > + > +typedef struct ICPCtrlRegsState { > + /*< private >*/ > + SysBusDevice parent_obj; > + /*< public >*/ > + > + MemoryRegion iomem; > +} ICPCtrlRegsState; > + > static uint64_t icp_control_read(void *opaque, hwaddr offset, > unsigned size) > { > @@ -444,15 +456,14 @@ static const MemoryRegionOps icp_control_ops = { > .endianness = DEVICE_NATIVE_ENDIAN, > }; > > -static void icp_control_init(hwaddr base) > +static void icp_control_init(Object *obj) > { > - MemoryRegion *io; > + SysBusDevice *sbd = SYS_BUS_DEVICE(obj); > + ICPCtrlRegsState *s = ICP_CONTROL_REGS(obj); > > - io = (MemoryRegion *)g_malloc0(sizeof(MemoryRegion)); > - memory_region_init_io(io, NULL, &icp_control_ops, NULL, > - "control", 0x00800000); > - memory_region_add_subregion(get_system_memory(), base, io); > - /* ??? Save/restore. */ > + memory_region_init_io(&s->iomem, OBJECT(s), &icp_control_ops, s, > + "icp_ctrl_regs", 0x00800000); > + sysbus_init_mmio(sbd, &s->iomem); > } > > > @@ -541,7 +552,7 @@ static void integratorcp_init(MachineState *machine) > sysbus_create_simple("pl031", 0x15000000, pic[8]); > sysbus_create_simple("pl011", 0x16000000, pic[1]); > sysbus_create_simple("pl011", 0x17000000, pic[2]); > - icp_control_init(0xcb000000); > + sysbus_create_simple(TYPE_ICP_CONTROL_REGS, 0xcb000000, NULL); > sysbus_create_simple("pl050_keyboard", 0x18000000, pic[3]); > sysbus_create_simple("pl050_mouse", 0x19000000, pic[4]); > sysbus_create_simple(TYPE_INTEGRATOR_DEBUG, 0x1a000000, 0); > @@ -606,10 +617,18 @@ static const TypeInfo icp_pic_info = { > .class_init = icp_pic_class_init, > }; > > +static const TypeInfo icp_ctrl_regs_info = { > + .name = TYPE_ICP_CONTROL_REGS, > + .parent = TYPE_SYS_BUS_DEVICE, > + .instance_size = sizeof(ICPCtrlRegsState), > + .instance_init = icp_control_init, > +}; > + > static void integratorcp_register_types(void) > { > type_register_static(&icp_pic_info); > type_register_static(&core_info); > + type_register_static(&icp_ctrl_regs_info); > } > > type_init(integratorcp_register_types) > -- > 2.1.4 > ^ permalink raw reply [flat|nested] 10+ messages in thread
* Re: [Qemu-devel] [PATCH v4 1/2] integrator/cp: Model CP control registers as sysbus device 2015-02-24 7:03 ` [Qemu-devel] [PATCH v4 " Jan Kiszka 2015-02-24 7:07 ` Peter Crosthwaite @ 2015-03-10 16:03 ` Peter Maydell 2015-03-10 16:11 ` Jan Kiszka 1 sibling, 1 reply; 10+ messages in thread From: Peter Maydell @ 2015-03-10 16:03 UTC (permalink / raw) To: Jan Kiszka; +Cc: Peter Crosthwaite, qemu-devel On 24 February 2015 at 07:03, Jan Kiszka <jan.kiszka@siemens.com> wrote: > No new features yet, just encapsulation. > > Signed-off-by: Jan Kiszka <jan.kiszka@siemens.com> > --- > > Changes in v4: > - fixed up type name as Peter suggested I can't see the rest of v4 on the list and neither can the 'patches' tool -- the latest it has is v3. Can you resend, please? thanks -- PMM ^ permalink raw reply [flat|nested] 10+ messages in thread
* Re: [Qemu-devel] [PATCH v4 1/2] integrator/cp: Model CP control registers as sysbus device 2015-03-10 16:03 ` Peter Maydell @ 2015-03-10 16:11 ` Jan Kiszka 2015-03-10 16:12 ` Peter Maydell 0 siblings, 1 reply; 10+ messages in thread From: Jan Kiszka @ 2015-03-10 16:11 UTC (permalink / raw) To: Peter Maydell; +Cc: Peter Crosthwaite, qemu-devel Am 2015-03-10 um 17:03 schrieb Peter Maydell: > On 24 February 2015 at 07:03, Jan Kiszka <jan.kiszka@siemens.com> wrote: >> No new features yet, just encapsulation. >> >> Signed-off-by: Jan Kiszka <jan.kiszka@siemens.com> >> --- >> >> Changes in v4: >> - fixed up type name as Peter suggested > > I can't see the rest of v4 on the list and neither can > the 'patches' tool -- the latest it has is v3. Can > you resend, please? There is no v4 of patch 2, it's identical to v3. I can resent if the tooling requires it, though. Jan -- Siemens AG, Corporate Technology, CT RTC ITP SES-DE Corporate Competence Center Embedded Linux ^ permalink raw reply [flat|nested] 10+ messages in thread
* Re: [Qemu-devel] [PATCH v4 1/2] integrator/cp: Model CP control registers as sysbus device 2015-03-10 16:11 ` Jan Kiszka @ 2015-03-10 16:12 ` Peter Maydell 0 siblings, 0 replies; 10+ messages in thread From: Peter Maydell @ 2015-03-10 16:12 UTC (permalink / raw) To: Jan Kiszka; +Cc: Peter Crosthwaite, qemu-devel On 10 March 2015 at 16:11, Jan Kiszka <jan.kiszka@siemens.com> wrote: > Am 2015-03-10 um 17:03 schrieb Peter Maydell: >> On 24 February 2015 at 07:03, Jan Kiszka <jan.kiszka@siemens.com> wrote: >> I can't see the rest of v4 on the list and neither can >> the 'patches' tool -- the latest it has is v3. Can >> you resend, please? > > There is no v4 of patch 2, it's identical to v3. I can resent if the > tooling requires it, though. Yes, please. Tooling tends to treat half-patchsets as being incomplete and ignores them til the rest arrives. (This is why http://wiki.qemu.org/Contribute/SubmitAPatch says to resend the whole series.) -- PMM ^ permalink raw reply [flat|nested] 10+ messages in thread
* [Qemu-devel] [PATCH v3 2/2] integrator/cp: Implement CARDIN and WPROT signals 2015-02-23 12:21 [Qemu-devel] [PATCH v3 0/2] integrator/cp: Working SD card support Jan Kiszka 2015-02-23 12:21 ` [Qemu-devel] [PATCH v3 1/2] integrator/cp: Model CP control registers as sysbus device Jan Kiszka @ 2015-02-23 12:21 ` Jan Kiszka 2015-02-24 1:30 ` Peter Crosthwaite 1 sibling, 1 reply; 10+ messages in thread From: Jan Kiszka @ 2015-02-23 12:21 UTC (permalink / raw) To: qemu-devel, Peter Maydell; +Cc: Peter Crosthwaite This allows to use the SD card emulation of the board: Forward the signals from the pl181 top the CP control register emulation, report the current state via CP_INTREG, deliver CARDIN IRQ to the secondary interrupt controller and also support clearing that line via CP_INTREG. Signed-off-by: Jan Kiszka <jan.kiszka@siemens.com> --- hw/arm/integratorcp.c | 62 ++++++++++++++++++++++++++++++++++++++++++++++----- 1 file changed, 56 insertions(+), 6 deletions(-) diff --git a/hw/arm/integratorcp.c b/hw/arm/integratorcp.c index 2d62275..59658d3 100644 --- a/hw/arm/integratorcp.c +++ b/hw/arm/integratorcp.c @@ -416,18 +416,29 @@ typedef struct ICPCtrlRegsState { /*< public >*/ MemoryRegion iomem; + + qemu_irq mmc_irq; + uint32_t intreg_state; } ICPCtrlRegsState; +#define ICP_GPIO_MMC_WPROT "mmc-wprot" +#define ICP_GPIO_MMC_CARDIN "mmc-cardin" + +#define ICP_INTREG_WPROT (1 << 0) +#define ICP_INTREG_CARDIN (1 << 3) + static uint64_t icp_control_read(void *opaque, hwaddr offset, unsigned size) { + ICPCtrlRegsState *s = opaque; + switch (offset >> 2) { case 0: /* CP_IDFIELD */ return 0x41034003; case 1: /* CP_FLASHPROG */ return 0; case 2: /* CP_INTREG */ - return 0; + return s->intreg_state; case 3: /* CP_DECODE */ return 0x11; default: @@ -439,9 +450,14 @@ static uint64_t icp_control_read(void *opaque, hwaddr offset, static void icp_control_write(void *opaque, hwaddr offset, uint64_t value, unsigned size) { + ICPCtrlRegsState *s = opaque; + switch (offset >> 2) { - case 1: /* CP_FLASHPROG */ case 2: /* CP_INTREG */ + s->intreg_state &= ~(value & ICP_INTREG_CARDIN); + qemu_set_irq(s->mmc_irq, !!(s->intreg_state & ICP_INTREG_CARDIN)); + break; + case 1: /* CP_FLASHPROG */ case 3: /* CP_DECODE */ /* Nothing interesting implemented yet. */ break; @@ -456,14 +472,41 @@ static const MemoryRegionOps icp_control_ops = { .endianness = DEVICE_NATIVE_ENDIAN, }; +static void icp_control_mmc_wprot(void *opaque, int line, int level) +{ + ICPCtrlRegsState *s = opaque; + + s->intreg_state &= ~ICP_INTREG_WPROT; + if (level) { + s->intreg_state |= ICP_INTREG_WPROT; + } +} + +static void icp_control_mmc_cardin(void *opaque, int line, int level) +{ + ICPCtrlRegsState *s = opaque; + + /* line is released by writing to CP_INTREG */ + if (level) { + s->intreg_state |= ICP_INTREG_CARDIN; + qemu_set_irq(s->mmc_irq, 1); + } +} + static void icp_control_init(Object *obj) { SysBusDevice *sbd = SYS_BUS_DEVICE(obj); ICPCtrlRegsState *s = ICP_CONTROL_REGS(obj); + DeviceState *dev = DEVICE(obj); memory_region_init_io(&s->iomem, OBJECT(s), &icp_control_ops, s, "icp_ctrl_regs", 0x00800000); sysbus_init_mmio(sbd, &s->iomem); + + qdev_init_gpio_in_named(dev, icp_control_mmc_wprot, ICP_GPIO_MMC_WPROT, 1); + qdev_init_gpio_in_named(dev, icp_control_mmc_cardin, + ICP_GPIO_MMC_CARDIN, 1); + sysbus_init_irq(sbd, &s->mmc_irq); } @@ -488,7 +531,7 @@ static void integratorcp_init(MachineState *machine) MemoryRegion *ram = g_new(MemoryRegion, 1); MemoryRegion *ram_alias = g_new(MemoryRegion, 1); qemu_irq pic[32]; - DeviceState *dev; + DeviceState *dev, *sic, *icp; int i; Error *err = NULL; @@ -546,17 +589,24 @@ static void integratorcp_init(MachineState *machine) for (i = 0; i < 32; i++) { pic[i] = qdev_get_gpio_in(dev, i); } - sysbus_create_simple(TYPE_INTEGRATOR_PIC, 0xca000000, pic[26]); + sic = sysbus_create_simple(TYPE_INTEGRATOR_PIC, 0xca000000, pic[26]); sysbus_create_varargs("integrator_pit", 0x13000000, pic[5], pic[6], pic[7], NULL); sysbus_create_simple("pl031", 0x15000000, pic[8]); sysbus_create_simple("pl011", 0x16000000, pic[1]); sysbus_create_simple("pl011", 0x17000000, pic[2]); - sysbus_create_simple(TYPE_ICP_CONTROL_REGS, 0xcb000000, NULL); + icp = sysbus_create_simple(TYPE_ICP_CONTROL_REGS, 0xcb000000, + qdev_get_gpio_in(sic, 3)); sysbus_create_simple("pl050_keyboard", 0x18000000, pic[3]); sysbus_create_simple("pl050_mouse", 0x19000000, pic[4]); sysbus_create_simple(TYPE_INTEGRATOR_DEBUG, 0x1a000000, 0); - sysbus_create_varargs("pl181", 0x1c000000, pic[23], pic[24], NULL); + + dev = sysbus_create_varargs("pl181", 0x1c000000, pic[23], pic[24], NULL); + qdev_connect_gpio_out(dev, 0, + qdev_get_gpio_in_named(icp, ICP_GPIO_MMC_WPROT, 0)); + qdev_connect_gpio_out(dev, 1, + qdev_get_gpio_in_named(icp, ICP_GPIO_MMC_CARDIN, 0)); + if (nd_table[0].used) smc91c111_init(&nd_table[0], 0xc8000000, pic[27]); -- 2.1.4 ^ permalink raw reply related [flat|nested] 10+ messages in thread
* Re: [Qemu-devel] [PATCH v3 2/2] integrator/cp: Implement CARDIN and WPROT signals 2015-02-23 12:21 ` [Qemu-devel] [PATCH v3 2/2] integrator/cp: Implement CARDIN and WPROT signals Jan Kiszka @ 2015-02-24 1:30 ` Peter Crosthwaite 0 siblings, 0 replies; 10+ messages in thread From: Peter Crosthwaite @ 2015-02-24 1:30 UTC (permalink / raw) To: Jan Kiszka; +Cc: Peter Maydell, qemu-devel On Mon, Feb 23, 2015 at 4:21 AM, Jan Kiszka <jan.kiszka@siemens.com> wrote: > This allows to use the SD card emulation of the board: Forward the > signals from the pl181 top the CP control register emulation, report the > current state via CP_INTREG, deliver CARDIN IRQ to the secondary > interrupt controller and also support clearing that line via CP_INTREG. > > Signed-off-by: Jan Kiszka <jan.kiszka@siemens.com> Reviewed-by: Peter Crosthwaite <peter.crosthwaite@xilinx.com> > --- > hw/arm/integratorcp.c | 62 ++++++++++++++++++++++++++++++++++++++++++++++----- > 1 file changed, 56 insertions(+), 6 deletions(-) > > diff --git a/hw/arm/integratorcp.c b/hw/arm/integratorcp.c > index 2d62275..59658d3 100644 > --- a/hw/arm/integratorcp.c > +++ b/hw/arm/integratorcp.c > @@ -416,18 +416,29 @@ typedef struct ICPCtrlRegsState { > /*< public >*/ > > MemoryRegion iomem; > + > + qemu_irq mmc_irq; > + uint32_t intreg_state; > } ICPCtrlRegsState; > > +#define ICP_GPIO_MMC_WPROT "mmc-wprot" > +#define ICP_GPIO_MMC_CARDIN "mmc-cardin" > + > +#define ICP_INTREG_WPROT (1 << 0) > +#define ICP_INTREG_CARDIN (1 << 3) > + > static uint64_t icp_control_read(void *opaque, hwaddr offset, > unsigned size) > { > + ICPCtrlRegsState *s = opaque; > + > switch (offset >> 2) { > case 0: /* CP_IDFIELD */ > return 0x41034003; > case 1: /* CP_FLASHPROG */ > return 0; > case 2: /* CP_INTREG */ > - return 0; > + return s->intreg_state; > case 3: /* CP_DECODE */ > return 0x11; > default: > @@ -439,9 +450,14 @@ static uint64_t icp_control_read(void *opaque, hwaddr offset, > static void icp_control_write(void *opaque, hwaddr offset, > uint64_t value, unsigned size) > { > + ICPCtrlRegsState *s = opaque; > + > switch (offset >> 2) { > - case 1: /* CP_FLASHPROG */ > case 2: /* CP_INTREG */ > + s->intreg_state &= ~(value & ICP_INTREG_CARDIN); > + qemu_set_irq(s->mmc_irq, !!(s->intreg_state & ICP_INTREG_CARDIN)); > + break; > + case 1: /* CP_FLASHPROG */ > case 3: /* CP_DECODE */ > /* Nothing interesting implemented yet. */ > break; > @@ -456,14 +472,41 @@ static const MemoryRegionOps icp_control_ops = { > .endianness = DEVICE_NATIVE_ENDIAN, > }; > > +static void icp_control_mmc_wprot(void *opaque, int line, int level) > +{ > + ICPCtrlRegsState *s = opaque; > + > + s->intreg_state &= ~ICP_INTREG_WPROT; > + if (level) { > + s->intreg_state |= ICP_INTREG_WPROT; > + } > +} > + > +static void icp_control_mmc_cardin(void *opaque, int line, int level) > +{ > + ICPCtrlRegsState *s = opaque; > + > + /* line is released by writing to CP_INTREG */ > + if (level) { > + s->intreg_state |= ICP_INTREG_CARDIN; > + qemu_set_irq(s->mmc_irq, 1); > + } > +} > + > static void icp_control_init(Object *obj) > { > SysBusDevice *sbd = SYS_BUS_DEVICE(obj); > ICPCtrlRegsState *s = ICP_CONTROL_REGS(obj); > + DeviceState *dev = DEVICE(obj); > > memory_region_init_io(&s->iomem, OBJECT(s), &icp_control_ops, s, > "icp_ctrl_regs", 0x00800000); > sysbus_init_mmio(sbd, &s->iomem); > + > + qdev_init_gpio_in_named(dev, icp_control_mmc_wprot, ICP_GPIO_MMC_WPROT, 1); > + qdev_init_gpio_in_named(dev, icp_control_mmc_cardin, > + ICP_GPIO_MMC_CARDIN, 1); > + sysbus_init_irq(sbd, &s->mmc_irq); > } > > > @@ -488,7 +531,7 @@ static void integratorcp_init(MachineState *machine) > MemoryRegion *ram = g_new(MemoryRegion, 1); > MemoryRegion *ram_alias = g_new(MemoryRegion, 1); > qemu_irq pic[32]; > - DeviceState *dev; > + DeviceState *dev, *sic, *icp; > int i; > Error *err = NULL; > > @@ -546,17 +589,24 @@ static void integratorcp_init(MachineState *machine) > for (i = 0; i < 32; i++) { > pic[i] = qdev_get_gpio_in(dev, i); > } > - sysbus_create_simple(TYPE_INTEGRATOR_PIC, 0xca000000, pic[26]); > + sic = sysbus_create_simple(TYPE_INTEGRATOR_PIC, 0xca000000, pic[26]); > sysbus_create_varargs("integrator_pit", 0x13000000, > pic[5], pic[6], pic[7], NULL); > sysbus_create_simple("pl031", 0x15000000, pic[8]); > sysbus_create_simple("pl011", 0x16000000, pic[1]); > sysbus_create_simple("pl011", 0x17000000, pic[2]); > - sysbus_create_simple(TYPE_ICP_CONTROL_REGS, 0xcb000000, NULL); > + icp = sysbus_create_simple(TYPE_ICP_CONTROL_REGS, 0xcb000000, > + qdev_get_gpio_in(sic, 3)); > sysbus_create_simple("pl050_keyboard", 0x18000000, pic[3]); > sysbus_create_simple("pl050_mouse", 0x19000000, pic[4]); > sysbus_create_simple(TYPE_INTEGRATOR_DEBUG, 0x1a000000, 0); > - sysbus_create_varargs("pl181", 0x1c000000, pic[23], pic[24], NULL); > + > + dev = sysbus_create_varargs("pl181", 0x1c000000, pic[23], pic[24], NULL); > + qdev_connect_gpio_out(dev, 0, > + qdev_get_gpio_in_named(icp, ICP_GPIO_MMC_WPROT, 0)); > + qdev_connect_gpio_out(dev, 1, > + qdev_get_gpio_in_named(icp, ICP_GPIO_MMC_CARDIN, 0)); > + > if (nd_table[0].used) > smc91c111_init(&nd_table[0], 0xc8000000, pic[27]); > > -- > 2.1.4 > > ^ permalink raw reply [flat|nested] 10+ messages in thread
end of thread, other threads:[~2015-03-10 16:13 UTC | newest] Thread overview: 10+ messages (download: mbox.gz follow: Atom feed -- links below jump to the message on this page -- 2015-02-23 12:21 [Qemu-devel] [PATCH v3 0/2] integrator/cp: Working SD card support Jan Kiszka 2015-02-23 12:21 ` [Qemu-devel] [PATCH v3 1/2] integrator/cp: Model CP control registers as sysbus device Jan Kiszka 2015-02-24 1:29 ` Peter Crosthwaite 2015-02-24 7:03 ` [Qemu-devel] [PATCH v4 " Jan Kiszka 2015-02-24 7:07 ` Peter Crosthwaite 2015-03-10 16:03 ` Peter Maydell 2015-03-10 16:11 ` Jan Kiszka 2015-03-10 16:12 ` Peter Maydell 2015-02-23 12:21 ` [Qemu-devel] [PATCH v3 2/2] integrator/cp: Implement CARDIN and WPROT signals Jan Kiszka 2015-02-24 1:30 ` Peter Crosthwaite
This is a public inbox, see mirroring instructions for how to clone and mirror all data and code used for this inbox; as well as URLs for NNTP newsgroup(s).