xref: /qemu/hw/alpha/pci.c (revision a8170e5e97ad17ca169c64ba87ae2f53850dab4c)
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"
1080bb2ff7SRichard Henderson #include "alpha_sys.h"
1180bb2ff7SRichard Henderson #include "qemu-log.h"
1280bb2ff7SRichard Henderson #include "sysemu.h"
1380bb2ff7SRichard Henderson 
1480bb2ff7SRichard Henderson 
1580bb2ff7SRichard Henderson /* PCI IO reads/writes, to byte-word addressable memory.  */
1680bb2ff7SRichard Henderson /* ??? Doesn't handle multiple PCI busses.  */
1780bb2ff7SRichard Henderson 
18*a8170e5eSAvi Kivity static uint64_t bw_io_read(void *opaque, hwaddr addr, unsigned size)
1980bb2ff7SRichard Henderson {
2080bb2ff7SRichard Henderson     switch (size) {
2180bb2ff7SRichard Henderson     case 1:
2280bb2ff7SRichard Henderson         return cpu_inb(addr);
2380bb2ff7SRichard Henderson     case 2:
2480bb2ff7SRichard Henderson         return cpu_inw(addr);
2580bb2ff7SRichard Henderson     case 4:
2680bb2ff7SRichard Henderson         return cpu_inl(addr);
2780bb2ff7SRichard Henderson     }
2880bb2ff7SRichard Henderson     abort();
2980bb2ff7SRichard Henderson }
3080bb2ff7SRichard Henderson 
31*a8170e5eSAvi Kivity static void bw_io_write(void *opaque, hwaddr addr,
3280bb2ff7SRichard Henderson                         uint64_t val, unsigned size)
3380bb2ff7SRichard Henderson {
3480bb2ff7SRichard Henderson     switch (size) {
3580bb2ff7SRichard Henderson     case 1:
3680bb2ff7SRichard Henderson         cpu_outb(addr, val);
3780bb2ff7SRichard Henderson         break;
3880bb2ff7SRichard Henderson     case 2:
3980bb2ff7SRichard Henderson         cpu_outw(addr, val);
4080bb2ff7SRichard Henderson         break;
4180bb2ff7SRichard Henderson     case 4:
4280bb2ff7SRichard Henderson         cpu_outl(addr, val);
4380bb2ff7SRichard Henderson         break;
4480bb2ff7SRichard Henderson     default:
4580bb2ff7SRichard Henderson         abort();
4680bb2ff7SRichard Henderson     }
4780bb2ff7SRichard Henderson }
4880bb2ff7SRichard Henderson 
4980bb2ff7SRichard Henderson const MemoryRegionOps alpha_pci_bw_io_ops = {
5080bb2ff7SRichard Henderson     .read = bw_io_read,
5180bb2ff7SRichard Henderson     .write = bw_io_write,
5280bb2ff7SRichard Henderson     .endianness = DEVICE_LITTLE_ENDIAN,
5380bb2ff7SRichard Henderson     .impl = {
5480bb2ff7SRichard Henderson         .min_access_size = 1,
5580bb2ff7SRichard Henderson         .max_access_size = 4,
5680bb2ff7SRichard Henderson     },
5780bb2ff7SRichard Henderson };
5880bb2ff7SRichard Henderson 
5980bb2ff7SRichard Henderson /* PCI config space reads/writes, to byte-word addressable memory.  */
60*a8170e5eSAvi Kivity static uint64_t bw_conf1_read(void *opaque, hwaddr addr,
6180bb2ff7SRichard Henderson                               unsigned size)
6280bb2ff7SRichard Henderson {
6380bb2ff7SRichard Henderson     PCIBus *b = opaque;
6480bb2ff7SRichard Henderson     return pci_data_read(b, addr, size);
6580bb2ff7SRichard Henderson }
6680bb2ff7SRichard Henderson 
67*a8170e5eSAvi Kivity static void bw_conf1_write(void *opaque, hwaddr addr,
6880bb2ff7SRichard Henderson                            uint64_t val, unsigned size)
6980bb2ff7SRichard Henderson {
7080bb2ff7SRichard Henderson     PCIBus *b = opaque;
7180bb2ff7SRichard Henderson     pci_data_write(b, addr, val, size);
7280bb2ff7SRichard Henderson }
7380bb2ff7SRichard Henderson 
7480bb2ff7SRichard Henderson const MemoryRegionOps alpha_pci_conf1_ops = {
7580bb2ff7SRichard Henderson     .read = bw_conf1_read,
7680bb2ff7SRichard Henderson     .write = bw_conf1_write,
7780bb2ff7SRichard Henderson     .endianness = DEVICE_LITTLE_ENDIAN,
7880bb2ff7SRichard Henderson     .impl = {
7980bb2ff7SRichard Henderson         .min_access_size = 1,
8080bb2ff7SRichard Henderson         .max_access_size = 4,
8180bb2ff7SRichard Henderson     },
8280bb2ff7SRichard Henderson };
8380bb2ff7SRichard Henderson 
8480bb2ff7SRichard Henderson /* PCI/EISA Interrupt Acknowledge Cycle.  */
8580bb2ff7SRichard Henderson 
86*a8170e5eSAvi Kivity static uint64_t iack_read(void *opaque, hwaddr addr, unsigned size)
8780bb2ff7SRichard Henderson {
8880bb2ff7SRichard Henderson     return pic_read_irq(isa_pic);
8980bb2ff7SRichard Henderson }
9080bb2ff7SRichard Henderson 
91*a8170e5eSAvi Kivity static void special_write(void *opaque, hwaddr addr,
9280bb2ff7SRichard Henderson                           uint64_t val, unsigned size)
9380bb2ff7SRichard Henderson {
9480bb2ff7SRichard Henderson     qemu_log("pci: special write cycle");
9580bb2ff7SRichard Henderson }
9680bb2ff7SRichard Henderson 
9780bb2ff7SRichard Henderson const MemoryRegionOps alpha_pci_iack_ops = {
9880bb2ff7SRichard Henderson     .read = iack_read,
9980bb2ff7SRichard Henderson     .write = special_write,
10080bb2ff7SRichard Henderson     .endianness = DEVICE_LITTLE_ENDIAN,
10180bb2ff7SRichard Henderson     .valid = {
10280bb2ff7SRichard Henderson         .min_access_size = 4,
10380bb2ff7SRichard Henderson         .max_access_size = 4,
10480bb2ff7SRichard Henderson     },
10580bb2ff7SRichard Henderson     .impl = {
10680bb2ff7SRichard Henderson         .min_access_size = 4,
10780bb2ff7SRichard Henderson         .max_access_size = 4,
10880bb2ff7SRichard Henderson     },
10980bb2ff7SRichard Henderson };
110