]> git.proxmox.com Git - mirror_qemu.git/blame - hw/alpha/dp264.c
include/crypto: Include qapi-types.h or qemu/bswap.h instead of qemu-common.h
[mirror_qemu.git] / hw / alpha / dp264.c
CommitLineData
80bb2ff7
RH
1/*
2 * QEMU Alpha DP264/CLIPPER hardware system emulator.
3 *
4 * Choose CLIPPER IRQ mappings over, say, DP264, MONET, or WEBBRICK
66a0a2cb 5 * variants because CLIPPER doesn't have an SMC669 SuperIO controller
80bb2ff7
RH
6 * that we need to emulate as well.
7 */
8
e2e5e114 9#include "qemu/osdep.h"
83c9f4ca 10#include "hw/hw.h"
80bb2ff7 11#include "elf.h"
83c9f4ca
PB
12#include "hw/loader.h"
13#include "hw/boards.h"
47b43a1f 14#include "alpha_sys.h"
c525436e 15#include "qemu/error-report.h"
9c17d615 16#include "sysemu/sysemu.h"
0d09e41a 17#include "hw/timer/mc146818rtc.h"
83c9f4ca 18#include "hw/ide.h"
0d09e41a
PB
19#include "hw/timer/i8254.h"
20#include "hw/char/serial.h"
80bb2ff7
RH
21
22#define MAX_IDE_BUS 2
23
24static uint64_t cpu_alpha_superpage_to_phys(void *opaque, uint64_t addr)
25{
26 if (((addr >> 41) & 3) == 2) {
27 addr &= 0xffffffffffull;
28 }
29 return addr;
30}
31
32/* Note that there are at least 3 viewpoints of IRQ numbers on Alpha systems.
33 (0) The dev_irq_n lines into the cpu, which we totally ignore,
34 (1) The DRIR lines in the typhoon chipset,
35 (2) The "vector" aka mangled interrupt number reported by SRM PALcode,
36 (3) The interrupt number assigned by the kernel.
37 The following function is concerned with (1) only. */
38
39static int clipper_pci_map_irq(PCIDevice *d, int irq_num)
40{
41 int slot = d->devfn >> 3;
42
43 assert(irq_num >= 0 && irq_num <= 3);
44
45 return (slot + 1) * 4 + irq_num;
46}
47
3ef96221 48static void clipper_init(MachineState *machine)
80bb2ff7 49{
3ef96221
MA
50 ram_addr_t ram_size = machine->ram_size;
51 const char *cpu_model = machine->cpu_model;
52 const char *kernel_filename = machine->kernel_filename;
53 const char *kernel_cmdline = machine->kernel_cmdline;
54 const char *initrd_filename = machine->initrd_filename;
ad601177 55 AlphaCPU *cpus[4];
80bb2ff7 56 PCIBus *pci_bus;
48a18b3c 57 ISABus *isa_bus;
80bb2ff7
RH
58 qemu_irq rtc_irq;
59 long size, i;
c18f8556 60 char *palcode_filename;
80bb2ff7
RH
61 uint64_t palcode_entry, palcode_low, palcode_high;
62 uint64_t kernel_entry, kernel_low, kernel_high;
63
64 /* Create up to 4 cpus. */
65 memset(cpus, 0, sizeof(cpus));
66 for (i = 0; i < smp_cpus; ++i) {
ad601177 67 cpus[i] = cpu_alpha_init(cpu_model ? cpu_model : "ev67");
80bb2ff7
RH
68 }
69
ad601177
AF
70 cpus[0]->env.trap_arg0 = ram_size;
71 cpus[0]->env.trap_arg1 = 0;
72 cpus[0]->env.trap_arg2 = smp_cpus;
80bb2ff7
RH
73
74 /* Init the chipset. */
71baa303
HP
75 pci_bus = typhoon_init(ram_size, &isa_bus, &rtc_irq, cpus,
76 clipper_pci_map_irq);
80bb2ff7 77
e605e969
RH
78 /* Since we have an SRM-compatible PALcode, use the SRM epoch. */
79 rtc_init(isa_bus, 1900, rtc_irq);
80
319ba9f5 81 pit_init(isa_bus, 0x40, 0, NULL);
48a18b3c 82 isa_create_simple(isa_bus, "i8042");
80bb2ff7
RH
83
84 /* VGA setup. Don't bother loading the bios. */
606f90cc 85 pci_vga_init(pci_bus);
80bb2ff7
RH
86
87 /* Serial code setup. */
b6607a1a 88 serial_hds_isa_init(isa_bus, MAX_SERIAL_PORTS);
80bb2ff7
RH
89
90 /* Network setup. e1000 is good enough, failing Tulip support. */
91 for (i = 0; i < nb_nics; i++) {
29b358f9 92 pci_nic_init_nofail(&nd_table[i], pci_bus, "e1000", NULL);
80bb2ff7
RH
93 }
94
95 /* IDE disk setup. */
96 {
97 DriveInfo *hd[MAX_IDE_BUS * MAX_IDE_DEVS];
d8f94e1b 98 ide_drive_get(hd, ARRAY_SIZE(hd));
80bb2ff7
RH
99
100 pci_cmd646_ide_init(pci_bus, hd, 0);
101 }
102
103 /* Load PALcode. Given that this is not "real" cpu palcode,
104 but one explicitly written for the emulation, we might as
105 well load it directly from and ELF image. */
c18f8556
SZ
106 palcode_filename = qemu_find_file(QEMU_FILE_TYPE_BIOS,
107 bios_name ? bios_name : "palcode-clipper");
80bb2ff7 108 if (palcode_filename == NULL) {
c525436e 109 error_report("no palcode provided");
80bb2ff7
RH
110 exit(1);
111 }
112 size = load_elf(palcode_filename, cpu_alpha_superpage_to_phys,
113 NULL, &palcode_entry, &palcode_low, &palcode_high,
7ef295ea 114 0, EM_ALPHA, 0, 0);
80bb2ff7 115 if (size < 0) {
c525436e 116 error_report("could not load palcode '%s'", palcode_filename);
80bb2ff7
RH
117 exit(1);
118 }
c18f8556 119 g_free(palcode_filename);
80bb2ff7
RH
120
121 /* Start all cpus at the PALcode RESET entry point. */
122 for (i = 0; i < smp_cpus; ++i) {
ad601177
AF
123 cpus[i]->env.pal_mode = 1;
124 cpus[i]->env.pc = palcode_entry;
125 cpus[i]->env.palbr = palcode_entry;
80bb2ff7
RH
126 }
127
128 /* Load a kernel. */
129 if (kernel_filename) {
130 uint64_t param_offset;
131
132 size = load_elf(kernel_filename, cpu_alpha_superpage_to_phys,
133 NULL, &kernel_entry, &kernel_low, &kernel_high,
7ef295ea 134 0, EM_ALPHA, 0, 0);
80bb2ff7 135 if (size < 0) {
c525436e 136 error_report("could not load kernel '%s'", kernel_filename);
80bb2ff7
RH
137 exit(1);
138 }
139
ad601177 140 cpus[0]->env.trap_arg1 = kernel_entry;
80bb2ff7
RH
141
142 param_offset = kernel_low - 0x6000;
143
144 if (kernel_cmdline) {
145 pstrcpy_targphys("cmdline", param_offset, 0x100, kernel_cmdline);
146 }
147
148 if (initrd_filename) {
149 long initrd_base, initrd_size;
150
151 initrd_size = get_image_size(initrd_filename);
152 if (initrd_size < 0) {
c525436e
MA
153 error_report("could not load initial ram disk '%s'",
154 initrd_filename);
80bb2ff7
RH
155 exit(1);
156 }
157
158 /* Put the initrd image as high in memory as possible. */
159 initrd_base = (ram_size - initrd_size) & TARGET_PAGE_MASK;
160 load_image_targphys(initrd_filename, initrd_base,
161 ram_size - initrd_base);
162
42874d3a
PM
163 address_space_stq(&address_space_memory, param_offset + 0x100,
164 initrd_base + 0xfffffc0000000000ULL,
165 MEMTXATTRS_UNSPECIFIED,
166 NULL);
167 address_space_stq(&address_space_memory, param_offset + 0x108,
168 initrd_size, MEMTXATTRS_UNSPECIFIED, NULL);
80bb2ff7
RH
169 }
170 }
171}
172
e264d29d 173static void clipper_machine_init(MachineClass *mc)
80bb2ff7 174{
e264d29d
EH
175 mc->desc = "Alpha DP264/CLIPPER";
176 mc->init = clipper_init;
177 mc->max_cpus = 4;
178 mc->is_default = 1;
80bb2ff7
RH
179}
180
e264d29d 181DEFINE_MACHINE("clipper", clipper_machine_init)