/* * SPAPR PHB definitions * * Modifications by Matt Evans , IBM Corporation. * * This program is free software; you can redistribute it and/or modify it * under the terms of the GNU General Public License version 2 as published * by the Free Software Foundation. */ #ifndef SPAPR_PCI_H #define SPAPR_PCI_H #include "kvm/kvm.h" #include "spapr.h" #include /* With XICS, we can easily accomodate 1 IRQ per PCI device. */ #define SPAPR_PCI_NUM_LSI 256 struct spapr_phb { uint64_t buid; uint64_t mem_addr; uint64_t mem_size; uint64_t io_addr; uint64_t io_size; }; void spapr_create_phb(struct kvm *kvm, const char *busname, uint64_t buid, uint64_t mem_win_addr, uint64_t mem_win_size, uint64_t io_win_addr, uint64_t io_win_size); int spapr_populate_pci_devices(struct kvm *kvm, uint32_t xics_phandle, void *fdt); static inline bool spapr_phb_mmio(struct kvm_cpu *vcpu, u64 phys_addr, u8 *data, u32 len, u8 is_write) { if ((phys_addr >= SPAPR_PCI_IO_WIN_ADDR) && (phys_addr < SPAPR_PCI_IO_WIN_ADDR + SPAPR_PCI_IO_WIN_SIZE)) { return kvm__emulate_io(vcpu, phys_addr - SPAPR_PCI_IO_WIN_ADDR, data, is_write ? KVM_EXIT_IO_OUT : KVM_EXIT_IO_IN, len, 1); } else if ((phys_addr >= SPAPR_PCI_MEM_WIN_ADDR) && (phys_addr < SPAPR_PCI_MEM_WIN_ADDR + SPAPR_PCI_MEM_WIN_SIZE)) { return kvm__emulate_mmio(vcpu, phys_addr - SPAPR_PCI_MEM_WIN_ADDR, data, len, is_write); } return false; } #endif