Make it possible to attach smc91x to memory controllers
authorRiku Voipio <riku.voipio@nokia.com>
Wed, 25 Mar 2009 16:46:08 +0000 (18:46 +0200)
committerRiku Voipio <riku.voipio@nokia.com>
Wed, 25 Mar 2009 16:46:08 +0000 (18:46 +0200)
To register smc91x properly under omap gpmc, we need
to not to register the physical memory in smc91x
init itself. Add a new parameter phys_alloc and use
it everywhere.

hw/beagle.c
hw/devices.h
hw/gumstix.c
hw/integratorcp.c
hw/mainstone.c
hw/realview.c
hw/smc91c111.c
hw/versatilepb.c

index 4388fb0..f8a5bda 100644 (file)
@@ -52,6 +52,7 @@ static void beagle_init(ram_addr_t ram_size, int vga_ram_size,
 {
     struct beagle_s *s = (struct beagle_s *) qemu_mallocz(sizeof(*s));
     int sdindex = drive_get_index(IF_SD, 0, 0);
+    void *opaque;
     
     if (sdindex == -1) {
         fprintf(stderr, "%s: missing SecureDigital device\n", __FUNCTION__);
@@ -66,9 +67,9 @@ static void beagle_init(ram_addr_t ram_size, int vga_ram_size,
 
     s->i2c = omap_i2c_bus(s->cpu->i2c[0]);
     s->twl4030 = twl4030_init(s->i2c, s->cpu->irq[0][OMAP_INT_3XXX_SYS_NIRQ]);
-    smc91c111_init(&nd_table[0], 0x01000000,
-                    omap2_gpio_in_get(s->cpu->gpif, 51)[0]);
-/*  omap_gpmc_attach(s->cpu->gpmc, BEAGLE_SMC_CS, 0, 0, 0, NULL, NULL); */
+    opaque = smc91c111_init(&nd_table[0], 0x08000000,
+                    omap2_gpio_in_get(s->cpu->gpif, 54)[0], 0);
+    omap_gpmc_attach(s->cpu->gpmc, BEAGLE_SMC_CS, smc91c111_iomemtype(opaque), 0, 0, opaque, NULL);
 
        s->lcd_panel = omap3_lcd_panel_init();
        omap3_lcd_panel_attach(s->cpu->dss, 0, s->lcd_panel);
index a8afa94..92518c5 100644 (file)
@@ -4,7 +4,8 @@
 /* Devices that have nowhere better to go.  */
 
 /* smc91c111.c */
-void smc91c111_init(NICInfo *, uint32_t, qemu_irq);
+void *smc91c111_init(NICInfo *, uint32_t, qemu_irq, int phys_alloc);
+int smc91c111_iomemtype(void *opaque);
 
 /* ssd0323.c */
 int ssd0323_xfer_ssi(void *opaque, int data);
index 70abbdc..dfa239b 100644 (file)
@@ -78,7 +78,7 @@ static void connex_init(ram_addr_t ram_size, int vga_ram_size,
 
     /* Interrupt line of NIC is connected to GPIO line 36 */
     smc91c111_init(&nd_table[0], 0x04000300,
-                    pxa2xx_gpio_in_get(cpu->gpio)[36]);
+                    pxa2xx_gpio_in_get(cpu->gpio)[36], 1);
 }
 
 static void verdex_init(ram_addr_t ram_size, int vga_ram_size,
@@ -118,7 +118,7 @@ static void verdex_init(ram_addr_t ram_size, int vga_ram_size,
 
     /* Interrupt line of NIC is connected to GPIO line 99 */
     smc91c111_init(&nd_table[0], 0x04000300,
-                    pxa2xx_gpio_in_get(cpu->gpio)[99]);
+                    pxa2xx_gpio_in_get(cpu->gpio)[99], 1);
 }
 
 QEMUMachine connex_machine = {
index f990afe..145ae4d 100644 (file)
@@ -496,7 +496,7 @@ static void integratorcp_init(ram_addr_t ram_size, int vga_ram_size,
     }
     pl181_init(0x1c000000, drives_table[sd].bdrv, pic[23], pic[24]);
     if (nd_table[0].vlan)
-        smc91c111_init(&nd_table[0], 0xc8000000, pic[27]);
+        smc91c111_init(&nd_table[0], 0xc8000000, pic[27], 1);
     pl110_init(0xc0000000, pic[22], 0);
 
     integrator_binfo.ram_size = ram_size;
index 5f4cc91..36c6f4b 100644 (file)
@@ -125,7 +125,7 @@ static void mainstone_common_init(ram_addr_t ram_size, int vga_ram_size,
     /* MMC/SD host */
     pxa2xx_mmci_handlers(cpu->mmc, NULL, mst_irq[MMC_IRQ]);
 
-    smc91c111_init(&nd_table[0], MST_ETH_PHYS, mst_irq[ETHERNET_IRQ]);
+    smc91c111_init(&nd_table[0], MST_ETH_PHYS, mst_irq[ETHERNET_IRQ], 1);
 
     mainstone_binfo.kernel_filename = kernel_filename;
     mainstone_binfo.kernel_cmdline = kernel_cmdline;
index aae4b86..aa67c4f 100644 (file)
@@ -123,7 +123,7 @@ static void realview_init(ram_addr_t ram_size, int vga_ram_size,
         nd = &nd_table[n];
 
         if ((!nd->model && !done_smc) || strcmp(nd->model, "smc91c111") == 0) {
-            smc91c111_init(nd, 0x4e000000, pic[28]);
+            smc91c111_init(nd, 0x4e000000, pic[28], 1);
             done_smc = 1;
         } else {
             pci_nic_init(pci_bus, nd, -1, "rtl8139");
index f5b29a7..50160ad 100644 (file)
@@ -37,6 +37,7 @@ typedef struct {
     int rx_fifo[NUM_PACKETS];
     int tx_fifo_done_len;
     int tx_fifo_done[NUM_PACKETS];
+    int iomemtype;
     /* Packet buffer memory.  */
     uint8_t data[NUM_PACKETS][2048];
     uint8_t int_level;
@@ -690,17 +691,22 @@ static CPUWriteMemoryFunc *smc91c111_writefn[] = {
     smc91c111_writel
 };
 
-void smc91c111_init(NICInfo *nd, uint32_t base, qemu_irq irq)
+int smc91c111_iomemtype(void *opaque) {
+    smc91c111_state *s=(smc91c111_state *) opaque;
+    return s->iomemtype;
+}
+
+void *smc91c111_init(NICInfo *nd, uint32_t base, qemu_irq irq, int phys_alloc)
 {
     smc91c111_state *s;
-    int iomemtype;
 
     qemu_check_nic_model(nd, "smc91c111");
 
     s = (smc91c111_state *)qemu_mallocz(sizeof(smc91c111_state));
-    iomemtype = cpu_register_io_memory(0, smc91c111_readfn,
-                                       smc91c111_writefn, s);
-    cpu_register_physical_memory(base, 16, iomemtype);
+    s->iomemtype = cpu_register_io_memory(0, smc91c111_readfn,
+                                          smc91c111_writefn, s);
+    if (phys_alloc)
+        cpu_register_physical_memory(base, 16, s->iomemtype);
     s->irq = irq;
     memcpy(s->macaddr, nd->macaddr, 6);
 
@@ -710,4 +716,5 @@ void smc91c111_init(NICInfo *nd, uint32_t base, qemu_irq irq)
                                  smc91c111_receive, smc91c111_can_receive, s);
     qemu_format_nic_info_str(s->vc, s->macaddr);
     /* ??? Save/restore.  */
+    return s;
 }
index d80e2f2..ca34619 100644 (file)
@@ -194,7 +194,7 @@ static void versatile_init(ram_addr_t ram_size, int vga_ram_size,
         nd = &nd_table[n];
 
         if ((!nd->model && !done_smc) || strcmp(nd->model, "smc91c111") == 0) {
-            smc91c111_init(nd, 0x10010000, sic[25]);
+            smc91c111_init(nd, 0x10010000, sic[25], 1);
             done_smc = 1;
         } else {
             pci_nic_init(pci_bus, nd, -1, "rtl8139");