xref: /qemu/include/hw/nvram/mac_nvram.h (revision cae323572eddc1a45e2f6ef98c006d98fed23b1e)
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  */
253cbee15bSj_mayer #if !defined(__PPC_MAC_H__)
263cbee15bSj_mayer #define __PPC_MAC_H__
273cbee15bSj_mayer 
28022c62cbSPaolo Bonzini #include "exec/memory.h"
2995ed3b7cSAndreas Färber #include "hw/sysbus.h"
3007a7484eSAndreas Färber #include "hw/ide/internal.h"
310d09e41aSPaolo Bonzini #include "hw/input/adb.h"
321e39101cSAvi Kivity 
333cbee15bSj_mayer /* SMP is not enabled, for now */
343cbee15bSj_mayer #define MAX_CPUS 1
353cbee15bSj_mayer 
36bba831e8SPaul Brook #define BIOS_SIZE     (1024 * 1024)
373cbee15bSj_mayer #define BIOS_FILENAME "ppc_rom.bin"
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;
6145fa67fbSAndreas Färber     QEMUTimer *timer;
6245fa67fbSAndreas Färber } CUDATimer;
6345fa67fbSAndreas Färber 
6445fa67fbSAndreas Färber /**
6545fa67fbSAndreas Färber  * CUDAState:
6645fa67fbSAndreas Färber  * @b: B-side data
6745fa67fbSAndreas Färber  * @a: A-side data
6845fa67fbSAndreas Färber  * @dirb: B-side direction (1=output)
6945fa67fbSAndreas Färber  * @dira: A-side direction (1=output)
7045fa67fbSAndreas Färber  * @sr: Shift register
7145fa67fbSAndreas Färber  * @acr: Auxiliary control register
7245fa67fbSAndreas Färber  * @pcr: Peripheral control register
7345fa67fbSAndreas Färber  * @ifr: Interrupt flag register
7445fa67fbSAndreas Färber  * @ier: Interrupt enable register
7545fa67fbSAndreas Färber  * @anh: A-side data, no handshake
7645fa67fbSAndreas Färber  * @last_b: last value of B register
7745fa67fbSAndreas Färber  * @last_acr: last value of ACR register
7845fa67fbSAndreas Färber  */
7945fa67fbSAndreas Färber typedef struct CUDAState {
8045fa67fbSAndreas Färber     /*< private >*/
8145fa67fbSAndreas Färber     SysBusDevice parent_obj;
8245fa67fbSAndreas Färber     /*< public >*/
8345fa67fbSAndreas Färber 
8445fa67fbSAndreas Färber     MemoryRegion mem;
8545fa67fbSAndreas Färber     /* cuda registers */
8645fa67fbSAndreas Färber     uint8_t b;
8745fa67fbSAndreas Färber     uint8_t a;
8845fa67fbSAndreas Färber     uint8_t dirb;
8945fa67fbSAndreas Färber     uint8_t dira;
9045fa67fbSAndreas Färber     uint8_t sr;
9145fa67fbSAndreas Färber     uint8_t acr;
9245fa67fbSAndreas Färber     uint8_t pcr;
9345fa67fbSAndreas Färber     uint8_t ifr;
9445fa67fbSAndreas Färber     uint8_t ier;
9545fa67fbSAndreas Färber     uint8_t anh;
9645fa67fbSAndreas Färber 
97293c867dSAndreas Färber     ADBBusState adb_bus;
9845fa67fbSAndreas Färber     CUDATimer timers[2];
9945fa67fbSAndreas Färber 
10045fa67fbSAndreas Färber     uint32_t tick_offset;
10145fa67fbSAndreas Färber 
10245fa67fbSAndreas Färber     uint8_t last_b;
10345fa67fbSAndreas Färber     uint8_t last_acr;
10445fa67fbSAndreas Färber 
10545fa67fbSAndreas Färber     int data_in_size;
10645fa67fbSAndreas Färber     int data_in_index;
10745fa67fbSAndreas Färber     int data_out_index;
10845fa67fbSAndreas Färber 
10945fa67fbSAndreas Färber     qemu_irq irq;
11045fa67fbSAndreas Färber     uint8_t autopoll;
11145fa67fbSAndreas Färber     uint8_t data_in[128];
11245fa67fbSAndreas Färber     uint8_t data_out[16];
11345fa67fbSAndreas Färber     QEMUTimer *adb_poll_timer;
11445fa67fbSAndreas Färber } CUDAState;
1153cbee15bSj_mayer 
1163cbee15bSj_mayer /* MacIO */
117d037834aSAndreas Färber #define TYPE_OLDWORLD_MACIO "macio-oldworld"
118d037834aSAndreas Färber #define TYPE_NEWWORLD_MACIO "macio-newworld"
11907a7484eSAndreas Färber 
12007a7484eSAndreas Färber #define TYPE_MACIO_IDE "macio-ide"
12107a7484eSAndreas Färber #define MACIO_IDE(obj) OBJECT_CHECK(MACIOIDEState, (obj), TYPE_MACIO_IDE)
12207a7484eSAndreas Färber 
12307a7484eSAndreas Färber typedef struct MACIOIDEState {
12407a7484eSAndreas Färber     /*< private >*/
12507a7484eSAndreas Färber     SysBusDevice parent_obj;
12607a7484eSAndreas Färber     /*< public >*/
12707a7484eSAndreas Färber 
12807a7484eSAndreas Färber     qemu_irq irq;
12907a7484eSAndreas Färber     qemu_irq dma_irq;
13007a7484eSAndreas Färber 
13107a7484eSAndreas Färber     MemoryRegion mem;
13207a7484eSAndreas Färber     IDEBus bus;
13307a7484eSAndreas Färber     BlockDriverAIOCB *aiocb;
1344aa3510fSAlexander Graf     IDEDMA dma;
1354aa3510fSAlexander Graf     void *dbdma;
136cae32357SAlexander Graf     bool dma_active;
13707a7484eSAndreas Färber } MACIOIDEState;
13807a7484eSAndreas Färber 
13907a7484eSAndreas Färber void macio_ide_init_drives(MACIOIDEState *ide, DriveInfo **hd_table);
14007a7484eSAndreas Färber void macio_ide_register_dma(MACIOIDEState *ide, void *dbdma, int channel);
14107a7484eSAndreas Färber 
142d037834aSAndreas Färber void macio_init(PCIDevice *dev,
14307a7484eSAndreas Färber                 MemoryRegion *pic_mem,
14407a7484eSAndreas Färber                 MemoryRegion *escc_mem);
1453cbee15bSj_mayer 
1463cbee15bSj_mayer /* Heathrow PIC */
14723c5e4caSAvi Kivity qemu_irq *heathrow_pic_init(MemoryRegion **pmem,
1483cbee15bSj_mayer                             int nb_cpus, qemu_irq **irqs);
1493cbee15bSj_mayer 
1503cbee15bSj_mayer /* Grackle PCI */
1510e655047SAndreas Färber #define TYPE_GRACKLE_PCI_HOST_BRIDGE "grackle-pcihost"
1521e39101cSAvi Kivity PCIBus *pci_grackle_init(uint32_t base, qemu_irq *pic,
153aee97b84SAvi Kivity                          MemoryRegion *address_space_mem,
154aee97b84SAvi Kivity                          MemoryRegion *address_space_io);
1553cbee15bSj_mayer 
1563cbee15bSj_mayer /* UniNorth PCI */
157aee97b84SAvi Kivity PCIBus *pci_pmac_init(qemu_irq *pic,
158aee97b84SAvi Kivity                       MemoryRegion *address_space_mem,
159aee97b84SAvi Kivity                       MemoryRegion *address_space_io);
160aee97b84SAvi Kivity PCIBus *pci_pmac_u3_init(qemu_irq *pic,
161aee97b84SAvi Kivity                          MemoryRegion *address_space_mem,
162aee97b84SAvi Kivity                          MemoryRegion *address_space_io);
1633cbee15bSj_mayer 
1643cbee15bSj_mayer /* Mac NVRAM */
16595ed3b7cSAndreas Färber #define TYPE_MACIO_NVRAM "macio-nvram"
16695ed3b7cSAndreas Färber #define MACIO_NVRAM(obj) \
16795ed3b7cSAndreas Färber     OBJECT_CHECK(MacIONVRAMState, (obj), TYPE_MACIO_NVRAM)
1683cbee15bSj_mayer 
16995ed3b7cSAndreas Färber typedef struct MacIONVRAMState {
17095ed3b7cSAndreas Färber     /*< private >*/
17195ed3b7cSAndreas Färber     SysBusDevice parent_obj;
17295ed3b7cSAndreas Färber     /*< public >*/
17395ed3b7cSAndreas Färber 
17495ed3b7cSAndreas Färber     uint32_t size;
17595ed3b7cSAndreas Färber     uint32_t it_shift;
17695ed3b7cSAndreas Färber 
17795ed3b7cSAndreas Färber     MemoryRegion mem;
17895ed3b7cSAndreas Färber     uint8_t *data;
17995ed3b7cSAndreas Färber } MacIONVRAMState;
18095ed3b7cSAndreas Färber 
1813cbee15bSj_mayer void pmac_format_nvram_partition (MacIONVRAMState *nvr, int len);
1823743cca7SAndreas Färber uint8_t macio_nvram_read(MacIONVRAMState *s, uint32_t addr);
1833743cca7SAndreas Färber void macio_nvram_write(MacIONVRAMState *s, uint32_t addr, uint8_t val);
1843cbee15bSj_mayer #endif /* !defined(__PPC_MAC_H__) */
185