[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: [Xen-devel] [XEN/ARM PATCH v2 1/1] Add support for Exynos secure firmware
Hi Suriyan,
On 12/09/14 16:01, Suriyan Ramasami wrote:
+static int __init exynos5_smp_init(void)
+{
+ void __iomem *sysram;
+ u64 sysram_addr;
+ u64 size;
+ u64 sysram_offset;
+ int rc;
+
+ rc = exynos_smp_init_getbasesizeoffset(&sysram_addr, &size,
&sysram_offset);
The function name is odd. As you call the function only here, couldn't
you inline it?
+ if ( rc )
+ return rc;
+
+ dprintk(XENLOG_INFO, "sysram_addr: %016llx size: %016llx offset:
%016llx\n",
+ sysram_addr, size, sysram_offset);
+
+ sysram = ioremap_nocache(sysram_addr, size);
if ( !sysram )
{
dprintk(XENLOG_ERR, "Unable to map exynos5 MMIO\n");
@@ -125,7 +158,7 @@ static int __init exynos5_smp_init(void)
printk("Set SYSRAM to %"PRIpaddr" (%p)\n",
__pa(init_secondary), init_secondary);
- writel(__pa(init_secondary), sysram);
+ writel(__pa(init_secondary), sysram + sysram_offset);
iounmap(sysram);
@@ -135,7 +168,7 @@ static int __init exynos5_smp_init(void)
static int exynos_cpu_power_state(void __iomem *power, int cpu)
{
return __raw_readl(power + EXYNOS_ARM_CORE_STATUS(cpu)) &
- S5P_CORE_LOCAL_PWR_EN;
+ S5P_CORE_LOCAL_PWR_EN;
Why this change?
}
static void exynos_cpu_power_up(void __iomem *power, int cpu)
@@ -171,8 +204,7 @@ static int exynos5_cpu_power_up(void __iomem *power, int
cpu)
return 0;
}
-static int exynos5_get_pmu_base_addr(u64 *power_base_addr) {
- u64 size;
+static int exynos5_get_pmu_baseandsize(u64 *power_base_addr, u64 *size) {
The Xen coding style is
static int foo(...)
{
struct dt_device_node *node;
int rc;
static const struct dt_device_match exynos_dt_pmu_matches[] __initconst =
@@ -190,7 +222,7 @@ static int exynos5_get_pmu_base_addr(u64 *power_base_addr) {
return -ENXIO;
}
- rc = dt_device_get_address(node, 0, power_base_addr, &size);
+ rc = dt_device_get_address(node, 0, power_base_addr, size);
if ( rc )
{
dprintk(XENLOG_ERR, "Error in \"samsung,exynos5XXX-pmu\"\n");
@@ -198,23 +230,31 @@ static int exynos5_get_pmu_base_addr(u64
*power_base_addr) {
}
dprintk(XENLOG_DEBUG, "power_base_addr: %016llx size: %016llx\n",
- *power_base_addr, size);
+ *power_base_addr, *size);
return 0;
}
+static void exynos_smc(u32 cmd, u32 arg1, u32 arg2, u32 arg3)
+{
+ asm(
+ "dsb;"
+ "smc #0;"
+ );
+}
+
The compiler may decide to inline the function. This will end up to the
command register not in register r0.
Give a look to __invoke_psci_fn_smc in xen/arch/arm/psci.c. It might be
worth to introduce an SMC helper.
static int exynos5_cpu_up(int cpu)
{
u64 power_base_addr;
+ u64 size;
void __iomem *power;
int rc;
- rc = exynos5_get_pmu_base_addr(&power_base_addr);
+ rc = exynos5_get_pmu_baseandsize(&power_base_addr, &size);
if ( rc )
return rc;
- power = ioremap_nocache(power_base_addr +
- EXYNOS_ARM_CORE0_CONFIG, PAGE_SIZE);
+ power = ioremap_nocache(power_base_addr, size);
if ( !power )
{
dprintk(XENLOG_ERR, "Unable to map power MMIO\n");
@@ -230,22 +270,23 @@ static int exynos5_cpu_up(int cpu)
iounmap(power);
+ exynos_smc(SMC_CMD_CPU1BOOT, cpu, 0, 0);
+
The call is not done unconditionally on Linux. It's only done when the
secure firmware is present.
return cpu_up_send_sgi(cpu);
}
static void exynos5_reset(void)
{
u64 power_base_addr;
+ u64 size;
void __iomem *pmu;
int rc;
- BUILD_BUG_ON(EXYNOS5_SWRESET >= PAGE_SIZE);
-
- rc = exynos5_get_pmu_base_addr(&power_base_addr);
+ rc = exynos5_get_pmu_baseandsize(&power_base_addr, &size);
if ( rc )
return;
- pmu = ioremap_nocache(power_base_addr, PAGE_SIZE);
+ pmu = ioremap_nocache(power_base_addr, size);
if ( !pmu )
{
dprintk(XENLOG_ERR, "Unable to map PMU\n");
@@ -264,6 +305,7 @@ static const struct dt_device_match exynos5_blacklist_dev[]
__initconst =
* This is result to random freeze.
*/
DT_MATCH_COMPATIBLE("samsung,exynos4210-mct"),
+ DT_MATCH_COMPATIBLE("samsung,secure-firmware"),
Can you add a comment explaining why we blacklist the secure firmware?
Regards,
--
Julien Grall
_______________________________________________
Xen-devel mailing list
Xen-devel@xxxxxxxxxxxxx
http://lists.xen.org/xen-devel
|