* [Qemu-devel] [PATCH 1/7] pxa2xx_pcmcia: qdevify
2011-04-11 13:33 [Qemu-devel] [PATCH 0/7] Rework PCMCIA subsystem Dmitry Eremin-Solenikov
@ 2011-04-11 13:33 ` Dmitry Eremin-Solenikov
2011-04-11 13:33 ` [Qemu-devel] [PATCH 2/7] PCMCIA: start qdev'ication Dmitry Eremin-Solenikov
` (7 subsequent siblings)
8 siblings, 0 replies; 10+ messages in thread
From: Dmitry Eremin-Solenikov @ 2011-04-11 13:33 UTC (permalink / raw)
To: qemu-devel
Use qdev insfrastructure for managing PXA PCMCIA devices. PCMCIA bus
itself isn't converted to QBus (yet). pxa2xx_pcmcia_init() function is
moved to pcmcia.h as it will be used by other cores/devices (like
StrongARM).
Signed-off-by: Dmitry Eremin-Solenikov <dbaryshkov@gmail.com>
---
hw/mainstone.c | 14 +++++----
hw/pcmcia.h | 3 ++
hw/pxa.h | 5 +---
hw/pxa2xx.c | 9 +++---
hw/pxa2xx_pcmcia.c | 77 +++++++++++++++++++++++++++++++++++++--------------
hw/spitz.c | 20 ++++++++-----
hw/tosa.c | 12 ++++----
7 files changed, 91 insertions(+), 49 deletions(-)
diff --git a/hw/mainstone.c b/hw/mainstone.c
index 50691ca..77b224c 100644
--- a/hw/mainstone.c
+++ b/hw/mainstone.c
@@ -149,12 +149,14 @@ static void mainstone_common_init(ram_addr_t ram_size,
/* MMC/SD host */
pxa2xx_mmci_handlers(cpu->mmc, NULL, qdev_get_gpio_in(mst_irq, MMC_IRQ));
- pxa2xx_pcmcia_set_irq_cb(cpu->pcmcia[0],
- qdev_get_gpio_in(mst_irq, S0_IRQ),
- qdev_get_gpio_in(mst_irq, S0_CD_IRQ));
- pxa2xx_pcmcia_set_irq_cb(cpu->pcmcia[1],
- qdev_get_gpio_in(mst_irq, S1_IRQ),
- qdev_get_gpio_in(mst_irq, S1_CD_IRQ));
+ sysbus_connect_irq(sysbus_from_qdev(cpu->pcmcia[0]), 0,
+ qdev_get_gpio_in(mst_irq, S0_IRQ));
+ sysbus_connect_irq(sysbus_from_qdev(cpu->pcmcia[0]), 1,
+ qdev_get_gpio_in(mst_irq, S0_CD_IRQ));
+ sysbus_connect_irq(sysbus_from_qdev(cpu->pcmcia[1]), 0,
+ qdev_get_gpio_in(mst_irq, S1_IRQ));
+ sysbus_connect_irq(sysbus_from_qdev(cpu->pcmcia[1]), 1,
+ qdev_get_gpio_in(mst_irq, S1_CD_IRQ));
smc91c111_init(&nd_table[0], MST_ETH_PHYS,
qdev_get_gpio_in(mst_irq, ETHERNET_IRQ));
diff --git a/hw/pcmcia.h b/hw/pcmcia.h
index 50648c9..f0b16b8 100644
--- a/hw/pcmcia.h
+++ b/hw/pcmcia.h
@@ -47,5 +47,8 @@ struct PCMCIACardState {
#define CISTPL_END 0xff /* Tuple End */
#define CISTPL_ENDMARK 0xff
+/* pxa2xx_pcmcia.h -- used also for StrongARM */
+DeviceState *pxa2xx_pcmcia_init(target_phys_addr_t base, uint8_t id);
+
/* dscm1xxxx.c */
PCMCIACardState *dscm1xxxx_init(DriveInfo *bdrv);
diff --git a/hw/pxa.h b/hw/pxa.h
index d982f00..25176ef 100644
--- a/hw/pxa.h
+++ b/hw/pxa.h
@@ -90,11 +90,8 @@ void pxa2xx_mmci_handlers(PXA2xxMMCIState *s, qemu_irq readonly,
qemu_irq coverswitch);
/* pxa2xx_pcmcia.c */
-typedef struct PXA2xxPCMCIAState PXA2xxPCMCIAState;
-PXA2xxPCMCIAState *pxa2xx_pcmcia_init(target_phys_addr_t base);
int pxa2xx_pcmcia_attach(void *opaque, PCMCIACardState *card);
int pxa2xx_pcmcia_dettach(void *opaque);
-void pxa2xx_pcmcia_set_irq_cb(void *opaque, qemu_irq irq, qemu_irq cd_irq);
/* pxa2xx_keypad.c */
struct keymap {
@@ -126,7 +123,7 @@ typedef struct {
SSIBus **ssp;
PXA2xxI2CState *i2c[2];
PXA2xxMMCIState *mmc;
- PXA2xxPCMCIAState *pcmcia[2];
+ DeviceState *pcmcia[2];
PXA2xxI2SState *i2s;
PXA2xxFIrState *fir;
PXA2xxKeyPadState *kp;
diff --git a/hw/pxa2xx.c b/hw/pxa2xx.c
index 9b95e2c..ef4c0a2 100644
--- a/hw/pxa2xx.c
+++ b/hw/pxa2xx.c
@@ -13,6 +13,7 @@
#include "pc.h"
#include "i2c.h"
#include "ssi.h"
+#include "pcmcia.h"
#include "qemu-char.h"
#include "blockdev.h"
@@ -2221,8 +2222,8 @@ PXA2xxState *pxa270_init(unsigned int sdram_size, const char *revision)
qdev_get_gpio_in(s->pic, PXA2XX_PIC_USBH1));
}
- s->pcmcia[0] = pxa2xx_pcmcia_init(0x20000000);
- s->pcmcia[1] = pxa2xx_pcmcia_init(0x30000000);
+ s->pcmcia[0] = pxa2xx_pcmcia_init(0x20000000, 0);
+ s->pcmcia[1] = pxa2xx_pcmcia_init(0x30000000, 1);
sysbus_create_simple("pxa2xx_rtc", 0x40900000,
qdev_get_gpio_in(s->pic, PXA2XX_PIC_RTCALARM));
@@ -2357,8 +2358,8 @@ PXA2xxState *pxa255_init(unsigned int sdram_size)
qdev_get_gpio_in(s->pic, PXA2XX_PIC_USBH1));
}
- s->pcmcia[0] = pxa2xx_pcmcia_init(0x20000000);
- s->pcmcia[1] = pxa2xx_pcmcia_init(0x30000000);
+ s->pcmcia[0] = pxa2xx_pcmcia_init(0x20000000, 0);
+ s->pcmcia[1] = pxa2xx_pcmcia_init(0x30000000, 1);
sysbus_create_simple("pxa2xx_rtc", 0x40900000,
qdev_get_gpio_in(s->pic, PXA2XX_PIC_RTCALARM));
diff --git a/hw/pxa2xx_pcmcia.c b/hw/pxa2xx_pcmcia.c
index 50d4649..3d93829 100644
--- a/hw/pxa2xx_pcmcia.c
+++ b/hw/pxa2xx_pcmcia.c
@@ -9,15 +9,19 @@
#include "hw.h"
#include "pcmcia.h"
+#include "sysbus.h"
#include "pxa.h"
-struct PXA2xxPCMCIAState {
+typedef struct PXA2xxPCMCIAState {
+ SysBusDevice busdev;
+
+ uint8_t id;
PCMCIASocket slot;
PCMCIACardState *card;
qemu_irq irq;
qemu_irq cd_irq;
-};
+} PXA2xxPCMCIAState;
static uint32_t pxa2xx_pcmcia_common_read(void *opaque,
target_phys_addr_t offset)
@@ -130,39 +134,61 @@ static void pxa2xx_pcmcia_set_irq(void *opaque, int line, int level)
qemu_set_irq(s->irq, level);
}
-PXA2xxPCMCIAState *pxa2xx_pcmcia_init(target_phys_addr_t base)
+DeviceState *pxa2xx_pcmcia_init(target_phys_addr_t base, uint8_t id)
{
- int iomemtype;
- PXA2xxPCMCIAState *s;
+ SysBusDevice *dev;
+
+ dev = sysbus_from_qdev(qdev_create(NULL, "pxa2xx-pcmcia"));
+ qdev_prop_set_uint8(&dev->qdev, "id", id);
+ qdev_init_nofail(&dev->qdev);
+
+ sysbus_mmio_map(dev, 0, base | 0x00000000);
+ sysbus_mmio_map(dev, 1, base | 0x08000000);
+ sysbus_mmio_map(dev, 2, base | 0x0c000000);
+ /* IRQs are mapped in the board code */
- s = (PXA2xxPCMCIAState *)
- qemu_mallocz(sizeof(PXA2xxPCMCIAState));
+ return &dev->qdev;
+}
+
+static int pxa2xx_pcmcia_initfn(SysBusDevice *dev)
+{
+ int iomemtype;
+ char *str;
+ PXA2xxPCMCIAState *s = FROM_SYSBUS(PXA2xxPCMCIAState, dev);
/* Socket I/O Memory Space */
iomemtype = cpu_register_io_memory(pxa2xx_pcmcia_io_readfn,
pxa2xx_pcmcia_io_writefn, s, DEVICE_NATIVE_ENDIAN);
- cpu_register_physical_memory(base | 0x00000000, 0x04000000, iomemtype);
+ sysbus_init_mmio(dev, 0x04000000, iomemtype);
/* Then next 64 MB is reserved */
/* Socket Attribute Memory Space */
iomemtype = cpu_register_io_memory(pxa2xx_pcmcia_attr_readfn,
pxa2xx_pcmcia_attr_writefn, s, DEVICE_NATIVE_ENDIAN);
- cpu_register_physical_memory(base | 0x08000000, 0x04000000, iomemtype);
+ sysbus_init_mmio(dev, 0x04000000, iomemtype);
/* Socket Common Memory Space */
iomemtype = cpu_register_io_memory(pxa2xx_pcmcia_common_readfn,
pxa2xx_pcmcia_common_writefn, s, DEVICE_NATIVE_ENDIAN);
- cpu_register_physical_memory(base | 0x0c000000, 0x04000000, iomemtype);
+ sysbus_init_mmio(dev, 0x04000000, iomemtype);
+
+ sysbus_init_irq(dev, &s->irq);
+ sysbus_init_irq(dev, &s->cd_irq);
+
+ if (!dev->qdev.id) {
+ str = qemu_mallocz(256);
+ snprintf(str, 256, "pxa2xx-pcmcia.%d", s->id);
+ dev->qdev.id = str;
+ }
+
+ str = qemu_mallocz(256);
+ snprintf(str, 256, "PXA PC Card Socket %d", s->id);
+ s->slot.slot_string = str;
- if (base == 0x30000000)
- s->slot.slot_string = "PXA PC Card Socket 1";
- else
- s->slot.slot_string = "PXA PC Card Socket 0";
s->slot.irq = qemu_allocate_irqs(pxa2xx_pcmcia_set_irq, s, 1)[0];
pcmcia_socket_register(&s->slot);
-
- return s;
+ return 0;
}
/* Insert a new card into a slot */
@@ -206,10 +232,19 @@ int pxa2xx_pcmcia_dettach(void *opaque)
return 0;
}
-/* Who to notify on card events */
-void pxa2xx_pcmcia_set_irq_cb(void *opaque, qemu_irq irq, qemu_irq cd_irq)
+static SysBusDeviceInfo pxa2xx_pcmcia_info = {
+ .init = pxa2xx_pcmcia_initfn,
+ .qdev.name = "pxa2xx-pcmcia",
+ .qdev.desc = "PXA2xx PCMCIA controller",
+ .qdev.size = sizeof(PXA2xxPCMCIAState),
+ .qdev.props = (Property[]) {
+ DEFINE_PROP_UINT8("id", struct PXA2xxPCMCIAState, id, 0),
+ DEFINE_PROP_END_OF_LIST(),
+ },
+};
+
+static void pxa2xx_pcmcia_register(void)
{
- PXA2xxPCMCIAState *s = (PXA2xxPCMCIAState *) opaque;
- s->irq = irq;
- s->cd_irq = cd_irq;
+ sysbus_register_withprop(&pxa2xx_pcmcia_info);
}
+device_init(pxa2xx_pcmcia_register);
diff --git a/hw/spitz.c b/hw/spitz.c
index 006f7a9..ce19b5a 100644
--- a/hw/spitz.c
+++ b/hw/spitz.c
@@ -870,14 +870,18 @@ static void spitz_gpio_setup(PXA2xxState *cpu, int slots)
qdev_connect_gpio_out(cpu->gpio, SPITZ_GPIO_ON_RESET, cpu->reset);
/* PCMCIA signals: card's IRQ and Card-Detect */
- if (slots >= 1)
- pxa2xx_pcmcia_set_irq_cb(cpu->pcmcia[0],
- qdev_get_gpio_in(cpu->gpio, SPITZ_GPIO_CF1_IRQ),
- qdev_get_gpio_in(cpu->gpio, SPITZ_GPIO_CF1_CD));
- if (slots >= 2)
- pxa2xx_pcmcia_set_irq_cb(cpu->pcmcia[1],
- qdev_get_gpio_in(cpu->gpio, SPITZ_GPIO_CF2_IRQ),
- qdev_get_gpio_in(cpu->gpio, SPITZ_GPIO_CF2_CD));
+ if (slots >= 1) {
+ sysbus_connect_irq(sysbus_from_qdev(cpu->pcmcia[0]), 0,
+ qdev_get_gpio_in(cpu->gpio, SPITZ_GPIO_CF1_IRQ));
+ sysbus_connect_irq(sysbus_from_qdev(cpu->pcmcia[0]), 1,
+ qdev_get_gpio_in(cpu->gpio, SPITZ_GPIO_CF1_CD));
+ }
+ if (slots >= 2) {
+ sysbus_connect_irq(sysbus_from_qdev(cpu->pcmcia[1]), 0,
+ qdev_get_gpio_in(cpu->gpio, SPITZ_GPIO_CF2_IRQ));
+ sysbus_connect_irq(sysbus_from_qdev(cpu->pcmcia[1]), 1,
+ qdev_get_gpio_in(cpu->gpio, SPITZ_GPIO_CF2_CD));
+ }
}
/* Board init. */
diff --git a/hw/tosa.c b/hw/tosa.c
index b8b6c4f..a988507 100644
--- a/hw/tosa.c
+++ b/hw/tosa.c
@@ -102,13 +102,13 @@ static void tosa_gpio_setup(PXA2xxState *cpu,
qdev_connect_gpio_out(cpu->gpio, TOSA_GPIO_ON_RESET, cpu->reset);
/* PCMCIA signals: card's IRQ and Card-Detect */
- pxa2xx_pcmcia_set_irq_cb(cpu->pcmcia[0],
- qdev_get_gpio_in(cpu->gpio, TOSA_GPIO_CF_IRQ),
- qdev_get_gpio_in(cpu->gpio, TOSA_GPIO_CF_CD));
+ sysbus_connect_irq(sysbus_from_qdev(cpu->pcmcia[0]), 0,
+ qdev_get_gpio_in(cpu->gpio, TOSA_GPIO_CF_IRQ));
+ sysbus_connect_irq(sysbus_from_qdev(cpu->pcmcia[0]), 1,
+ qdev_get_gpio_in(cpu->gpio, TOSA_GPIO_CF_CD));
- pxa2xx_pcmcia_set_irq_cb(cpu->pcmcia[1],
- qdev_get_gpio_in(cpu->gpio, TOSA_GPIO_JC_CF_IRQ),
- NULL);
+ sysbus_connect_irq(sysbus_from_qdev(cpu->pcmcia[1]), 0,
+ qdev_get_gpio_in(cpu->gpio, TOSA_GPIO_JC_CF_IRQ));
qdev_connect_gpio_out(scp1, TOSA_GPIO_BT_LED, outsignals[0]);
qdev_connect_gpio_out(scp1, TOSA_GPIO_NOTE_LED, outsignals[1]);
--
1.7.4.1
^ permalink raw reply related [flat|nested] 10+ messages in thread
* [Qemu-devel] [PATCH 2/7] PCMCIA: start qdev'ication
2011-04-11 13:33 [Qemu-devel] [PATCH 0/7] Rework PCMCIA subsystem Dmitry Eremin-Solenikov
2011-04-11 13:33 ` [Qemu-devel] [PATCH 1/7] pxa2xx_pcmcia: qdevify Dmitry Eremin-Solenikov
@ 2011-04-11 13:33 ` Dmitry Eremin-Solenikov
2011-04-11 13:33 ` [Qemu-devel] [PATCH 3/7] microdrive: qdevify Dmitry Eremin-Solenikov
` (6 subsequent siblings)
8 siblings, 0 replies; 10+ messages in thread
From: Dmitry Eremin-Solenikov @ 2011-04-11 13:33 UTC (permalink / raw)
To: qemu-devel
Convert PCMCIA bus handling code to use QBus internally.
MicroDrive code is still unaffected.
Signed-off-by: Dmitry Eremin-Solenikov <dbaryshkov@gmail.com>
---
Makefile.objs | 3 ++
hw/pcmcia.c | 102 ++++++++++++++++++++++++++++++++++++++++++++++++++++
hw/pcmcia.h | 15 +++++++-
hw/pxa2xx_pcmcia.c | 2 +-
vl.c | 43 ----------------------
5 files changed, 120 insertions(+), 45 deletions(-)
create mode 100644 hw/pcmcia.c
diff --git a/Makefile.objs b/Makefile.objs
index 44ce368..153a148 100644
--- a/Makefile.objs
+++ b/Makefile.objs
@@ -289,6 +289,9 @@ hw-obj-$(CONFIG_REALLY_VIRTFS) += virtio-9p-debug.o
hw-obj-$(CONFIG_VIRTFS) += virtio-9p-local.o virtio-9p-xattr.o
hw-obj-$(CONFIG_VIRTFS) += virtio-9p-xattr-user.o virtio-9p-posix-acl.o
+# PCMCIA
+hw-obj-y += pcmcia.o
+
######################################################################
# libdis
# NOTE: the disassembler code is only needed for debugging
diff --git a/hw/pcmcia.c b/hw/pcmcia.c
new file mode 100644
index 0000000..17a49b6
--- /dev/null
+++ b/hw/pcmcia.c
@@ -0,0 +1,102 @@
+/*
+ * QEMU System Emulator
+ * PCMCIA subsystem
+ *
+ * Copyright (c) 2003-2008 Fabrice Bellard
+ * Copyright (c) 2011 Dmitry Eremin-Solenikov
+ *
+ * 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 "hw.h"
+#include "pcmcia.h"
+#include "monitor.h"
+
+/***********************************************************/
+/* PCMCIA/Cardbus */
+
+static struct pcmcia_socket_entry_s {
+ PCMCIASocket *socket;
+ struct pcmcia_socket_entry_s *next;
+} *pcmcia_sockets = 0;
+
+static BusInfo pcmcia_bus_info = {
+ .name = "PCMCIA",
+ .size = sizeof(PCMCIASocket),
+};
+
+void pcmcia_socket_register(PCMCIASocket *socket, DeviceState *parent)
+{
+ struct pcmcia_socket_entry_s *entry;
+
+ qbus_create_inplace(&socket->qbus, &pcmcia_bus_info,
+ parent, "pcmcia");
+
+ entry = qemu_malloc(sizeof(struct pcmcia_socket_entry_s));
+ entry->socket = socket;
+ entry->next = pcmcia_sockets;
+ pcmcia_sockets = entry;
+}
+
+void pcmcia_socket_unregister(PCMCIASocket *socket)
+{
+ struct pcmcia_socket_entry_s *entry, **ptr;
+
+ ptr = &pcmcia_sockets;
+ for (entry = *ptr; entry; ptr = &entry->next, entry = *ptr)
+ if (entry->socket == socket) {
+ *ptr = entry->next;
+ qemu_free(entry);
+ }
+
+ qbus_free(&socket->qbus);
+}
+
+void pcmcia_info(Monitor *mon)
+{
+ struct pcmcia_socket_entry_s *iter;
+
+ if (!pcmcia_sockets) {
+ monitor_printf(mon, "No PCMCIA sockets\n");
+ }
+
+ for (iter = pcmcia_sockets; iter; iter = iter->next) {
+ monitor_printf(mon, "%s: %s\n", iter->socket->slot_string,
+ iter->socket->attached ? iter->socket->card_string :
+ "Empty");
+ }
+}
+
+static int pcmcia_device_init(DeviceState *dev, DeviceInfo *info)
+{
+ PCMCIACardState *state = DO_UPCAST(PCMCIACardState, dev, dev);
+ PCMCIACardInfo *pinfo = DO_UPCAST(PCMCIACardInfo, qdev, info);
+ int rc;
+
+ state->info = pinfo;
+ rc = pinfo->init(state);
+ return rc;
+}
+
+void pcmcia_card_register(PCMCIACardInfo *info)
+{
+ info->qdev.init = pcmcia_device_init;
+ info->qdev.bus_info = &pcmcia_bus_info;
+ assert(info->qdev.size >= sizeof(PCMCIACardState));
+ qdev_register(&info->qdev);
+}
diff --git a/hw/pcmcia.h b/hw/pcmcia.h
index f0b16b8..561d86c 100644
--- a/hw/pcmcia.h
+++ b/hw/pcmcia.h
@@ -1,19 +1,30 @@
/* PCMCIA/Cardbus */
#include "qemu-common.h"
+#include "qdev.h"
typedef struct {
+ BusState qbus;
qemu_irq irq;
int attached;
const char *slot_string;
const char *card_string;
} PCMCIASocket;
-void pcmcia_socket_register(PCMCIASocket *socket);
+void pcmcia_socket_register(PCMCIASocket *socket, DeviceState *parent);
void pcmcia_socket_unregister(PCMCIASocket *socket);
void pcmcia_info(Monitor *mon);
+typedef struct PCMCIACardInfo {
+ DeviceInfo qdev;
+
+ int (*init)(PCMCIACardState *state);
+} PCMCIACardInfo;
+
struct PCMCIACardState {
+ DeviceState dev;
+ PCMCIACardInfo *info;
+
void *state;
PCMCIASocket *slot;
int (*attach)(void *state);
@@ -30,6 +41,8 @@ struct PCMCIACardState {
void (*io_write)(void *state, uint32_t address, uint16_t value);
};
+void pcmcia_card_register(PCMCIACardInfo *info);
+
#define CISTPL_DEVICE 0x01 /* 5V Device Information Tuple */
#define CISTPL_NO_LINK 0x14 /* No Link Tuple */
#define CISTPL_VERS_1 0x15 /* Level 1 Version Tuple */
diff --git a/hw/pxa2xx_pcmcia.c b/hw/pxa2xx_pcmcia.c
index 3d93829..61afaf1 100644
--- a/hw/pxa2xx_pcmcia.c
+++ b/hw/pxa2xx_pcmcia.c
@@ -187,7 +187,7 @@ static int pxa2xx_pcmcia_initfn(SysBusDevice *dev)
s->slot.slot_string = str;
s->slot.irq = qemu_allocate_irqs(pxa2xx_pcmcia_set_irq, s, 1)[0];
- pcmcia_socket_register(&s->slot);
+ pcmcia_socket_register(&s->slot, &s->busdev.qdev);
return 0;
}
diff --git a/vl.c b/vl.c
index 68c3b53..2b277a6 100644
--- a/vl.c
+++ b/vl.c
@@ -980,49 +980,6 @@ void do_usb_del(Monitor *mon, const QDict *qdict)
}
/***********************************************************/
-/* PCMCIA/Cardbus */
-
-static struct pcmcia_socket_entry_s {
- PCMCIASocket *socket;
- struct pcmcia_socket_entry_s *next;
-} *pcmcia_sockets = 0;
-
-void pcmcia_socket_register(PCMCIASocket *socket)
-{
- struct pcmcia_socket_entry_s *entry;
-
- entry = qemu_malloc(sizeof(struct pcmcia_socket_entry_s));
- entry->socket = socket;
- entry->next = pcmcia_sockets;
- pcmcia_sockets = entry;
-}
-
-void pcmcia_socket_unregister(PCMCIASocket *socket)
-{
- struct pcmcia_socket_entry_s *entry, **ptr;
-
- ptr = &pcmcia_sockets;
- for (entry = *ptr; entry; ptr = &entry->next, entry = *ptr)
- if (entry->socket == socket) {
- *ptr = entry->next;
- qemu_free(entry);
- }
-}
-
-void pcmcia_info(Monitor *mon)
-{
- struct pcmcia_socket_entry_s *iter;
-
- if (!pcmcia_sockets)
- monitor_printf(mon, "No PCMCIA sockets\n");
-
- for (iter = pcmcia_sockets; iter; iter = iter->next)
- monitor_printf(mon, "%s: %s\n", iter->socket->slot_string,
- iter->socket->attached ? iter->socket->card_string :
- "Empty");
-}
-
-/***********************************************************/
/* machine registration */
static QEMUMachine *first_machine = NULL;
--
1.7.4.1
^ permalink raw reply related [flat|nested] 10+ messages in thread
* [Qemu-devel] [PATCH 3/7] microdrive: qdevify
2011-04-11 13:33 [Qemu-devel] [PATCH 0/7] Rework PCMCIA subsystem Dmitry Eremin-Solenikov
2011-04-11 13:33 ` [Qemu-devel] [PATCH 1/7] pxa2xx_pcmcia: qdevify Dmitry Eremin-Solenikov
2011-04-11 13:33 ` [Qemu-devel] [PATCH 2/7] PCMCIA: start qdev'ication Dmitry Eremin-Solenikov
@ 2011-04-11 13:33 ` Dmitry Eremin-Solenikov
2011-04-11 13:33 ` [Qemu-devel] [PATCH 4/7] pcmcia: move all card callbacks to PCMCIACardInfo Dmitry Eremin-Solenikov
` (5 subsequent siblings)
8 siblings, 0 replies; 10+ messages in thread
From: Dmitry Eremin-Solenikov @ 2011-04-11 13:33 UTC (permalink / raw)
To: qemu-devel
Switch dscm1xxxx microdrive driver to use qdev infrastructure.
---
hw/ide/microdrive.c | 49 +++++++++++++++++++++++++++++++++++++++----------
hw/pcmcia.h | 2 +-
hw/spitz.c | 5 ++++-
hw/tosa.c | 5 ++++-
4 files changed, 48 insertions(+), 13 deletions(-)
diff --git a/hw/ide/microdrive.c b/hw/ide/microdrive.c
index 2ceeb87..167ec09 100644
--- a/hw/ide/microdrive.c
+++ b/hw/ide/microdrive.c
@@ -39,8 +39,8 @@
/* DSCM-1XXXX Microdrive hard disk with CF+ II / PCMCIA interface. */
typedef struct {
- IDEBus bus;
PCMCIACardState card;
+ IDEBus bus;
uint32_t attr_base;
uint32_t io_base;
@@ -530,22 +530,51 @@ static int dscm1xxxx_detach(void *opaque)
return 0;
}
-PCMCIACardState *dscm1xxxx_init(DriveInfo *bdrv)
+PCMCIACardState *dscm1xxxx_init(PCMCIASocket *socket, DriveInfo *bdrv)
+{
+ DeviceState *dev;
+ MicroDriveState *md;
+
+ dev = qdev_create(&socket->qbus, "dscm1xxxx");
+ qdev_init_nofail(dev);
+ md = DO_UPCAST(MicroDriveState, card.dev, dev);
+
+ ide_create_drive(&md->bus, 0, bdrv);
+ md->bus.ifs[0].drive_kind = IDE_CFATA;
+ md->bus.ifs[0].mdata_size = METADATA_SIZE;
+ md->bus.ifs[0].mdata_storage = (uint8_t *) qemu_mallocz(METADATA_SIZE);
+
+ return &md->card;
+}
+
+static int dscm1xxxx_initfn(PCMCIACardState *state)
{
- MicroDriveState *md = (MicroDriveState *) qemu_mallocz(sizeof(MicroDriveState));
+ MicroDriveState *md;
+ md = DO_UPCAST(MicroDriveState, card, state);
+
md->card.state = md;
md->card.attach = dscm1xxxx_attach;
md->card.detach = dscm1xxxx_detach;
md->card.cis = dscm1xxxx_cis;
md->card.cis_len = sizeof(dscm1xxxx_cis);
- ide_init2_with_non_qdev_drives(&md->bus, bdrv, NULL,
- qemu_allocate_irqs(md_set_irq, md, 1)[0]);
- md->bus.ifs[0].drive_kind = IDE_CFATA;
- md->bus.ifs[0].mdata_size = METADATA_SIZE;
- md->bus.ifs[0].mdata_storage = (uint8_t *) qemu_mallocz(METADATA_SIZE);
+ ide_bus_new(&md->bus, &state->dev, 0);
+ qdev_init_gpio_in(&state->dev, md_set_irq, 1);
+ ide_init2(&md->bus, qdev_get_gpio_in(&state->dev, 0));
- vmstate_register(NULL, -1, &vmstate_microdrive, md);
+ return 0;
+}
- return &md->card;
+static PCMCIACardInfo dscm1xxxx_info = {
+ .qdev.name = "dscm1xxxx",
+ .qdev.desc = "QEMU CF MicroDrive emulation",
+ .init = dscm1xxxx_initfn,
+ .qdev.size = sizeof(MicroDriveState),
+ .qdev.vmsd = &vmstate_microdrive,
+};
+
+static void dscm1xxxx_register(void)
+{
+ pcmcia_card_register(&dscm1xxxx_info);
}
+device_init(dscm1xxxx_register);
diff --git a/hw/pcmcia.h b/hw/pcmcia.h
index 561d86c..c6b8100 100644
--- a/hw/pcmcia.h
+++ b/hw/pcmcia.h
@@ -64,4 +64,4 @@ void pcmcia_card_register(PCMCIACardInfo *info);
DeviceState *pxa2xx_pcmcia_init(target_phys_addr_t base, uint8_t id);
/* dscm1xxxx.c */
-PCMCIACardState *dscm1xxxx_init(DriveInfo *bdrv);
+PCMCIACardState *dscm1xxxx_init(PCMCIASocket *socket, DriveInfo *bdrv);
diff --git a/hw/spitz.c b/hw/spitz.c
index ce19b5a..51cc08c 100644
--- a/hw/spitz.c
+++ b/hw/spitz.c
@@ -714,7 +714,10 @@ static void spitz_microdrive_attach(PXA2xxState *cpu, int slot)
return;
bs = dinfo->bdrv;
if (bdrv_is_inserted(bs) && !bdrv_is_removable(bs)) {
- md = dscm1xxxx_init(dinfo);
+ md = dscm1xxxx_init(
+ DO_UPCAST(PCMCIASocket, qbus,
+ qdev_get_child_bus(cpu->pcmcia[slot], "pcmcia")),
+ dinfo);
pxa2xx_pcmcia_attach(cpu->pcmcia[slot], md);
}
}
diff --git a/hw/tosa.c b/hw/tosa.c
index a988507..1435ea2 100644
--- a/hw/tosa.c
+++ b/hw/tosa.c
@@ -60,7 +60,10 @@ static void tosa_microdrive_attach(PXA2xxState *cpu)
return;
bs = dinfo->bdrv;
if (bdrv_is_inserted(bs) && !bdrv_is_removable(bs)) {
- md = dscm1xxxx_init(dinfo);
+ md = dscm1xxxx_init(
+ DO_UPCAST(PCMCIASocket, qbus,
+ qdev_get_child_bus(cpu->pcmcia[0], "pcmcia")),
+ dinfo);
pxa2xx_pcmcia_attach(cpu->pcmcia[0], md);
}
}
--
1.7.4.1
^ permalink raw reply related [flat|nested] 10+ messages in thread
* [Qemu-devel] [PATCH 4/7] pcmcia: move all card callbacks to PCMCIACardInfo
2011-04-11 13:33 [Qemu-devel] [PATCH 0/7] Rework PCMCIA subsystem Dmitry Eremin-Solenikov
` (2 preceding siblings ...)
2011-04-11 13:33 ` [Qemu-devel] [PATCH 3/7] microdrive: qdevify Dmitry Eremin-Solenikov
@ 2011-04-11 13:33 ` Dmitry Eremin-Solenikov
2011-04-11 13:33 ` [Qemu-devel] [PATCH 5/7] pcmcia: move attach and detach socket methods to PCMCIASocket Dmitry Eremin-Solenikov
` (4 subsequent siblings)
8 siblings, 0 replies; 10+ messages in thread
From: Dmitry Eremin-Solenikov @ 2011-04-11 13:33 UTC (permalink / raw)
To: qemu-devel
Signed-off-by: Dmitry Eremin-Solenikov <dbaryshkov@gmail.com>
last commit fixup
Signed-off-by: Dmitry Eremin-Solenikov <dbaryshkov@gmail.com>
Revert "microdrive fixup"
This reverts commit 6a9f969b0626e218ff910d84ed1c9eec285cbcd5.
Signed-off-by: Dmitry Eremin-Solenikov <dbaryshkov@gmail.com>
---
hw/ide/microdrive.c | 41 ++++++++++++++++++++---------------------
hw/pcmcia.h | 29 +++++++++++++++--------------
hw/pxa2xx_pcmcia.c | 16 ++++++++--------
3 files changed, 43 insertions(+), 43 deletions(-)
diff --git a/hw/ide/microdrive.c b/hw/ide/microdrive.c
index 167ec09..a251544 100644
--- a/hw/ide/microdrive.c
+++ b/hw/ide/microdrive.c
@@ -113,9 +113,9 @@ static void md_reset(MicroDriveState *s)
ide_bus_reset(&s->bus);
}
-static uint8_t md_attr_read(void *opaque, uint32_t at)
+static uint8_t md_attr_read(PCMCIACardState *opaque, uint32_t at)
{
- MicroDriveState *s = opaque;
+ MicroDriveState *s = DO_UPCAST(MicroDriveState, card, opaque);
if (at < s->attr_base) {
if (at < s->card.cis_len)
return s->card.cis[at];
@@ -146,9 +146,9 @@ static uint8_t md_attr_read(void *opaque, uint32_t at)
return 0;
}
-static void md_attr_write(void *opaque, uint32_t at, uint8_t value)
+static void md_attr_write(PCMCIACardState *opaque, uint32_t at, uint8_t value)
{
- MicroDriveState *s = opaque;
+ MicroDriveState *s = DO_UPCAST(MicroDriveState, card, opaque);
at -= s->attr_base;
switch (at) {
@@ -177,9 +177,9 @@ static void md_attr_write(void *opaque, uint32_t at, uint8_t value)
}
}
-static uint16_t md_common_read(void *opaque, uint32_t at)
+static uint16_t md_common_read(PCMCIACardState *opaque, uint32_t at)
{
- MicroDriveState *s = opaque;
+ MicroDriveState *s = DO_UPCAST(MicroDriveState, card, opaque);
IDEState *ifs;
uint16_t ret;
at -= s->io_base;
@@ -239,9 +239,9 @@ static uint16_t md_common_read(void *opaque, uint32_t at)
return 0;
}
-static void md_common_write(void *opaque, uint32_t at, uint16_t value)
+static void md_common_write(PCMCIACardState *opaque, uint32_t at, uint16_t value)
{
- MicroDriveState *s = opaque;
+ MicroDriveState *s = DO_UPCAST(MicroDriveState, card, opaque);
at -= s->io_base;
switch (s->opt & OPT_MODE) {
@@ -503,15 +503,9 @@ static const uint8_t dscm1xxxx_cis[0x14a] = {
[0x146] = CISTPL_END, /* Tuple End */
};
-static int dscm1xxxx_attach(void *opaque)
+static int dscm1xxxx_attach(PCMCIACardState *opaque)
{
- MicroDriveState *md = opaque;
- md->card.attr_read = md_attr_read;
- md->card.attr_write = md_attr_write;
- md->card.common_read = md_common_read;
- md->card.common_write = md_common_write;
- md->card.io_read = md_common_read;
- md->card.io_write = md_common_write;
+ MicroDriveState *md = DO_UPCAST(MicroDriveState, card, opaque);
md->attr_base = md->card.cis[0x74] | (md->card.cis[0x76] << 8);
md->io_base = 0x0;
@@ -523,9 +517,9 @@ static int dscm1xxxx_attach(void *opaque)
return 0;
}
-static int dscm1xxxx_detach(void *opaque)
+static int dscm1xxxx_detach(PCMCIACardState *opaque)
{
- MicroDriveState *md = opaque;
+ MicroDriveState *md = DO_UPCAST(MicroDriveState, card, opaque);
md_reset(md);
return 0;
}
@@ -552,9 +546,6 @@ static int dscm1xxxx_initfn(PCMCIACardState *state)
MicroDriveState *md;
md = DO_UPCAST(MicroDriveState, card, state);
- md->card.state = md;
- md->card.attach = dscm1xxxx_attach;
- md->card.detach = dscm1xxxx_detach;
md->card.cis = dscm1xxxx_cis;
md->card.cis_len = sizeof(dscm1xxxx_cis);
@@ -571,6 +562,14 @@ static PCMCIACardInfo dscm1xxxx_info = {
.init = dscm1xxxx_initfn,
.qdev.size = sizeof(MicroDriveState),
.qdev.vmsd = &vmstate_microdrive,
+ .attach = dscm1xxxx_attach,
+ .detach = dscm1xxxx_detach,
+ .attr_read = md_attr_read,
+ .attr_write = md_attr_write,
+ .common_read = md_common_read,
+ .common_write = md_common_write,
+ .io_read = md_common_read,
+ .io_write = md_common_write,
};
static void dscm1xxxx_register(void)
diff --git a/hw/pcmcia.h b/hw/pcmcia.h
index c6b8100..2c012d9 100644
--- a/hw/pcmcia.h
+++ b/hw/pcmcia.h
@@ -3,13 +3,15 @@
#include "qemu-common.h"
#include "qdev.h"
-typedef struct {
+typedef struct PCMCIASocket PCMCIASocket;
+
+struct PCMCIASocket {
BusState qbus;
qemu_irq irq;
int attached;
const char *slot_string;
const char *card_string;
-} PCMCIASocket;
+};
void pcmcia_socket_register(PCMCIASocket *socket, DeviceState *parent);
void pcmcia_socket_unregister(PCMCIASocket *socket);
@@ -19,26 +21,25 @@ typedef struct PCMCIACardInfo {
DeviceInfo qdev;
int (*init)(PCMCIACardState *state);
+
+ int (*attach)(PCMCIACardState *state);
+ int (*detach)(PCMCIACardState *state);
+
+ /* Only valid if attached */
+ uint8_t (*attr_read)(PCMCIACardState *state, uint32_t address);
+ void (*attr_write)(PCMCIACardState *state, uint32_t address, uint8_t value);
+ uint16_t (*common_read)(PCMCIACardState *state, uint32_t address);
+ void (*common_write)(PCMCIACardState *state, uint32_t address, uint16_t value);
+ uint16_t (*io_read)(PCMCIACardState *state, uint32_t address);
+ void (*io_write)(PCMCIACardState *state, uint32_t address, uint16_t value);
} PCMCIACardInfo;
struct PCMCIACardState {
DeviceState dev;
PCMCIACardInfo *info;
-
- void *state;
PCMCIASocket *slot;
- int (*attach)(void *state);
- int (*detach)(void *state);
const uint8_t *cis;
int cis_len;
-
- /* Only valid if attached */
- uint8_t (*attr_read)(void *state, uint32_t address);
- void (*attr_write)(void *state, uint32_t address, uint8_t value);
- uint16_t (*common_read)(void *state, uint32_t address);
- void (*common_write)(void *state, uint32_t address, uint16_t value);
- uint16_t (*io_read)(void *state, uint32_t address);
- void (*io_write)(void *state, uint32_t address, uint16_t value);
};
void pcmcia_card_register(PCMCIACardInfo *info);
diff --git a/hw/pxa2xx_pcmcia.c b/hw/pxa2xx_pcmcia.c
index 61afaf1..ae7d01a 100644
--- a/hw/pxa2xx_pcmcia.c
+++ b/hw/pxa2xx_pcmcia.c
@@ -29,7 +29,7 @@ static uint32_t pxa2xx_pcmcia_common_read(void *opaque,
PXA2xxPCMCIAState *s = (PXA2xxPCMCIAState *) opaque;
if (s->slot.attached) {
- return s->card->common_read(s->card->state, offset);
+ return s->card->info->common_read(s->card, offset);
}
return 0;
@@ -41,7 +41,7 @@ static void pxa2xx_pcmcia_common_write(void *opaque,
PXA2xxPCMCIAState *s = (PXA2xxPCMCIAState *) opaque;
if (s->slot.attached) {
- s->card->common_write(s->card->state, offset, value);
+ s->card->info->common_write(s->card, offset, value);
}
}
@@ -51,7 +51,7 @@ static uint32_t pxa2xx_pcmcia_attr_read(void *opaque,
PXA2xxPCMCIAState *s = (PXA2xxPCMCIAState *) opaque;
if (s->slot.attached) {
- return s->card->attr_read(s->card->state, offset);
+ return s->card->info->attr_read(s->card, offset);
}
return 0;
@@ -63,7 +63,7 @@ static void pxa2xx_pcmcia_attr_write(void *opaque,
PXA2xxPCMCIAState *s = (PXA2xxPCMCIAState *) opaque;
if (s->slot.attached) {
- s->card->attr_write(s->card->state, offset, value);
+ s->card->info->attr_write(s->card, offset, value);
}
}
@@ -73,7 +73,7 @@ static uint32_t pxa2xx_pcmcia_io_read(void *opaque,
PXA2xxPCMCIAState *s = (PXA2xxPCMCIAState *) opaque;
if (s->slot.attached) {
- return s->card->io_read(s->card->state, offset);
+ return s->card->info->io_read(s->card, offset);
}
return 0;
@@ -85,7 +85,7 @@ static void pxa2xx_pcmcia_io_write(void *opaque,
PXA2xxPCMCIAState *s = (PXA2xxPCMCIAState *) opaque;
if (s->slot.attached) {
- s->card->io_write(s->card->state, offset, value);
+ s->card->info->io_write(s->card, offset, value);
}
}
@@ -206,7 +206,7 @@ int pxa2xx_pcmcia_attach(void *opaque, PCMCIACardState *card)
s->slot.attached = 1;
s->card->slot = &s->slot;
- s->card->attach(s->card->state);
+ s->card->info->attach(s->card);
return 0;
}
@@ -218,7 +218,7 @@ int pxa2xx_pcmcia_dettach(void *opaque)
if (!s->slot.attached)
return -ENOENT;
- s->card->detach(s->card->state);
+ s->card->info->detach(s->card);
s->card->slot = NULL;
s->card = NULL;
--
1.7.4.1
^ permalink raw reply related [flat|nested] 10+ messages in thread
* [Qemu-devel] [PATCH 5/7] pcmcia: move attach and detach socket methods to PCMCIASocket
2011-04-11 13:33 [Qemu-devel] [PATCH 0/7] Rework PCMCIA subsystem Dmitry Eremin-Solenikov
` (3 preceding siblings ...)
2011-04-11 13:33 ` [Qemu-devel] [PATCH 4/7] pcmcia: move all card callbacks to PCMCIACardInfo Dmitry Eremin-Solenikov
@ 2011-04-11 13:33 ` Dmitry Eremin-Solenikov
2011-04-11 13:33 ` [Qemu-devel] [PATCH 6/7] pxa: change order of pcmcia devices instantiation, so that the socket 0 will be default Dmitry Eremin-Solenikov
` (3 subsequent siblings)
8 siblings, 0 replies; 10+ messages in thread
From: Dmitry Eremin-Solenikov @ 2011-04-11 13:33 UTC (permalink / raw)
To: qemu-devel
Make attach and detach calls to be automatically called by PCMCIA card
instantiation code, rather than calling them by hand from the board
code.
Signed-off-by: Dmitry Eremin-Solenikov <dbaryshkov@gmail.com>
---
hw/pcmcia.c | 45 +++++++++++++++++++++++++++++++-
hw/pcmcia.h | 2 +
hw/pxa.h | 4 ---
hw/pxa2xx_pcmcia.c | 73 +++++++++++++++++++++++----------------------------
hw/spitz.c | 1 -
hw/tosa.c | 1 -
6 files changed, 79 insertions(+), 47 deletions(-)
diff --git a/hw/pcmcia.c b/hw/pcmcia.c
index 17a49b6..d661663 100644
--- a/hw/pcmcia.c
+++ b/hw/pcmcia.c
@@ -86,16 +86,59 @@ static int pcmcia_device_init(DeviceState *dev, DeviceInfo *info)
{
PCMCIACardState *state = DO_UPCAST(PCMCIACardState, dev, dev);
PCMCIACardInfo *pinfo = DO_UPCAST(PCMCIACardInfo, qdev, info);
+ PCMCIASocket *socket = DO_UPCAST(PCMCIASocket, qbus, dev->parent_bus);
int rc;
+ if (socket->attached) {
+ return -1;
+ }
+
state->info = pinfo;
rc = pinfo->init(state);
- return rc;
+ if (rc) {
+ return rc;
+ }
+
+ socket->attached = 1;
+ state->slot = socket;
+
+ rc = socket->attach(socket, state);
+ if (rc) {
+ return rc;
+ }
+
+ rc = state->info->attach(state);
+ if (rc) {
+ socket->detach(socket);
+ return rc;
+ }
+
+ return 0;
+}
+
+static int pcmcia_device_exit(DeviceState *dev)
+{
+ PCMCIACardState *state = DO_UPCAST(PCMCIACardState, dev, dev);
+ PCMCIASocket *socket = DO_UPCAST(PCMCIASocket, qbus, dev->parent_bus);
+
+ if (!socket->attached) {
+ return -ENOENT;
+ }
+
+ state->info->detach(state);
+ state->slot = NULL;
+
+ socket->detach(socket);
+
+ socket->attached = 0;
+
+ return 0;
}
void pcmcia_card_register(PCMCIACardInfo *info)
{
info->qdev.init = pcmcia_device_init;
+ info->qdev.exit = pcmcia_device_exit;
info->qdev.bus_info = &pcmcia_bus_info;
assert(info->qdev.size >= sizeof(PCMCIACardState));
qdev_register(&info->qdev);
diff --git a/hw/pcmcia.h b/hw/pcmcia.h
index 2c012d9..4f90af7 100644
--- a/hw/pcmcia.h
+++ b/hw/pcmcia.h
@@ -11,6 +11,8 @@ struct PCMCIASocket {
int attached;
const char *slot_string;
const char *card_string;
+ int (*attach)(PCMCIASocket *socket, PCMCIACardState *card);
+ int (*detach)(PCMCIASocket *socket);
};
void pcmcia_socket_register(PCMCIASocket *socket, DeviceState *parent);
diff --git a/hw/pxa.h b/hw/pxa.h
index 25176ef..c145029 100644
--- a/hw/pxa.h
+++ b/hw/pxa.h
@@ -89,10 +89,6 @@ PXA2xxMMCIState *pxa2xx_mmci_init(target_phys_addr_t base,
void pxa2xx_mmci_handlers(PXA2xxMMCIState *s, qemu_irq readonly,
qemu_irq coverswitch);
-/* pxa2xx_pcmcia.c */
-int pxa2xx_pcmcia_attach(void *opaque, PCMCIACardState *card);
-int pxa2xx_pcmcia_dettach(void *opaque);
-
/* pxa2xx_keypad.c */
struct keymap {
int column;
diff --git a/hw/pxa2xx_pcmcia.c b/hw/pxa2xx_pcmcia.c
index ae7d01a..efd4c09 100644
--- a/hw/pxa2xx_pcmcia.c
+++ b/hw/pxa2xx_pcmcia.c
@@ -150,6 +150,37 @@ DeviceState *pxa2xx_pcmcia_init(target_phys_addr_t base, uint8_t id)
return &dev->qdev;
}
+/* Insert a new card into a slot */
+static int pxa2xx_pcmcia_attach(PCMCIASocket *socket, PCMCIACardState *card)
+{
+ PXA2xxPCMCIAState *s = container_of(socket, PXA2xxPCMCIAState, slot);
+
+ if (s->cd_irq) {
+ qemu_irq_raise(s->cd_irq);
+ }
+
+ s->card = card;
+
+ return 0;
+}
+
+/* Eject card from the slot */
+static int pxa2xx_pcmcia_detach(PCMCIASocket *socket)
+{
+ PXA2xxPCMCIAState *s = container_of(socket, PXA2xxPCMCIAState, slot);
+
+ s->card = NULL;
+
+ if (s->irq) {
+ qemu_irq_lower(s->irq);
+ }
+ if (s->cd_irq) {
+ qemu_irq_lower(s->cd_irq);
+ }
+
+ return 0;
+}
+
static int pxa2xx_pcmcia_initfn(SysBusDevice *dev)
{
int iomemtype;
@@ -186,48 +217,10 @@ static int pxa2xx_pcmcia_initfn(SysBusDevice *dev)
snprintf(str, 256, "PXA PC Card Socket %d", s->id);
s->slot.slot_string = str;
+ s->slot.attach = pxa2xx_pcmcia_attach;
+ s->slot.detach = pxa2xx_pcmcia_detach;
s->slot.irq = qemu_allocate_irqs(pxa2xx_pcmcia_set_irq, s, 1)[0];
pcmcia_socket_register(&s->slot, &s->busdev.qdev);
- return 0;
-}
-
-/* Insert a new card into a slot */
-int pxa2xx_pcmcia_attach(void *opaque, PCMCIACardState *card)
-{
- PXA2xxPCMCIAState *s = (PXA2xxPCMCIAState *) opaque;
- if (s->slot.attached)
- return -EEXIST;
-
- if (s->cd_irq) {
- qemu_irq_raise(s->cd_irq);
- }
-
- s->card = card;
-
- s->slot.attached = 1;
- s->card->slot = &s->slot;
- s->card->info->attach(s->card);
-
- return 0;
-}
-
-/* Eject card from the slot */
-int pxa2xx_pcmcia_dettach(void *opaque)
-{
- PXA2xxPCMCIAState *s = (PXA2xxPCMCIAState *) opaque;
- if (!s->slot.attached)
- return -ENOENT;
-
- s->card->info->detach(s->card);
- s->card->slot = NULL;
- s->card = NULL;
-
- s->slot.attached = 0;
-
- if (s->irq)
- qemu_irq_lower(s->irq);
- if (s->cd_irq)
- qemu_irq_lower(s->cd_irq);
return 0;
}
diff --git a/hw/spitz.c b/hw/spitz.c
index 51cc08c..cf2ee82 100644
--- a/hw/spitz.c
+++ b/hw/spitz.c
@@ -718,7 +718,6 @@ static void spitz_microdrive_attach(PXA2xxState *cpu, int slot)
DO_UPCAST(PCMCIASocket, qbus,
qdev_get_child_bus(cpu->pcmcia[slot], "pcmcia")),
dinfo);
- pxa2xx_pcmcia_attach(cpu->pcmcia[slot], md);
}
}
diff --git a/hw/tosa.c b/hw/tosa.c
index 1435ea2..d1777b7 100644
--- a/hw/tosa.c
+++ b/hw/tosa.c
@@ -64,7 +64,6 @@ static void tosa_microdrive_attach(PXA2xxState *cpu)
DO_UPCAST(PCMCIASocket, qbus,
qdev_get_child_bus(cpu->pcmcia[0], "pcmcia")),
dinfo);
- pxa2xx_pcmcia_attach(cpu->pcmcia[0], md);
}
}
--
1.7.4.1
^ permalink raw reply related [flat|nested] 10+ messages in thread
* [Qemu-devel] [PATCH 6/7] pxa: change order of pcmcia devices instantiation, so that the socket 0 will be default
2011-04-11 13:33 [Qemu-devel] [PATCH 0/7] Rework PCMCIA subsystem Dmitry Eremin-Solenikov
` (4 preceding siblings ...)
2011-04-11 13:33 ` [Qemu-devel] [PATCH 5/7] pcmcia: move attach and detach socket methods to PCMCIASocket Dmitry Eremin-Solenikov
@ 2011-04-11 13:33 ` Dmitry Eremin-Solenikov
2011-04-11 13:33 ` [Qemu-devel] [PATCH 7/7] ide-core: allocate metadata storage for CFATA drives Dmitry Eremin-Solenikov
` (2 subsequent siblings)
8 siblings, 0 replies; 10+ messages in thread
From: Dmitry Eremin-Solenikov @ 2011-04-11 13:33 UTC (permalink / raw)
To: qemu-devel
Signed-off-by: Dmitry Eremin-Solenikov <dbaryshkov@gmail.com>
---
hw/pxa2xx.c | 4 ++--
1 files changed, 2 insertions(+), 2 deletions(-)
diff --git a/hw/pxa2xx.c b/hw/pxa2xx.c
index ef4c0a2..bcb42cf 100644
--- a/hw/pxa2xx.c
+++ b/hw/pxa2xx.c
@@ -2222,8 +2222,8 @@ PXA2xxState *pxa270_init(unsigned int sdram_size, const char *revision)
qdev_get_gpio_in(s->pic, PXA2XX_PIC_USBH1));
}
- s->pcmcia[0] = pxa2xx_pcmcia_init(0x20000000, 0);
s->pcmcia[1] = pxa2xx_pcmcia_init(0x30000000, 1);
+ s->pcmcia[0] = pxa2xx_pcmcia_init(0x20000000, 0);
sysbus_create_simple("pxa2xx_rtc", 0x40900000,
qdev_get_gpio_in(s->pic, PXA2XX_PIC_RTCALARM));
@@ -2358,8 +2358,8 @@ PXA2xxState *pxa255_init(unsigned int sdram_size)
qdev_get_gpio_in(s->pic, PXA2XX_PIC_USBH1));
}
- s->pcmcia[0] = pxa2xx_pcmcia_init(0x20000000, 0);
s->pcmcia[1] = pxa2xx_pcmcia_init(0x30000000, 1);
+ s->pcmcia[0] = pxa2xx_pcmcia_init(0x20000000, 0);
sysbus_create_simple("pxa2xx_rtc", 0x40900000,
qdev_get_gpio_in(s->pic, PXA2XX_PIC_RTCALARM));
--
1.7.4.1
^ permalink raw reply related [flat|nested] 10+ messages in thread
* [Qemu-devel] [PATCH 7/7] ide-core: allocate metadata storage for CFATA drives
2011-04-11 13:33 [Qemu-devel] [PATCH 0/7] Rework PCMCIA subsystem Dmitry Eremin-Solenikov
` (5 preceding siblings ...)
2011-04-11 13:33 ` [Qemu-devel] [PATCH 6/7] pxa: change order of pcmcia devices instantiation, so that the socket 0 will be default Dmitry Eremin-Solenikov
@ 2011-04-11 13:33 ` Dmitry Eremin-Solenikov
2011-04-16 9:26 ` [Qemu-devel] [PATCH 0/7] Rework PCMCIA subsystem Dmitry Eremin-Solenikov
2011-04-21 11:56 ` Dmitry Eremin-Solenikov
8 siblings, 0 replies; 10+ messages in thread
From: Dmitry Eremin-Solenikov @ 2011-04-11 13:33 UTC (permalink / raw)
To: qemu-devel
Currently it's done by hw/ide/microdrive.c To simplify that part,
move this initialization to ide core.
Signed-off-by: Dmitry Eremin-Solenikov <dbaryshkov@gmail.com>
---
hw/ide/core.c | 4 ++++
hw/ide/internal.h | 2 ++
hw/ide/microdrive.c | 6 +-----
3 files changed, 7 insertions(+), 5 deletions(-)
diff --git a/hw/ide/core.c b/hw/ide/core.c
index c11d457..f6f7c04 100644
--- a/hw/ide/core.c
+++ b/hw/ide/core.c
@@ -2556,6 +2556,10 @@ int ide_init_drive(IDEState *s, BlockDriverState *bs,
return -1;
}
}
+ if (s->drive_kind == IDE_CFATA) {
+ s->mdata_size = CFA_METADATA_SIZE;
+ s->mdata_storage = qemu_mallocz(CFA_METADATA_SIZE);
+ }
if (serial) {
strncpy(s->drive_serial_str, serial, sizeof(s->drive_serial_str));
} else {
diff --git a/hw/ide/internal.h b/hw/ide/internal.h
index d533fb6..d1e0528 100644
--- a/hw/ide/internal.h
+++ b/hw/ide/internal.h
@@ -364,6 +364,8 @@ typedef struct IDEDMAOps IDEDMAOps;
#define SMART_DISABLE 0xd9
#define SMART_STATUS 0xda
+#define CFA_METADATA_SIZE 0x20
+
typedef enum { IDE_HD, IDE_CD, IDE_CFATA } IDEDriveKind;
typedef void EndTransferFunc(IDEState *);
diff --git a/hw/ide/microdrive.c b/hw/ide/microdrive.c
index a251544..898ad15 100644
--- a/hw/ide/microdrive.c
+++ b/hw/ide/microdrive.c
@@ -35,8 +35,6 @@
/***********************************************************/
/* CF-ATA Microdrive */
-#define METADATA_SIZE 0x20
-
/* DSCM-1XXXX Microdrive hard disk with CF+ II / PCMCIA interface. */
typedef struct {
PCMCIACardState card;
@@ -534,9 +532,6 @@ PCMCIACardState *dscm1xxxx_init(PCMCIASocket *socket, DriveInfo *bdrv)
md = DO_UPCAST(MicroDriveState, card.dev, dev);
ide_create_drive(&md->bus, 0, bdrv);
- md->bus.ifs[0].drive_kind = IDE_CFATA;
- md->bus.ifs[0].mdata_size = METADATA_SIZE;
- md->bus.ifs[0].mdata_storage = (uint8_t *) qemu_mallocz(METADATA_SIZE);
return &md->card;
}
@@ -553,6 +548,7 @@ static int dscm1xxxx_initfn(PCMCIACardState *state)
qdev_init_gpio_in(&state->dev, md_set_irq, 1);
ide_init2(&md->bus, qdev_get_gpio_in(&state->dev, 0));
+ md->bus.ifs[0].drive_kind = IDE_CFATA;
return 0;
}
--
1.7.4.1
^ permalink raw reply related [flat|nested] 10+ messages in thread
* Re: [Qemu-devel] [PATCH 0/7] Rework PCMCIA subsystem
2011-04-11 13:33 [Qemu-devel] [PATCH 0/7] Rework PCMCIA subsystem Dmitry Eremin-Solenikov
` (6 preceding siblings ...)
2011-04-11 13:33 ` [Qemu-devel] [PATCH 7/7] ide-core: allocate metadata storage for CFATA drives Dmitry Eremin-Solenikov
@ 2011-04-16 9:26 ` Dmitry Eremin-Solenikov
2011-04-21 11:56 ` Dmitry Eremin-Solenikov
8 siblings, 0 replies; 10+ messages in thread
From: Dmitry Eremin-Solenikov @ 2011-04-16 9:26 UTC (permalink / raw)
To: qemu-devel
Hi,
What about this serie of patches?
On 4/11/11, Dmitry Eremin-Solenikov <dbaryshkov@gmail.com> wrote:
> Please pull the following changeset that makes PCMCIA subsystem to use
> QBus and Qdev for managing devices. Currently the only implementation
> of PCMCIA host is a PXA2xx host and the only possible PCMCIA device is
> IDE MicroDrive (dscm1xxxx).
>
> With this patchset I can create a microdrive device from command line:
> -device dscm1xxxx -device ide-drive,drive=test -drive
> if=none,id=test,file=/dev/null
>
>
> Dmitry Eremin-Solenikov (7):
> pxa2xx_pcmcia: qdevify
> PCMCIA: start qdev'ication
> microdrive: qdevify
> pcmcia: move all card callbacks to PCMCIACardInfo
> pcmcia: move attach and detach socket methods to PCMCIASocket
> pxa: change order of pcmcia devices instantiation, so that the socket
> 0 will be default
> ide-core: allocate metadata storage for CFATA drives
>
> Makefile.objs | 3 +
> hw/ide/core.c | 4 ++
> hw/ide/internal.h | 2 +
> hw/ide/microdrive.c | 88 +++++++++++++++++++-----------
> hw/mainstone.c | 14 +++--
> hw/pcmcia.c | 145
> +++++++++++++++++++++++++++++++++++++++++++++++++
> hw/pcmcia.h | 49 ++++++++++++-----
> hw/pxa.h | 9 +---
> hw/pxa2xx.c | 9 ++--
> hw/pxa2xx_pcmcia.c | 148
> ++++++++++++++++++++++++++++++---------------------
> hw/spitz.c | 26 ++++++----
> hw/tosa.c | 18 ++++---
> vl.c | 43 ---------------
> 13 files changed, 372 insertions(+), 186 deletions(-)
> create mode 100644 hw/pcmcia.c
>
>
--
With best wishes
Dmitry
^ permalink raw reply [flat|nested] 10+ messages in thread
* Re: [Qemu-devel] [PATCH 0/7] Rework PCMCIA subsystem
2011-04-11 13:33 [Qemu-devel] [PATCH 0/7] Rework PCMCIA subsystem Dmitry Eremin-Solenikov
` (7 preceding siblings ...)
2011-04-16 9:26 ` [Qemu-devel] [PATCH 0/7] Rework PCMCIA subsystem Dmitry Eremin-Solenikov
@ 2011-04-21 11:56 ` Dmitry Eremin-Solenikov
8 siblings, 0 replies; 10+ messages in thread
From: Dmitry Eremin-Solenikov @ 2011-04-21 11:56 UTC (permalink / raw)
To: qemu-devel
Hello,
On 4/11/11, Dmitry Eremin-Solenikov <dbaryshkov@gmail.com> wrote:
> Please pull the following changeset that makes PCMCIA subsystem to use
> QBus and Qdev for managing devices. Currently the only implementation
> of PCMCIA host is a PXA2xx host and the only possible PCMCIA device is
> IDE MicroDrive (dscm1xxxx).
>
> With this patchset I can create a microdrive device from command line:
> -device dscm1xxxx -device ide-drive,drive=test -drive
> if=none,id=test,file=/dev/null
>
>
> Dmitry Eremin-Solenikov (7):
> pxa2xx_pcmcia: qdevify
> PCMCIA: start qdev'ication
> microdrive: qdevify
> pcmcia: move all card callbacks to PCMCIACardInfo
> pcmcia: move attach and detach socket methods to PCMCIASocket
> pxa: change order of pcmcia devices instantiation, so that the socket
> 0 will be default
> ide-core: allocate metadata storage for CFATA drives
>
> Makefile.objs | 3 +
> hw/ide/core.c | 4 ++
> hw/ide/internal.h | 2 +
> hw/ide/microdrive.c | 88 +++++++++++++++++++-----------
> hw/mainstone.c | 14 +++--
> hw/pcmcia.c | 145
> +++++++++++++++++++++++++++++++++++++++++++++++++
> hw/pcmcia.h | 49 ++++++++++++-----
> hw/pxa.h | 9 +---
> hw/pxa2xx.c | 9 ++--
> hw/pxa2xx_pcmcia.c | 148
> ++++++++++++++++++++++++++++++---------------------
> hw/spitz.c | 26 ++++++----
> hw/tosa.c | 18 ++++---
> vl.c | 43 ---------------
> 13 files changed, 372 insertions(+), 186 deletions(-)
> create mode 100644 hw/pcmcia.c
Pinging again about this patchset. Any objections? Comments? Etc.?
--
With best wishes
Dmitry
^ permalink raw reply [flat|nested] 10+ messages in thread