xref: /kvmtool/powerpc/spapr_pci.h (revision 4123ca555b1d466b08c630763a378b4d53de9ec5)
1c481cfd5SMatt Evans /*
2c481cfd5SMatt Evans  * SPAPR PHB definitions
3c481cfd5SMatt Evans  *
4c481cfd5SMatt Evans  * Modifications by Matt Evans <matt@ozlabs.org>, IBM Corporation.
5c481cfd5SMatt Evans  *
6c481cfd5SMatt Evans  * This program is free software; you can redistribute it and/or modify it
7c481cfd5SMatt Evans  * under the terms of the GNU General Public License version 2 as published
8c481cfd5SMatt Evans  * by the Free Software Foundation.
9c481cfd5SMatt Evans  */
10c481cfd5SMatt Evans 
11c481cfd5SMatt Evans #ifndef SPAPR_PCI_H
12c481cfd5SMatt Evans #define SPAPR_PCI_H
13c481cfd5SMatt Evans 
14c481cfd5SMatt Evans #include "kvm/kvm.h"
15c481cfd5SMatt Evans #include "spapr.h"
16c481cfd5SMatt Evans #include <inttypes.h>
17c481cfd5SMatt Evans 
18c481cfd5SMatt Evans /* With XICS, we can easily accomodate 1 IRQ per PCI device. */
19c481cfd5SMatt Evans 
20c481cfd5SMatt Evans #define SPAPR_PCI_NUM_LSI 256
21c481cfd5SMatt Evans 
22c481cfd5SMatt Evans struct spapr_phb {
23c481cfd5SMatt Evans 	uint64_t buid;
24c481cfd5SMatt Evans 	uint64_t mem_addr;
25c481cfd5SMatt Evans 	uint64_t mem_size;
26c481cfd5SMatt Evans 	uint64_t io_addr;
27c481cfd5SMatt Evans 	uint64_t io_size;
28c481cfd5SMatt Evans };
29c481cfd5SMatt Evans 
30c481cfd5SMatt Evans void spapr_create_phb(struct kvm *kvm,
31c481cfd5SMatt Evans                       const char *busname, uint64_t buid,
32c481cfd5SMatt Evans                       uint64_t mem_win_addr, uint64_t mem_win_size,
33c481cfd5SMatt Evans                       uint64_t io_win_addr, uint64_t io_win_size);
34c481cfd5SMatt Evans 
35c481cfd5SMatt Evans int spapr_populate_pci_devices(struct kvm *kvm,
36c481cfd5SMatt Evans                                uint32_t xics_phandle,
37c481cfd5SMatt Evans                                void *fdt);
38c481cfd5SMatt Evans 
spapr_phb_mmio(struct kvm_cpu * vcpu,u64 phys_addr,u8 * data,u32 len,u8 is_write)399b735910SMarc Zyngier static inline bool spapr_phb_mmio(struct kvm_cpu *vcpu, u64 phys_addr, u8 *data, u32 len, u8 is_write)
40c481cfd5SMatt Evans {
41c481cfd5SMatt Evans 	if ((phys_addr >= SPAPR_PCI_IO_WIN_ADDR) &&
42c481cfd5SMatt Evans 	    (phys_addr < SPAPR_PCI_IO_WIN_ADDR +
43c481cfd5SMatt Evans 	     SPAPR_PCI_IO_WIN_SIZE)) {
44*4123ca55SMarc Zyngier 		return kvm__emulate_io(vcpu, phys_addr - SPAPR_PCI_IO_WIN_ADDR,
45c481cfd5SMatt Evans 				       data, is_write ? KVM_EXIT_IO_OUT :
46c481cfd5SMatt Evans 				       KVM_EXIT_IO_IN,
47c481cfd5SMatt Evans 				       len, 1);
48c481cfd5SMatt Evans 	} else if ((phys_addr >= SPAPR_PCI_MEM_WIN_ADDR) &&
49c481cfd5SMatt Evans 		   (phys_addr < SPAPR_PCI_MEM_WIN_ADDR +
50c481cfd5SMatt Evans 		    SPAPR_PCI_MEM_WIN_SIZE)) {
519b735910SMarc Zyngier 		return kvm__emulate_mmio(vcpu, phys_addr - SPAPR_PCI_MEM_WIN_ADDR,
52c481cfd5SMatt Evans 					 data, len, is_write);
53c481cfd5SMatt Evans 	}
54c481cfd5SMatt Evans 	return false;
55c481cfd5SMatt Evans }
56c481cfd5SMatt Evans 
57c481cfd5SMatt Evans #endif
58