From: "Cédric Le Goater" <clg@kaod.org>
To: qemu-ppc@nongnu.org, qemu-devel@nongnu.org,
David Gibson <david@gibson.dropbear.id.au>,
Greg Kurz <groug@kaod.org>,
Benjamin Herrenschmidt <benh@kernel.crashing.org>
Cc: "Cédric Le Goater" <clg@kaod.org>
Subject: [Qemu-devel] [PATCH for-2.12 v3 05/11] spapr: introduce an IRQ allocator using a bitmap
Date: Fri, 10 Nov 2017 15:20:11 +0000 [thread overview]
Message-ID: <20171110152017.24324-6-clg@kaod.org> (raw)
In-Reply-To: <20171110152017.24324-1-clg@kaod.org>
Let's define a new set of XICSFabric IRQ operations for the latest
pseries machine. These simply use a a bitmap 'irq_map' as a IRQ number
allocator.
The previous pseries machines keep the old set of IRQ operations using
the ICSIRQState array.
Signed-off-by: Cédric Le Goater <clg@kaod.org>
---
Changes since v2 :
- introduced a second set of XICSFabric IRQ operations for older
pseries machines
hw/ppc/spapr.c | 76 ++++++++++++++++++++++++++++++++++++++++++++++----
include/hw/ppc/spapr.h | 3 ++
2 files changed, 74 insertions(+), 5 deletions(-)
diff --git a/hw/ppc/spapr.c b/hw/ppc/spapr.c
index 4bdceb45a14f..4ef0b73559ca 100644
--- a/hw/ppc/spapr.c
+++ b/hw/ppc/spapr.c
@@ -1681,6 +1681,22 @@ static const VMStateDescription vmstate_spapr_patb_entry = {
},
};
+static bool spapr_irq_map_needed(void *opaque)
+{
+ return true;
+}
+
+static const VMStateDescription vmstate_spapr_irq_map = {
+ .name = "spapr_irq_map",
+ .version_id = 0,
+ .minimum_version_id = 0,
+ .needed = spapr_irq_map_needed,
+ .fields = (VMStateField[]) {
+ VMSTATE_BITMAP(irq_map, sPAPRMachineState, 0, nr_irqs),
+ VMSTATE_END_OF_LIST()
+ },
+};
+
static const VMStateDescription vmstate_spapr = {
.name = "spapr",
.version_id = 3,
@@ -1700,6 +1716,7 @@ static const VMStateDescription vmstate_spapr = {
&vmstate_spapr_ov5_cas,
&vmstate_spapr_patb_entry,
&vmstate_spapr_pending_events,
+ &vmstate_spapr_irq_map,
NULL
}
};
@@ -2337,8 +2354,12 @@ static void ppc_spapr_init(MachineState *machine)
/* Setup a load limit for the ramdisk leaving room for SLOF and FDT */
load_limit = MIN(spapr->rma_size, RTAS_MAX_ADDR) - FW_OVERHEAD;
+ /* Initialize the IRQ allocator */
+ spapr->nr_irqs = XICS_IRQS_SPAPR;
+ spapr->irq_map = bitmap_new(spapr->nr_irqs);
+
/* Set up Interrupt Controller before we create the VCPUs */
- xics_system_init(machine, XICS_IRQS_SPAPR, &error_fatal);
+ xics_system_init(machine, spapr->nr_irqs, &error_fatal);
/* Set up containers for ibm,client-architecture-support negotiated options
*/
@@ -3560,7 +3581,7 @@ static int ics_find_free_block(ICSState *ics, int num, int alignnum)
return -1;
}
-static bool spapr_irq_test(XICSFabric *xi, int irq)
+static bool spapr_irq_test_2_11(XICSFabric *xi, int irq)
{
sPAPRMachineState *spapr = SPAPR_MACHINE(xi);
ICSState *ics = spapr->ics;
@@ -3569,7 +3590,7 @@ static bool spapr_irq_test(XICSFabric *xi, int irq)
return !ICS_IRQ_FREE(ics, srcno);
}
-static int spapr_irq_alloc_block(XICSFabric *xi, int count, int align)
+static int spapr_irq_alloc_block_2_11(XICSFabric *xi, int count, int align)
{
sPAPRMachineState *spapr = SPAPR_MACHINE(xi);
ICSState *ics = spapr->ics;
@@ -3583,7 +3604,7 @@ static int spapr_irq_alloc_block(XICSFabric *xi, int count, int align)
return srcno + ics->offset;
}
-static void spapr_irq_free_block(XICSFabric *xi, int irq, int num)
+static void spapr_irq_free_block_2_11(XICSFabric *xi, int irq, int num)
{
sPAPRMachineState *spapr = SPAPR_MACHINE(xi);
ICSState *ics = spapr->ics;
@@ -3601,6 +3622,46 @@ static void spapr_irq_free_block(XICSFabric *xi, int irq, int num)
}
}
+static bool spapr_irq_test(XICSFabric *xi, int irq)
+{
+ sPAPRMachineState *spapr = SPAPR_MACHINE(xi);
+ int srcno = irq - spapr->ics->offset;
+
+ return test_bit(srcno, spapr->irq_map);
+}
+
+static int spapr_irq_alloc_block(XICSFabric *xi, int count, int align)
+{
+ sPAPRMachineState *spapr = SPAPR_MACHINE(xi);
+ int start = 0;
+ int srcno;
+
+ /*
+ * The 'align_mask' parameter of bitmap_find_next_zero_area()
+ * should be one less than a power of 2; 0 means no
+ * alignment. Adapt the 'align' value of the former allocator to
+ * fit the requirements of bitmap_find_next_zero_area()
+ */
+ align -= 1;
+
+ srcno = bitmap_find_next_zero_area(spapr->irq_map, spapr->nr_irqs, start,
+ count, align);
+ if (srcno == spapr->nr_irqs) {
+ return -1;
+ }
+
+ bitmap_set(spapr->irq_map, srcno, count);
+ return srcno + spapr->ics->offset;
+}
+
+static void spapr_irq_free_block(XICSFabric *xi, int irq, int num)
+{
+ sPAPRMachineState *spapr = SPAPR_MACHINE(xi);
+ int srcno = irq - spapr->ics->offset;
+
+ bitmap_clear(spapr->irq_map, srcno, num);
+}
+
static void spapr_pic_print_info(InterruptStatsProvider *obj,
Monitor *mon)
{
@@ -3778,7 +3839,12 @@ static void spapr_machine_2_11_instance_options(MachineState *machine)
static void spapr_machine_2_11_class_options(MachineClass *mc)
{
- /* Defaults for the latest behaviour inherited from the base class */
+ XICSFabricClass *xic = XICS_FABRIC_CLASS(mc);
+
+ spapr_machine_2_12_class_options(mc);
+ xic->irq_test = spapr_irq_test_2_11;
+ xic->irq_alloc_block = spapr_irq_alloc_block_2_11;
+ xic->irq_free_block = spapr_irq_free_block_2_11;
}
DEFINE_SPAPR_MACHINE(2_11, "2.11", false);
diff --git a/include/hw/ppc/spapr.h b/include/hw/ppc/spapr.h
index 9d21ca9bde3a..5835c694caff 100644
--- a/include/hw/ppc/spapr.h
+++ b/include/hw/ppc/spapr.h
@@ -7,6 +7,7 @@
#include "hw/ppc/spapr_drc.h"
#include "hw/mem/pc-dimm.h"
#include "hw/ppc/spapr_ovec.h"
+#include "qemu/bitmap.h"
struct VIOsPAPRBus;
struct sPAPRPHBState;
@@ -78,6 +79,8 @@ struct sPAPRMachineState {
struct VIOsPAPRBus *vio_bus;
QLIST_HEAD(, sPAPRPHBState) phbs;
struct sPAPRNVRAM *nvram;
+ int32_t nr_irqs;
+ unsigned long *irq_map;
ICSState *ics;
sPAPRRTCState rtc;
--
2.13.6
next prev parent reply other threads:[~2017-11-10 15:21 UTC|newest]
Thread overview: 79+ messages / expand[flat|nested] mbox.gz Atom feed top
2017-11-10 15:20 [Qemu-devel] [PATCH for-2.12 v3 00/11] spapr: introduce an IRQ allocator at the machine level Cédric Le Goater
2017-11-10 15:20 ` [Qemu-devel] [PATCH for-2.12 v3 01/11] spapr: add pseries 2.12 machine type Cédric Le Goater
2017-11-11 15:15 ` Greg Kurz
2017-11-13 5:51 ` David Gibson
2017-11-13 9:50 ` Greg Kurz
2017-11-14 9:08 ` David Gibson
2017-11-13 7:14 ` [Qemu-devel] QEMU 3.0 ? (was: [PATCH for-2.12 v3 01/11] spapr: add pseries 2.12 machine type) Thomas Huth
2017-11-13 9:53 ` Peter Maydell
2017-11-13 10:03 ` [Qemu-devel] QEMU 3.0 ? Cédric Le Goater
2017-11-13 10:21 ` Peter Maydell
2017-11-13 10:25 ` Thomas Huth
2017-11-23 10:03 ` [Qemu-devel] QEMU 3.0 ? (was: [PATCH for-2.12 v3 01/11] spapr: add pseries 2.12 machine type) Cornelia Huck
2017-11-23 10:17 ` Peter Maydell
2017-11-23 10:57 ` [Qemu-devel] QEMU 3.0 ? Thomas Huth
2017-11-23 11:11 ` Daniel P. Berrange
2017-11-23 11:24 ` Thomas Huth
2017-11-23 11:33 ` Daniel P. Berrange
2017-11-23 11:40 ` Thomas Huth
2017-11-23 11:17 ` Paolo Bonzini
2017-11-23 11:57 ` Thomas Huth
2017-11-23 12:05 ` Paolo Bonzini
2017-11-23 12:09 ` Cornelia Huck
2017-11-23 12:26 ` Paolo Bonzini
2017-11-23 12:39 ` Cornelia Huck
2017-11-23 12:59 ` Daniel P. Berrange
2017-11-23 13:08 ` Paolo Bonzini
2017-11-23 13:23 ` Daniel P. Berrange
2017-11-23 13:25 ` Paolo Bonzini
2017-11-23 13:02 ` Paolo Bonzini
2017-11-23 13:13 ` Cornelia Huck
2017-11-23 13:27 ` Paolo Bonzini
2017-11-23 13:13 ` Peter Maydell
2017-11-23 13:51 ` Paolo Bonzini
2017-11-23 13:57 ` Peter Maydell
2017-11-23 14:01 ` Thomas Huth
2017-11-23 14:13 ` Paolo Bonzini
2017-11-23 13:57 ` Daniel P. Berrange
2017-11-23 14:57 ` Igor Mammedov
2017-11-23 11:14 ` [Qemu-devel] QEMU 3.0 ? (was: [PATCH for-2.12 v3 01/11] spapr: add pseries 2.12 machine type) Daniel P. Berrange
2017-11-23 11:26 ` [Qemu-devel] QEMU 3.0 ? Thomas Huth
2017-11-10 15:20 ` [Qemu-devel] [PATCH for-2.12 v3 02/11] ppc/xics: remove useless if condition Cédric Le Goater
2017-11-11 14:50 ` Greg Kurz
2017-11-13 5:28 ` David Gibson
2017-11-10 15:20 ` [Qemu-devel] [PATCH for-2.12 v3 03/11] spapr: introduce new XICSFabric operations for an IRQ allocator Cédric Le Goater
2017-11-14 8:52 ` Greg Kurz
2017-11-17 4:48 ` David Gibson
2017-11-17 7:16 ` Cédric Le Goater
2017-11-23 11:07 ` David Gibson
2017-11-23 13:22 ` Cédric Le Goater
2017-11-10 15:20 ` [Qemu-devel] [PATCH for-2.12 v3 04/11] spapr: move current IRQ allocation under the machine Cédric Le Goater
2017-11-14 8:56 ` Greg Kurz
2017-11-10 15:20 ` Cédric Le Goater [this message]
2017-11-14 9:42 ` [Qemu-devel] [PATCH for-2.12 v3 05/11] spapr: introduce an IRQ allocator using a bitmap Greg Kurz
2017-11-14 11:54 ` Cédric Le Goater
2017-11-14 15:28 ` Greg Kurz
2017-11-15 8:47 ` Cédric Le Goater
2017-11-17 4:50 ` David Gibson
2017-11-17 7:19 ` Cédric Le Goater
2017-11-23 11:08 ` David Gibson
2017-11-20 12:07 ` Greg Kurz
2017-11-23 11:13 ` David Gibson
2017-11-10 15:20 ` [Qemu-devel] [PATCH for-2.12 v3 06/11] spapr: store a reference IRQ bitmap Cédric Le Goater
2017-11-14 15:12 ` Greg Kurz
2017-11-10 15:20 ` [Qemu-devel] [PATCH for-2.12 v3 07/11] spapr: introduce an 'irq_base' number Cédric Le Goater
2017-11-14 15:45 ` Greg Kurz
2017-11-15 15:24 ` Cédric Le Goater
2017-11-15 16:43 ` Greg Kurz
2017-11-10 15:20 ` [Qemu-devel] [PATCH for-2.12 v3 08/11] spapr: introduce a XICSFabric irq_is_lsi() operation Cédric Le Goater
2017-11-14 16:21 ` Greg Kurz
2017-11-17 4:54 ` David Gibson
2017-11-17 7:23 ` Cédric Le Goater
2017-11-23 11:12 ` David Gibson
2017-11-23 13:26 ` Cédric Le Goater
2017-11-10 15:20 ` [Qemu-devel] [PATCH for-2.12 v3 09/11] spapr: split the IRQ number space for LSI interrupts Cédric Le Goater
2017-11-15 15:52 ` Greg Kurz
2017-11-15 16:08 ` Cédric Le Goater
2017-11-15 20:27 ` Greg Kurz
2017-11-10 15:20 ` [Qemu-devel] [PATCH for-2.12 v3 10/11] sparp: merge ics_set_irq_type() in irq_alloc_block() operation Cédric Le Goater
2017-11-10 15:20 ` [Qemu-devel] [PATCH for-2.12 v3 11/11] spapr: use sPAPRMachineState in spapr_ics_ prototypes Cédric Le Goater
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=20171110152017.24324-6-clg@kaod.org \
--to=clg@kaod.org \
--cc=benh@kernel.crashing.org \
--cc=david@gibson.dropbear.id.au \
--cc=groug@kaod.org \
--cc=qemu-devel@nongnu.org \
--cc=qemu-ppc@nongnu.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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).