13cbee15bSj_mayer /* 23cbee15bSj_mayer * QEMU PowerMac emulation shared definitions and prototypes 33cbee15bSj_mayer * 43cbee15bSj_mayer * Copyright (c) 2004-2007 Fabrice Bellard 53cbee15bSj_mayer * Copyright (c) 2007 Jocelyn Mayer 63cbee15bSj_mayer * 73cbee15bSj_mayer * Permission is hereby granted, free of charge, to any person obtaining a copy 83cbee15bSj_mayer * of this software and associated documentation files (the "Software"), to deal 93cbee15bSj_mayer * in the Software without restriction, including without limitation the rights 103cbee15bSj_mayer * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 113cbee15bSj_mayer * copies of the Software, and to permit persons to whom the Software is 123cbee15bSj_mayer * furnished to do so, subject to the following conditions: 133cbee15bSj_mayer * 143cbee15bSj_mayer * The above copyright notice and this permission notice shall be included in 153cbee15bSj_mayer * all copies or substantial portions of the Software. 163cbee15bSj_mayer * 173cbee15bSj_mayer * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 183cbee15bSj_mayer * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 193cbee15bSj_mayer * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL 203cbee15bSj_mayer * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 213cbee15bSj_mayer * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 223cbee15bSj_mayer * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN 233cbee15bSj_mayer * THE SOFTWARE. 243cbee15bSj_mayer */ 252a6a4076SMarkus Armbruster 262a6a4076SMarkus Armbruster #ifndef PPC_MAC_H 272a6a4076SMarkus Armbruster #define PPC_MAC_H 283cbee15bSj_mayer 29022c62cbSPaolo Bonzini #include "exec/memory.h" 3095ed3b7cSAndreas Färber #include "hw/sysbus.h" 3107a7484eSAndreas Färber #include "hw/ide/internal.h" 320d09e41aSPaolo Bonzini #include "hw/input/adb.h" 331e39101cSAvi Kivity 343cbee15bSj_mayer /* SMP is not enabled, for now */ 353cbee15bSj_mayer #define MAX_CPUS 1 363cbee15bSj_mayer 37bba831e8SPaul Brook #define BIOS_SIZE (1024 * 1024) 383cbee15bSj_mayer #define NVRAM_SIZE 0x2000 39e5d01b06Saurel32 #define PROM_FILENAME "openbios-ppc" 40992e5acdSblueswir1 #define PROM_ADDR 0xfff00000 413cbee15bSj_mayer 423cbee15bSj_mayer #define KERNEL_LOAD_ADDR 0x01000000 43b9e17a34SAlexander Graf #define KERNEL_GAP 0x00100000 443cbee15bSj_mayer 457fa9ae1aSblueswir1 #define ESCC_CLOCK 3686400 467fa9ae1aSblueswir1 473cbee15bSj_mayer /* Cuda */ 4845fa67fbSAndreas Färber #define TYPE_CUDA "cuda" 4945fa67fbSAndreas Färber #define CUDA(obj) OBJECT_CHECK(CUDAState, (obj), TYPE_CUDA) 5045fa67fbSAndreas Färber 5145fa67fbSAndreas Färber /** 5245fa67fbSAndreas Färber * CUDATimer: 5345fa67fbSAndreas Färber * @counter_value: counter value at load time 5445fa67fbSAndreas Färber */ 5545fa67fbSAndreas Färber typedef struct CUDATimer { 5645fa67fbSAndreas Färber int index; 5745fa67fbSAndreas Färber uint16_t latch; 5845fa67fbSAndreas Färber uint16_t counter_value; 5945fa67fbSAndreas Färber int64_t load_time; 6045fa67fbSAndreas Färber int64_t next_irq_time; 61b981289cSAlexander Graf uint64_t frequency; 6245fa67fbSAndreas Färber QEMUTimer *timer; 6345fa67fbSAndreas Färber } CUDATimer; 6445fa67fbSAndreas Färber 6545fa67fbSAndreas Färber /** 6645fa67fbSAndreas Färber * CUDAState: 6745fa67fbSAndreas Färber * @b: B-side data 6845fa67fbSAndreas Färber * @a: A-side data 6945fa67fbSAndreas Färber * @dirb: B-side direction (1=output) 7045fa67fbSAndreas Färber * @dira: A-side direction (1=output) 7145fa67fbSAndreas Färber * @sr: Shift register 7245fa67fbSAndreas Färber * @acr: Auxiliary control register 7345fa67fbSAndreas Färber * @pcr: Peripheral control register 7445fa67fbSAndreas Färber * @ifr: Interrupt flag register 7545fa67fbSAndreas Färber * @ier: Interrupt enable register 7645fa67fbSAndreas Färber * @anh: A-side data, no handshake 7745fa67fbSAndreas Färber * @last_b: last value of B register 7845fa67fbSAndreas Färber * @last_acr: last value of ACR register 7945fa67fbSAndreas Färber */ 8045fa67fbSAndreas Färber typedef struct CUDAState { 8145fa67fbSAndreas Färber /*< private >*/ 8245fa67fbSAndreas Färber SysBusDevice parent_obj; 8345fa67fbSAndreas Färber /*< public >*/ 8445fa67fbSAndreas Färber 8545fa67fbSAndreas Färber MemoryRegion mem; 8645fa67fbSAndreas Färber /* cuda registers */ 8745fa67fbSAndreas Färber uint8_t b; 8845fa67fbSAndreas Färber uint8_t a; 8945fa67fbSAndreas Färber uint8_t dirb; 9045fa67fbSAndreas Färber uint8_t dira; 9145fa67fbSAndreas Färber uint8_t sr; 9245fa67fbSAndreas Färber uint8_t acr; 9345fa67fbSAndreas Färber uint8_t pcr; 9445fa67fbSAndreas Färber uint8_t ifr; 9545fa67fbSAndreas Färber uint8_t ier; 9645fa67fbSAndreas Färber uint8_t anh; 9745fa67fbSAndreas Färber 98293c867dSAndreas Färber ADBBusState adb_bus; 9945fa67fbSAndreas Färber CUDATimer timers[2]; 10045fa67fbSAndreas Färber 10145fa67fbSAndreas Färber uint32_t tick_offset; 102b981289cSAlexander Graf uint64_t frequency; 10345fa67fbSAndreas Färber 10445fa67fbSAndreas Färber uint8_t last_b; 10545fa67fbSAndreas Färber uint8_t last_acr; 10645fa67fbSAndreas Färber 107cffc331aSMark Cave-Ayland /* MacOS 9 is racy and requires a delay upon setting the SR_INT bit */ 108cffc331aSMark Cave-Ayland QEMUTimer *sr_delay_timer; 109cffc331aSMark Cave-Ayland 11045fa67fbSAndreas Färber int data_in_size; 11145fa67fbSAndreas Färber int data_in_index; 11245fa67fbSAndreas Färber int data_out_index; 11345fa67fbSAndreas Färber 11445fa67fbSAndreas Färber qemu_irq irq; 115216c906eSHervé Poussineau uint16_t adb_poll_mask; 116374312e7SHervé Poussineau uint8_t autopoll_rate_ms; 11745fa67fbSAndreas Färber uint8_t autopoll; 11845fa67fbSAndreas Färber uint8_t data_in[128]; 11945fa67fbSAndreas Färber uint8_t data_out[16]; 12045fa67fbSAndreas Färber QEMUTimer *adb_poll_timer; 12145fa67fbSAndreas Färber } CUDAState; 1223cbee15bSj_mayer 1233cbee15bSj_mayer /* MacIO */ 124d037834aSAndreas Färber #define TYPE_OLDWORLD_MACIO "macio-oldworld" 125d037834aSAndreas Färber #define TYPE_NEWWORLD_MACIO "macio-newworld" 12607a7484eSAndreas Färber 12707a7484eSAndreas Färber #define TYPE_MACIO_IDE "macio-ide" 12807a7484eSAndreas Färber #define MACIO_IDE(obj) OBJECT_CHECK(MACIOIDEState, (obj), TYPE_MACIO_IDE) 12907a7484eSAndreas Färber 13007a7484eSAndreas Färber typedef struct MACIOIDEState { 13107a7484eSAndreas Färber /*< private >*/ 13207a7484eSAndreas Färber SysBusDevice parent_obj; 13307a7484eSAndreas Färber /*< public >*/ 1340fc84331SMark Cave-Ayland uint32_t channel; 1354f7265ffSBenjamin Herrenschmidt qemu_irq real_ide_irq; 1364f7265ffSBenjamin Herrenschmidt qemu_irq real_dma_irq; 1374f7265ffSBenjamin Herrenschmidt qemu_irq ide_irq; 13807a7484eSAndreas Färber qemu_irq dma_irq; 13907a7484eSAndreas Färber 14007a7484eSAndreas Färber MemoryRegion mem; 14107a7484eSAndreas Färber IDEBus bus; 1424aa3510fSAlexander Graf IDEDMA dma; 1434aa3510fSAlexander Graf void *dbdma; 144cae32357SAlexander Graf bool dma_active; 1454f7265ffSBenjamin Herrenschmidt uint32_t timing_reg; 1464f7265ffSBenjamin Herrenschmidt uint32_t irq_reg; 14707a7484eSAndreas Färber } MACIOIDEState; 14807a7484eSAndreas Färber 14907a7484eSAndreas Färber void macio_ide_init_drives(MACIOIDEState *ide, DriveInfo **hd_table); 1500fc84331SMark Cave-Ayland void macio_ide_register_dma(MACIOIDEState *ide, void *dbdma); 15107a7484eSAndreas Färber 152d037834aSAndreas Färber void macio_init(PCIDevice *dev, 15307a7484eSAndreas Färber MemoryRegion *pic_mem, 15407a7484eSAndreas Färber MemoryRegion *escc_mem); 1553cbee15bSj_mayer 1563cbee15bSj_mayer /* Heathrow PIC */ 15723c5e4caSAvi Kivity qemu_irq *heathrow_pic_init(MemoryRegion **pmem, 1583cbee15bSj_mayer int nb_cpus, qemu_irq **irqs); 1593cbee15bSj_mayer 1603cbee15bSj_mayer /* Grackle PCI */ 1610e655047SAndreas Färber #define TYPE_GRACKLE_PCI_HOST_BRIDGE "grackle-pcihost" 1621e39101cSAvi Kivity PCIBus *pci_grackle_init(uint32_t base, qemu_irq *pic, 163aee97b84SAvi Kivity MemoryRegion *address_space_mem, 164aee97b84SAvi Kivity MemoryRegion *address_space_io); 1653cbee15bSj_mayer 1663cbee15bSj_mayer /* UniNorth PCI */ 167aee97b84SAvi Kivity PCIBus *pci_pmac_init(qemu_irq *pic, 168aee97b84SAvi Kivity MemoryRegion *address_space_mem, 169aee97b84SAvi Kivity MemoryRegion *address_space_io); 170aee97b84SAvi Kivity PCIBus *pci_pmac_u3_init(qemu_irq *pic, 171aee97b84SAvi Kivity MemoryRegion *address_space_mem, 172aee97b84SAvi Kivity MemoryRegion *address_space_io); 1733cbee15bSj_mayer 1743cbee15bSj_mayer /* Mac NVRAM */ 17595ed3b7cSAndreas Färber #define TYPE_MACIO_NVRAM "macio-nvram" 17695ed3b7cSAndreas Färber #define MACIO_NVRAM(obj) \ 17795ed3b7cSAndreas Färber OBJECT_CHECK(MacIONVRAMState, (obj), TYPE_MACIO_NVRAM) 1783cbee15bSj_mayer 17995ed3b7cSAndreas Färber typedef struct MacIONVRAMState { 18095ed3b7cSAndreas Färber /*< private >*/ 18195ed3b7cSAndreas Färber SysBusDevice parent_obj; 18295ed3b7cSAndreas Färber /*< public >*/ 18395ed3b7cSAndreas Färber 18495ed3b7cSAndreas Färber uint32_t size; 18595ed3b7cSAndreas Färber uint32_t it_shift; 18695ed3b7cSAndreas Färber 18795ed3b7cSAndreas Färber MemoryRegion mem; 18895ed3b7cSAndreas Färber uint8_t *data; 18995ed3b7cSAndreas Färber } MacIONVRAMState; 19095ed3b7cSAndreas Färber 1913cbee15bSj_mayer void pmac_format_nvram_partition (MacIONVRAMState *nvr, int len); 1922a6a4076SMarkus Armbruster #endif /* PPC_MAC_H */ 193