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