From: Ayan Kumar Halder <ayan.kumar.halder@amd.com>
To: <xen-devel@lists.xenproject.org>
Cc: <sstabellini@kernel.org>, <stefano.stabellini@amd.com>,
<julien@xen.org>, <Volodymyr_Babchuk@epam.com>,
<bertrand.marquis@arm.com>,
Ayan Kumar Halder <ayan.kumar.halder@amd.com>
Subject: [XEN v1 4/9] xen/arm: Use translate_dt_address_size() to translate between device tree addr/size and paddr_t
Date: Thu, 15 Dec 2022 19:32:40 +0000 [thread overview]
Message-ID: <20221215193245.48314-5-ayan.kumar.halder@amd.com> (raw)
In-Reply-To: <20221215193245.48314-1-ayan.kumar.halder@amd.com>
dt_device_get_address() will return address and size which are always 'u64'.
One should use translate_dt_address_size() to translate address and size to
'paddr_t'.
Signed-off-by: Ayan Kumar Halder <ayan.kumar.halder@amd.com>
---
xen/arch/arm/domain_build.c | 53 +++++++++++++++++++++++-------
xen/arch/arm/gic-v2.c | 39 +++++++++++++++++-----
xen/arch/arm/gic-v3.c | 33 ++++++++++++++++---
xen/arch/arm/platforms/brcm.c | 9 +++--
xen/arch/arm/platforms/exynos5.c | 48 ++++++++++++++++++---------
xen/arch/arm/platforms/sunxi.c | 11 ++++++-
xen/arch/arm/setup.c | 18 ++++++++--
xen/drivers/char/exynos4210-uart.c | 10 ++++--
xen/drivers/char/ns16550.c | 13 ++++++--
xen/drivers/char/omap-uart.c | 10 ++++--
xen/drivers/char/pl011.c | 10 ++++--
xen/drivers/char/scif-uart.c | 10 ++++--
xen/drivers/passthrough/arm/smmu.c | 13 +++++---
xen/include/xen/serial.h | 2 +-
14 files changed, 218 insertions(+), 61 deletions(-)
diff --git a/xen/arch/arm/domain_build.c b/xen/arch/arm/domain_build.c
index bef5e905a7..1bb97cd337 100644
--- a/xen/arch/arm/domain_build.c
+++ b/xen/arch/arm/domain_build.c
@@ -537,8 +537,11 @@ static mfn_t __init acquire_static_memory_bank(struct domain *d,
{
mfn_t smfn;
int res;
+ u64 dt_pbase, dt_psize;
+
+ device_tree_get_reg(cell, addr_cells, size_cells, &dt_pbase, &dt_psize);
+ res = translate_dt_address_size(&dt_pbase, &dt_psize, pbase, psize);
- device_tree_get_reg(cell, addr_cells, size_cells, pbase, psize);
ASSERT(IS_ALIGNED(*pbase, PAGE_SIZE) && IS_ALIGNED(*psize, PAGE_SIZE));
if ( PFN_DOWN(*psize) > UINT_MAX )
{
@@ -929,7 +932,8 @@ static int __init process_shm(struct domain *d, struct kernel_info *kinfo,
const struct dt_property *prop;
const __be32 *cells;
uint32_t addr_cells, size_cells;
- paddr_t gbase, pbase, psize;
+ u64 dt_gbase = 0, dt_pbase = 0, dt_psize = 0;
+ paddr_t gbase = 0, pbase = 0, psize = 0;
int ret = 0;
unsigned int i;
const char *role_str;
@@ -948,8 +952,14 @@ static int __init process_shm(struct domain *d, struct kernel_info *kinfo,
prop = dt_find_property(shm_node, "xen,shared-mem", NULL);
BUG_ON(!prop);
cells = (const __be32 *)prop->value;
- device_tree_get_reg(&cells, addr_cells, addr_cells, &pbase, &gbase);
- psize = dt_read_number(cells, size_cells);
+ device_tree_get_reg(&cells, addr_cells, addr_cells, &dt_pbase, &dt_gbase);
+ ret = translate_dt_address_size(&dt_pbase, &dt_gbase, &pbase, &gbase);
+ if ( ret )
+ return ret;
+
+ dt_psize = dt_read_number(cells, size_cells);
+ ret = translate_dt_address_size(NULL, &dt_psize, NULL, &psize);
+
if ( !IS_ALIGNED(pbase, PAGE_SIZE) || !IS_ALIGNED(gbase, PAGE_SIZE) )
{
printk("%pd: physical address 0x%"PRIpaddr", or guest address 0x%"PRIpaddr" is not suitably aligned.\n",
@@ -1666,13 +1676,14 @@ static int __init find_memory_holes(const struct kernel_info *kinfo,
dt_for_each_device_node( dt_host, np )
{
unsigned int naddr;
- u64 addr, size;
+ paddr_t addr, size;
+ u64 dt_addr, dt_size;
naddr = dt_number_of_address(np);
for ( i = 0; i < naddr; i++ )
{
- res = dt_device_get_address(np, i, &addr, &size);
+ res = dt_device_get_address(np, i, &dt_addr, &dt_size);
if ( res )
{
printk(XENLOG_ERR "Unable to retrieve address %u for %s\n",
@@ -1680,6 +1691,10 @@ static int __init find_memory_holes(const struct kernel_info *kinfo,
goto out;
}
+ res = translate_dt_address_size(&dt_addr, &dt_size, &addr, &size);
+ if ( res )
+ return res;
+
start = addr & PAGE_MASK;
end = PAGE_ALIGN(addr + size);
res = rangeset_remove_range(mem_holes, start, end - 1);
@@ -2445,7 +2460,8 @@ static int __init handle_device(struct domain *d, struct dt_device_node *dev,
unsigned int naddr;
unsigned int i;
int res;
- u64 addr, size;
+ paddr_t addr, size;
+ u64 dt_addr, dt_size;
bool own_device = !dt_device_for_passthrough(dev);
/*
* We want to avoid mapping the MMIO in dom0 for the following cases:
@@ -2500,7 +2516,7 @@ static int __init handle_device(struct domain *d, struct dt_device_node *dev,
/* Give permission and map MMIOs */
for ( i = 0; i < naddr; i++ )
{
- res = dt_device_get_address(dev, i, &addr, &size);
+ res = dt_device_get_address(dev, i, &dt_addr, &dt_size);
if ( res )
{
printk(XENLOG_ERR "Unable to retrieve address %u for %s\n",
@@ -2508,6 +2524,10 @@ static int __init handle_device(struct domain *d, struct dt_device_node *dev,
return res;
}
+ res = translate_dt_address_size(&dt_addr, &dt_size, &addr, &size);
+ if ( res )
+ return res;
+
res = map_range_to_domain(dev, addr, size, &mr_data);
if ( res )
return res;
@@ -2917,6 +2937,7 @@ static int __init handle_passthrough_prop(struct kernel_info *kinfo,
struct dt_device_node *node;
int res;
paddr_t mstart, size, gstart;
+ u64 dt_mstart, dt_size, dt_gstart;
/* xen,reg specifies where to map the MMIO region */
cell = (const __be32 *)xen_reg->data;
@@ -2926,8 +2947,15 @@ static int __init handle_passthrough_prop(struct kernel_info *kinfo,
for ( i = 0; i < len; i++ )
{
device_tree_get_reg(&cell, address_cells, size_cells,
- &mstart, &size);
- gstart = dt_next_cell(address_cells, &cell);
+ &dt_mstart, &dt_size);
+ res = translate_dt_address_size(&dt_mstart, &dt_size, &mstart, &size);
+ if ( res )
+ return res;
+
+ dt_gstart = dt_next_cell(address_cells, &cell);
+ res = translate_dt_address_size(&dt_gstart, NULL, &gstart, NULL);
+ if ( res )
+ return res;
if ( gstart & ~PAGE_MASK || mstart & ~PAGE_MASK || size & ~PAGE_MASK )
{
@@ -2941,9 +2969,10 @@ static int __init handle_passthrough_prop(struct kernel_info *kinfo,
if ( res )
{
printk(XENLOG_ERR "Unable to permit to dom%d access to"
- " 0x%"PRIx64" - 0x%"PRIx64"\n",
+ " 0x%"PRIpaddr" - 0x%"PRIpaddr"\n",
kinfo->d->domain_id,
- mstart & PAGE_MASK, PAGE_ALIGN(mstart + size) - 1);
+ (paddr_t) (mstart & PAGE_MASK),
+ (paddr_t) (PAGE_ALIGN(mstart + size) - 1));
return res;
}
diff --git a/xen/arch/arm/gic-v2.c b/xen/arch/arm/gic-v2.c
index 61802839cb..72de0707ed 100644
--- a/xen/arch/arm/gic-v2.c
+++ b/xen/arch/arm/gic-v2.c
@@ -979,6 +979,7 @@ static void gicv2_add_v2m_frame_to_list(paddr_t addr, paddr_t size,
static void gicv2_extension_dt_init(const struct dt_device_node *node)
{
const struct dt_device_node *v2m = NULL;
+ int res;
/*
* Check whether this GIC implements the v2m extension. If so,
@@ -987,13 +988,18 @@ static void gicv2_extension_dt_init(const struct dt_device_node *node)
dt_for_each_child_node(node, v2m)
{
u32 spi_start = 0, nr_spis = 0;
+ u64 dt_addr, dt_size;
paddr_t addr, size;
if ( !dt_device_is_compatible(v2m, "arm,gic-v2m-frame") )
continue;
/* Get register frame resource from DT. */
- if ( dt_device_get_address(v2m, 0, &addr, &size) )
+ if ( dt_device_get_address(v2m, 0, &dt_addr, &dt_size) )
+ panic("GICv2: Cannot find a valid v2m frame address\n");
+
+ res = translate_dt_address_size(&dt_addr, &dt_size, &addr, &size);
+ if ( res )
panic("GICv2: Cannot find a valid v2m frame address\n");
/*
@@ -1017,20 +1023,37 @@ static void __init gicv2_dt_init(void)
int res;
paddr_t vsize;
const struct dt_device_node *node = gicv2_info.node;
+ u64 dt_hbase, dt_dbase, dt_cbase, dt_csize, dt_vbase, dt_vsize;
- res = dt_device_get_address(node, 0, &dbase, NULL);
+ res = dt_device_get_address(node, 0, &dt_dbase, NULL);
if ( res )
panic("GICv2: Cannot find a valid address for the distributor\n");
- res = dt_device_get_address(node, 1, &cbase, &csize);
+ res = translate_dt_address_size(&dt_dbase, NULL, &dbase, NULL);
+ if ( res )
+ panic("GICv2: Cannot find a valid address for the distributor\n");
+
+ res = dt_device_get_address(node, 1, &dt_cbase, &dt_csize);
+ if ( res )
+ panic("GICv2: Cannot find a valid address for the CPU\n");
+
+ res = translate_dt_address_size(&dt_cbase, &dt_csize, &cbase, &csize);
if ( res )
panic("GICv2: Cannot find a valid address for the CPU\n");
- res = dt_device_get_address(node, 2, &hbase, NULL);
+ res = dt_device_get_address(node, 2, &dt_hbase, NULL);
+ if ( res )
+ panic("GICv2: Cannot find a valid address for the hypervisor\n");
+
+ res = translate_dt_address_size(&dt_hbase, NULL, &hbase, NULL);
if ( res )
panic("GICv2: Cannot find a valid address for the hypervisor\n");
- res = dt_device_get_address(node, 3, &vbase, &vsize);
+ res = dt_device_get_address(node, 3, &dt_vbase, &dt_vsize);
+ if ( res )
+ panic("GICv2: Cannot find a valid address for the virtual CPU\n");
+
+ res = translate_dt_address_size(&dt_vbase, &dt_vsize, &vbase, &vsize);
if ( res )
panic("GICv2: Cannot find a valid address for the virtual CPU\n");
@@ -1049,7 +1072,7 @@ static void __init gicv2_dt_init(void)
if ( csize < SZ_8K )
{
printk(XENLOG_WARNING "GICv2: WARNING: "
- "The GICC size is too small: %#"PRIx64" expected %#x\n",
+ "The GICC size is too small: %#"PRIpaddr" expected %#x\n",
csize, SZ_8K);
if ( platform_has_quirk(PLATFORM_QUIRK_GIC_64K_STRIDE) )
{
@@ -1280,11 +1303,11 @@ static int __init gicv2_init(void)
gicv2.map_cbase += aliased_offset;
printk(XENLOG_WARNING
- "GICv2: Adjusting CPU interface base to %#"PRIx64"\n",
+ "GICv2: Adjusting CPU interface base to %#"PRIpaddr"\n",
cbase + aliased_offset);
} else if ( csize == SZ_128K )
printk(XENLOG_WARNING
- "GICv2: GICC size=%#"PRIx64" but not aliased\n",
+ "GICv2: GICC size=%#"PRIpaddr" but not aliased\n",
csize);
gicv2.map_hbase = ioremap_nocache(hbase, PAGE_SIZE);
diff --git a/xen/arch/arm/gic-v3.c b/xen/arch/arm/gic-v3.c
index bb59ea94cd..db64009483 100644
--- a/xen/arch/arm/gic-v3.c
+++ b/xen/arch/arm/gic-v3.c
@@ -33,6 +33,7 @@
#include <asm/gic_v3_defs.h>
#include <asm/gic_v3_its.h>
#include <asm/io.h>
+#include <asm/platform.h>
#include <asm/sysregs.h>
/* Global state */
@@ -1376,8 +1377,14 @@ static void __init gicv3_dt_init(void)
struct rdist_region *rdist_regs;
int res, i;
const struct dt_device_node *node = gicv3_info.node;
+ u64 dt_dbase, dt_rdist_base, dt_rdist_size, dt_cbase, dt_csize, dt_vbase,
+ dt_vsize;
- res = dt_device_get_address(node, 0, &dbase, NULL);
+ res = dt_device_get_address(node, 0, &dt_dbase, NULL);
+ if ( res )
+ panic("GICv3: Cannot find a valid distributor address\n");
+
+ res = translate_dt_address_size(&dt_dbase, NULL, &dbase, NULL);
if ( res )
panic("GICv3: Cannot find a valid distributor address\n");
@@ -1393,9 +1400,15 @@ static void __init gicv3_dt_init(void)
for ( i = 0; i < gicv3.rdist_count; i++ )
{
- uint64_t rdist_base, rdist_size;
+ paddr_t rdist_base, rdist_size;
+
+ res = dt_device_get_address(node, 1 + i, &dt_rdist_base,
+ &dt_rdist_size);
+ if ( res )
+ panic("GICv3: No rdist base found for region %d\n", i);
- res = dt_device_get_address(node, 1 + i, &rdist_base, &rdist_size);
+ res = translate_dt_address_size(&dt_rdist_base, &dt_rdist_size,
+ &rdist_base, &rdist_size);
if ( res )
panic("GICv3: No rdist base found for region %d\n", i);
@@ -1418,10 +1431,20 @@ static void __init gicv3_dt_init(void)
* provided.
*/
res = dt_device_get_address(node, 1 + gicv3.rdist_count,
- &cbase, &csize);
+ &dt_cbase, &dt_csize);
if ( !res )
+ {
dt_device_get_address(node, 1 + gicv3.rdist_count + 2,
- &vbase, &vsize);
+ &dt_vbase, &dt_vsize);
+
+ res = translate_dt_address_size(&dt_vbase, &dt_vsize, &vbase, &vsize);
+ if ( res )
+ panic("GICv3: Invalid vbase/vsize provided\n");
+ }
+
+ res = translate_dt_address_size(&dt_cbase, &dt_csize, &cbase, &csize);
+ if ( res )
+ panic("GICv3: Invalid cbase / csize provided\n");
}
static int gicv3_iomem_deny_access(struct domain *d)
diff --git a/xen/arch/arm/platforms/brcm.c b/xen/arch/arm/platforms/brcm.c
index d481b2c60f..3e208a060d 100644
--- a/xen/arch/arm/platforms/brcm.c
+++ b/xen/arch/arm/platforms/brcm.c
@@ -40,7 +40,8 @@ static __init int brcm_get_dt_node(char *compat_str,
u32 *reg_base)
{
const struct dt_device_node *node;
- u64 reg_base_64;
+ paddr_t reg_base_64;
+ u64 dt_reg_base_64;
int rc;
node = dt_find_compatible_node(NULL, NULL, compat_str);
@@ -50,13 +51,17 @@ static __init int brcm_get_dt_node(char *compat_str,
return -ENOENT;
}
- rc = dt_device_get_address(node, 0, ®_base_64, NULL);
+ rc = dt_device_get_address(node, 0, &dt_reg_base_64, NULL);
if ( rc )
{
dprintk(XENLOG_ERR, "%s: missing \"reg\" prop\n", __func__);
return rc;
}
+ rc = translate_dt_address_size(&dt_reg_base_64, NULL, ®_base_64, NULL);
+ if ( rc )
+ return rc;
+
if ( dn )
*dn = node;
diff --git a/xen/arch/arm/platforms/exynos5.c b/xen/arch/arm/platforms/exynos5.c
index 6560507092..a3fcab92ac 100644
--- a/xen/arch/arm/platforms/exynos5.c
+++ b/xen/arch/arm/platforms/exynos5.c
@@ -42,8 +42,9 @@ static int exynos5_init_time(void)
void __iomem *mct;
int rc;
struct dt_device_node *node;
- u64 mct_base_addr;
- u64 size;
+ paddr_t mct_base_addr;
+ paddr_t size;
+ u64 dt_mct_base_addr, dt_size;
node = dt_find_compatible_node(NULL, NULL, "samsung,exynos4210-mct");
if ( !node )
@@ -52,14 +53,19 @@ static int exynos5_init_time(void)
return -ENXIO;
}
- rc = dt_device_get_address(node, 0, &mct_base_addr, &size);
+ rc = dt_device_get_address(node, 0, &dt_mct_base_addr, &dt_size);
if ( rc )
{
dprintk(XENLOG_ERR, "Error in \"samsung,exynos4210-mct\"\n");
return -ENXIO;
}
- dprintk(XENLOG_INFO, "mct_base_addr: %016llx size: %016llx\n",
+ rc = translate_dt_address_size(&dt_mct_base_addr, &dt_size, &mct_base_addr,
+ &size);
+ if ( rc )
+ return rc;
+
+ dprintk(XENLOG_INFO, "mct_base_addr: 0x%"PRIpaddr" size: 0x%"PRIpaddr"\n",
mct_base_addr, size);
mct = ioremap_nocache(mct_base_addr, size);
@@ -97,8 +103,9 @@ static int __init exynos5_smp_init(void)
struct dt_device_node *node;
void __iomem *sysram;
char *compatible;
- u64 sysram_addr;
- u64 size;
+ u64 dt_sysram_addr, dt_size;
+ paddr_t sysram_addr;
+ paddr_t size;
u64 sysram_offset;
int rc;
@@ -125,13 +132,18 @@ static int __init exynos5_smp_init(void)
return -ENXIO;
}
- rc = dt_device_get_address(node, 0, &sysram_addr, &size);
+ rc = dt_device_get_address(node, 0, &dt_sysram_addr, &dt_size);
if ( rc )
{
dprintk(XENLOG_ERR, "Error in %s\n", compatible);
return -ENXIO;
}
- dprintk(XENLOG_INFO, "sysram_addr: %016llx size: %016llx offset: %016llx\n",
+
+ rc = translate_dt_address_size(&dt_sysram_addr, &dt_size, &sysram_addr, &size);
+ if ( rc )
+ return rc;
+
+ dprintk(XENLOG_INFO, "sysram_addr: 0x%"PRIpaddr" size: 0x%"PRIpaddr" offset: %016llx\n",
sysram_addr, size, sysram_offset);
sysram = ioremap_nocache(sysram_addr, size);
@@ -189,10 +201,11 @@ static int exynos5_cpu_power_up(void __iomem *power, int cpu)
return 0;
}
-static int exynos5_get_pmu_baseandsize(u64 *power_base_addr, u64 *size)
+static int exynos5_get_pmu_baseandsize(paddr_t *power_base_addr, paddr_t *size)
{
struct dt_device_node *node;
int rc;
+ u64 dt_power_base_addr, dt_size;
static const struct dt_device_match exynos_dt_pmu_matches[] =
{
DT_MATCH_COMPATIBLE("samsung,exynos5250-pmu"),
@@ -208,14 +221,19 @@ static int exynos5_get_pmu_baseandsize(u64 *power_base_addr, u64 *size)
return -ENXIO;
}
- rc = dt_device_get_address(node, 0, power_base_addr, size);
+ rc = dt_device_get_address(node, 0, &dt_power_base_addr, &dt_size);
if ( rc )
{
dprintk(XENLOG_ERR, "Error in \"samsung,exynos5XXX-pmu\"\n");
return -ENXIO;
}
- dprintk(XENLOG_DEBUG, "power_base_addr: %016llx size: %016llx\n",
+ rc = translate_dt_address_size(&dt_power_base_addr, &dt_size,
+ power_base_addr, size);
+ if ( rc )
+ return rc;
+
+ dprintk(XENLOG_DEBUG, "power_base_addr: 0x%"PRIpaddr" size: 0x%"PRIpaddr"\n",
*power_base_addr, *size);
return 0;
@@ -223,8 +241,8 @@ static int exynos5_get_pmu_baseandsize(u64 *power_base_addr, u64 *size)
static int exynos5_cpu_up(int cpu)
{
- u64 power_base_addr;
- u64 size;
+ paddr_t power_base_addr;
+ paddr_t size;
void __iomem *power;
int rc;
@@ -256,8 +274,8 @@ static int exynos5_cpu_up(int cpu)
static void exynos5_reset(void)
{
- u64 power_base_addr;
- u64 size;
+ paddr_t power_base_addr;
+ paddr_t size;
void __iomem *pmu;
int rc;
diff --git a/xen/arch/arm/platforms/sunxi.c b/xen/arch/arm/platforms/sunxi.c
index e8e4d88bef..7027170b68 100644
--- a/xen/arch/arm/platforms/sunxi.c
+++ b/xen/arch/arm/platforms/sunxi.c
@@ -34,6 +34,7 @@ static void __iomem *sunxi_map_watchdog(bool *new_wdt)
{
void __iomem *wdt;
struct dt_device_node *node;
+ u64 dt_wdt_start, dt_wdt_len;
paddr_t wdt_start, wdt_len;
bool _new_wdt = false;
int ret;
@@ -50,7 +51,15 @@ static void __iomem *sunxi_map_watchdog(bool *new_wdt)
return NULL;
}
- ret = dt_device_get_address(node, 0, &wdt_start, &wdt_len);
+ ret = dt_device_get_address(node, 0, &dt_wdt_start, &dt_wdt_len);
+ if ( ret )
+ {
+ dprintk(XENLOG_ERR, "Cannot read watchdog register address\n");
+ return NULL;
+ }
+
+ ret = translate_dt_address_size(&dt_wdt_start, &dt_wdt_len, &wdt_start,
+ &wdt_len);
if ( ret )
{
dprintk(XENLOG_ERR, "Cannot read watchdog register address\n");
diff --git a/xen/arch/arm/setup.c b/xen/arch/arm/setup.c
index 1f26f67b90..da64aeec88 100644
--- a/xen/arch/arm/setup.c
+++ b/xen/arch/arm/setup.c
@@ -220,12 +220,19 @@ static void __init dt_unreserved_regions(paddr_t s, paddr_t e,
for ( i = first; i < nr ; i++ )
{
+ u64 dt_r_s, dt_r_e;
paddr_t r_s, r_e;
- if ( fdt_get_mem_rsv(device_tree_flattened, i, &r_s, &r_e ) < 0 )
+ if ( fdt_get_mem_rsv(device_tree_flattened, i, &dt_r_s, &dt_r_e ) < 0 )
/* If we can't read it, pretend it doesn't exist... */
continue;
+ else
+ {
+ if ( translate_dt_address_size(&dt_r_s, &dt_r_e, &r_s, &r_e) )
+ panic("Invalid address or size provided\n");
+ }
+
r_e += r_s; /* fdt_get_mem_rsv returns length */
if ( s < r_e && r_s < e )
@@ -500,14 +507,21 @@ static paddr_t __init consider_modules(paddr_t s, paddr_t e,
for ( ; i < mi->nr_mods + nr; i++ )
{
+ u64 dt_mod_s, dt_mod_e;
paddr_t mod_s, mod_e;
if ( fdt_get_mem_rsv(device_tree_flattened,
i - mi->nr_mods,
- &mod_s, &mod_e ) < 0 )
+ &dt_mod_s, &dt_mod_e ) < 0 )
/* If we can't read it, pretend it doesn't exist... */
continue;
+ else
+ {
+ if ( translate_dt_address_size(&dt_mod_s, &dt_mod_e, &mod_s, &mod_e) )
+ panic("Invalid address or size provided\n");
+ }
+
/* fdt_get_mem_rsv returns length */
mod_e += mod_s;
diff --git a/xen/drivers/char/exynos4210-uart.c b/xen/drivers/char/exynos4210-uart.c
index 43aaf02e18..38cc19410f 100644
--- a/xen/drivers/char/exynos4210-uart.c
+++ b/xen/drivers/char/exynos4210-uart.c
@@ -26,6 +26,7 @@
#include <asm/device.h>
#include <asm/exynos4210-uart.h>
#include <asm/io.h>
+#include <asm/platform.h>
static struct exynos4210_uart {
unsigned int baud, clock_hz, data_bits, parity, stop_bits;
@@ -303,7 +304,8 @@ static int __init exynos4210_uart_init(struct dt_device_node *dev,
const char *config = data;
struct exynos4210_uart *uart;
int res;
- u64 addr, size;
+ paddr_t addr, size;
+ u64 dt_addr, dt_size;
if ( strcmp(config, "") )
printk("WARNING: UART configuration is not supported\n");
@@ -316,7 +318,7 @@ static int __init exynos4210_uart_init(struct dt_device_node *dev,
uart->parity = PARITY_NONE;
uart->stop_bits = 1;
- res = dt_device_get_address(dev, 0, &addr, &size);
+ res = dt_device_get_address(dev, 0, &dt_addr, &dt_size);
if ( res )
{
printk("exynos4210: Unable to retrieve the base"
@@ -324,6 +326,10 @@ static int __init exynos4210_uart_init(struct dt_device_node *dev,
return res;
}
+ res = translate_dt_address_size(&dt_addr, &dt_size, &addr, &size);
+ if ( res )
+ return res;
+
res = platform_get_irq(dev, 0);
if ( res < 0 )
{
diff --git a/xen/drivers/char/ns16550.c b/xen/drivers/char/ns16550.c
index 58d0ccd889..e62362db2f 100644
--- a/xen/drivers/char/ns16550.c
+++ b/xen/drivers/char/ns16550.c
@@ -35,6 +35,7 @@
#include <asm/io.h>
#ifdef CONFIG_HAS_DEVICE_TREE
#include <asm/device.h>
+#include <asm/platform.h>
#endif
#ifdef CONFIG_X86
#include <asm/fixmap.h>
@@ -42,8 +43,8 @@
static struct ns16550 {
int baud, clock_hz, data_bits, parity, stop_bits, fifo_size, irq;
- u64 io_base; /* I/O port or memory-mapped I/O address. */
- u64 io_size;
+ paddr_t io_base; /* I/O port or memory-mapped I/O address. */
+ paddr_t io_size;
int reg_shift; /* Bits to shift register offset by */
int reg_width; /* Size of access to use, the registers
* themselves are still bytes */
@@ -1747,6 +1748,7 @@ static int __init ns16550_uart_dt_init(struct dt_device_node *dev,
struct ns16550 *uart;
int res;
u32 reg_shift, reg_width;
+ u64 dt_io_base, dt_io_size;
uart = &ns16550_com[0];
@@ -1757,7 +1759,12 @@ static int __init ns16550_uart_dt_init(struct dt_device_node *dev,
uart->parity = UART_PARITY_NONE;
uart->stop_bits = 1;
- res = dt_device_get_address(dev, 0, &uart->io_base, &uart->io_size);
+ res = dt_device_get_address(dev, 0, &dt_io_base, &dt_io_size);
+ if ( res )
+ return res;
+
+ res = translate_dt_address_size(&dt_io_base, &dt_io_size, &uart->io_base,
+ &uart->io_size);
if ( res )
return res;
diff --git a/xen/drivers/char/omap-uart.c b/xen/drivers/char/omap-uart.c
index d6a5d59aa2..e606c3ef1e 100644
--- a/xen/drivers/char/omap-uart.c
+++ b/xen/drivers/char/omap-uart.c
@@ -16,6 +16,7 @@
#include <xen/irq.h>
#include <xen/device_tree.h>
#include <asm/device.h>
+#include <asm/platform.h>
#include <xen/errno.h>
#include <xen/mm.h>
#include <xen/vmap.h>
@@ -324,7 +325,8 @@ static int __init omap_uart_init(struct dt_device_node *dev,
struct omap_uart *uart;
u32 clkspec;
int res;
- u64 addr, size;
+ u64 dt_addr, dt_size;
+ paddr_t addr, size;
if ( strcmp(config, "") )
printk("WARNING: UART configuration is not supported\n");
@@ -344,7 +346,7 @@ static int __init omap_uart_init(struct dt_device_node *dev,
uart->parity = UART_PARITY_NONE;
uart->stop_bits = 1;
- res = dt_device_get_address(dev, 0, &addr, &size);
+ res = dt_device_get_address(dev, 0, &dt_addr, &dt_size);
if ( res )
{
printk("omap-uart: Unable to retrieve the base"
@@ -352,6 +354,10 @@ static int __init omap_uart_init(struct dt_device_node *dev,
return res;
}
+ res = translate_dt_address_size(&dt_addr, &dt_size, &addr, &size);
+ if ( res )
+ return res;
+
res = platform_get_irq(dev, 0);
if ( res < 0 )
{
diff --git a/xen/drivers/char/pl011.c b/xen/drivers/char/pl011.c
index be67242bc0..23037405e1 100644
--- a/xen/drivers/char/pl011.c
+++ b/xen/drivers/char/pl011.c
@@ -24,6 +24,7 @@
#include <xen/device_tree.h>
#include <xen/errno.h>
#include <asm/device.h>
+#include <asm/platform.h>
#include <xen/mm.h>
#include <xen/vmap.h>
#include <asm/pl011-uart.h>
@@ -258,14 +259,15 @@ static int __init pl011_dt_uart_init(struct dt_device_node *dev,
{
const char *config = data;
int res;
- u64 addr, size;
+ paddr_t addr, size;
+ u64 dt_addr, dt_size;
if ( strcmp(config, "") )
{
printk("WARNING: UART configuration is not supported\n");
}
- res = dt_device_get_address(dev, 0, &addr, &size);
+ res = dt_device_get_address(dev, 0, &dt_addr, &dt_size);
if ( res )
{
printk("pl011: Unable to retrieve the base"
@@ -273,6 +275,10 @@ static int __init pl011_dt_uart_init(struct dt_device_node *dev,
return res;
}
+ res = translate_dt_address_size(&dt_addr, &dt_size, &addr, &size);
+ if ( res )
+ return res;
+
res = platform_get_irq(dev, 0);
if ( res < 0 )
{
diff --git a/xen/drivers/char/scif-uart.c b/xen/drivers/char/scif-uart.c
index 2fccafe340..c16cac836a 100644
--- a/xen/drivers/char/scif-uart.c
+++ b/xen/drivers/char/scif-uart.c
@@ -28,6 +28,7 @@
#include <asm/device.h>
#include <asm/scif-uart.h>
#include <asm/io.h>
+#include <asm/platform.h>
#define scif_readb(uart, off) readb((uart)->regs + (off))
#define scif_writeb(uart, off, val) writeb((val), (uart)->regs + (off))
@@ -311,14 +312,15 @@ static int __init scif_uart_init(struct dt_device_node *dev,
const char *config = data;
struct scif_uart *uart;
int res;
- u64 addr, size;
+ paddr_t addr, size;
+ u64 dt_addr, dt_size;
if ( strcmp(config, "") )
printk("WARNING: UART configuration is not supported\n");
uart = &scif_com;
- res = dt_device_get_address(dev, 0, &addr, &size);
+ res = dt_device_get_address(dev, 0, &dt_addr, &dt_size);
if ( res )
{
printk("scif-uart: Unable to retrieve the base"
@@ -326,6 +328,10 @@ static int __init scif_uart_init(struct dt_device_node *dev,
return res;
}
+ res = translate_dt_address_size(&dt_addr, &dt_size, &addr, &size);
+ if ( res )
+ return res;
+
res = platform_get_irq(dev, 0);
if ( res < 0 )
{
diff --git a/xen/drivers/passthrough/arm/smmu.c b/xen/drivers/passthrough/arm/smmu.c
index 0a514821b3..5ae180a4cc 100644
--- a/xen/drivers/passthrough/arm/smmu.c
+++ b/xen/drivers/passthrough/arm/smmu.c
@@ -73,8 +73,8 @@
/* Xen: Helpers to get device MMIO and IRQs */
struct resource
{
- u64 addr;
- u64 size;
+ paddr_t addr;
+ paddr_t size;
unsigned int type;
};
@@ -96,12 +96,17 @@ static struct resource *platform_get_resource(struct platform_device *pdev,
*/
static struct resource res;
int ret = 0;
+ u64 dt_addr, dt_size;
res.type = type;
switch (type) {
case IORESOURCE_MEM:
- ret = dt_device_get_address(pdev, num, &res.addr, &res.size);
+ ret = dt_device_get_address(pdev, num, &dt_addr, &dt_size);
+
+ if ( !ret )
+ ret = translate_dt_address_size(&dt_addr, &dt_size, &res.addr,
+ &res.size);
return ((ret) ? NULL : &res);
@@ -169,7 +174,7 @@ static void __iomem *devm_ioremap_resource(struct device *dev,
ptr = ioremap_nocache(res->addr, res->size);
if (!ptr) {
dev_err(dev,
- "ioremap failed (addr 0x%"PRIx64" size 0x%"PRIx64")\n",
+ "ioremap failed (addr 0x%"PRIpaddr" size 0x%"PRIpaddr")\n",
res->addr, res->size);
return ERR_PTR(-ENOMEM);
}
diff --git a/xen/include/xen/serial.h b/xen/include/xen/serial.h
index f0aff7ea76..0b326e22fd 100644
--- a/xen/include/xen/serial.h
+++ b/xen/include/xen/serial.h
@@ -34,7 +34,7 @@ enum serial_port_state {
struct vuart_info {
paddr_t base_addr; /* Base address of the UART */
- unsigned long size; /* Size of the memory region */
+ paddr_t size; /* Size of the memory region */
unsigned long data_off; /* Data register offset */
unsigned long status_off; /* Status register offset */
unsigned long status; /* Ready status value */
--
2.17.1
next prev parent reply other threads:[~2022-12-15 19:33 UTC|newest]
Thread overview: 28+ messages / expand[flat|nested] mbox.gz Atom feed top
2022-12-15 19:32 [XEN v1 0/9] Add support for 32 bit physical address Ayan Kumar Halder
2022-12-15 19:32 ` [XEN v1 1/9] xen/arm: Remove the extra assignment Ayan Kumar Halder
2022-12-16 7:56 ` Jan Beulich
2022-12-16 9:41 ` Julien Grall
2022-12-15 19:32 ` [XEN v1 2/9] xen/arm: Define translate_dt_address_size() for the translation between u64 and paddr_t Ayan Kumar Halder
2022-12-16 9:51 ` Julien Grall
2022-12-17 0:46 ` Stefano Stabellini
2022-12-17 8:42 ` Julien Grall
2022-12-22 23:20 ` Stefano Stabellini
2022-12-23 10:01 ` Ayan Kumar Halder
2022-12-23 10:17 ` Julien Grall
2023-01-04 23:56 ` Stefano Stabellini
2022-12-15 19:32 ` [XEN v1 3/9] xen/arm: Always use 'u64' instead of 'paddr_t' for address and size in DT Ayan Kumar Halder
2022-12-16 9:57 ` Julien Grall
2022-12-16 10:49 ` Ayan Kumar Halder
2022-12-16 11:12 ` Julien Grall
2022-12-16 11:13 ` Julien Grall
2022-12-15 19:32 ` Ayan Kumar Halder [this message]
2022-12-15 19:32 ` [XEN v1 5/9] xen/arm: Use 'PRIpaddr' to display 'paddr_t' variable Ayan Kumar Halder
2022-12-15 19:32 ` [XEN v1 6/9] xen/arm: Use 'u64' to represent 'unsigned long long' Ayan Kumar Halder
2022-12-16 10:04 ` Julien Grall
2022-12-15 19:32 ` [XEN v1 7/9] xen/arm: Restrict zeroeth_table_offset for ARM_64 Ayan Kumar Halder
2022-12-15 22:08 ` Julien Grall
2022-12-15 19:32 ` [XEN v1 8/9] xen/arm: Other adaptations required to support 32bit paddr Ayan Kumar Halder
2022-12-16 10:23 ` Julien Grall
2022-12-20 15:24 ` Ayan Kumar Halder
2022-12-20 16:22 ` Julien Grall
2022-12-15 19:32 ` [XEN v1 9/9] xen/arm: Introduce ARM_PA_32 to support 32 bit physical address Ayan Kumar Halder
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20221215193245.48314-5-ayan.kumar.halder@amd.com \
--to=ayan.kumar.halder@amd.com \
--cc=Volodymyr_Babchuk@epam.com \
--cc=bertrand.marquis@arm.com \
--cc=julien@xen.org \
--cc=sstabellini@kernel.org \
--cc=stefano.stabellini@amd.com \
--cc=xen-devel@lists.xenproject.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.