diff mbox series

[v5,3/8] xen/arm: introduce kinfo->guest_phandle_gic

Message ID 20190925184924.21691-3-sstabellini@kernel.org (mailing list archive)
State Superseded
Headers show
Series [v5,1/8] xen/arm: introduce handle_device_interrupts | expand

Commit Message

Stefano Stabellini Sept. 25, 2019, 6:49 p.m. UTC
Instead of always hard-coding the GIC phandle (GUEST_PHANDLE_GIC), store
it in a variable under kinfo. This way it can be dynamically chosen per
domain. Remove the fdt pointer argument to the make_*_domU_node
functions and oass a struct kernel_info * instead. The fdt pointer can
be accessed from kinfo->fdt. Remove the struct domain *d parameter to
the make_*_domU_node functions because it becomes unused.

Initialize guest_phandle_gic to GUEST_PHANDLE_GIC at the beginning of
prepare_dtb_domU. Later patches will change the value of
guest_phandle_gic depending on user provided information.

Signed-off-by: Stefano Stabellini <stefanos@xilinx.com>

---
Changes in v5:
- improve commit message
Changes in v4:
- new patch
---
 xen/arch/arm/domain_build.c  | 36 +++++++++++++++++++++---------------
 xen/include/asm-arm/kernel.h |  3 +++
 2 files changed, 24 insertions(+), 15 deletions(-)

Comments

Julien Grall Sept. 25, 2019, 8:54 p.m. UTC | #1
Hi,

