blob: 5cf7b84c7956ee1b16d70ca641115979ed0bc4fb [file] [log] [blame]
Edgar E. Iglesias6a8b1ae2009-05-20 20:16:11 +02001/*
2 * Model of Petalogix linux reference design targeting Xilinx Spartan 3ADSP-1800
3 * boards.
4 *
5 * Copyright (c) 2009 Edgar E. Iglesias.
6 *
7 * Permission is hereby granted, free of charge, to any person obtaining a copy
8 * of this software and associated documentation files (the "Software"), to deal
9 * in the Software without restriction, including without limitation the rights
10 * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
11 * copies of the Software, and to permit persons to whom the Software is
12 * furnished to do so, subject to the following conditions:
13 *
14 * The above copyright notice and this permission notice shall be included in
15 * all copies or substantial portions of the Software.
16 *
17 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
18 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
19 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
20 * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
21 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
22 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
23 * THE SOFTWARE.
24 */
25
Peter Maydell8fd9dec2016-01-26 18:05:31 +000026#include "qemu/osdep.h"
Philippe Mathieu-Daudéa4fb3312018-06-25 09:42:16 -030027#include "qemu/units.h"
Markus Armbrusterda34e652016-03-14 09:01:28 +010028#include "qapi/error.h"
Paolo Bonzini4771d752016-01-19 21:51:44 +010029#include "qemu-common.h"
30#include "cpu.h"
Paolo Bonzini83c9f4c2013-02-04 15:40:22 +010031#include "hw/sysbus.h"
32#include "hw/hw.h"
Paolo Bonzini1422e322012-10-24 08:43:34 +020033#include "net/net.h"
Paolo Bonzini0d09e412013-02-05 17:06:20 +010034#include "hw/block/flash.h"
Paolo Bonzini9c17d612012-12-17 18:20:04 +010035#include "sysemu/sysemu.h"
Peter Maydellbd2be152013-04-09 15:26:55 +010036#include "hw/devices.h"
Paolo Bonzini83c9f4c2013-02-04 15:40:22 +010037#include "hw/boards.h"
Paolo Bonzini022c62c2012-12-17 18:19:49 +010038#include "exec/address-spaces.h"
xiaoqiang zhao1b6d0782016-06-06 16:59:32 +010039#include "hw/char/xilinx_uartlite.h"
Edgar E. Iglesias6a8b1ae2009-05-20 20:16:11 +020040
Paolo Bonzini47b43a12013-03-18 17:36:02 +010041#include "boot.h"
Peter A. G. Crosthwaiteb861b742011-08-22 18:15:25 +100042
Philippe Mathieu-Daudéa4fb3312018-06-25 09:42:16 -030043#define LMB_BRAM_SIZE (128 * KiB)
44#define FLASH_SIZE (16 * MiB)
Edgar E. Iglesias6a8b1ae2009-05-20 20:16:11 +020045
Edgar E. Iglesias6a8b1ae2009-05-20 20:16:11 +020046#define BINARY_DEVICE_TREE_FILE "petalogix-s3adsp1800.dtb"
Aurelien Jarno409dbce2010-03-14 21:20:59 +010047
Peter A. G. Crosthwaitecba1fd32012-03-04 21:03:53 +100048#define MEMORY_BASEADDR 0x90000000
49#define FLASH_BASEADDR 0xa0000000
50#define INTC_BASEADDR 0x81800000
51#define TIMER_BASEADDR 0x83c00000
52#define UARTLITE_BASEADDR 0x84000000
53#define ETHLITE_BASEADDR 0x81000000
54
Peter Crosthwaite05a738c2014-02-25 16:38:19 -080055#define TIMER_IRQ 0
56#define ETHLITE_IRQ 1
57#define UARTLITE_IRQ 3
58
Edgar E. Iglesias6a8b1ae2009-05-20 20:16:11 +020059static void
Marcel Apfelbaum3ef96222014-05-07 17:42:57 +030060petalogix_s3adsp1800_init(MachineState *machine)
Edgar E. Iglesias6a8b1ae2009-05-20 20:16:11 +020061{
Marcel Apfelbaum3ef96222014-05-07 17:42:57 +030062 ram_addr_t ram_size = machine->ram_size;
Edgar E. Iglesias6a8b1ae2009-05-20 20:16:11 +020063 DeviceState *dev;
Andreas Färber3ed60732012-05-05 12:20:29 +020064 MicroBlazeCPU *cpu;
Gerd Hoffmann751c6a12009-07-22 16:42:57 +020065 DriveInfo *dinfo;
Edgar E. Iglesias6a8b1ae2009-05-20 20:16:11 +020066 int i;
Avi Kivitya8170e52012-10-23 12:30:10 +020067 hwaddr ddr_base = MEMORY_BASEADDR;
Avi Kivity589f0aa2011-09-12 16:31:50 +030068 MemoryRegion *phys_lmb_bram = g_new(MemoryRegion, 1);
69 MemoryRegion *phys_ram = g_new(MemoryRegion, 1);
Alistair Francis73c69452014-01-13 13:35:26 +100070 qemu_irq irq[32];
Avi Kivity589f0aa2011-09-12 16:31:50 +030071 MemoryRegion *sysmem = get_system_memory();
Edgar E. Iglesias6a8b1ae2009-05-20 20:16:11 +020072
Peter Crosthwaited87636b2015-05-24 20:31:40 -070073 cpu = MICROBLAZE_CPU(object_new(TYPE_MICROBLAZE_CPU));
Edgar E. Iglesiasad24f942015-11-13 16:55:00 +010074 object_property_set_str(OBJECT(cpu), "7.10.d", "version", &error_abort);
Peter Crosthwaited87636b2015-05-24 20:31:40 -070075 object_property_set_bool(OBJECT(cpu), true, "realized", &error_abort);
Edgar E. Iglesias6a8b1ae2009-05-20 20:16:11 +020076
Edgar E. Iglesias6a8b1ae2009-05-20 20:16:11 +020077 /* Attach emulated BRAM through the LMB. */
Peter Maydell98a99ce2017-07-07 15:42:53 +010078 memory_region_init_ram(phys_lmb_bram, NULL,
Hu Tao49946532014-09-09 13:27:55 +080079 "petalogix_s3adsp1800.lmb_bram", LMB_BRAM_SIZE,
Markus Armbrusterf8ed85a2015-09-11 16:51:43 +020080 &error_fatal);
Avi Kivity589f0aa2011-09-12 16:31:50 +030081 memory_region_add_subregion(sysmem, 0x00000000, phys_lmb_bram);
Edgar E. Iglesias6a8b1ae2009-05-20 20:16:11 +020082
Peter Maydell98a99ce2017-07-07 15:42:53 +010083 memory_region_init_ram(phys_ram, NULL, "petalogix_s3adsp1800.ram",
Markus Armbrusterf8ed85a2015-09-11 16:51:43 +020084 ram_size, &error_fatal);
Avi Kivity589f0aa2011-09-12 16:31:50 +030085 memory_region_add_subregion(sysmem, ddr_base, phys_ram);
Edgar E. Iglesias6a8b1ae2009-05-20 20:16:11 +020086
Gerd Hoffmann751c6a12009-07-22 16:42:57 +020087 dinfo = drive_get(IF_PFLASH, 0, 0);
Peter A. G. Crosthwaitecba1fd32012-03-04 21:03:53 +100088 pflash_cfi01_register(FLASH_BASEADDR,
Avi Kivitycfe5f012011-08-04 15:55:30 +030089 NULL, "petalogix_s3adsp1800.flash", FLASH_SIZE,
Markus Armbruster4be74632014-10-07 13:59:18 +020090 dinfo ? blk_by_legacy_dinfo(dinfo) : NULL,
Philippe Mathieu-Daudéa4fb3312018-06-25 09:42:16 -030091 64 * KiB, FLASH_SIZE >> 16,
Anthony Liguori01e04512011-08-25 14:39:18 -050092 1, 0x89, 0x18, 0x0000, 0x0, 1);
Edgar E. Iglesias6a8b1ae2009-05-20 20:16:11 +020093
Peter Crosthwaite13c9bfb2014-02-25 16:40:04 -080094 dev = qdev_create(NULL, "xlnx.xps-intc");
95 qdev_prop_set_uint32(dev, "kind-of-intr",
96 1 << ETHLITE_IRQ | 1 << UARTLITE_IRQ);
97 qdev_init_nofail(dev);
98 sysbus_mmio_map(SYS_BUS_DEVICE(dev), 0, INTC_BASEADDR);
99 sysbus_connect_irq(SYS_BUS_DEVICE(dev), 0,
100 qdev_get_gpio_in(DEVICE(cpu), MB_CPU_IRQ));
Edgar E. Iglesias6a8b1ae2009-05-20 20:16:11 +0200101 for (i = 0; i < 32; i++) {
102 irq[i] = qdev_get_gpio_in(dev, i);
103 }
104
xiaoqiang zhao1b6d0782016-06-06 16:59:32 +0100105 xilinx_uartlite_create(UARTLITE_BASEADDR, irq[UARTLITE_IRQ],
Peter Maydell9bca0ed2018-04-20 15:52:43 +0100106 serial_hd(0));
Peter Crosthwaite29873712014-02-25 16:40:39 -0800107
Edgar E. Iglesias6a8b1ae2009-05-20 20:16:11 +0200108 /* 2 timers at irq 2 @ 62 Mhz. */
Peter Crosthwaite29873712014-02-25 16:40:39 -0800109 dev = qdev_create(NULL, "xlnx.xps-timer");
110 qdev_prop_set_uint32(dev, "one-timer-only", 0);
111 qdev_prop_set_uint32(dev, "clock-frequency", 62 * 1000000);
112 qdev_init_nofail(dev);
113 sysbus_mmio_map(SYS_BUS_DEVICE(dev), 0, TIMER_BASEADDR);
114 sysbus_connect_irq(SYS_BUS_DEVICE(dev), 0, irq[TIMER_IRQ]);
115
Peter Crosthwaiteb8d4e1c2014-02-25 16:41:14 -0800116 qemu_check_nic_model(&nd_table[0], "xlnx.xps-ethernetlite");
117 dev = qdev_create(NULL, "xlnx.xps-ethernetlite");
118 qdev_set_nic_properties(dev, &nd_table[0]);
119 qdev_prop_set_uint32(dev, "tx-ping-pong", 0);
120 qdev_prop_set_uint32(dev, "rx-ping-pong", 0);
121 qdev_init_nofail(dev);
122 sysbus_mmio_map(SYS_BUS_DEVICE(dev), 0, ETHLITE_BASEADDR);
123 sysbus_connect_irq(SYS_BUS_DEVICE(dev), 0, irq[ETHLITE_IRQ]);
Edgar E. Iglesias6a8b1ae2009-05-20 20:16:11 +0200124
Andreas Färberbf494362012-05-05 12:30:53 +0200125 microblaze_load_kernel(cpu, ddr_base, ram_size,
Marcel Apfelbaum3ef96222014-05-07 17:42:57 +0300126 machine->initrd_filename,
Edgar E. Iglesiasec426ff2013-05-05 11:06:37 +0200127 BINARY_DEVICE_TREE_FILE,
Alistair Francis033af8e2015-06-18 21:16:48 -0700128 NULL);
Edgar E. Iglesias6a8b1ae2009-05-20 20:16:11 +0200129}
130
Eduardo Habkoste264d292015-09-04 15:37:08 -0300131static void petalogix_s3adsp1800_machine_init(MachineClass *mc)
Edgar E. Iglesias6a8b1ae2009-05-20 20:16:11 +0200132{
Eduardo Habkoste264d292015-09-04 15:37:08 -0300133 mc->desc = "PetaLogix linux refdesign for xilinx Spartan 3ADSP1800";
134 mc->init = petalogix_s3adsp1800_init;
135 mc->is_default = 1;
Edgar E. Iglesias6a8b1ae2009-05-20 20:16:11 +0200136}
137
Eduardo Habkoste264d292015-09-04 15:37:08 -0300138DEFINE_MACHINE("petalogix-s3adsp1800", petalogix_s3adsp1800_machine_init)