xref: /qemu/hw/alpha/pci.c (revision 3661049fec64ffd7ab008e57e396881c6a4b53a4)
180bb2ff7SRichard Henderson /*
280bb2ff7SRichard Henderson  * QEMU Alpha PCI support functions.
380bb2ff7SRichard Henderson  *
480bb2ff7SRichard Henderson  * Some of this isn't very Alpha specific at all.
580bb2ff7SRichard Henderson  *
680bb2ff7SRichard Henderson  * ??? Sparse memory access not implemented.
780bb2ff7SRichard Henderson  */
880bb2ff7SRichard Henderson 
980bb2ff7SRichard Henderson #include "config.h"
1047b43a1fSPaolo Bonzini #include "alpha_sys.h"
111de7afc9SPaolo Bonzini #include "qemu/log.h"
129c17d615SPaolo Bonzini #include "sysemu/sysemu.h"
1380bb2ff7SRichard Henderson 
1480bb2ff7SRichard Henderson 
15*3661049fSRichard Henderson /* Fallback for unassigned PCI I/O operations.  Avoids MCHK.  */
16*3661049fSRichard Henderson 
17*3661049fSRichard Henderson static uint64_t ignore_read(void *opaque, hwaddr addr, unsigned size)
18*3661049fSRichard Henderson {
19*3661049fSRichard Henderson     return 0;
20*3661049fSRichard Henderson }
21*3661049fSRichard Henderson 
22*3661049fSRichard Henderson static void ignore_write(void *opaque, hwaddr addr, uint64_t v, unsigned size)
23*3661049fSRichard Henderson {
24*3661049fSRichard Henderson }
25*3661049fSRichard Henderson 
26*3661049fSRichard Henderson const MemoryRegionOps alpha_pci_ignore_ops = {
27*3661049fSRichard Henderson     .read = ignore_read,
28*3661049fSRichard Henderson     .write = ignore_write,
29*3661049fSRichard Henderson     .endianness = DEVICE_LITTLE_ENDIAN,
30*3661049fSRichard Henderson     .valid = {
31*3661049fSRichard Henderson         .min_access_size = 1,
32*3661049fSRichard Henderson         .max_access_size = 8,
33*3661049fSRichard Henderson     },
34*3661049fSRichard Henderson     .impl = {
35*3661049fSRichard Henderson         .min_access_size = 1,
36*3661049fSRichard Henderson         .max_access_size = 8,
37*3661049fSRichard Henderson     },
38*3661049fSRichard Henderson };
39*3661049fSRichard Henderson 
40*3661049fSRichard Henderson 
4180bb2ff7SRichard Henderson /* PCI config space reads/writes, to byte-word addressable memory.  */
42a8170e5eSAvi Kivity static uint64_t bw_conf1_read(void *opaque, hwaddr addr,
4380bb2ff7SRichard Henderson                               unsigned size)
4480bb2ff7SRichard Henderson {
4580bb2ff7SRichard Henderson     PCIBus *b = opaque;
4680bb2ff7SRichard Henderson     return pci_data_read(b, addr, size);
4780bb2ff7SRichard Henderson }
4880bb2ff7SRichard Henderson 
49a8170e5eSAvi Kivity static void bw_conf1_write(void *opaque, hwaddr addr,
5080bb2ff7SRichard Henderson                            uint64_t val, unsigned size)
5180bb2ff7SRichard Henderson {
5280bb2ff7SRichard Henderson     PCIBus *b = opaque;
5380bb2ff7SRichard Henderson     pci_data_write(b, addr, val, size);
5480bb2ff7SRichard Henderson }
5580bb2ff7SRichard Henderson 
5680bb2ff7SRichard Henderson const MemoryRegionOps alpha_pci_conf1_ops = {
5780bb2ff7SRichard Henderson     .read = bw_conf1_read,
5880bb2ff7SRichard Henderson     .write = bw_conf1_write,
5980bb2ff7SRichard Henderson     .endianness = DEVICE_LITTLE_ENDIAN,
6080bb2ff7SRichard Henderson     .impl = {
6180bb2ff7SRichard Henderson         .min_access_size = 1,
6280bb2ff7SRichard Henderson         .max_access_size = 4,
6380bb2ff7SRichard Henderson     },
6480bb2ff7SRichard Henderson };
6580bb2ff7SRichard Henderson 
6680bb2ff7SRichard Henderson /* PCI/EISA Interrupt Acknowledge Cycle.  */
6780bb2ff7SRichard Henderson 
68a8170e5eSAvi Kivity static uint64_t iack_read(void *opaque, hwaddr addr, unsigned size)
6980bb2ff7SRichard Henderson {
7080bb2ff7SRichard Henderson     return pic_read_irq(isa_pic);
7180bb2ff7SRichard Henderson }
7280bb2ff7SRichard Henderson 
73a8170e5eSAvi Kivity static void special_write(void *opaque, hwaddr addr,
7480bb2ff7SRichard Henderson                           uint64_t val, unsigned size)
7580bb2ff7SRichard Henderson {
7680bb2ff7SRichard Henderson     qemu_log("pci: special write cycle");
7780bb2ff7SRichard Henderson }
7880bb2ff7SRichard Henderson 
7980bb2ff7SRichard Henderson const MemoryRegionOps alpha_pci_iack_ops = {
8080bb2ff7SRichard Henderson     .read = iack_read,
8180bb2ff7SRichard Henderson     .write = special_write,
8280bb2ff7SRichard Henderson     .endianness = DEVICE_LITTLE_ENDIAN,
8380bb2ff7SRichard Henderson     .valid = {
8480bb2ff7SRichard Henderson         .min_access_size = 4,
8580bb2ff7SRichard Henderson         .max_access_size = 4,
8680bb2ff7SRichard Henderson     },
8780bb2ff7SRichard Henderson     .impl = {
8880bb2ff7SRichard Henderson         .min_access_size = 4,
8980bb2ff7SRichard Henderson         .max_access_size = 4,
9080bb2ff7SRichard Henderson     },
9180bb2ff7SRichard Henderson };
92