Now that we have some common OF PCI definitions in of_pci.h, make use
of them when generating the devicetree for spapr_pci on ppc.

Signed-off-by: Will Deacon <will.dea...@arm.com>
---
 tools/kvm/powerpc/spapr_pci.c | 114 ++++++++++++++++++------------------------
 1 file changed, 48 insertions(+), 66 deletions(-)

diff --git a/tools/kvm/powerpc/spapr_pci.c b/tools/kvm/powerpc/spapr_pci.c
index ed4b9ab52a7c..768e3f2df648 100644
--- a/tools/kvm/powerpc/spapr_pci.c
+++ b/tools/kvm/powerpc/spapr_pci.c
@@ -18,6 +18,7 @@
 #include "kvm/devices.h"
 #include "kvm/fdt.h"
 #include "kvm/util.h"
+#include "kvm/of_pci.h"
 #include "kvm/pci.h"
 
 #include <linux/pci_regs.h>
@@ -42,26 +43,8 @@ static const uint32_t bars[] = {
 
 #define PCI_NUM_REGIONS                7
 
-/* Macros to operate with address in OF binding to PCI */
-#define b_x(x, p, l)   (((x) & ((1<<(l))-1)) << (p))
-#define b_n(x)         b_x((x), 31, 1) /* 0 if relocatable */
-#define b_p(x)         b_x((x), 30, 1) /* 1 if prefetchable */
-#define b_t(x)         b_x((x), 29, 1) /* 1 if the address is aliased */
-#define b_ss(x)                b_x((x), 24, 2) /* the space code */
-#define b_bbbbbbbb(x)  b_x((x), 16, 8) /* bus number */
-#define b_ddddd(x)     b_x((x), 11, 5) /* device number */
-#define b_fff(x)       b_x((x), 8, 3)  /* function number */
-#define b_rrrrrrrr(x)  b_x((x), 0, 8)  /* register number */
-
-#define SS_M64         3
-#define SS_M32         2
-#define SS_IO          1
-#define SS_CONFIG      0
-
-
 static struct spapr_phb phb;
 
-
 static void rtas_ibm_read_pci_config(struct kvm_cpu *vcpu,
                                     uint32_t token, uint32_t nargs,
                                     target_ulong args,
@@ -228,11 +211,11 @@ static uint32_t bar_to_ss(unsigned long bar)
 {
        if ((bar & PCI_BASE_ADDRESS_SPACE) ==
            PCI_BASE_ADDRESS_SPACE_IO)
-               return SS_IO;
+               return OF_PCI_SS_IO;
        else if (bar & PCI_BASE_ADDRESS_MEM_TYPE_64)
-               return SS_M64;
+               return OF_PCI_SS_M64;
        else
-               return SS_M32;
+               return OF_PCI_SS_M32;
 }
 
 static unsigned long bar_to_addr(unsigned long bar)
@@ -251,33 +234,32 @@ 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 {
-               uint32_t hi;
-               uint64_t addr;
-               uint64_t size;
-       } __attribute__((packed)) reg[PCI_NUM_REGIONS + 1],
-                 assigned_addresses[PCI_NUM_REGIONS];
+       struct of_pci_unit_address reg[PCI_NUM_REGIONS + 1],
+                                  assigned_addresses[PCI_NUM_REGIONS];
        uint32_t bus_range[] = { cpu_to_be32(0), cpu_to_be32(0xff) };
-       struct {
-               uint32_t hi;
-               uint64_t child;
-               uint64_t parent;
-               uint64_t size;
-       } __attribute__((packed)) ranges[] = {
+       struct of_pci_ranges_entry ranges[] = {
                {
-                       cpu_to_be32(b_ss(1)), cpu_to_be64(0),
+                       {
+                               cpu_to_be32(of_pci_b_ss(1)),
+                               cpu_to_be32(0),
+                               cpu_to_be32(0),
+                       },
                        cpu_to_be64(phb.io_addr),
                        cpu_to_be64(phb.io_size),
                },
                {
-                       cpu_to_be32(b_ss(2)), cpu_to_be64(0),
+                       {
+                               cpu_to_be32(of_pci_b_ss(2)),
+                               cpu_to_be32(0),
+                               cpu_to_be32(0),
+                       },
                        cpu_to_be64(phb.mem_addr),
                        cpu_to_be64(phb.mem_size),
                },
        };
        uint64_t bus_reg[] = { cpu_to_be64(phb.buid), 0 };
        uint32_t interrupt_map_mask[] = {
-               cpu_to_be32(b_ddddd(-1)|b_fff(-1)), 0x0, 0x0, 0x0};
+               cpu_to_be32(of_pci_b_ddddd(-1)|of_pci_b_fff(-1)), 0x0, 0x0, 
0x0};
        uint32_t interrupt_map[SPAPR_PCI_NUM_LSI][7];
 
        /* Start populating the FDT */
@@ -321,7 +303,7 @@ int spapr_populate_pci_devices(struct kvm *kvm,
                        die("Unexpected behaviour in 
spapr_populate_pci_devices,"
                            "wrong devid %u\n", devid);
                }
-               irqmap[0] = cpu_to_be32(b_ddddd(devid)|b_fff(fn));
+               irqmap[0] = cpu_to_be32(of_pci_b_ddddd(devid)|of_pci_b_fff(fn));
                irqmap[1] = 0;
                irqmap[2] = 0;
                irqmap[3] = 0;
@@ -358,15 +340,15 @@ int spapr_populate_pci_devices(struct kvm *kvm,
 
                /* Config space region comes first */
                reg[0].hi = cpu_to_be32(
-                       b_n(0) |
-                       b_p(0) |
-                       b_t(0) |
-                       b_ss(SS_CONFIG) |
-                       b_bbbbbbbb(0) |
-                       b_ddddd(devid) |
-                       b_fff(fn));
-               reg[0].addr = 0;
-               reg[0].size = 0;
+                       of_pci_b_n(0) |
+                       of_pci_b_p(0) |
+                       of_pci_b_t(0) |
+                       of_pci_b_ss(OF_PCI_SS_CONFIG) |
+                       of_pci_b_bbbbbbbb(0) |
+                       of_pci_b_ddddd(devid) |
+                       of_pci_b_fff(fn));
+               reg[0].mid = 0;
+               reg[0].lo = 0;
 
                n = 0;
                /* Six BARs, no ROM supported, addresses are 32bit */
@@ -376,33 +358,33 @@ int spapr_populate_pci_devices(struct kvm *kvm,
                        }
 
                        reg[n+1].hi = cpu_to_be32(
-                               b_n(0) |
-                               b_p(0) |
-                               b_t(0) |
-                               b_ss(bar_to_ss(le32_to_cpu(hdr->bar[i]))) |
-                               b_bbbbbbbb(0) |
-                               b_ddddd(devid) |
-                               b_fff(fn) |
-                               b_rrrrrrrr(bars[i]));
-                       reg[n+1].addr = 0;
-                       reg[n+1].size = cpu_to_be64(hdr->bar_size[i]);
+                               of_pci_b_n(0) |
+                               of_pci_b_p(0) |
+                               of_pci_b_t(0) |
+                               
of_pci_b_ss(bar_to_ss(le32_to_cpu(hdr->bar[i]))) |
+                               of_pci_b_bbbbbbbb(0) |
+                               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]);
 
                        assigned_addresses[n].hi = cpu_to_be32(
-                               b_n(1) |
-                               b_p(0) |
-                               b_t(0) |
-                               b_ss(bar_to_ss(le32_to_cpu(hdr->bar[i]))) |
-                               b_bbbbbbbb(0) |
-                               b_ddddd(devid) |
-                               b_fff(fn) |
-                               b_rrrrrrrr(bars[i]));
+                               of_pci_b_n(1) |
+                               of_pci_b_p(0) |
+                               of_pci_b_t(0) |
+                               
of_pci_b_ss(bar_to_ss(le32_to_cpu(hdr->bar[i]))) |
+                               of_pci_b_bbbbbbbb(0) |
+                               of_pci_b_ddddd(devid) |
+                               of_pci_b_fff(fn) |
+                               of_pci_b_rrrrrrrr(bars[i]));
 
                        /*
                         * Writing zeroes to assigned_addresses causes the 
guest kernel to
                         * reassign BARs
                         */
-                       assigned_addresses[n].addr = 
cpu_to_be64(bar_to_addr(le32_to_cpu(hdr->bar[i])));
-                       assigned_addresses[n].size = reg[n+1].size;
+                       assigned_addresses[n].mid = 
cpu_to_be64(bar_to_addr(le32_to_cpu(hdr->bar[i])));
+                       assigned_addresses[n].lo = reg[n+1].lo;
 
                        ++n;
                }
-- 
1.8.2.2

--
To unsubscribe from this list: send the line "unsubscribe kvm" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html

Reply via email to