diff mbox series

[v6,03/37] ppc/xive: introduce the XiveNotifier interface

Message ID 20181205232251.10446-4-clg@kaod.org
State New
Headers show
Series ppc: support for the XIVE interrupt controller (POWER9) | expand

Commit Message

Cédric Le Goater Dec. 5, 2018, 11:22 p.m. UTC
The XiveNotifier offers a simple interface, between the XiveSource
object and the main interrupt controller of the machine. It will
forward event notifications to the XIVE Interrupt Virtualization
Routing Engine (IVRE).

Signed-off-by: Cédric Le Goater <clg@kaod.org>
---
 include/hw/ppc/xive.h | 23 +++++++++++++++++++++++
 hw/intc/xive.c        | 25 +++++++++++++++++++++++++
 2 files changed, 48 insertions(+)

Comments

David Gibson Dec. 6, 2018, 3:25 a.m. UTC | #1
On Thu, Dec 06, 2018 at 12:22:17AM +0100, Cédric Le Goater wrote:
> The XiveNotifier offers a simple interface, between the XiveSource
> object and the main interrupt controller of the machine. It will
> forward event notifications to the XIVE Interrupt Virtualization
> Routing Engine (IVRE).
> 
> Signed-off-by: Cédric Le Goater <clg@kaod.org>
> ---
>  include/hw/ppc/xive.h | 23 +++++++++++++++++++++++
>  hw/intc/xive.c        | 25 +++++++++++++++++++++++++
>  2 files changed, 48 insertions(+)
> 
> diff --git a/include/hw/ppc/xive.h b/include/hw/ppc/xive.h
> index 7cebc32eba4c..6770cffec67d 100644
> --- a/include/hw/ppc/xive.h
> +++ b/include/hw/ppc/xive.h
> @@ -142,6 +142,27 @@
>  
>  #include "hw/qdev-core.h"
>  
> +/*
> + * XIVE Fabric (Interface between Source and Router)
> + */
> +
> +typedef struct XiveNotifier {
> +    Object parent;
> +} XiveNotifier;
> +
> +#define TYPE_XIVE_NOTIFIER "xive-fabric"

I'm applying this, but changing the string here from "xive-fabric" to
"xive-notifier".


> +#define XIVE_NOTIFIER(obj)                                     \
> +    OBJECT_CHECK(XiveNotifier, (obj), TYPE_XIVE_NOTIFIER)
> +#define XIVE_NOTIFIER_CLASS(klass)                                     \
> +    OBJECT_CLASS_CHECK(XiveNotifierClass, (klass), TYPE_XIVE_NOTIFIER)
> +#define XIVE_NOTIFIER_GET_CLASS(obj)                                   \
> +    OBJECT_GET_CLASS(XiveNotifierClass, (obj), TYPE_XIVE_NOTIFIER)
> +
> +typedef struct XiveNotifierClass {
> +    InterfaceClass parent;
> +    void (*notify)(XiveNotifier *xn, uint32_t lisn);
> +} XiveNotifierClass;
> +
>  /*
>   * XIVE Interrupt Source
>   */
> @@ -171,6 +192,8 @@ typedef struct XiveSource {
>      uint64_t        esb_flags;
>      uint32_t        esb_shift;
>      MemoryRegion    esb_mmio;
> +
> +    XiveNotifier    *xive;
>  } XiveSource;
>  
>  /*
> diff --git a/hw/intc/xive.c b/hw/intc/xive.c
> index 11c7aac962de..79238eb57fae 100644
> --- a/hw/intc/xive.c
> +++ b/hw/intc/xive.c
> @@ -155,7 +155,11 @@ static bool xive_source_esb_eoi(XiveSource *xsrc, uint32_t srcno)
>   */
>  static void xive_source_notify(XiveSource *xsrc, int srcno)
>  {
> +    XiveNotifierClass *xnc = XIVE_NOTIFIER_GET_CLASS(xsrc->xive);
>  
> +    if (xnc->notify) {
> +        xnc->notify(xsrc->xive, srcno);
> +    }
>  }
>  
>  /*
> @@ -362,6 +366,17 @@ static void xive_source_reset(void *dev)
>  static void xive_source_realize(DeviceState *dev, Error **errp)
>  {
>      XiveSource *xsrc = XIVE_SOURCE(dev);
> +    Object *obj;
> +    Error *local_err = NULL;
> +
> +    obj = object_property_get_link(OBJECT(dev), "xive", &local_err);
> +    if (!obj) {
> +        error_propagate(errp, local_err);
> +        error_prepend(errp, "required link 'xive' not found: ");
> +        return;
> +    }
> +
> +    xsrc->xive = XIVE_NOTIFIER(obj);
>  
>      if (!xsrc->nr_irqs) {
>          error_setg(errp, "Number of interrupt needs to be greater than 0");
> @@ -428,9 +443,19 @@ static const TypeInfo xive_source_info = {
>      .class_init    = xive_source_class_init,
>  };
>  
> +/*
> + * XIVE Fabric
> + */
> +static const TypeInfo xive_fabric_info = {
> +    .name = TYPE_XIVE_NOTIFIER,
> +    .parent = TYPE_INTERFACE,
> +    .class_size = sizeof(XiveNotifierClass),
> +};
> +
>  static void xive_register_types(void)
>  {
>      type_register_static(&xive_source_info);
> +    type_register_static(&xive_fabric_info);
>  }
>  
>  type_init(xive_register_types)
Cédric Le Goater Dec. 6, 2018, 6:17 a.m. UTC | #2
On 12/6/18 4:25 AM, David Gibson wrote:
> On Thu, Dec 06, 2018 at 12:22:17AM +0100, Cédric Le Goater wrote:
>> The XiveNotifier offers a simple interface, between the XiveSource
>> object and the main interrupt controller of the machine. It will
>> forward event notifications to the XIVE Interrupt Virtualization
>> Routing Engine (IVRE).
>>
>> Signed-off-by: Cédric Le Goater <clg@kaod.org>
>> ---
>>  include/hw/ppc/xive.h | 23 +++++++++++++++++++++++
>>  hw/intc/xive.c        | 25 +++++++++++++++++++++++++
>>  2 files changed, 48 insertions(+)
>>
>> diff --git a/include/hw/ppc/xive.h b/include/hw/ppc/xive.h
>> index 7cebc32eba4c..6770cffec67d 100644
>> --- a/include/hw/ppc/xive.h
>> +++ b/include/hw/ppc/xive.h
>> @@ -142,6 +142,27 @@
>>  
>>  #include "hw/qdev-core.h"
>>  
>> +/*
>> + * XIVE Fabric (Interface between Source and Router)
>> + */
>> +
>> +typedef struct XiveNotifier {
>> +    Object parent;
>> +} XiveNotifier;
>> +
>> +#define TYPE_XIVE_NOTIFIER "xive-fabric"
> 
> I'm applying this, but changing the string here from "xive-fabric" to
> "xive-notifier".

