diff mbox series

[V2] VAS: Alloc IRQ and port address for each VAS instance

Message ID 1570873450.24387.12.camel@hbabu-laptop
State Superseded
Headers show
Series [V2] VAS: Alloc IRQ and port address for each VAS instance | expand

Checks

Context Check Description
snowpatch_ozlabs/apply_patch success Successfully applied on branch master (1785745d5a7eaefd7d0c135f2a3b0f5d86aefec5)
snowpatch_ozlabs/snowpatch_job_snowpatch-skiboot success Test snowpatch/job/snowpatch-skiboot on branch master
snowpatch_ozlabs/snowpatch_job_snowpatch-skiboot-dco success Signed-off-by present

Commit Message

Haren Myneni Oct. 12, 2019, 9:44 a.m. UTC
Setup IRQ and trigger port for each VAS instance. Export these
values through device-tree with 'interrupts' and 'ibm,vas-port'
properties in each VAS device node. Kernel setup IRQ and register
port address for each send window.
    
Signed-off-by: Sukadev Bhattiprolu <sukadev@linux.vnet.ibm.com>
Signed-off-by: Haren Myneni <haren@us.ibm.com>
---
Changes from V1:
- Use standard 'interrupts' property as suggested by Oliver

Comments

Oliver O'Halloran Oct. 14, 2019, 4:55 a.m. UTC | #1
On Sat, Oct 12, 2019 at 8:44 PM Haren Myneni <haren@linux.vnet.ibm.com> wrote:
>
>
> Setup IRQ and trigger port for each VAS instance. Export these
> values through device-tree with 'interrupts' and 'ibm,vas-port'
> properties in each VAS device node. Kernel setup IRQ and register
> port address for each send window.
>
> Signed-off-by: Sukadev Bhattiprolu <sukadev@linux.vnet.ibm.com>
> Signed-off-by: Haren Myneni <haren@us.ibm.com>
> ---
> Changes from V1:
> - Use standard 'interrupts' property as suggested by Oliver
>
>
> diff --git a/doc/device-tree/vas.rst b/doc/device-tree/vas.rst
> index 438e45f..7c11c78 100644
> --- a/doc/device-tree/vas.rst
> +++ b/doc/device-tree/vas.rst
> @@ -18,6 +18,12 @@ Each VAS node contains: ::
>
>    ibm,vas-id: unique identifier for each instance of VAS in the system.
>
> +  ibm,vas-port: Port address for the interrupt.
> +
> +  interrupts: <IRQ# level> for this VAS instance.
> +
> +  interrupt-parent: Interrupt controller phandle.
> +
>    reg: contains 8 64-bit fields.
>
>          Fields [0] and [1] represent the Hypervisor window context BAR
> diff --git a/hw/vas.c b/hw/vas.c
> index 212da0e..be006f6 100644
> --- a/hw/vas.c
> +++ b/hw/vas.c
> @@ -6,6 +6,8 @@
>  #include <phys-map.h>
>  #include <xscom.h>
>  #include <io.h>
> +#include <xive.h>
> +#include <interrupts.h>
>  #include <vas.h>
>
>  #define vas_err(__fmt,...)     prlog(PR_ERR,"VAS: " __fmt, ##__VA_ARGS__)
> @@ -24,6 +26,7 @@ struct vas {
>         uint64_t        xscom_base;
>         uint64_t        wcbs;
>         uint32_t        vas_irq;
> +       uint64_t        vas_port;
>  };
>
>  static inline void get_hvwc_mmio_bar(int chipid, uint64_t *start, uint64_t *len)
> @@ -402,6 +405,9 @@ static void create_mm_dt_node(struct proc_chip *chip)
>
>         dt_add_property(dn, "ibm,vas-id", &vas->vas_id, sizeof(vas->vas_id));
>         dt_add_property(dn, "ibm,chip-id", &gcid, sizeof(gcid));
> +       dt_add_property_cells(dn, "interrupts", vas->vas_irq, 0);
> +       dt_add_property_cells(dn, "interrupt-parent", get_ics_phandle());
> +       dt_add_property_u64(dn, "ibm,vas-port", vas->vas_port);
>  }
>
>  /*
> @@ -423,6 +429,25 @@ static void disable_vas_inst(struct dt_node *np)
>         reset_north_ctl(chip);
>  }
>
> +static int vas_setup_irq(struct proc_chip *chip)
> +{
> +       uint32_t irq;
> +       uint64_t port;
> +
> +       irq = xive_alloc_ipi_irqs(chip->id, 1, 64);
> +       if (irq == XIVE_IRQ_ERROR)
> +               return -1;
> +
> +       vas_vdbg("trigger port: 0x%p\n", xive_get_trigger_port(irq));
> +
> +       port = (uint64_t)xive_get_trigger_port(irq);
> +
> +       chip->vas->vas_irq = irq;
> +       chip->vas->vas_port = port;
> +
> +       return 0;
> +}
> +
>  /*
>   * Initialize one VAS instance and enable it if @enable is true.
>   */
> @@ -452,6 +477,9 @@ static int init_vas_inst(struct dt_node *np, bool enable)
>                                 init_rma(chip))
>                 return -1;
>
> +       if (vas_setup_irq(chip))
> +               return -1;