On 25/09/2019 19:49, Stefano Stabellini wrote:
> Instead of always hard-coding the GIC phandle (GUEST_PHANDLE_GIC), store
> it in a variable under kinfo. This way it can be dynamically chosen per
> domain. Remove the fdt pointer argument to the make_*_domU_node
> functions and oass a struct kernel_info * instead. The fdt pointer can
> be accessed from kinfo->fdt. Remove the struct domain *d parameter to
> the make_*_domU_node functions because it becomes unused.
> 
> Initialize guest_phandle_gic to GUEST_PHANDLE_GIC at the beginning of
> prepare_dtb_domU. Later patches will change the value of
> guest_phandle_gic depending on user provided information.
> 
> Signed-off-by: Stefano Stabellini <stefanos@xilinx.com>
> 
> ---
> Changes in v5:
> - improve commit message
> Changes in v4:
> - new patch
> ---
>   xen/arch/arm/domain_build.c  | 36 +++++++++++++++++++++---------------
>   xen/include/asm-arm/kernel.h |  3 +++
>   2 files changed, 24 insertions(+), 15 deletions(-)
> 
> diff --git a/xen/arch/arm/domain_build.c b/xen/arch/arm/domain_build.c
> index 21985628f0..32f85cd959 100644
> --- a/xen/arch/arm/domain_build.c
> +++ b/xen/arch/arm/domain_build.c
> @@ -627,7 +627,8 @@ static int __init fdt_property_interrupts(const struct kernel_info *kinfo,
>   {
>       int res;
>       uint32_t phandle = is_hardware_domain(kinfo->d) ?
> -                       dt_interrupt_controller->phandle : GUEST_PHANDLE_GIC;

Sorry, I only realized it now. But is there any reason to not set 
guest_phandle_gic for the hwdom also?

[...]

> diff --git a/xen/include/asm-arm/kernel.h b/xen/include/asm-arm/kernel.h
> index 33f3e72b11..760434369b 100644
> --- a/xen/include/asm-arm/kernel.h
> +++ b/xen/include/asm-arm/kernel.h
> @@ -36,6 +36,9 @@ struct kernel_info {
>       /* Enable pl011 emulation */
>       bool vpl011;
>   
> +    /* GIC phandle */
> +    uint32_t guest_phandle_gic;

This would also allow to drop the guest_ prefix.

> +
>       /* loader to use for this kernel */
>       void (*load)(struct kernel_info *info);
>       /* loader specific state */
> 

Cheers,
Stefano Stabellini Sept. 26, 2019, 3:43 a.m. UTC | #2
On Wed, 25 Sep 2019, Julien Grall wrote:
> Hi,
> 
> On 25/09/2019 19:49, Stefano Stabellini wrote:
> > Instead of always hard-coding the GIC phandle (GUEST_PHANDLE_GIC), store
> > it in a variable under kinfo. This way it can be dynamically chosen per
> > domain. Remove the fdt pointer argument to the make_*_domU_node
> > functions and oass a struct kernel_info * instead. The fdt pointer can
> > be accessed from kinfo->fdt. Remove the struct domain *d parameter to
> > the make_*_domU_node functions because it becomes unused.
> > 
> > Initialize guest_phandle_gic to GUEST_PHANDLE_GIC at the beginning of
> > prepare_dtb_domU. Later patches will change the value of
> > guest_phandle_gic depending on user provided information.
> > 
> > Signed-off-by: Stefano Stabellini <stefanos@xilinx.com>
> > 
> > ---
> > Changes in v5:
> > - improve commit message
> > Changes in v4:
> > - new patch
> > ---
> >   xen/arch/arm/domain_build.c  | 36 +++++++++++++++++++++---------------
> >   xen/include/asm-arm/kernel.h |  3 +++
> >   2 files changed, 24 insertions(+), 15 deletions(-)
> > 
> > diff --git a/xen/arch/arm/domain_build.c b/xen/arch/arm/domain_build.c
> > index 21985628f0..32f85cd959 100644
> > --- a/xen/arch/arm/domain_build.c
> > +++ b/xen/arch/arm/domain_build.c
> > @@ -627,7 +627,8 @@ static int __init fdt_property_interrupts(const struct kernel_info *kinfo,
> >   {
> >       int res;
> >       uint32_t phandle = is_hardware_domain(kinfo->d) ?
> > -                       dt_interrupt_controller->phandle : GUEST_PHANDLE_GIC;
> 
> Sorry, I only realized it now. But is there any reason to not set 
> guest_phandle_gic for the hwdom also?

Yes, I can do that for dom0 too


> > diff --git a/xen/include/asm-arm/kernel.h b/xen/include/asm-arm/kernel.h
> > index 33f3e72b11..760434369b 100644
> > --- a/xen/include/asm-arm/kernel.h
> > +++ b/xen/include/asm-arm/kernel.h
> > @@ -36,6 +36,9 @@ struct kernel_info {
> >       /* Enable pl011 emulation */
> >       bool vpl011;
> >   
> > +    /* GIC phandle */
> > +    uint32_t guest_phandle_gic;
> 
> This would also allow to drop the guest_ prefix.
> 
> > +
> >       /* loader to use for this kernel */
> >       void (*load)(struct kernel_info *info);
> >       /* loader specific state */
> > 
> 
> Cheers,
> 
> -- 
> Julien Grall
>
diff mbox series

Patch

diff --git a/xen/arch/arm/domain_build.c b/xen/arch/arm/domain_build.c
index 21985628f0..32f85cd959 100644
--- a/xen/arch/arm/domain_build.c
+++ b/xen/arch/arm/domain_build.c
@@ -627,7 +627,8 @@  static int __init fdt_property_interrupts(const struct kernel_info *kinfo,
 {
     int res;
     uint32_t phandle = is_hardware_domain(kinfo->d) ?
-                       dt_interrupt_controller->phandle : GUEST_PHANDLE_GIC;
+                       dt_interrupt_controller->phandle :
+                       kinfo->guest_phandle_gic;
 
     res = fdt_property(kinfo->fdt, "interrupts",
                        intr, sizeof(intr[0]) * num_irq);
@@ -1537,8 +1538,9 @@  static int __init handle_node(struct domain *d, struct kernel_info *kinfo,
     return res;
 }
 
-static int __init make_gicv2_domU_node(const struct domain *d, void *fdt)
+static int __init make_gicv2_domU_node(struct kernel_info *kinfo)
 {
+    void *fdt = kinfo->fdt;
     int res = 0;
     __be32 reg[(GUEST_ROOT_ADDRESS_CELLS + GUEST_ROOT_SIZE_CELLS) * 2];
     __be32 *cells;
@@ -1573,11 +1575,11 @@  static int __init make_gicv2_domU_node(const struct domain *d, void *fdt)
     if (res)
         return res;
 
-    res = fdt_property_cell(fdt, "linux,phandle", GUEST_PHANDLE_GIC);
+    res = fdt_property_cell(fdt, "linux,phandle", kinfo->guest_phandle_gic);
     if (res)
         return res;
 
-    res = fdt_property_cell(fdt, "phandle", GUEST_PHANDLE_GIC);
+    res = fdt_property_cell(fdt, "phandle", kinfo->guest_phandle_gic);
     if (res)
         return res;
 
@@ -1586,8 +1588,9 @@  static int __init make_gicv2_domU_node(const struct domain *d, void *fdt)
     return res;
 }
 
-static int __init make_gicv3_domU_node(const struct domain *d, void *fdt)
+static int __init make_gicv3_domU_node(struct kernel_info *kinfo)
 {
+    void *fdt = kinfo->fdt;
     int res = 0;
     __be32 reg[(GUEST_ROOT_ADDRESS_CELLS + GUEST_ROOT_SIZE_CELLS) * 2];
     __be32 *cells;
@@ -1622,11 +1625,11 @@  static int __init make_gicv3_domU_node(const struct domain *d, void *fdt)
     if (res)
         return res;
 
-    res = fdt_property_cell(fdt, "linux,phandle", GUEST_PHANDLE_GIC);
+    res = fdt_property_cell(fdt, "linux,phandle", kinfo->guest_phandle_gic);
     if (res)
         return res;
 
-    res = fdt_property_cell(fdt, "phandle", GUEST_PHANDLE_GIC);
+    res = fdt_property_cell(fdt, "phandle", kinfo->guest_phandle_gic);
     if (res)
         return res;
 
@@ -1635,22 +1638,23 @@  static int __init make_gicv3_domU_node(const struct domain *d, void *fdt)
     return res;
 }
 
-static int __init make_gic_domU_node(const struct domain *d, void *fdt)
+static int __init make_gic_domU_node(struct kernel_info *kinfo)
 {
-    switch ( d->arch.vgic.version )
+    switch ( kinfo->d->arch.vgic.version )
     {
     case GIC_V3:
-        return make_gicv3_domU_node(d, fdt);
+        return make_gicv3_domU_node(kinfo);
     case GIC_V2:
-        return make_gicv2_domU_node(d, fdt);
+        return make_gicv2_domU_node(kinfo);
     default:
         panic("Unsupported GIC version\n");
     }
 }
 
 #ifdef CONFIG_SBSA_VUART_CONSOLE
-static int __init make_vpl011_uart_node(const struct domain *d, void *fdt)
+static int __init make_vpl011_uart_node(struct kernel_info *kinfo)
 {
+    void *fdt = kinfo->fdt;
     int res;
     gic_interrupt_t intr;
     __be32 reg[GUEST_ROOT_ADDRESS_CELLS + GUEST_ROOT_SIZE_CELLS];
@@ -1681,7 +1685,7 @@  static int __init make_vpl011_uart_node(const struct domain *d, void *fdt)
         return res;
 
     res = fdt_property_cell(fdt, "interrupt-parent",
-                            GUEST_PHANDLE_GIC);
+                            kinfo->guest_phandle_gic);
     if ( res )
         return res;
 
@@ -1706,6 +1710,8 @@  static int __init prepare_dtb_domU(struct domain *d, struct kernel_info *kinfo)
     int addrcells, sizecells;
     int ret;
 
+    kinfo->guest_phandle_gic = GUEST_PHANDLE_GIC;
+
     addrcells = GUEST_ROOT_ADDRESS_CELLS;
     sizecells = GUEST_ROOT_SIZE_CELLS;
 
@@ -1749,7 +1755,7 @@  static int __init prepare_dtb_domU(struct domain *d, struct kernel_info *kinfo)
     if ( ret )
         goto err;
 
-    ret = make_gic_domU_node(d, kinfo->fdt);
+    ret = make_gic_domU_node(kinfo);
     if ( ret )
         goto err;
 
@@ -1761,7 +1767,7 @@  static int __init prepare_dtb_domU(struct domain *d, struct kernel_info *kinfo)
     {
         ret = -EINVAL;
 #ifdef CONFIG_SBSA_VUART_CONSOLE
-        ret = make_vpl011_uart_node(d, kinfo->fdt);
+        ret = make_vpl011_uart_node(kinfo);
 #endif
         if ( ret )
             goto err;
diff --git a/xen/include/asm-arm/kernel.h b/xen/include/asm-arm/kernel.h
index 33f3e72b11..760434369b 100644
--- a/xen/include/asm-arm/kernel.h
+++ b/xen/include/asm-arm/kernel.h
@@ -36,6 +36,9 @@  struct kernel_info {
     /* Enable pl011 emulation */
     bool vpl011;
 
+    /* GIC phandle */
+    uint32_t guest_phandle_gic;
+
     /* loader to use for this kernel */
     void (*load)(struct kernel_info *info);
     /* loader specific state */