Ah yes. My sed command missed that.

Thanks,

C.

> 
> 
>> +#define XIVE_NOTIFIER(obj)                                     \
>> +    OBJECT_CHECK(XiveNotifier, (obj), TYPE_XIVE_NOTIFIER)
>> +#define XIVE_NOTIFIER_CLASS(klass)                                     \
>> +    OBJECT_CLASS_CHECK(XiveNotifierClass, (klass), TYPE_XIVE_NOTIFIER)
>> +#define XIVE_NOTIFIER_GET_CLASS(obj)                                   \
>> +    OBJECT_GET_CLASS(XiveNotifierClass, (obj), TYPE_XIVE_NOTIFIER)
>> +
>> +typedef struct XiveNotifierClass {
>> +    InterfaceClass parent;
>> +    void (*notify)(XiveNotifier *xn, uint32_t lisn);
>> +} XiveNotifierClass;
>> +
>>  /*
>>   * XIVE Interrupt Source
>>   */
>> @@ -171,6 +192,8 @@ typedef struct XiveSource {
>>      uint64_t        esb_flags;
>>      uint32_t        esb_shift;
>>      MemoryRegion    esb_mmio;
>> +
>> +    XiveNotifier    *xive;
>>  } XiveSource;
>>  
>>  /*
>> diff --git a/hw/intc/xive.c b/hw/intc/xive.c
>> index 11c7aac962de..79238eb57fae 100644
>> --- a/hw/intc/xive.c
>> +++ b/hw/intc/xive.c
>> @@ -155,7 +155,11 @@ static bool xive_source_esb_eoi(XiveSource *xsrc, uint32_t srcno)
>>   */
>>  static void xive_source_notify(XiveSource *xsrc, int srcno)
>>  {
>> +    XiveNotifierClass *xnc = XIVE_NOTIFIER_GET_CLASS(xsrc->xive);
>>  
>> +    if (xnc->notify) {
>> +        xnc->notify(xsrc->xive, srcno);
>> +    }
>>  }
>>  
>>  /*
>> @@ -362,6 +366,17 @@ static void xive_source_reset(void *dev)
>>  static void xive_source_realize(DeviceState *dev, Error **errp)
>>  {
>>      XiveSource *xsrc = XIVE_SOURCE(dev);
>> +    Object *obj;
>> +    Error *local_err = NULL;
>> +
>> +    obj = object_property_get_link(OBJECT(dev), "xive", &local_err);
>> +    if (!obj) {
>> +        error_propagate(errp, local_err);
>> +        error_prepend(errp, "required link 'xive' not found: ");
>> +        return;
>> +    }
>> +
>> +    xsrc->xive = XIVE_NOTIFIER(obj);
>>  
>>      if (!xsrc->nr_irqs) {
>>          error_setg(errp, "Number of interrupt needs to be greater than 0");
>> @@ -428,9 +443,19 @@ static const TypeInfo xive_source_info = {
>>      .class_init    = xive_source_class_init,
>>  };
>>  
>> +/*
>> + * XIVE Fabric
>> + */
>> +static const TypeInfo xive_fabric_info = {
>> +    .name = TYPE_XIVE_NOTIFIER,
>> +    .parent = TYPE_INTERFACE,
>> +    .class_size = sizeof(XiveNotifierClass),
>> +};
>> +
>>  static void xive_register_types(void)
>>  {
>>      type_register_static(&xive_source_info);
>> +    type_register_static(&xive_fabric_info);
>>  }
>>  
>>  type_init(xive_register_types)
>
David Gibson Dec. 7, 2018, 2:07 a.m. UTC | #3
On Thu, Dec 06, 2018 at 07:17:47AM +0100, Cédric Le Goater wrote:
> On 12/6/18 4:25 AM, David Gibson wrote:
> > On Thu, Dec 06, 2018 at 12:22:17AM +0100, Cédric Le Goater wrote:
> >> The XiveNotifier offers a simple interface, between the XiveSource
> >> object and the main interrupt controller of the machine. It will
> >> forward event notifications to the XIVE Interrupt Virtualization
> >> Routing Engine (IVRE).
> >>
> >> Signed-off-by: Cédric Le Goater <clg@kaod.org>
> >> ---
> >>  include/hw/ppc/xive.h | 23 +++++++++++++++++++++++
> >>  hw/intc/xive.c        | 25 +++++++++++++++++++++++++
> >>  2 files changed, 48 insertions(+)
> >>
> >> diff --git a/include/hw/ppc/xive.h b/include/hw/ppc/xive.h
> >> index 7cebc32eba4c..6770cffec67d 100644
> >> --- a/include/hw/ppc/xive.h
> >> +++ b/include/hw/ppc/xive.h
> >> @@ -142,6 +142,27 @@
> >>  
> >>  #include "hw/qdev-core.h"
> >>  
> >> +/*
> >> + * XIVE Fabric (Interface between Source and Router)
> >> + */
> >> +
> >> +typedef struct XiveNotifier {
> >> +    Object parent;
> >> +} XiveNotifier;
> >> +
> >> +#define TYPE_XIVE_NOTIFIER "xive-fabric"
> > 
> > I'm applying this, but changing the string here from "xive-fabric" to
> > "xive-notifier".
> 
> Ah yes. My sed command missed that.