As I said on the last revision, why are you doing an early exit if
vas_setup_irq() fails? The existing code doesn't provide an interrupt
and it seems to work just fine...

> +
>         create_mm_dt_node(chip);
>
>         prlog(PR_INFO, "VAS: Initialized chip %d\n", chip->id);
>
>
diff mbox series

Patch

diff --git a/doc/device-tree/vas.rst b/doc/device-tree/vas.rst
index 438e45f..7c11c78 100644
--- a/doc/device-tree/vas.rst
+++ b/doc/device-tree/vas.rst
@@ -18,6 +18,12 @@  Each VAS node contains: ::
 
   ibm,vas-id: unique identifier for each instance of VAS in the system.
 
+  ibm,vas-port: Port address for the interrupt.
+
+  interrupts: <IRQ# level> for this VAS instance.
+
+  interrupt-parent: Interrupt controller phandle.
+
   reg: contains 8 64-bit fields.
 
         Fields [0] and [1] represent the Hypervisor window context BAR
diff --git a/hw/vas.c b/hw/vas.c
index 212da0e..be006f6 100644
--- a/hw/vas.c
+++ b/hw/vas.c
@@ -6,6 +6,8 @@ 
 #include <phys-map.h>
 #include <xscom.h>
 #include <io.h>
+#include <xive.h>
+#include <interrupts.h>
 #include <vas.h>
 
 #define vas_err(__fmt,...)	prlog(PR_ERR,"VAS: " __fmt, ##__VA_ARGS__)
@@ -24,6 +26,7 @@  struct vas {
 	uint64_t	xscom_base;
 	uint64_t	wcbs;
 	uint32_t	vas_irq;
+	uint64_t	vas_port;
 };
 
 static inline void get_hvwc_mmio_bar(int chipid, uint64_t *start, uint64_t *len)
@@ -402,6 +405,9 @@  static void create_mm_dt_node(struct proc_chip *chip)
 
 	dt_add_property(dn, "ibm,vas-id", &vas->vas_id, sizeof(vas->vas_id));
 	dt_add_property(dn, "ibm,chip-id", &gcid, sizeof(gcid));
+	dt_add_property_cells(dn, "interrupts", vas->vas_irq, 0);
+	dt_add_property_cells(dn, "interrupt-parent", get_ics_phandle());
+	dt_add_property_u64(dn, "ibm,vas-port", vas->vas_port);
 }
 
 /*
@@ -423,6 +429,25 @@  static void disable_vas_inst(struct dt_node *np)
 	reset_north_ctl(chip);
 }
 
+static int vas_setup_irq(struct proc_chip *chip)
+{
+	uint32_t irq;
+	uint64_t port;
+
+	irq = xive_alloc_ipi_irqs(chip->id, 1, 64);
+	if (irq == XIVE_IRQ_ERROR)
+		return -1;
+
+	vas_vdbg("trigger port: 0x%p\n", xive_get_trigger_port(irq));
+
+	port = (uint64_t)xive_get_trigger_port(irq);
+
+	chip->vas->vas_irq = irq;
+	chip->vas->vas_port = port;
+
+	return 0;
+}
+
 /*
  * Initialize one VAS instance and enable it if @enable is true.
  */
@@ -452,6 +477,9 @@  static int init_vas_inst(struct dt_node *np, bool enable)
 	    			init_rma(chip))
 		return -1;
 
+	if (vas_setup_irq(chip))
+		return -1;
+
 	create_mm_dt_node(chip);
 
 	prlog(PR_INFO, "VAS: Initialized chip %d\n", chip->id);