blob: a0ad1b8dc7e32385b0a0aba896ae12fa5aabd1e8 [file] [log] [blame]
Dmitry Eremin-Solenikovc64b21d2011-04-19 18:56:46 +04001/*
2 * SA-1110-based Sharp Zaurus SL-5500 platform.
3 *
4 * Copyright (C) 2011 Dmitry Eremin-Solenikov
5 *
6 * This code is licensed under GNU GPL v2.
Paolo Bonzini6b620ca2012-01-13 17:44:23 +01007 *
8 * Contributions after 2012-01-13 are licensed under the terms of the
9 * GNU GPL, version 2 or (at your option) any later version.
Dmitry Eremin-Solenikovc64b21d2011-04-19 18:56:46 +040010 */
Peter Maydell12b16722015-12-07 16:23:45 +000011#include "qemu/osdep.h"
Markus Armbrusterce147102019-03-08 10:46:10 +010012#include "qemu/units.h"
Igor Mammedov00b98292020-02-19 11:08:45 -050013#include "qemu/cutils.h"
Paolo Bonzini83c9f4c2013-02-04 15:40:22 +010014#include "hw/sysbus.h"
15#include "hw/boards.h"
Paolo Bonzini47b43a12013-03-18 17:36:02 +010016#include "strongarm.h"
Peter Maydell12ec8bd2019-05-23 14:47:43 +010017#include "hw/arm/boot.h"
Paolo Bonzini0d09e412013-02-05 17:06:20 +010018#include "hw/block/flash.h"
Paolo Bonzini022c62c2012-12-17 18:19:49 +010019#include "exec/address-spaces.h"
Igor Mammedovba1ba5c2017-09-13 18:04:57 +020020#include "cpu.h"
Eduardo Habkostdb1015e2020-09-03 16:43:22 -040021#include "qom/object.h"
Richard Hendersoncc37d982023-03-15 17:43:13 +000022#include "qemu/error-report.h"
23
Dmitry Eremin-Solenikovc64b21d2011-04-19 18:56:46 +040024
Philippe Mathieu-Daudé50f9b332023-01-09 12:53:06 +010025#define RAM_SIZE (512 * MiB)
26#define FLASH_SIZE (32 * MiB)
27#define FLASH_SECTOR_SIZE (64 * KiB)
28
Eduardo Habkostdb1015e2020-09-03 16:43:22 -040029struct CollieMachineState {
Peter Maydell8a2b76f2020-03-26 20:49:19 +000030 MachineState parent;
31
32 StrongARMState *sa1110;
Eduardo Habkostdb1015e2020-09-03 16:43:22 -040033};
Peter Maydell8a2b76f2020-03-26 20:49:19 +000034
35#define TYPE_COLLIE_MACHINE MACHINE_TYPE_NAME("collie")
Eduardo Habkost80633962020-09-16 14:25:19 -040036OBJECT_DECLARE_SIMPLE_TYPE(CollieMachineState, COLLIE_MACHINE)
Peter Maydell8a2b76f2020-03-26 20:49:19 +000037
Dmitry Eremin-Solenikovc64b21d2011-04-19 18:56:46 +040038static struct arm_boot_info collie_binfo = {
39 .loader_start = SA_SDCS0,
Philippe Mathieu-Daudé50f9b332023-01-09 12:53:06 +010040 .ram_size = RAM_SIZE,
Dmitry Eremin-Solenikovc64b21d2011-04-19 18:56:46 +040041};
42
Marcel Apfelbaum3ef96222014-05-07 17:42:57 +030043static void collie_init(MachineState *machine)
Dmitry Eremin-Solenikovc64b21d2011-04-19 18:56:46 +040044{
Igor Mammedov00b98292020-02-19 11:08:45 -050045 MachineClass *mc = MACHINE_GET_CLASS(machine);
Peter Maydell8a2b76f2020-03-26 20:49:19 +000046 CollieMachineState *cms = COLLIE_MACHINE(machine);
Igor Mammedov00b98292020-02-19 11:08:45 -050047
48 if (machine->ram_size != mc->default_ram_size) {
49 char *sz = size_to_str(mc->default_ram_size);
50 error_report("Invalid RAM size, should be %s", sz);
51 g_free(sz);
52 exit(EXIT_FAILURE);
53 }
Dmitry Eremin-Solenikovc64b21d2011-04-19 18:56:46 +040054
Peter Maydell8a2b76f2020-03-26 20:49:19 +000055 cms->sa1110 = sa1110_init(machine->cpu_type);
Philippe Mathieu-Daudé3cd892d2019-10-22 16:50:38 +010056
Igor Mammedov00b98292020-02-19 11:08:45 -050057 memory_region_add_subregion(get_system_memory(), SA_SDCS0, machine->ram);
Dmitry Eremin-Solenikovc64b21d2011-04-19 18:56:46 +040058
Philippe Mathieu-Daudéec177b72023-01-09 12:53:07 +010059 for (unsigned i = 0; i < 2; i++) {
60 DriveInfo *dinfo = drive_get(IF_PFLASH, 0, i);
61 pflash_cfi01_register(i ? SA_CS1 : SA_CS0,
62 i ? "collie.fl2" : "collie.fl1", FLASH_SIZE,
63 dinfo ? blk_by_legacy_dinfo(dinfo) : NULL,
64 FLASH_SECTOR_SIZE, 4, 0x00, 0x00, 0x00, 0x00, 0);
65 }
Dmitry Eremin-Solenikovc64b21d2011-04-19 18:56:46 +040066
67 sysbus_create_simple("scoop", 0x40800000, NULL);
68
Dmitry Eremin-Solenikovc64b21d2011-04-19 18:56:46 +040069 collie_binfo.board_id = 0x208;
Peter Maydell8a2b76f2020-03-26 20:49:19 +000070 arm_load_kernel(cms->sa1110->cpu, machine, &collie_binfo);
Dmitry Eremin-Solenikovc64b21d2011-04-19 18:56:46 +040071}
72
Peter Maydell8a2b76f2020-03-26 20:49:19 +000073static void collie_machine_class_init(ObjectClass *oc, void *data)
Dmitry Eremin-Solenikovc64b21d2011-04-19 18:56:46 +040074{
Peter Maydell8a2b76f2020-03-26 20:49:19 +000075 MachineClass *mc = MACHINE_CLASS(oc);
76
Ryo ONODERAad1e8db2015-10-16 11:14:53 +010077 mc->desc = "Sharp SL-5500 (Collie) PDA (SA-1110)";
Eduardo Habkoste264d292015-09-04 15:37:08 -030078 mc->init = collie_init;
Peter Maydell4672cbd2017-09-07 13:54:54 +010079 mc->ignore_memory_transaction_failures = true;
Igor Mammedovba1ba5c2017-09-13 18:04:57 +020080 mc->default_cpu_type = ARM_CPU_TYPE_NAME("sa1110");
Philippe Mathieu-Daudé50f9b332023-01-09 12:53:06 +010081 mc->default_ram_size = RAM_SIZE;
Igor Mammedov00b98292020-02-19 11:08:45 -050082 mc->default_ram_id = "strongarm.sdram";
Dmitry Eremin-Solenikovc64b21d2011-04-19 18:56:46 +040083}
84
Peter Maydell8a2b76f2020-03-26 20:49:19 +000085static const TypeInfo collie_machine_typeinfo = {
86 .name = TYPE_COLLIE_MACHINE,
87 .parent = TYPE_MACHINE,
88 .class_init = collie_machine_class_init,
89 .instance_size = sizeof(CollieMachineState),
90};
91
92static void collie_machine_register_types(void)
93{
94 type_register_static(&collie_machine_typeinfo);
95}
96type_init(collie_machine_register_types);