From: Stewart Hildebrand <stewart.hildebrand@amd.com>
PCI ranges have prefetchable / non-prefetchable flags that will be
needed in the callback. Pass the flags to the callback.
Signed-off-by: Stewart Hildebrand <stewart.hildebrand@amd.com>
Signed-off-by: Mykyta Poturai <mykyta_poturai@epam.com>
---
xen/arch/arm/device.c | 4 ++--
xen/arch/arm/domain_build.c | 3 ++-
xen/arch/arm/include/asm/setup.h | 2 +-
xen/arch/arm/pci/pci-host-common.c | 4 ++--
xen/common/device-tree/device-tree.c | 5 +++--
xen/include/xen/device_tree.h | 2 +-
6 files changed, 11 insertions(+), 9 deletions(-)
diff --git a/xen/arch/arm/device.c b/xen/arch/arm/device.c
index 74b54cad34..cc0759023e 100644
--- a/xen/arch/arm/device.c
+++ b/xen/arch/arm/device.c
@@ -50,7 +50,7 @@ int map_irq_to_domain(struct domain *d, unsigned int irq,
}
int map_range_to_domain(const struct dt_device_node *dev,
- uint64_t addr, uint64_t len, void *data)
+ uint32_t flags, uint64_t addr, uint64_t len, void *data)
{
struct map_range_data *mr_data = data;
struct domain *d = mr_data->d;
@@ -325,7 +325,7 @@ int handle_device(struct domain *d, struct dt_device_node *dev, p2m_type_t p2mt,
return res;
}
- res = map_range_to_domain(dev, addr, size, &mr_data);
+ res = map_range_to_domain(dev, 0, addr, size, &mr_data);
if ( res )
return res;
}
diff --git a/xen/arch/arm/domain_build.c b/xen/arch/arm/domain_build.c
index fb8fbb1650..4bbffdf535 100644
--- a/xen/arch/arm/domain_build.c
+++ b/xen/arch/arm/domain_build.c
@@ -762,7 +762,8 @@ int __init add_ext_regions(unsigned long s_gfn, unsigned long e_gfn,
}
static int __init handle_pci_range(const struct dt_device_node *dev,
- uint64_t addr, uint64_t len, void *data)
+ uint32_t flags, uint64_t addr, uint64_t len,
+ void *data)
{
struct rangeset *mem_holes = data;
paddr_t start, end;
diff --git a/xen/arch/arm/include/asm/setup.h b/xen/arch/arm/include/asm/setup.h
index 1eaf13bd66..97bc5f90a1 100644
--- a/xen/arch/arm/include/asm/setup.h
+++ b/xen/arch/arm/include/asm/setup.h
@@ -62,7 +62,7 @@ int map_device_irqs_to_domain(struct domain *d, struct dt_device_node *dev,
int map_irq_to_domain(struct domain *d, unsigned int irq,
bool need_mapping, const char *devname);
-int map_range_to_domain(const struct dt_device_node *dev,
+int map_range_to_domain(const struct dt_device_node *dev, uint32_t flags,
uint64_t addr, uint64_t len, void *data);
struct init_info
diff --git a/xen/arch/arm/pci/pci-host-common.c b/xen/arch/arm/pci/pci-host-common.c
index d3481b05eb..67447d8696 100644
--- a/xen/arch/arm/pci/pci-host-common.c
+++ b/xen/arch/arm/pci/pci-host-common.c
@@ -418,7 +418,7 @@ int __init pci_host_bridge_mappings(struct domain *d)
bridge->child_ops->need_p2m_hwdom_mapping(d, bridge, addr);
if ( need_mapping )
{
- err = map_range_to_domain(dev, addr, size, &mr_data);
+ err = map_range_to_domain(dev, 0, addr, size, &mr_data);
if ( err )
return err;
}
@@ -434,7 +434,7 @@ int __init pci_host_bridge_mappings(struct domain *d)
* right place for alignment check.
*/
static int is_bar_valid(const struct dt_device_node *dev,
- uint64_t addr, uint64_t len, void *data)
+ uint32_t flags, uint64_t addr, uint64_t len, void *data)
{
struct pdev_bar_check *bar_data = data;
paddr_t s = bar_data->start;
diff --git a/xen/common/device-tree/device-tree.c b/xen/common/device-tree/device-tree.c
index 0b5375f151..5ee1fa4eb1 100644
--- a/xen/common/device-tree/device-tree.c
+++ b/xen/common/device-tree/device-tree.c
@@ -976,7 +976,7 @@ int dt_device_get_paddr(const struct dt_device_node *dev, unsigned int index,
int dt_for_each_range(const struct dt_device_node *dev,
int (*cb)(const struct dt_device_node *dev,
- uint64_t addr, uint64_t length,
+ uint32_t flags, uint64_t addr, uint64_t length,
void *data),
void *data)
{
@@ -1041,13 +1041,14 @@ int dt_for_each_range(const struct dt_device_node *dev,
{
uint64_t a, s;
int ret;
+ uint32_t flags = bus->get_flags(ranges);
memcpy(addr, ranges + na, 4 * pna);
a = __dt_translate_address(dev, addr, "ranges");
s = dt_read_number(ranges + na + pna, ns);
- ret = cb(dev, a, s, data);
+ ret = cb(dev, flags, a, s, data);
if ( ret )
{
dt_dprintk(" -> callback failed=%d\n", ret);
diff --git a/xen/include/xen/device_tree.h b/xen/include/xen/device_tree.h
index 06d7643622..1091e34a10 100644
--- a/xen/include/xen/device_tree.h
+++ b/xen/include/xen/device_tree.h
@@ -667,7 +667,7 @@ int dt_for_each_irq_map(const struct dt_device_node *dev,
*/
int dt_for_each_range(const struct dt_device_node *dev,
int (*cb)(const struct dt_device_node *dev,
- uint64_t addr, uint64_t length,
+ uint32_t flags, uint64_t addr, uint64_t length,
void *data),
void *data);
--
2.34.1