aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorBalbir Singh <bsingharora@gmail.com>2016-04-03 20:38:02 +1000
committerWill Deacon <will.deacon@arm.com>2016-04-11 12:00:11 +0100
commit5568f3e36d6da688c9bbe67d4157d960879d4ff0 (patch)
treeb7dd86017d35f673b7b94a1d8df4893156fb7860
parent015785d4efcc6fde5f6d1c79e4adced42283efb2 (diff)
downloadkvmtool-5568f3e36d6da688c9bbe67d4157d960879d4ff0.tar.gz
Implement spapr pci for little endian systems.
Port the spapr_pci implementation for ppc64le. Based on suggestions by Alexey Kardashevskiy <aik@ozlabs.ru> We should have always used phys_hi and 64 bit addr and size. Cc: Alexey Kardashevskiy <aik@ozlabs.ru> Signed-off-by: Balbir Singh <bsingharora@gmail.com> Acked-by: Michael Ellerman <mpe@ellerman.id.au> Signed-off-by: Will Deacon <will.deacon@arm.com>
-rw-r--r--powerpc/spapr_pci.c25
1 files changed, 14 insertions, 11 deletions
diff --git a/powerpc/spapr_pci.c b/powerpc/spapr_pci.c
index 768e3f2d..a15f7d89 100644
--- a/powerpc/spapr_pci.c
+++ b/powerpc/spapr_pci.c
@@ -234,8 +234,11 @@ int spapr_populate_pci_devices(struct kvm *kvm,
int bus_off, node_off = 0, devid, fn, i, n, devices;
struct device_header *dev_hdr;
char nodename[256];
- struct of_pci_unit_address reg[PCI_NUM_REGIONS + 1],
- assigned_addresses[PCI_NUM_REGIONS];
+ struct of_pci_unit64_address {
+ u32 phys_hi;
+ u64 addr;
+ u64 size;
+ } __attribute((packed)) reg[PCI_NUM_REGIONS + 1], assigned_addresses[PCI_NUM_REGIONS];
uint32_t bus_range[] = { cpu_to_be32(0), cpu_to_be32(0xff) };
struct of_pci_ranges_entry ranges[] = {
{
@@ -339,7 +342,7 @@ int spapr_populate_pci_devices(struct kvm *kvm,
le16_to_cpu(hdr->subsys_vendor_id)));
/* Config space region comes first */
- reg[0].hi = cpu_to_be32(
+ reg[0].phys_hi = cpu_to_be32(
of_pci_b_n(0) |
of_pci_b_p(0) |
of_pci_b_t(0) |
@@ -347,8 +350,8 @@ int spapr_populate_pci_devices(struct kvm *kvm,
of_pci_b_bbbbbbbb(0) |
of_pci_b_ddddd(devid) |
of_pci_b_fff(fn));
- reg[0].mid = 0;
- reg[0].lo = 0;
+ reg[0].addr = 0;
+ reg[0].size = 0;
n = 0;
/* Six BARs, no ROM supported, addresses are 32bit */
@@ -357,7 +360,7 @@ int spapr_populate_pci_devices(struct kvm *kvm,
continue;
}
- reg[n+1].hi = cpu_to_be32(
+ reg[n+1].phys_hi = cpu_to_be32(
of_pci_b_n(0) |
of_pci_b_p(0) |
of_pci_b_t(0) |
@@ -366,10 +369,10 @@ int spapr_populate_pci_devices(struct kvm *kvm,
of_pci_b_ddddd(devid) |
of_pci_b_fff(fn) |
of_pci_b_rrrrrrrr(bars[i]));
- reg[n+1].mid = 0;
- reg[n+1].lo = cpu_to_be64(hdr->bar_size[i]);
+ reg[n+1].size = cpu_to_be64(hdr->bar_size[i]);
+ reg[n+1].addr = 0;
- assigned_addresses[n].hi = cpu_to_be32(
+ assigned_addresses[n].phys_hi = cpu_to_be32(
of_pci_b_n(1) |
of_pci_b_p(0) |
of_pci_b_t(0) |
@@ -383,8 +386,8 @@ int spapr_populate_pci_devices(struct kvm *kvm,
* Writing zeroes to assigned_addresses causes the guest kernel to
* reassign BARs
*/
- assigned_addresses[n].mid = cpu_to_be64(bar_to_addr(le32_to_cpu(hdr->bar[i])));
- assigned_addresses[n].lo = reg[n+1].lo;
+ assigned_addresses[n].addr = cpu_to_be64(bar_to_addr(le32_to_cpu(hdr->bar[i])));
+ assigned_addresses[n].size = reg[n+1].size;
++n;
}