mirror of https://gitee.com/openkylin/qemu.git
ppc: convert to memory API
Reviewed-by: Richard Henderson <rth@twiddle.net> Reviewed-by: Anthony Liguori <aliguori@us.ibm.com> Signed-off-by: Avi Kivity <avi@redhat.com> Signed-off-by: Anthony Liguori <aliguori@us.ibm.com>
This commit is contained in:
parent
b0ce84e50b
commit
23c5e4cab2
|
@ -117,6 +117,7 @@ typedef struct CUDATimer {
|
|||
} CUDATimer;
|
||||
|
||||
typedef struct CUDAState {
|
||||
MemoryRegion mem;
|
||||
/* cuda registers */
|
||||
uint8_t b; /* B-side data */
|
||||
uint8_t a; /* A-side data */
|
||||
|
@ -722,7 +723,7 @@ static void cuda_reset(void *opaque)
|
|||
set_counter(s, &s->timers[1], 0xffff);
|
||||
}
|
||||
|
||||
void cuda_init (int *cuda_mem_index, qemu_irq irq)
|
||||
void cuda_init (MemoryRegion **cuda_mem, qemu_irq irq)
|
||||
{
|
||||
struct tm tm;
|
||||
CUDAState *s = &cuda_state;
|
||||
|
@ -738,8 +739,9 @@ void cuda_init (int *cuda_mem_index, qemu_irq irq)
|
|||
s->tick_offset = (uint32_t)mktimegm(&tm) + RTC_OFFSET;
|
||||
|
||||
s->adb_poll_timer = qemu_new_timer_ns(vm_clock, cuda_adb_poll, s);
|
||||
*cuda_mem_index = cpu_register_io_memory(cuda_read, cuda_write, s,
|
||||
cpu_register_io_memory(cuda_read, cuda_write, s,
|
||||
DEVICE_NATIVE_ENDIAN);
|
||||
*cuda_mem = &s->mem;
|
||||
vmstate_register(NULL, -1, &vmstate_cuda, s);
|
||||
qemu_register_reset(cuda_reset, s);
|
||||
}
|
||||
|
|
42
hw/escc.c
42
hw/escc.c
|
@ -126,7 +126,7 @@ struct SerialState {
|
|||
SysBusDevice busdev;
|
||||
struct ChannelState chn[2];
|
||||
uint32_t it_shift;
|
||||
int mmio_index;
|
||||
MemoryRegion mmio;
|
||||
uint32_t disabled;
|
||||
uint32_t frequency;
|
||||
};
|
||||
|
@ -490,7 +490,8 @@ static void escc_update_parameters(ChannelState *s)
|
|||
qemu_chr_ioctl(s->chr, CHR_IOCTL_SERIAL_SET_PARAMS, &ssp);
|
||||
}
|
||||
|
||||
static void escc_mem_writeb(void *opaque, target_phys_addr_t addr, uint32_t val)
|
||||
static void escc_mem_write(void *opaque, target_phys_addr_t addr,
|
||||
uint64_t val, unsigned size)
|
||||
{
|
||||
SerialState *serial = opaque;
|
||||
ChannelState *s;
|
||||
|
@ -592,7 +593,8 @@ static void escc_mem_writeb(void *opaque, target_phys_addr_t addr, uint32_t val)
|
|||
}
|
||||
}
|
||||
|
||||
static uint32_t escc_mem_readb(void *opaque, target_phys_addr_t addr)
|
||||
static uint64_t escc_mem_read(void *opaque, target_phys_addr_t addr,
|
||||
unsigned size)
|
||||
{
|
||||
SerialState *serial = opaque;
|
||||
ChannelState *s;
|
||||
|
@ -627,6 +629,16 @@ static uint32_t escc_mem_readb(void *opaque, target_phys_addr_t addr)
|
|||
return 0;
|
||||
}
|
||||
|
||||
static const MemoryRegionOps escc_mem_ops = {
|
||||
.read = escc_mem_read,
|
||||
.write = escc_mem_write,
|
||||
.endianness = DEVICE_NATIVE_ENDIAN,
|
||||
.valid = {
|
||||
.min_access_size = 1,
|
||||
.max_access_size = 1,
|
||||
},
|
||||
};
|
||||
|
||||
static int serial_can_receive(void *opaque)
|
||||
{
|
||||
ChannelState *s = opaque;
|
||||
|
@ -668,18 +680,6 @@ static void serial_event(void *opaque, int event)
|
|||
serial_receive_break(s);
|
||||
}
|
||||
|
||||
static CPUReadMemoryFunc * const escc_mem_read[3] = {
|
||||
escc_mem_readb,
|
||||
NULL,
|
||||
NULL,
|
||||
};
|
||||
|
||||
static CPUWriteMemoryFunc * const escc_mem_write[3] = {
|
||||
escc_mem_writeb,
|
||||
NULL,
|
||||
NULL,
|
||||
};
|
||||
|
||||
static const VMStateDescription vmstate_escc_chn = {
|
||||
.name ="escc_chn",
|
||||
.version_id = 2,
|
||||
|
@ -712,7 +712,7 @@ static const VMStateDescription vmstate_escc = {
|
|||
}
|
||||
};
|
||||
|
||||
int escc_init(target_phys_addr_t base, qemu_irq irqA, qemu_irq irqB,
|
||||
MemoryRegion *escc_init(target_phys_addr_t base, qemu_irq irqA, qemu_irq irqB,
|
||||
CharDriverState *chrA, CharDriverState *chrB,
|
||||
int clock, int it_shift)
|
||||
{
|
||||
|
@ -737,7 +737,7 @@ int escc_init(target_phys_addr_t base, qemu_irq irqA, qemu_irq irqB,
|
|||
}
|
||||
|
||||
d = FROM_SYSBUS(SerialState, s);
|
||||
return d->mmio_index;
|
||||
return &d->mmio;
|
||||
}
|
||||
|
||||
static const uint8_t keycodes[128] = {
|
||||
|
@ -901,7 +901,6 @@ void slavio_serial_ms_kbd_init(target_phys_addr_t base, qemu_irq irq,
|
|||
static int escc_init1(SysBusDevice *dev)
|
||||
{
|
||||
SerialState *s = FROM_SYSBUS(SerialState, dev);
|
||||
int io;
|
||||
unsigned int i;
|
||||
|
||||
s->chn[0].disabled = s->disabled;
|
||||
|
@ -918,10 +917,9 @@ static int escc_init1(SysBusDevice *dev)
|
|||
s->chn[0].otherchn = &s->chn[1];
|
||||
s->chn[1].otherchn = &s->chn[0];
|
||||
|
||||
io = cpu_register_io_memory(escc_mem_read, escc_mem_write, s,
|
||||
DEVICE_NATIVE_ENDIAN);
|
||||
sysbus_init_mmio(dev, ESCC_SIZE << s->it_shift, io);
|
||||
s->mmio_index = io;
|
||||
memory_region_init_io(&s->mmio, &escc_mem_ops, s, "escc",
|
||||
ESCC_SIZE << s->it_shift);
|
||||
sysbus_init_mmio_region(dev, &s->mmio);
|
||||
|
||||
if (s->chn[0].type == mouse) {
|
||||
qemu_add_mouse_event_handler(sunmouse_event, &s->chn[0], 0,
|
||||
|
|
|
@ -1,6 +1,6 @@
|
|||
/* escc.c */
|
||||
#define ESCC_SIZE 4
|
||||
int escc_init(target_phys_addr_t base, qemu_irq irqA, qemu_irq irqB,
|
||||
MemoryRegion *escc_init(target_phys_addr_t base, qemu_irq irqA, qemu_irq irqB,
|
||||
CharDriverState *chrA, CharDriverState *chrB,
|
||||
int clock, int it_shift);
|
||||
|
||||
|
|
|
@ -43,6 +43,7 @@ typedef struct HeathrowPIC {
|
|||
} HeathrowPIC;
|
||||
|
||||
typedef struct HeathrowPICS {
|
||||
MemoryRegion mem;
|
||||
HeathrowPIC pics[2];
|
||||
qemu_irq *irqs;
|
||||
} HeathrowPICS;
|
||||
|
@ -62,7 +63,8 @@ static void heathrow_pic_update(HeathrowPICS *s)
|
|||
}
|
||||
}
|
||||
|
||||
static void pic_writel (void *opaque, target_phys_addr_t addr, uint32_t value)
|
||||
static void pic_write(void *opaque, target_phys_addr_t addr,
|
||||
uint64_t value, unsigned size)
|
||||
{
|
||||
HeathrowPICS *s = opaque;
|
||||
HeathrowPIC *pic;
|
||||
|
@ -89,7 +91,8 @@ static void pic_writel (void *opaque, target_phys_addr_t addr, uint32_t value)
|
|||
}
|
||||
}
|
||||
|
||||
static uint32_t pic_readl (void *opaque, target_phys_addr_t addr)
|
||||
static uint64_t pic_read(void *opaque, target_phys_addr_t addr,
|
||||
unsigned size)
|
||||
{
|
||||
HeathrowPICS *s = opaque;
|
||||
HeathrowPIC *pic;
|
||||
|
@ -120,19 +123,12 @@ static uint32_t pic_readl (void *opaque, target_phys_addr_t addr)
|
|||
return value;
|
||||
}
|
||||
|
||||
static CPUWriteMemoryFunc * const pic_write[] = {
|
||||
&pic_writel,
|
||||
&pic_writel,
|
||||
&pic_writel,
|
||||
static const MemoryRegionOps heathrow_pic_ops = {
|
||||
.read = pic_read,
|
||||
.write = pic_write,
|
||||
.endianness = DEVICE_NATIVE_ENDIAN,
|
||||
};
|
||||
|
||||
static CPUReadMemoryFunc * const pic_read[] = {
|
||||
&pic_readl,
|
||||
&pic_readl,
|
||||
&pic_readl,
|
||||
};
|
||||
|
||||
|
||||
static void heathrow_pic_set_irq(void *opaque, int num, int level)
|
||||
{
|
||||
HeathrowPICS *s = opaque;
|
||||
|
@ -201,7 +197,7 @@ static void heathrow_pic_reset(void *opaque)
|
|||
s->pics[1].level_triggered = 0x1ff00000;
|
||||
}
|
||||
|
||||
qemu_irq *heathrow_pic_init(int *pmem_index,
|
||||
qemu_irq *heathrow_pic_init(MemoryRegion **pmem,
|
||||
int nb_cpus, qemu_irq **irqs)
|
||||
{
|
||||
HeathrowPICS *s;
|
||||
|
@ -209,8 +205,9 @@ qemu_irq *heathrow_pic_init(int *pmem_index,
|
|||
s = qemu_mallocz(sizeof(HeathrowPICS));
|
||||
/* only 1 CPU */
|
||||
s->irqs = irqs[0];
|
||||
*pmem_index = cpu_register_io_memory(pic_read, pic_write, s,
|
||||
DEVICE_LITTLE_ENDIAN);
|
||||
memory_region_init_io(&s->mem, &heathrow_pic_ops, s,
|
||||
"heathrow-pic", 0x1000);
|
||||
*pmem = &s->mem;
|
||||
|
||||
vmstate_register(NULL, -1, &vmstate_heathrow_pic, s);
|
||||
qemu_register_reset(heathrow_pic_reset, s);
|
||||
|
|
2
hw/ide.h
2
hw/ide.h
|
@ -19,7 +19,7 @@ PCIDevice *pci_piix4_ide_init(PCIBus *bus, DriveInfo **hd_table, int devfn);
|
|||
void vt82c686b_ide_init(PCIBus *bus, DriveInfo **hd_table, int devfn);
|
||||
|
||||
/* ide-macio.c */
|
||||
int pmac_ide_init (DriveInfo **hd_table, qemu_irq irq,
|
||||
MemoryRegion *pmac_ide_init (DriveInfo **hd_table, qemu_irq irq,
|
||||
void *dbdma, int channel, qemu_irq dma_irq);
|
||||
|
||||
/* ide-mmio.c */
|
||||
|
|
|
@ -35,6 +35,7 @@
|
|||
/* MacIO based PowerPC IDE */
|
||||
|
||||
typedef struct MACIOIDEState {
|
||||
MemoryRegion mem;
|
||||
IDEBus bus;
|
||||
BlockDriverAIOCB *aiocb;
|
||||
} MACIOIDEState;
|
||||
|
@ -281,16 +282,20 @@ static uint32_t pmac_ide_readl (void *opaque,target_phys_addr_t addr)
|
|||
return retval;
|
||||
}
|
||||
|
||||
static CPUWriteMemoryFunc * const pmac_ide_write[] = {
|
||||
pmac_ide_writeb,
|
||||
pmac_ide_writew,
|
||||
pmac_ide_writel,
|
||||
};
|
||||
|
||||
static CPUReadMemoryFunc * const pmac_ide_read[] = {
|
||||
pmac_ide_readb,
|
||||
pmac_ide_readw,
|
||||
pmac_ide_readl,
|
||||
static MemoryRegionOps pmac_ide_ops = {
|
||||
.old_mmio = {
|
||||
.write = {
|
||||
pmac_ide_writeb,
|
||||
pmac_ide_writew,
|
||||
pmac_ide_writel,
|
||||
},
|
||||
.read = {
|
||||
pmac_ide_readb,
|
||||
pmac_ide_readw,
|
||||
pmac_ide_readl,
|
||||
},
|
||||
},
|
||||
.endianness = DEVICE_NATIVE_ENDIAN,
|
||||
};
|
||||
|
||||
static const VMStateDescription vmstate_pmac = {
|
||||
|
@ -315,11 +320,10 @@ static void pmac_ide_reset(void *opaque)
|
|||
/* hd_table must contain 4 block drivers */
|
||||
/* PowerMac uses memory mapped registers, not I/O. Return the memory
|
||||
I/O index to access the ide. */
|
||||
int pmac_ide_init (DriveInfo **hd_table, qemu_irq irq,
|
||||
void *dbdma, int channel, qemu_irq dma_irq)
|
||||
MemoryRegion *pmac_ide_init (DriveInfo **hd_table, qemu_irq irq,
|
||||
void *dbdma, int channel, qemu_irq dma_irq)
|
||||
{
|
||||
MACIOIDEState *d;
|
||||
int pmac_ide_memory;
|
||||
|
||||
d = qemu_mallocz(sizeof(MACIOIDEState));
|
||||
ide_init2_with_non_qdev_drives(&d->bus, hd_table[0], hd_table[1], irq);
|
||||
|
@ -327,11 +331,9 @@ int pmac_ide_init (DriveInfo **hd_table, qemu_irq irq,
|
|||
if (dbdma)
|
||||
DBDMA_register_channel(dbdma, channel, dma_irq, pmac_ide_transfer, pmac_ide_flush, d);
|
||||
|
||||
pmac_ide_memory = cpu_register_io_memory(pmac_ide_read,
|
||||
pmac_ide_write, d,
|
||||
DEVICE_NATIVE_ENDIAN);
|
||||
memory_region_init_io(&d->mem, &pmac_ide_ops, d, "pmac-ide", 0x1000);
|
||||
vmstate_register(NULL, 0, &vmstate_pmac, d);
|
||||
qemu_register_reset(pmac_ide_reset, d);
|
||||
|
||||
return pmac_ide_memory;
|
||||
return &d->mem;
|
||||
}
|
||||
|
|
|
@ -166,6 +166,7 @@ typedef struct DBDMA_channel {
|
|||
} DBDMA_channel;
|
||||
|
||||
typedef struct {
|
||||
MemoryRegion mem;
|
||||
DBDMA_channel channels[DBDMA_CHANNELS];
|
||||
} DBDMAState;
|
||||
|
||||
|
@ -703,8 +704,8 @@ dbdma_control_write(DBDMA_channel *ch)
|
|||
ch->flush(&ch->io);
|
||||
}
|
||||
|
||||
static void dbdma_writel (void *opaque,
|
||||
target_phys_addr_t addr, uint32_t value)
|
||||
static void dbdma_write(void *opaque, target_phys_addr_t addr,
|
||||
uint64_t value, unsigned size)
|
||||
{
|
||||
int channel = addr >> DBDMA_CHANNEL_SHIFT;
|
||||
DBDMAState *s = opaque;
|
||||
|
@ -753,7 +754,8 @@ static void dbdma_writel (void *opaque,
|
|||
}
|
||||
}
|
||||
|
||||
static uint32_t dbdma_readl (void *opaque, target_phys_addr_t addr)
|
||||
static uint64_t dbdma_read(void *opaque, target_phys_addr_t addr,
|
||||
unsigned size)
|
||||
{
|
||||
uint32_t value;
|
||||
int channel = addr >> DBDMA_CHANNEL_SHIFT;
|
||||
|
@ -798,16 +800,14 @@ static uint32_t dbdma_readl (void *opaque, target_phys_addr_t addr)
|
|||
return value;
|
||||
}
|
||||
|
||||
static CPUWriteMemoryFunc * const dbdma_write[] = {
|
||||
NULL,
|
||||
NULL,
|
||||
dbdma_writel,
|
||||
};
|
||||
|
||||
static CPUReadMemoryFunc * const dbdma_read[] = {
|
||||
NULL,
|
||||
NULL,
|
||||
dbdma_readl,
|
||||
static const MemoryRegionOps dbdma_ops = {
|
||||
.read = dbdma_read,
|
||||
.write = dbdma_write,
|
||||
.endianness = DEVICE_LITTLE_ENDIAN,
|
||||
.valid = {
|
||||
.min_access_size = 4,
|
||||
.max_access_size = 4,
|
||||
},
|
||||
};
|
||||
|
||||
static const VMStateDescription vmstate_dbdma_channel = {
|
||||
|
@ -842,14 +842,14 @@ static void dbdma_reset(void *opaque)
|
|||
memset(s->channels[i].regs, 0, DBDMA_SIZE);
|
||||
}
|
||||
|
||||
void* DBDMA_init (int *dbdma_mem_index)
|
||||
void* DBDMA_init (MemoryRegion **dbdma_mem)
|
||||
{
|
||||
DBDMAState *s;
|
||||
|
||||
s = qemu_mallocz(sizeof(DBDMAState));
|
||||
|
||||
*dbdma_mem_index = cpu_register_io_memory(dbdma_read, dbdma_write, s,
|
||||
DEVICE_LITTLE_ENDIAN);
|
||||
memory_region_init_io(&s->mem, &dbdma_ops, s, "dbdma", 0x1000);
|
||||
*dbdma_mem = &s->mem;
|
||||
vmstate_register(NULL, -1, &vmstate_dbdma, s);
|
||||
qemu_register_reset(dbdma_reset, s);
|
||||
|
||||
|
|
|
@ -20,6 +20,8 @@
|
|||
* THE SOFTWARE.
|
||||
*/
|
||||
|
||||
#include "memory.h"
|
||||
|
||||
typedef struct DBDMA_io DBDMA_io;
|
||||
|
||||
typedef void (*DBDMA_flush)(DBDMA_io *io);
|
||||
|
@ -40,4 +42,4 @@ void DBDMA_register_channel(void *dbdma, int nchan, qemu_irq irq,
|
|||
DBDMA_rw rw, DBDMA_flush flush,
|
||||
void *opaque);
|
||||
void DBDMA_schedule(void);
|
||||
void* DBDMA_init (int *dbdma_mem_index);
|
||||
void* DBDMA_init (MemoryRegion **dbdma_mem);
|
||||
|
|
|
@ -39,7 +39,7 @@
|
|||
|
||||
struct MacIONVRAMState {
|
||||
uint32_t size;
|
||||
int mem_index;
|
||||
MemoryRegion mem;
|
||||
unsigned int it_shift;
|
||||
uint8_t *data;
|
||||
};
|
||||
|
@ -71,8 +71,8 @@ void macio_nvram_write (void *opaque, uint32_t addr, uint32_t val)
|
|||
}
|
||||
|
||||
/* macio style NVRAM device */
|
||||
static void macio_nvram_writeb (void *opaque,
|
||||
target_phys_addr_t addr, uint32_t value)
|
||||
static void macio_nvram_writeb(void *opaque, target_phys_addr_t addr,
|
||||
uint64_t value, unsigned size)
|
||||
{
|
||||
MacIONVRAMState *s = opaque;
|
||||
|
||||
|
@ -81,7 +81,8 @@ static void macio_nvram_writeb (void *opaque,
|
|||
NVR_DPRINTF("writeb addr %04x val %x\n", (int)addr, value);
|
||||
}
|
||||
|
||||
static uint32_t macio_nvram_readb (void *opaque, target_phys_addr_t addr)
|
||||
static uint64_t macio_nvram_readb(void *opaque, target_phys_addr_t addr,
|
||||
unsigned size)
|
||||
{
|
||||
MacIONVRAMState *s = opaque;
|
||||
uint32_t value;
|
||||
|
@ -93,16 +94,10 @@ static uint32_t macio_nvram_readb (void *opaque, target_phys_addr_t addr)
|
|||
return value;
|
||||
}
|
||||
|
||||
static CPUWriteMemoryFunc * const nvram_write[] = {
|
||||
&macio_nvram_writeb,
|
||||
&macio_nvram_writeb,
|
||||
&macio_nvram_writeb,
|
||||
};
|
||||
|
||||
static CPUReadMemoryFunc * const nvram_read[] = {
|
||||
&macio_nvram_readb,
|
||||
&macio_nvram_readb,
|
||||
&macio_nvram_readb,
|
||||
static const MemoryRegionOps macio_nvram_ops = {
|
||||
.read = macio_nvram_readb,
|
||||
.write = macio_nvram_writeb,
|
||||
.endianness = DEVICE_NATIVE_ENDIAN,
|
||||
};
|
||||
|
||||
static const VMStateDescription vmstate_macio_nvram = {
|
||||
|
@ -121,7 +116,7 @@ static void macio_nvram_reset(void *opaque)
|
|||
{
|
||||
}
|
||||
|
||||
MacIONVRAMState *macio_nvram_init (int *mem_index, target_phys_addr_t size,
|
||||
MacIONVRAMState *macio_nvram_init (target_phys_addr_t size,
|
||||
unsigned int it_shift)
|
||||
{
|
||||
MacIONVRAMState *s;
|
||||
|
@ -131,22 +126,18 @@ MacIONVRAMState *macio_nvram_init (int *mem_index, target_phys_addr_t size,
|
|||
s->size = size;
|
||||
s->it_shift = it_shift;
|
||||
|
||||
s->mem_index = cpu_register_io_memory(nvram_read, nvram_write, s,
|
||||
DEVICE_NATIVE_ENDIAN);
|
||||
*mem_index = s->mem_index;
|
||||
memory_region_init_io(&s->mem, &macio_nvram_ops, s, "macio-nvram",
|
||||
size << it_shift);
|
||||
vmstate_register(NULL, -1, &vmstate_macio_nvram, s);
|
||||
qemu_register_reset(macio_nvram_reset, s);
|
||||
|
||||
return s;
|
||||
}
|
||||
|
||||
void macio_nvram_map (void *opaque, target_phys_addr_t mem_base)
|
||||
void macio_nvram_setup_bar(MacIONVRAMState *s, MemoryRegion *bar,
|
||||
target_phys_addr_t mem_base)
|
||||
{
|
||||
MacIONVRAMState *s;
|
||||
|
||||
s = opaque;
|
||||
cpu_register_physical_memory(mem_base, s->size << s->it_shift,
|
||||
s->mem_index);
|
||||
memory_region_add_subregion(bar, mem_base, &s->mem);
|
||||
}
|
||||
|
||||
/* Set up a system OpenBIOS NVRAM partition */
|
||||
|
|
74
hw/macio.c
74
hw/macio.c
|
@ -30,58 +30,55 @@
|
|||
typedef struct macio_state_t macio_state_t;
|
||||
struct macio_state_t {
|
||||
int is_oldworld;
|
||||
int pic_mem_index;
|
||||
int dbdma_mem_index;
|
||||
int cuda_mem_index;
|
||||
int escc_mem_index;
|
||||
MemoryRegion bar;
|
||||
MemoryRegion *pic_mem;
|
||||
MemoryRegion *dbdma_mem;
|
||||
MemoryRegion *cuda_mem;
|
||||
MemoryRegion *escc_mem;
|
||||
void *nvram;
|
||||
int nb_ide;
|
||||
int ide_mem_index[4];
|
||||
MemoryRegion *ide_mem[4];
|
||||
};
|
||||
|
||||
static void macio_map (PCIDevice *pci_dev, int region_num,
|
||||
pcibus_t addr, pcibus_t size, int type)
|
||||
static void macio_bar_setup(macio_state_t *macio_state)
|
||||
{
|
||||
macio_state_t *macio_state;
|
||||
int i;
|
||||
MemoryRegion *bar = &macio_state->bar;
|
||||
|
||||
macio_state = (macio_state_t *)(pci_dev + 1);
|
||||
if (macio_state->pic_mem_index >= 0) {
|
||||
memory_region_init(bar, "macio", 0x80000);
|
||||
if (macio_state->pic_mem) {
|
||||
if (macio_state->is_oldworld) {
|
||||
/* Heathrow PIC */
|
||||
cpu_register_physical_memory(addr + 0x00000, 0x1000,
|
||||
macio_state->pic_mem_index);
|
||||
memory_region_add_subregion(bar, 0x00000, macio_state->pic_mem);
|
||||
} else {
|
||||
/* OpenPIC */
|
||||
cpu_register_physical_memory(addr + 0x40000, 0x40000,
|
||||
macio_state->pic_mem_index);
|
||||
memory_region_add_subregion(bar, 0x40000, macio_state->pic_mem);
|
||||
}
|
||||
}
|
||||
if (macio_state->dbdma_mem_index >= 0) {
|
||||
cpu_register_physical_memory(addr + 0x08000, 0x1000,
|
||||
macio_state->dbdma_mem_index);
|
||||
if (macio_state->dbdma_mem) {
|
||||
memory_region_add_subregion(bar, 0x08000, macio_state->dbdma_mem);
|
||||
}
|
||||
if (macio_state->escc_mem_index >= 0) {
|
||||
cpu_register_physical_memory(addr + 0x13000, ESCC_SIZE << 4,
|
||||
macio_state->escc_mem_index);
|
||||
if (macio_state->escc_mem) {
|
||||
memory_region_add_subregion(bar, 0x13000, macio_state->escc_mem);
|
||||
}
|
||||
if (macio_state->cuda_mem_index >= 0) {
|
||||
cpu_register_physical_memory(addr + 0x16000, 0x2000,
|
||||
macio_state->cuda_mem_index);
|
||||
if (macio_state->cuda_mem) {
|
||||
memory_region_add_subregion(bar, 0x16000, macio_state->cuda_mem);
|
||||
}
|
||||
for (i = 0; i < macio_state->nb_ide; i++) {
|
||||
if (macio_state->ide_mem_index[i] >= 0) {
|
||||
cpu_register_physical_memory(addr + 0x1f000 + (i * 0x1000), 0x1000,
|
||||
macio_state->ide_mem_index[i]);
|
||||
if (macio_state->ide_mem[i]) {
|
||||
memory_region_add_subregion(bar, 0x1f000 + (i * 0x1000),
|
||||
macio_state->ide_mem[i]);
|
||||
}
|
||||
}
|
||||
if (macio_state->nvram != NULL)
|
||||
macio_nvram_map(macio_state->nvram, addr + 0x60000);
|
||||
macio_nvram_setup_bar(macio_state->nvram, bar, 0x60000);
|
||||
}
|
||||
|
||||
void macio_init (PCIBus *bus, int device_id, int is_oldworld, int pic_mem_index,
|
||||
int dbdma_mem_index, int cuda_mem_index, void *nvram,
|
||||
int nb_ide, int *ide_mem_index, int escc_mem_index)
|
||||
void macio_init (PCIBus *bus, int device_id, int is_oldworld,
|
||||
MemoryRegion *pic_mem, MemoryRegion *dbdma_mem,
|
||||
MemoryRegion *cuda_mem, void *nvram,
|
||||
int nb_ide, MemoryRegion **ide_mem,
|
||||
MemoryRegion *escc_mem)
|
||||
{
|
||||
PCIDevice *d;
|
||||
macio_state_t *macio_state;
|
||||
|
@ -92,18 +89,18 @@ void macio_init (PCIBus *bus, int device_id, int is_oldworld, int pic_mem_index,
|
|||
-1, NULL, NULL);
|
||||
macio_state = (macio_state_t *)(d + 1);
|
||||
macio_state->is_oldworld = is_oldworld;
|
||||
macio_state->pic_mem_index = pic_mem_index;
|
||||
macio_state->dbdma_mem_index = dbdma_mem_index;
|
||||
macio_state->cuda_mem_index = cuda_mem_index;
|
||||
macio_state->escc_mem_index = escc_mem_index;
|
||||
macio_state->pic_mem = pic_mem;
|
||||
macio_state->dbdma_mem = dbdma_mem;
|
||||
macio_state->cuda_mem = cuda_mem;
|
||||
macio_state->escc_mem = escc_mem;
|
||||
macio_state->nvram = nvram;
|
||||
if (nb_ide > 4)
|
||||
nb_ide = 4;
|
||||
macio_state->nb_ide = nb_ide;
|
||||
for (i = 0; i < nb_ide; i++)
|
||||
macio_state->ide_mem_index[i] = ide_mem_index[i];
|
||||
macio_state->ide_mem[i] = ide_mem[i];
|
||||
for (; i < 4; i++)
|
||||
macio_state->ide_mem_index[i] = -1;
|
||||
macio_state->ide_mem[i] = NULL;
|
||||
/* Note: this code is strongly inspirated from the corresponding code
|
||||
in PearPC */
|
||||
|
||||
|
@ -113,6 +110,7 @@ void macio_init (PCIBus *bus, int device_id, int is_oldworld, int pic_mem_index,
|
|||
|
||||
d->config[0x3d] = 0x01; // interrupt on pin 1
|
||||
|
||||
pci_register_bar(d, 0, 0x80000,
|
||||
PCI_BASE_ADDRESS_SPACE_MEMORY, macio_map);
|
||||
macio_bar_setup(macio_state);
|
||||
pci_register_bar_region(d, 0, PCI_BASE_ADDRESS_SPACE_MEMORY,
|
||||
&macio_state->bar);
|
||||
}
|
||||
|
|
85
hw/openpic.c
85
hw/openpic.c
|
@ -205,7 +205,7 @@ typedef struct IRQ_dst_t {
|
|||
|
||||
typedef struct openpic_t {
|
||||
PCIDevice pci_dev;
|
||||
int mem_index;
|
||||
MemoryRegion mem;
|
||||
/* Global registers */
|
||||
uint32_t frep; /* Feature reporting register */
|
||||
uint32_t glbc; /* Global configuration register */
|
||||
|
@ -984,47 +984,34 @@ static uint32_t openpic_readl (void *opaque,target_phys_addr_t addr)
|
|||
return retval;
|
||||
}
|
||||
|
||||
static CPUWriteMemoryFunc * const openpic_write[] = {
|
||||
&openpic_buggy_write,
|
||||
&openpic_buggy_write,
|
||||
&openpic_writel,
|
||||
};
|
||||
|
||||
static CPUReadMemoryFunc * const openpic_read[] = {
|
||||
&openpic_buggy_read,
|
||||
&openpic_buggy_read,
|
||||
&openpic_readl,
|
||||
};
|
||||
|
||||
static void openpic_map(PCIDevice *pci_dev, int region_num,
|
||||
pcibus_t addr, pcibus_t size, int type)
|
||||
static uint64_t openpic_read(void *opaque, target_phys_addr_t addr,
|
||||
unsigned size)
|
||||
{
|
||||
openpic_t *opp;
|
||||
openpic_t *opp = opaque;
|
||||
|
||||
DPRINTF("Map OpenPIC\n");
|
||||
opp = (openpic_t *)pci_dev;
|
||||
/* Global registers */
|
||||
DPRINTF("Register OPENPIC gbl %08x => %08x\n",
|
||||
addr + 0x1000, addr + 0x1000 + 0x100);
|
||||
/* Timer registers */
|
||||
DPRINTF("Register OPENPIC timer %08x => %08x\n",
|
||||
addr + 0x1100, addr + 0x1100 + 0x40 * MAX_TMR);
|
||||
/* Interrupt source registers */
|
||||
DPRINTF("Register OPENPIC src %08x => %08x\n",
|
||||
addr + 0x10000, addr + 0x10000 + 0x20 * (OPENPIC_EXT_IRQ + 2));
|
||||
/* Per CPU registers */
|
||||
DPRINTF("Register OPENPIC dst %08x => %08x\n",
|
||||
addr + 0x20000, addr + 0x20000 + 0x1000 * MAX_CPU);
|
||||
cpu_register_physical_memory(addr, 0x40000, opp->mem_index);
|
||||
#if 0 // Don't implement ISU for now
|
||||
opp_io_memory = cpu_register_io_memory(openpic_src_read,
|
||||
openpic_src_write, NULL
|
||||
DEVICE_NATIVE_ENDIAN);
|
||||
cpu_register_physical_memory(isu_base, 0x20 * (EXT_IRQ + 2),
|
||||
opp_io_memory);
|
||||
#endif
|
||||
switch (size) {
|
||||
case 4: return openpic_readl(opp, addr);
|
||||
default: return openpic_buggy_read(opp, addr);
|
||||
}
|
||||
}
|
||||
|
||||
static void openpic_write(void *opaque, target_phys_addr_t addr,
|
||||
uint64_t data, unsigned size)
|
||||
{
|
||||
openpic_t *opp = opaque;
|
||||
|
||||
switch (size) {
|
||||
case 4: return openpic_writel(opp, addr, data);
|
||||
default: return openpic_buggy_write(opp, addr, data);
|
||||
}
|
||||
}
|
||||
|
||||
static const MemoryRegionOps openpic_ops = {
|
||||
.read = openpic_read,
|
||||
.write = openpic_write,
|
||||
.endianness = DEVICE_LITTLE_ENDIAN,
|
||||
};
|
||||
|
||||
static void openpic_save_IRQ_queue(QEMUFile* f, IRQ_queue_t *q)
|
||||
{
|
||||
unsigned int i;
|
||||
|
@ -1161,7 +1148,7 @@ static void openpic_irq_raise(openpic_t *opp, int n_CPU, IRQ_src_t *src)
|
|||
qemu_irq_raise(opp->dst[n_CPU].irqs[OPENPIC_OUTPUT_INT]);
|
||||
}
|
||||
|
||||
qemu_irq *openpic_init (PCIBus *bus, int *pmem_index, int nb_cpus,
|
||||
qemu_irq *openpic_init (PCIBus *bus, MemoryRegion **pmem, int nb_cpus,
|
||||
qemu_irq **irqs, qemu_irq irq_out)
|
||||
{
|
||||
openpic_t *opp;
|
||||
|
@ -1180,14 +1167,22 @@ qemu_irq *openpic_init (PCIBus *bus, int *pmem_index, int nb_cpus,
|
|||
pci_config_set_class(pci_conf, PCI_CLASS_SYSTEM_OTHER); // FIXME?
|
||||
pci_conf[0x3d] = 0x00; // no interrupt pin
|
||||
|
||||
memory_region_init_io(&opp->mem, &openpic_ops, opp, "openpic", 0x40000);
|
||||
#if 0 // Don't implement ISU for now
|
||||
opp_io_memory = cpu_register_io_memory(openpic_src_read,
|
||||
openpic_src_write, NULL
|
||||
DEVICE_NATIVE_ENDIAN);
|
||||
cpu_register_physical_memory(isu_base, 0x20 * (EXT_IRQ + 2),
|
||||
opp_io_memory);
|
||||
#endif
|
||||
|
||||
/* Register I/O spaces */
|
||||
pci_register_bar(&opp->pci_dev, 0, 0x40000,
|
||||
PCI_BASE_ADDRESS_SPACE_MEMORY, &openpic_map);
|
||||
pci_register_bar_region(&opp->pci_dev, 0,
|
||||
PCI_BASE_ADDRESS_SPACE_MEMORY, &opp->mem);
|
||||
} else {
|
||||
opp = qemu_mallocz(sizeof(openpic_t));
|
||||
memory_region_init_io(&opp->mem, &openpic_ops, opp, "openpic", 0x40000);
|
||||
}
|
||||
opp->mem_index = cpu_register_io_memory(openpic_read, openpic_write, opp,
|
||||
DEVICE_LITTLE_ENDIAN);
|
||||
|
||||
// isu_base &= 0xFFFC0000;
|
||||
opp->nb_cpus = nb_cpus;
|
||||
|
@ -1223,8 +1218,8 @@ qemu_irq *openpic_init (PCIBus *bus, int *pmem_index, int nb_cpus,
|
|||
opp->irq_raise = openpic_irq_raise;
|
||||
opp->reset = openpic_reset;
|
||||
|
||||
if (pmem_index)
|
||||
*pmem_index = opp->mem_index;
|
||||
if (pmem)
|
||||
*pmem = &opp->mem;
|
||||
|
||||
return qemu_allocate_irqs(openpic_set_irq, opp, opp->max_irq);
|
||||
}
|
||||
|
|
|
@ -11,7 +11,7 @@ enum {
|
|||
OPENPIC_OUTPUT_NB,
|
||||
};
|
||||
|
||||
qemu_irq *openpic_init (PCIBus *bus, int *pmem_index, int nb_cpus,
|
||||
qemu_irq *openpic_init (PCIBus *bus, MemoryRegion **pmem, int nb_cpus,
|
||||
qemu_irq **irqs, qemu_irq irq_out);
|
||||
qemu_irq *mpic_init (target_phys_addr_t base, int nb_cpus,
|
||||
qemu_irq **irqs, qemu_irq irq_out);
|
||||
|
|
16
hw/ppc_mac.h
16
hw/ppc_mac.h
|
@ -42,15 +42,16 @@
|
|||
#define ESCC_CLOCK 3686400
|
||||
|
||||
/* Cuda */
|
||||
void cuda_init (int *cuda_mem_index, qemu_irq irq);
|
||||
void cuda_init (MemoryRegion **cuda_mem, qemu_irq irq);
|
||||
|
||||
/* MacIO */
|
||||
void macio_init (PCIBus *bus, int device_id, int is_oldworld, int pic_mem_index,
|
||||
int dbdma_mem_index, int cuda_mem_index, void *nvram,
|
||||
int nb_ide, int *ide_mem_index, int escc_mem_index);
|
||||
void macio_init (PCIBus *bus, int device_id, int is_oldworld,
|
||||
MemoryRegion *pic_mem, MemoryRegion *dbdma_mem,
|
||||
MemoryRegion *cuda_mem, void *nvram,
|
||||
int nb_ide, MemoryRegion **ide_mem, MemoryRegion *escc_mem);
|
||||
|
||||
/* Heathrow PIC */
|
||||
qemu_irq *heathrow_pic_init(int *pmem_index,
|
||||
qemu_irq *heathrow_pic_init(MemoryRegion **pmem,
|
||||
int nb_cpus, qemu_irq **irqs);
|
||||
|
||||
/* Grackle PCI */
|
||||
|
@ -69,9 +70,10 @@ PCIBus *pci_pmac_u3_init(qemu_irq *pic,
|
|||
/* Mac NVRAM */
|
||||
typedef struct MacIONVRAMState MacIONVRAMState;
|
||||
|
||||
MacIONVRAMState *macio_nvram_init (int *mem_index, target_phys_addr_t size,
|
||||
MacIONVRAMState *macio_nvram_init (target_phys_addr_t size,
|
||||
unsigned int it_shift);
|
||||
void macio_nvram_map (void *opaque, target_phys_addr_t mem_base);
|
||||
void macio_nvram_setup_bar(MacIONVRAMState *s, MemoryRegion *bar,
|
||||
target_phys_addr_t mem_base);
|
||||
void pmac_format_nvram_partition (MacIONVRAMState *nvr, int len);
|
||||
uint32_t macio_nvram_read (void *opaque, uint32_t addr);
|
||||
void macio_nvram_write (void *opaque, uint32_t addr, uint32_t val);
|
||||
|
|
|
@ -144,10 +144,9 @@ static void ppc_core99_init (ram_addr_t ram_size,
|
|||
long kernel_size, initrd_size;
|
||||
PCIBus *pci_bus;
|
||||
MacIONVRAMState *nvr;
|
||||
int nvram_mem_index;
|
||||
int bios_size;
|
||||
int pic_mem_index, dbdma_mem_index, cuda_mem_index, escc_mem_index;
|
||||
int ide_mem_index[3];
|
||||
MemoryRegion *pic_mem, *dbdma_mem, *cuda_mem, *escc_mem;
|
||||
MemoryRegion *ide_mem[3];
|
||||
int ppc_boot_device;
|
||||
DriveInfo *hd[MAX_IDE_BUS * MAX_IDE_DEVS];
|
||||
void *fw_cfg;
|
||||
|
@ -315,7 +314,7 @@ static void ppc_core99_init (ram_addr_t ram_size,
|
|||
exit(1);
|
||||
}
|
||||
}
|
||||
pic = openpic_init(NULL, &pic_mem_index, smp_cpus, openpic_irqs, NULL);
|
||||
pic = openpic_init(NULL, &pic_mem, smp_cpus, openpic_irqs, NULL);
|
||||
if (PPC_INPUT(env) == PPC_FLAGS_INPUT_970) {
|
||||
/* 970 gets a U3 bus */
|
||||
pci_bus = pci_pmac_u3_init(pic, get_system_memory(), get_system_io());
|
||||
|
@ -327,32 +326,31 @@ static void ppc_core99_init (ram_addr_t ram_size,
|
|||
/* init basic PC hardware */
|
||||
pci_vga_init(pci_bus);
|
||||
|
||||
escc_mem_index = escc_init(0x80013000, pic[0x25], pic[0x24],
|
||||
serial_hds[0], serial_hds[1], ESCC_CLOCK, 4);
|
||||
escc_mem = escc_init(0x80013000, pic[0x25], pic[0x24],
|
||||
serial_hds[0], serial_hds[1], ESCC_CLOCK, 4);
|
||||
|
||||
for(i = 0; i < nb_nics; i++)
|
||||
pci_nic_init_nofail(&nd_table[i], "ne2k_pci", NULL);
|
||||
|
||||
ide_drive_get(hd, MAX_IDE_BUS);
|
||||
dbdma = DBDMA_init(&dbdma_mem_index);
|
||||
dbdma = DBDMA_init(&dbdma_mem);
|
||||
|
||||
/* We only emulate 2 out of 3 IDE controllers for now */
|
||||
ide_mem_index[0] = -1;
|
||||
ide_mem_index[1] = pmac_ide_init(hd, pic[0x0d], dbdma, 0x16, pic[0x02]);
|
||||
ide_mem_index[2] = pmac_ide_init(&hd[MAX_IDE_DEVS], pic[0x0e], dbdma, 0x1a, pic[0x02]);
|
||||
ide_mem[0] = NULL;
|
||||
ide_mem[1] = pmac_ide_init(hd, pic[0x0d], dbdma, 0x16, pic[0x02]);
|
||||
ide_mem[2] = pmac_ide_init(&hd[MAX_IDE_DEVS], pic[0x0e], dbdma, 0x1a, pic[0x02]);
|
||||
|
||||
/* cuda also initialize ADB */
|
||||
if (machine_arch == ARCH_MAC99_U3) {
|
||||
usb_enabled = 1;
|
||||
}
|
||||
cuda_init(&cuda_mem_index, pic[0x19]);
|
||||
cuda_init(&cuda_mem, pic[0x19]);
|
||||
|
||||
adb_kbd_init(&adb_bus);
|
||||
adb_mouse_init(&adb_bus);
|
||||
|
||||
macio_init(pci_bus, PCI_DEVICE_ID_APPLE_UNI_N_KEYL, 0, pic_mem_index,
|
||||
dbdma_mem_index, cuda_mem_index, NULL, 3, ide_mem_index,
|
||||
escc_mem_index);
|
||||
macio_init(pci_bus, PCI_DEVICE_ID_APPLE_UNI_N_KEYL, 0, pic_mem,
|
||||
dbdma_mem, cuda_mem, NULL, 3, ide_mem, escc_mem);
|
||||
|
||||
if (usb_enabled) {
|
||||
usb_ohci_init_pci(pci_bus, -1);
|
||||
|
@ -369,9 +367,9 @@ static void ppc_core99_init (ram_addr_t ram_size,
|
|||
graphic_depth = 15;
|
||||
|
||||
/* The NewWorld NVRAM is not located in the MacIO device */
|
||||
nvr = macio_nvram_init(&nvram_mem_index, 0x2000, 1);
|
||||
nvr = macio_nvram_init(0x2000, 1);
|
||||
pmac_format_nvram_partition(nvr, 0x2000);
|
||||
macio_nvram_map(nvr, 0xFFF04000);
|
||||
macio_nvram_setup_bar(nvr, get_system_memory(), 0xFFF04000);
|
||||
/* No PCI init: the BIOS will do it */
|
||||
|
||||
fw_cfg = fw_cfg_init(0, 0, CFG_ADDR, CFG_ADDR + 2);
|
||||
|
|
|
@ -82,8 +82,8 @@ static void ppc_heathrow_init (ram_addr_t ram_size,
|
|||
PCIBus *pci_bus;
|
||||
MacIONVRAMState *nvr;
|
||||
int bios_size;
|
||||
int pic_mem_index, nvram_mem_index, dbdma_mem_index, cuda_mem_index;
|
||||
int escc_mem_index, ide_mem_index[2];
|
||||
MemoryRegion *pic_mem, *dbdma_mem, *cuda_mem;
|
||||
MemoryRegion *escc_mem, *ide_mem[2];
|
||||
uint16_t ppc_boot_device;
|
||||
DriveInfo *hd[MAX_IDE_BUS * MAX_IDE_DEVS];
|
||||
void *fw_cfg;
|
||||
|
@ -233,13 +233,13 @@ static void ppc_heathrow_init (ram_addr_t ram_size,
|
|||
if (PPC_INPUT(env) != PPC_FLAGS_INPUT_6xx) {
|
||||
hw_error("Only 6xx bus is supported on heathrow machine\n");
|
||||
}
|
||||
pic = heathrow_pic_init(&pic_mem_index, 1, heathrow_irqs);
|
||||
pic = heathrow_pic_init(&pic_mem, 1, heathrow_irqs);
|
||||
pci_bus = pci_grackle_init(0xfec00000, pic,
|
||||
get_system_memory(),
|
||||
get_system_io());
|
||||
pci_vga_init(pci_bus);
|
||||
|
||||
escc_mem_index = escc_init(0x80013000, pic[0x0f], pic[0x10], serial_hds[0],
|
||||
escc_mem = escc_init(0x80013000, pic[0x0f], pic[0x10], serial_hds[0],
|
||||
serial_hds[1], ESCC_CLOCK, 4);
|
||||
|
||||
for(i = 0; i < nb_nics; i++)
|
||||
|
@ -249,9 +249,9 @@ static void ppc_heathrow_init (ram_addr_t ram_size,
|
|||
ide_drive_get(hd, MAX_IDE_BUS);
|
||||
|
||||
/* First IDE channel is a MAC IDE on the MacIO bus */
|
||||
dbdma = DBDMA_init(&dbdma_mem_index);
|
||||
ide_mem_index[0] = -1;
|
||||
ide_mem_index[1] = pmac_ide_init(hd, pic[0x0D], dbdma, 0x16, pic[0x02]);
|
||||
dbdma = DBDMA_init(&dbdma_mem);
|
||||
ide_mem[0] = NULL;
|
||||
ide_mem[1] = pmac_ide_init(hd, pic[0x0D], dbdma, 0x16, pic[0x02]);
|
||||
|
||||
/* Second IDE channel is a CMD646 on the PCI bus */
|
||||
hd[0] = hd[MAX_IDE_DEVS];
|
||||
|
@ -260,17 +260,16 @@ static void ppc_heathrow_init (ram_addr_t ram_size,
|
|||
pci_cmd646_ide_init(pci_bus, hd, 0);
|
||||
|
||||
/* cuda also initialize ADB */
|
||||
cuda_init(&cuda_mem_index, pic[0x12]);
|
||||
cuda_init(&cuda_mem, pic[0x12]);
|
||||
|
||||
adb_kbd_init(&adb_bus);
|
||||
adb_mouse_init(&adb_bus);
|
||||
|
||||
nvr = macio_nvram_init(&nvram_mem_index, 0x2000, 4);
|
||||
nvr = macio_nvram_init(0x2000, 4);
|
||||
pmac_format_nvram_partition(nvr, 0x2000);
|
||||
|
||||
macio_init(pci_bus, PCI_DEVICE_ID_APPLE_343S1201, 1, pic_mem_index,
|
||||
dbdma_mem_index, cuda_mem_index, nvr, 2, ide_mem_index,
|
||||
escc_mem_index);
|
||||
macio_init(pci_bus, PCI_DEVICE_ID_APPLE_343S1201, 1, pic_mem,
|
||||
dbdma_mem, cuda_mem, nvr, 2, ide_mem, escc_mem);
|
||||
|
||||
if (usb_enabled) {
|
||||
usb_ohci_init_pci(pci_bus, -1);
|
||||
|
|
Loading…
Reference in New Issue