So, I've now applied patches 1-5.  I think we've agreed to a change in
patch 6 which will require tweaks to a bunch further down the series,
so I think the rest will need a v7.
Cédric Le Goater Dec. 7, 2018, 9:08 a.m. UTC | #4
On 12/7/18 3:07 AM, David Gibson wrote:
> On Thu, Dec 06, 2018 at 07:17:47AM +0100, Cédric Le Goater wrote:
>> On 12/6/18 4:25 AM, David Gibson wrote:
>>> On Thu, Dec 06, 2018 at 12:22:17AM +0100, Cédric Le Goater wrote:
>>>> The XiveNotifier offers a simple interface, between the XiveSource
>>>> object and the main interrupt controller of the machine. It will
>>>> forward event notifications to the XIVE Interrupt Virtualization
>>>> Routing Engine (IVRE).
>>>>
>>>> Signed-off-by: Cédric Le Goater <clg@kaod.org>
>>>> ---
>>>>  include/hw/ppc/xive.h | 23 +++++++++++++++++++++++
>>>>  hw/intc/xive.c        | 25 +++++++++++++++++++++++++
>>>>  2 files changed, 48 insertions(+)
>>>>
>>>> diff --git a/include/hw/ppc/xive.h b/include/hw/ppc/xive.h
>>>> index 7cebc32eba4c..6770cffec67d 100644
>>>> --- a/include/hw/ppc/xive.h
>>>> +++ b/include/hw/ppc/xive.h
>>>> @@ -142,6 +142,27 @@
>>>>  
>>>>  #include "hw/qdev-core.h"
>>>>  
>>>> +/*
>>>> + * XIVE Fabric (Interface between Source and Router)
>>>> + */
>>>> +
>>>> +typedef struct XiveNotifier {
>>>> +    Object parent;
>>>> +} XiveNotifier;
>>>> +
>>>> +#define TYPE_XIVE_NOTIFIER "xive-fabric"
>>>
>>> I'm applying this, but changing the string here from "xive-fabric" to
>>> "xive-notifier".
>>
>> Ah yes. My sed command missed that.
> 
> So, I've now applied patches 1-5.  I think we've agreed to a change in
> patch 6 which will require tweaks to a bunch further down the series,

