Commit 0aa6a4a2500627d8824a536d4ea45176de273761

Authored by bellard
1 parent 938828a2

added Heathrow PowerMAC machine - added UniN memory fake controller for Mac99 - …

…added temporary frame buffer OSI calls to keep Mac OS X happy


git-svn-id: svn://svn.savannah.nongnu.org/qemu/trunk@1448 c046a42c-6fe2-441c-8c8c-71466251a162
Showing 1 changed file with 246 additions and 51 deletions
hw/ppc_chrp.c
... ... @@ -34,9 +34,10 @@
34 34  
35 35 static int dbdma_mem_index;
36 36 static int cuda_mem_index;
37   -static int ide0_mem_index;
38   -static int ide1_mem_index;
39   -static int openpic_mem_index;
  37 +static int ide0_mem_index = -1;
  38 +static int ide1_mem_index = -1;
  39 +static int openpic_mem_index = -1;
  40 +static int heathrow_pic_mem_index = -1;
40 41  
41 42 /* DBDMA: currently no op - should suffice right now */
42 43  
... ... @@ -84,11 +85,20 @@ static CPUReadMemoryFunc *dbdma_read[] = {
84 85 static void macio_map(PCIDevice *pci_dev, int region_num,
85 86 uint32_t addr, uint32_t size, int type)
86 87 {
  88 + if (heathrow_pic_mem_index >= 0) {
  89 + cpu_register_physical_memory(addr + 0x00000, 0x1000,
  90 + heathrow_pic_mem_index);
  91 + }
87 92 cpu_register_physical_memory(addr + 0x08000, 0x1000, dbdma_mem_index);
88 93 cpu_register_physical_memory(addr + 0x16000, 0x2000, cuda_mem_index);
89   - cpu_register_physical_memory(addr + 0x1f000, 0x1000, ide0_mem_index);
90   - cpu_register_physical_memory(addr + 0x20000, 0x1000, ide1_mem_index);
91   - cpu_register_physical_memory(addr + 0x40000, 0x40000, openpic_mem_index);
  94 + if (ide0_mem_index >= 0)
  95 + cpu_register_physical_memory(addr + 0x1f000, 0x1000, ide0_mem_index);
  96 + if (ide1_mem_index >= 0)
  97 + cpu_register_physical_memory(addr + 0x20000, 0x1000, ide1_mem_index);
  98 + if (openpic_mem_index >= 0) {
  99 + cpu_register_physical_memory(addr + 0x40000, 0x40000,
  100 + openpic_mem_index);
  101 + }
92 102 }
93 103  
94 104 static void macio_init(PCIBus *bus)
... ... @@ -116,20 +126,112 @@ static void macio_init(PCIBus *bus)
116 126 PCI_ADDRESS_SPACE_MEM, macio_map);
117 127 }
118 128  
119   -/* PowerPC PREP hardware initialisation */
120   -void ppc_chrp_init(int ram_size, int vga_ram_size, int boot_device,
121   - DisplayState *ds, const char **fd_filename, int snapshot,
122   - const char *kernel_filename, const char *kernel_cmdline,
123   - const char *initrd_filename)
  129 +/* UniN device */
  130 +static void unin_writel (void *opaque, target_phys_addr_t addr, uint32_t value)
  131 +{
  132 +}
  133 +
  134 +static uint32_t unin_readl (void *opaque, target_phys_addr_t addr)
  135 +{
  136 + return 0;
  137 +}
  138 +
  139 +static CPUWriteMemoryFunc *unin_write[] = {
  140 + &unin_writel,
  141 + &unin_writel,
  142 + &unin_writel,
  143 +};
  144 +
  145 +static CPUReadMemoryFunc *unin_read[] = {
  146 + &unin_readl,
  147 + &unin_readl,
  148 + &unin_readl,
  149 +};
  150 +
  151 +/* temporary frame buffer OSI calls for the video.x driver. The right
  152 + solution is to modify the driver to use VGA PCI I/Os */
  153 +static int vga_osi_call(CPUState *env)
  154 +{
  155 + static int vga_vbl_enabled;
  156 + int linesize;
  157 +
  158 + // printf("osi_call R5=%d\n", env->gpr[5]);
  159 +
  160 + /* same handler as PearPC, coming from the original MOL video
  161 + driver. */
  162 + switch(env->gpr[5]) {
  163 + case 4:
  164 + break;
  165 + case 28: /* set_vmode */
  166 + if (env->gpr[6] != 1 || env->gpr[7] != 0)
  167 + env->gpr[3] = 1;
  168 + else
  169 + env->gpr[3] = 0;
  170 + break;
  171 + case 29: /* get_vmode_info */
  172 + if (env->gpr[6] != 0) {
  173 + if (env->gpr[6] != 1 || env->gpr[7] != 0) {
  174 + env->gpr[3] = 1;
  175 + break;
  176 + }
  177 + }
  178 + env->gpr[3] = 0;
  179 + env->gpr[4] = (1 << 16) | 1; /* num_vmodes, cur_vmode */
  180 + env->gpr[5] = (1 << 16) | 0; /* num_depths, cur_depth_mode */
  181 + env->gpr[6] = (graphic_width << 16) | graphic_height; /* w, h */
  182 + env->gpr[7] = 85 << 16; /* refresh rate */
  183 + env->gpr[8] = (graphic_depth + 7) & ~7; /* depth (round to byte) */
  184 + linesize = ((graphic_depth + 7) >> 3) * graphic_width;
  185 + linesize = (linesize + 3) & ~3;
  186 + env->gpr[9] = (linesize << 16) | 0; /* row_bytes, offset */
  187 + break;
  188 + case 31: /* set_video power */
  189 + env->gpr[3] = 0;
  190 + break;
  191 + case 39: /* video_ctrl */
  192 + if (env->gpr[6] == 0 || env->gpr[6] == 1)
  193 + vga_vbl_enabled = env->gpr[6];
  194 + env->gpr[3] = 0;
  195 + break;
  196 + case 47:
  197 + break;
  198 + case 59: /* set_color */
  199 + /* R6 = index, R7 = RGB */
  200 + env->gpr[3] = 0;
  201 + break;
  202 + case 64: /* get color */
  203 + /* R6 = index */
  204 + env->gpr[3] = 0;
  205 + break;
  206 + case 116: /* set hwcursor */
  207 + /* R6 = x, R7 = y, R8 = visible, R9 = data */
  208 + break;
  209 + default:
  210 + fprintf(stderr, "unsupported OSI call R5=%08x\n", env->gpr[5]);
  211 + break;
  212 + }
  213 + return 1; /* osi_call handled */
  214 +}
  215 +
  216 +/* PowerPC CHRP hardware initialisation */
  217 +static void ppc_chrp_init(int ram_size, int vga_ram_size, int boot_device,
  218 + DisplayState *ds, const char **fd_filename,
  219 + int snapshot,
  220 + const char *kernel_filename,
  221 + const char *kernel_cmdline,
  222 + const char *initrd_filename,
  223 + int is_heathrow)
