153018216SPaolo Bonzini /* 253018216SPaolo Bonzini * Gumstix Platforms 353018216SPaolo Bonzini * 453018216SPaolo Bonzini * Copyright (c) 2007 by Thorsten Zitterell <info@bitmux.org> 553018216SPaolo Bonzini * 653018216SPaolo Bonzini * Code based on spitz platform by Andrzej Zaborowski <balrog@zabor.org> 753018216SPaolo Bonzini * 853018216SPaolo Bonzini * This code is licensed under the GNU GPL v2. 953018216SPaolo Bonzini * 1053018216SPaolo Bonzini * Contributions after 2012-01-13 are licensed under the terms of the 1153018216SPaolo Bonzini * GNU GPL, version 2 or (at your option) any later version. 1253018216SPaolo Bonzini */ 1353018216SPaolo Bonzini 1453018216SPaolo Bonzini /* 1553018216SPaolo Bonzini * Example usage: 1653018216SPaolo Bonzini * 1753018216SPaolo Bonzini * connex: 1853018216SPaolo Bonzini * ======= 1953018216SPaolo Bonzini * create image: 2053018216SPaolo Bonzini * # dd of=flash bs=1k count=16k if=/dev/zero 2153018216SPaolo Bonzini * # dd of=flash bs=1k conv=notrunc if=u-boot.bin 2253018216SPaolo Bonzini * # dd of=flash bs=1k conv=notrunc seek=256 if=rootfs.arm_nofpu.jffs2 2353018216SPaolo Bonzini * start it: 2453018216SPaolo Bonzini * # qemu-system-arm -M connex -pflash flash -monitor null -nographic 2553018216SPaolo Bonzini * 2653018216SPaolo Bonzini * verdex: 2753018216SPaolo Bonzini * ======= 2853018216SPaolo Bonzini * create image: 2953018216SPaolo Bonzini * # dd of=flash bs=1k count=32k if=/dev/zero 3053018216SPaolo Bonzini * # dd of=flash bs=1k conv=notrunc if=u-boot.bin 3153018216SPaolo Bonzini * # dd of=flash bs=1k conv=notrunc seek=256 if=rootfs.arm_nofpu.jffs2 3253018216SPaolo Bonzini * # dd of=flash bs=1k conv=notrunc seek=31744 if=uImage 3353018216SPaolo Bonzini * start it: 3453018216SPaolo Bonzini * # qemu-system-arm -M verdex -pflash flash -monitor null -nographic -m 289 3553018216SPaolo Bonzini */ 3653018216SPaolo Bonzini 3712b16722SPeter Maydell #include "qemu/osdep.h" 38*c0dbca36SAlistair Francis #include "qemu/error-report.h" 3953018216SPaolo Bonzini #include "hw/hw.h" 400d09e41aSPaolo Bonzini #include "hw/arm/pxa.h" 4153018216SPaolo Bonzini #include "net/net.h" 420d09e41aSPaolo Bonzini #include "hw/block/flash.h" 43bd2be150SPeter Maydell #include "hw/devices.h" 4453018216SPaolo Bonzini #include "hw/boards.h" 45fa1d36dfSMarkus Armbruster #include "sysemu/block-backend.h" 4653018216SPaolo Bonzini #include "exec/address-spaces.h" 47bdf921d6SAndreas Färber #include "sysemu/qtest.h" 48ba1ba5ccSIgor Mammedov #include "cpu.h" 4953018216SPaolo Bonzini 5053018216SPaolo Bonzini static const int sector_len = 128 * 1024; 5153018216SPaolo Bonzini 523ef96221SMarcel Apfelbaum static void connex_init(MachineState *machine) 5353018216SPaolo Bonzini { 5453018216SPaolo Bonzini PXA2xxState *cpu; 5553018216SPaolo Bonzini DriveInfo *dinfo; 5653018216SPaolo Bonzini int be; 5753018216SPaolo Bonzini MemoryRegion *address_space_mem = get_system_memory(); 5853018216SPaolo Bonzini 5953018216SPaolo Bonzini uint32_t connex_rom = 0x01000000; 6053018216SPaolo Bonzini uint32_t connex_ram = 0x04000000; 6153018216SPaolo Bonzini 6253018216SPaolo Bonzini cpu = pxa255_init(address_space_mem, connex_ram); 6353018216SPaolo Bonzini 6453018216SPaolo Bonzini dinfo = drive_get(IF_PFLASH, 0, 0); 65bdf921d6SAndreas Färber if (!dinfo && !qtest_enabled()) { 66*c0dbca36SAlistair Francis error_report("A flash image must be given with the " 67*c0dbca36SAlistair Francis "'pflash' parameter"); 6853018216SPaolo Bonzini exit(1); 6953018216SPaolo Bonzini } 7053018216SPaolo Bonzini 7153018216SPaolo Bonzini #ifdef TARGET_WORDS_BIGENDIAN 7253018216SPaolo Bonzini be = 1; 7353018216SPaolo Bonzini #else 7453018216SPaolo Bonzini be = 0; 7553018216SPaolo Bonzini #endif 7653018216SPaolo Bonzini if (!pflash_cfi01_register(0x00000000, NULL, "connext.rom", connex_rom, 774be74634SMarkus Armbruster dinfo ? blk_by_legacy_dinfo(dinfo) : NULL, 78bdf921d6SAndreas Färber sector_len, connex_rom / sector_len, 7953018216SPaolo Bonzini 2, 0, 0, 0, 0, be)) { 80*c0dbca36SAlistair Francis error_report("Error registering flash memory"); 8153018216SPaolo Bonzini exit(1); 8253018216SPaolo Bonzini } 8353018216SPaolo Bonzini 8453018216SPaolo Bonzini /* Interrupt line of NIC is connected to GPIO line 36 */ 8553018216SPaolo Bonzini smc91c111_init(&nd_table[0], 0x04000300, 8653018216SPaolo Bonzini qdev_get_gpio_in(cpu->gpio, 36)); 8753018216SPaolo Bonzini } 8853018216SPaolo Bonzini 893ef96221SMarcel Apfelbaum static void verdex_init(MachineState *machine) 9053018216SPaolo Bonzini { 9153018216SPaolo Bonzini PXA2xxState *cpu; 9253018216SPaolo Bonzini DriveInfo *dinfo; 9353018216SPaolo Bonzini int be; 9453018216SPaolo Bonzini MemoryRegion *address_space_mem = get_system_memory(); 9553018216SPaolo Bonzini 9653018216SPaolo Bonzini uint32_t verdex_rom = 0x02000000; 9753018216SPaolo Bonzini uint32_t verdex_ram = 0x10000000; 9853018216SPaolo Bonzini 99ba1ba5ccSIgor Mammedov cpu = pxa270_init(address_space_mem, verdex_ram, machine->cpu_type); 10053018216SPaolo Bonzini 10153018216SPaolo Bonzini dinfo = drive_get(IF_PFLASH, 0, 0); 102bdf921d6SAndreas Färber if (!dinfo && !qtest_enabled()) { 103*c0dbca36SAlistair Francis error_report("A flash image must be given with the " 104*c0dbca36SAlistair Francis "'pflash' parameter"); 10553018216SPaolo Bonzini exit(1); 10653018216SPaolo Bonzini } 10753018216SPaolo Bonzini 10853018216SPaolo Bonzini #ifdef TARGET_WORDS_BIGENDIAN 10953018216SPaolo Bonzini be = 1; 11053018216SPaolo Bonzini #else 11153018216SPaolo Bonzini be = 0; 11253018216SPaolo Bonzini #endif 11353018216SPaolo Bonzini if (!pflash_cfi01_register(0x00000000, NULL, "verdex.rom", verdex_rom, 1144be74634SMarkus Armbruster dinfo ? blk_by_legacy_dinfo(dinfo) : NULL, 115bdf921d6SAndreas Färber sector_len, verdex_rom / sector_len, 11653018216SPaolo Bonzini 2, 0, 0, 0, 0, be)) { 117*c0dbca36SAlistair Francis error_report("Error registering flash memory"); 11853018216SPaolo Bonzini exit(1); 11953018216SPaolo Bonzini } 12053018216SPaolo Bonzini 12153018216SPaolo Bonzini /* Interrupt line of NIC is connected to GPIO line 99 */ 12253018216SPaolo Bonzini smc91c111_init(&nd_table[0], 0x04000300, 12353018216SPaolo Bonzini qdev_get_gpio_in(cpu->gpio, 99)); 12453018216SPaolo Bonzini } 12553018216SPaolo Bonzini 1268a661aeaSAndreas Färber static void connex_class_init(ObjectClass *oc, void *data) 12753018216SPaolo Bonzini { 1288a661aeaSAndreas Färber MachineClass *mc = MACHINE_CLASS(oc); 1298a661aeaSAndreas Färber 130e264d29dSEduardo Habkost mc->desc = "Gumstix Connex (PXA255)"; 131e264d29dSEduardo Habkost mc->init = connex_init; 1324672cbd7SPeter Maydell mc->ignore_memory_transaction_failures = true; 13353018216SPaolo Bonzini } 13453018216SPaolo Bonzini 1358a661aeaSAndreas Färber static const TypeInfo connex_type = { 1368a661aeaSAndreas Färber .name = MACHINE_TYPE_NAME("connex"), 1378a661aeaSAndreas Färber .parent = TYPE_MACHINE, 1388a661aeaSAndreas Färber .class_init = connex_class_init, 1398a661aeaSAndreas Färber }; 140e264d29dSEduardo Habkost 1418a661aeaSAndreas Färber static void verdex_class_init(ObjectClass *oc, void *data) 142e264d29dSEduardo Habkost { 1438a661aeaSAndreas Färber MachineClass *mc = MACHINE_CLASS(oc); 1448a661aeaSAndreas Färber 145e264d29dSEduardo Habkost mc->desc = "Gumstix Verdex (PXA270)"; 146e264d29dSEduardo Habkost mc->init = verdex_init; 1474672cbd7SPeter Maydell mc->ignore_memory_transaction_failures = true; 148ba1ba5ccSIgor Mammedov mc->default_cpu_type = ARM_CPU_TYPE_NAME("pxa270-c0"); 149e264d29dSEduardo Habkost } 150e264d29dSEduardo Habkost 1518a661aeaSAndreas Färber static const TypeInfo verdex_type = { 1528a661aeaSAndreas Färber .name = MACHINE_TYPE_NAME("verdex"), 1538a661aeaSAndreas Färber .parent = TYPE_MACHINE, 1548a661aeaSAndreas Färber .class_init = verdex_class_init, 1558a661aeaSAndreas Färber }; 1568a661aeaSAndreas Färber 1578a661aeaSAndreas Färber static void gumstix_machine_init(void) 1588a661aeaSAndreas Färber { 1598a661aeaSAndreas Färber type_register_static(&connex_type); 1608a661aeaSAndreas Färber type_register_static(&verdex_type); 1618a661aeaSAndreas Färber } 1628a661aeaSAndreas Färber 1630e6aac87SEduardo Habkost type_init(gumstix_machine_init) 164