yes.

> so I think the rest will need a v7.

Yes.

Here's my TODO list : 

- some asserts and comments
- introduce a helper to get the CAM line of a ring
- rework the physical CAM line setting.
- introduce a "block" property in XiveENDSource
- remove chip_id id from XiveRouter
- may be modify XiveRouter to be a QOM interface


The hcalls are the big remaining part to review before adding the 
XIVE-only machine.

I think I will move up in the patchset the TCG "dual" machine because 
it does not need much more changes and the XICS machine is not impacted.

KVM will come after.
 

Thanks,

C.
diff mbox series

Patch

diff --git a/include/hw/ppc/xive.h b/include/hw/ppc/xive.h
index 7cebc32eba4c..6770cffec67d 100644
--- a/include/hw/ppc/xive.h
+++ b/include/hw/ppc/xive.h
@@ -142,6 +142,27 @@ 
 
 #include "hw/qdev-core.h"
 
+/*
+ * XIVE Fabric (Interface between Source and Router)
+ */
+
+typedef struct XiveNotifier {
+    Object parent;
+} XiveNotifier;
+
+#define TYPE_XIVE_NOTIFIER "xive-fabric"
+#define XIVE_NOTIFIER(obj)                                     \
+    OBJECT_CHECK(XiveNotifier, (obj), TYPE_XIVE_NOTIFIER)
+#define XIVE_NOTIFIER_CLASS(klass)                                     \
+    OBJECT_CLASS_CHECK(XiveNotifierClass, (klass), TYPE_XIVE_NOTIFIER)
+#define XIVE_NOTIFIER_GET_CLASS(obj)                                   \
+    OBJECT_GET_CLASS(XiveNotifierClass, (obj), TYPE_XIVE_NOTIFIER)
+
+typedef struct XiveNotifierClass {
+    InterfaceClass parent;
+    void (*notify)(XiveNotifier *xn, uint32_t lisn);
+} XiveNotifierClass;
+
 /*
  * XIVE Interrupt Source
  */
@@ -171,6 +192,8 @@  typedef struct XiveSource {
     uint64_t        esb_flags;
     uint32_t        esb_shift;
     MemoryRegion    esb_mmio;
+
+    XiveNotifier    *xive;
 } XiveSource;
 
 /*
diff --git a/hw/intc/xive.c b/hw/intc/xive.c
index 11c7aac962de..79238eb57fae 100644
--- a/hw/intc/xive.c
+++ b/hw/intc/xive.c
@@ -155,7 +155,11 @@  static bool xive_source_esb_eoi(XiveSource *xsrc, uint32_t srcno)
  */
 static void xive_source_notify(XiveSource *xsrc, int srcno)
 {
+    XiveNotifierClass *xnc = XIVE_NOTIFIER_GET_CLASS(xsrc->xive);
 
+    if (xnc->notify) {
+        xnc->notify(xsrc->xive, srcno);
+    }
 }
 
 /*
@@ -362,6 +366,17 @@  static void xive_source_reset(void *dev)
 static void xive_source_realize(DeviceState *dev, Error **errp)
 {
     XiveSource *xsrc = XIVE_SOURCE(dev);
+    Object *obj;
+    Error *local_err = NULL;
+
+    obj = object_property_get_link(OBJECT(dev), "xive", &local_err);
+    if (!obj) {
+        error_propagate(errp, local_err);
+        error_prepend(errp, "required link 'xive' not found: ");
+        return;
+    }
+
+    xsrc->xive = XIVE_NOTIFIER(obj);
 
     if (!xsrc->nr_irqs) {
         error_setg(errp, "Number of interrupt needs to be greater than 0");
@@ -428,9 +443,19 @@  static const TypeInfo xive_source_info = {
     .class_init    = xive_source_class_init,
 };
 
+/*
+ * XIVE Fabric
+ */
+static const TypeInfo xive_fabric_info = {
+    .name = TYPE_XIVE_NOTIFIER,
+    .parent = TYPE_INTERFACE,
+    .class_size = sizeof(XiveNotifierClass),
+};
+
 static void xive_register_types(void)
 {
     type_register_static(&xive_source_info);
+    type_register_static(&xive_fabric_info);
 }
 
 type_init(xive_register_types)