124 224 {
125 225 char buf[1024];
126   - openpic_t *openpic;
  226 + SetIRQFunc *set_irq;
  227 + void *pic;
127 228 m48t59_t *nvram;
128   - int PPC_io_memory;
  229 + int PPC_io_memory, unin_memory;
129 230 int ret, linux_boot, i;
130 231 unsigned long bios_offset;
131 232 uint32_t kernel_base, kernel_size, initrd_base, initrd_size;
132 233 PCIBus *pci_bus;
  234 + const char *arch_name;
133 235  
134 236 linux_boot = (kernel_filename != NULL);
135 237  
... ... @@ -180,49 +282,101 @@ void ppc_chrp_init(int ram_size, int vga_ram_size, int boot_device,
180 282 }
181 283 /* Register CPU as a 74x/75x */
182 284 cpu_ppc_register(cpu_single_env, 0x00080000);
183   - /* Set time-base frequency to 100 Mhz */
184   - cpu_ppc_tb_init(cpu_single_env, 100UL * 1000UL * 1000UL);
185   -
186   - isa_mem_base = 0x80000000;
187   - pci_bus = pci_pmac_init();
188   -
189   - /* Register 8 MB of ISA IO space */
190   - PPC_io_memory = cpu_register_io_memory(0, PPC_io_read, PPC_io_write, NULL);
191   - cpu_register_physical_memory(0xF2000000, 0x00800000, PPC_io_memory);
192   -
193   - /* init basic PC hardware */
194   - vga_initialize(pci_bus, ds, phys_ram_base + ram_size, ram_size,
195   - vga_ram_size);
196   - openpic = openpic_init(NULL, &openpic_mem_index, 1);
197   - pci_pmac_set_openpic(pci_bus, openpic);
198   -
199   - /* XXX: suppress that */
200   - pic_init();
201   -
202   - /* XXX: use Mac Serial port */
203   - serial_init(0x3f8, 4, serial_hds[0]);
204   -
205   - for(i = 0; i < nb_nics; i++) {
206   - pci_ne2000_init(pci_bus, &nd_table[i]);
  285 + /* Set time-base frequency to 10 Mhz */
  286 + cpu_ppc_tb_init(cpu_single_env, 10UL * 1000UL * 1000UL);
  287 +
  288 + cpu_single_env->osi_call = vga_osi_call;
  289 +
  290 + if (is_heathrow) {
  291 + isa_mem_base = 0x80000000;
  292 + pci_bus = pci_grackle_init(0xfec00000);
  293 +
  294 + /* Register 2 MB of ISA IO space */
  295 + PPC_io_memory = cpu_register_io_memory(0, PPC_io_read, PPC_io_write, NULL);
  296 + cpu_register_physical_memory(0xfe000000, 0x00200000, PPC_io_memory);
  297 +
  298 + /* init basic PC hardware */
  299 + vga_initialize(pci_bus, ds, phys_ram_base + ram_size, ram_size,
  300 + vga_ram_size);
  301 + pic = heathrow_pic_init(&heathrow_pic_mem_index);
  302 + set_irq = heathrow_pic_set_irq;
  303 + pci_set_pic(pci_bus, set_irq, pic);
  304 +
  305 + /* XXX: suppress that */
  306 + pic_init();
  307 +
  308 + /* XXX: use Mac Serial port */
  309 + serial_init(0x3f8, 4, serial_hds[0]);
  310 +
  311 + for(i = 0; i < nb_nics; i++) {
  312 + pci_ne2000_init(pci_bus, &nd_table[i]);
  313 + }
  314 +
  315 + pci_cmd646_ide_init(pci_bus, &bs_table[0], 0);
  316 +
  317 + /* cuda also initialize ADB */
  318 + cuda_mem_index = cuda_init(set_irq, pic, 0x12);
  319 +
  320 + adb_kbd_init(&adb_bus);
  321 + adb_mouse_init(&adb_bus);
  322 +
  323 + macio_init(pci_bus);
  324 +
  325 + nvram = m48t59_init(8, 0xFFF04000, 0x0074, NVRAM_SIZE);
  326 +
  327 + arch_name = "HEATHROW";
  328 + } else {
  329 + isa_mem_base = 0x80000000;
  330 + pci_bus = pci_pmac_init();
  331 +
  332 + /* Register 8 MB of ISA IO space */
  333 + PPC_io_memory = cpu_register_io_memory(0, PPC_io_read, PPC_io_write, NULL);
  334 + cpu_register_physical_memory(0xF2000000, 0x00800000, PPC_io_memory);
  335 +
  336 + /* UniN init */
  337 + unin_memory = cpu_register_io_memory(0, unin_read, unin_write, NULL);
  338 + cpu_register_physical_memory(0xf8000000, 0x00001000, unin_memory);
  339 +
  340 + /* init basic PC hardware */
  341 + vga_initialize(pci_bus, ds, phys_ram_base + ram_size, ram_size,
  342 + vga_ram_size);
  343 + pic = openpic_init(NULL, &openpic_mem_index, 1);
  344 + set_irq = openpic_set_irq;
  345 + pci_set_pic(pci_bus, set_irq, pic);
  346 +
  347 + /* XXX: suppress that */
  348 + pic_init();
  349 +
  350 + /* XXX: use Mac Serial port */
  351 + serial_init(0x3f8, 4, serial_hds[0]);
  352 +
  353 + for(i = 0; i < nb_nics; i++) {
  354 + pci_ne2000_init(pci_bus, &nd_table[i]);
  355 + }
  356 +
  357 +#if 1
  358 + ide0_mem_index = pmac_ide_init(&bs_table[0], set_irq, pic, 0x13);
  359 + ide1_mem_index = pmac_ide_init(&bs_table[2], set_irq, pic, 0x14);
  360 +#else
  361 + pci_cmd646_ide_init(pci_bus, &bs_table[0], 0);
  362 +#endif
  363 + /* cuda also initialize ADB */
  364 + cuda_mem_index = cuda_init(set_irq, pic, 0x19);
  365 +
  366 + adb_kbd_init(&adb_bus);
  367 + adb_mouse_init(&adb_bus);
  368 +
  369 + macio_init(pci_bus);
  370 +
  371 + nvram = m48t59_init(8, 0xFFF04000, 0x0074, NVRAM_SIZE);
  372 +
  373 + arch_name = "MAC99";
207 374 }
208   -
209   - ide0_mem_index = pmac_ide_init(&bs_table[0], openpic, 0x13);
210   - ide1_mem_index = pmac_ide_init(&bs_table[2], openpic, 0x14);
211   -
212   - /* cuda also initialize ADB */
213   - cuda_mem_index = cuda_init(openpic, 0x19);
214   -
215   - adb_kbd_init(&adb_bus);
216   - adb_mouse_init(&adb_bus);
217   -
218   - macio_init(pci_bus);
219   -
220   - nvram = m48t59_init(8, 0xFFF04000, 0x0074, NVRAM_SIZE);
221 375  
222 376 if (graphic_depth != 15 && graphic_depth != 32 && graphic_depth != 8)
223 377 graphic_depth = 15;
224 378  
225   - PPC_NVRAM_set_params(nvram, NVRAM_SIZE, "CHRP", ram_size, boot_device,
  379 + PPC_NVRAM_set_params(nvram, NVRAM_SIZE, arch_name, ram_size, boot_device,
226 380 kernel_base, kernel_size,
227 381 kernel_cmdline,
228 382 initrd_base, initrd_size,
... ... @@ -230,4 +384,45 @@ void ppc_chrp_init(int ram_size, int vga_ram_size, int boot_device,
230 384 0,
231 385 graphic_width, graphic_height, graphic_depth);
232 386 /* No PCI init: the BIOS will do it */
  387 +
  388 + /* Special port to get debug messages from Open-Firmware */
  389 + register_ioport_write(0x0F00, 4, 1, &PPC_debug_write, NULL);
  390 +}
  391 +
  392 +static void ppc_core99_init(int ram_size, int vga_ram_size, int boot_device,
  393 + DisplayState *ds, const char **fd_filename,
  394 + int snapshot,
  395 + const char *kernel_filename,
  396 + const char *kernel_cmdline,
  397 + const char *initrd_filename)
  398 +{
  399 + ppc_chrp_init(ram_size, vga_ram_size, boot_device,
  400 + ds, fd_filename, snapshot,
  401 + kernel_filename, kernel_cmdline,
  402 + initrd_filename, 0);
233 403 }
  404 +
  405 +static void ppc_heathrow_init(int ram_size, int vga_ram_size, int boot_device,
  406 + DisplayState *ds, const char **fd_filename,
  407 + int snapshot,
  408 + const char *kernel_filename,
  409 + const char *kernel_cmdline,
  410 + const char *initrd_filename)
  411 +{
  412 + ppc_chrp_init(ram_size, vga_ram_size, boot_device,
  413 + ds, fd_filename, snapshot,
  414 + kernel_filename, kernel_cmdline,
  415 + initrd_filename, 1);
  416 +}
  417 +
  418 +QEMUMachine core99_machine = {
  419 + "core99",
  420 + "Core99 based PowerMAC",
  421 + ppc_core99_init,
  422 +};
  423 +
  424 +QEMUMachine heathrow_machine = {
  425 + "heathrow",
  426 + "Heathrow based PowerMAC",
  427 + ppc_heathrow_init,
  428 +};
... ...