From: David Gibson <david@gibson.dropbear.id.au>
To: agraf@suse.de
Cc: qemu-devel@nongnu.org, mdroth@linux.vnet.ibm.com,
qemu-ppc@nongnu.org, Tyrel Datwyler <tyreld@linux.vnet.ibm.com>,
afaerber@suse.de, David Gibson <david@gibson.dropbear.id.au>
Subject: [Qemu-devel] [PATCH 24/32] spapr_events: event-scan RTAS interface
Date: Fri, 1 May 2015 16:41:42 +1000 [thread overview]
Message-ID: <1430462510-14195-25-git-send-email-david@gibson.dropbear.id.au> (raw)
In-Reply-To: <1430462510-14195-1-git-send-email-david@gibson.dropbear.id.au>
From: Tyrel Datwyler <tyreld@linux.vnet.ibm.com>
We don't actually rely on this interface to surface hotplug events, and
instead rely on the similar-but-interrupt-driven check-exception RTAS
interface used for EPOW events. However, the existence of this interface
is needed to ensure guest kernels initialize the event-reporting
interfaces which will in turn be used by userspace tools to handle these
events, so we implement this interface here.
Since events surfaced by this call are mutually exclusive to those
surfaced via check-exception, we also update the RTAS event queue code
to accept a boolean to mark/filter for events accordingly.
Events of this sort are not currently generated by QEMU, but the interface
has been tested by surfacing hotplug events via event-scan in place
of check-exception.
Signed-off-by: Tyrel Datwyler <tyreld@linux.vnet.ibm.com>
Signed-off-by: Michael Roth <mdroth@linux.vnet.ibm.com>
Reviewed-by: David Gibson <david@gibson.dropbear.id.au>
Signed-off-by: David Gibson <david@gibson.dropbear.id.au>
---
hw/ppc/spapr.c | 1 +
hw/ppc/spapr_events.c | 64 ++++++++++++++++++++++++++++++++++++++++++++------
include/hw/ppc/spapr.h | 3 +++
3 files changed, 61 insertions(+), 7 deletions(-)
diff --git a/hw/ppc/spapr.c b/hw/ppc/spapr.c
index e4448dd..2d6d1ca 100644
--- a/hw/ppc/spapr.c
+++ b/hw/ppc/spapr.c
@@ -533,6 +533,7 @@ static void *spapr_create_fdt_skel(hwaddr initrd_base,
refpoints, sizeof(refpoints))));
_FDT((fdt_property_cell(fdt, "rtas-error-log-max", RTAS_ERROR_LOG_MAX)));
+ _FDT((fdt_property_cell(fdt, "rtas-event-scan-rate", RTAS_EVENT_SCAN_RATE)));
/*
* According to PAPR, rtas ibm,os-term does not guarantee a return
diff --git a/hw/ppc/spapr_events.c b/hw/ppc/spapr_events.c
index c634a3b..be82815 100644
--- a/hw/ppc/spapr_events.c
+++ b/hw/ppc/spapr_events.c
@@ -236,17 +236,18 @@ void spapr_events_fdt_skel(void *fdt, uint32_t check_exception_irq)
_FDT((fdt_end_node(fdt)));
}
-static void rtas_event_log_queue(int log_type, void *data)
+static void rtas_event_log_queue(int log_type, void *data, bool exception)
{
sPAPREventLogEntry *entry = g_new(sPAPREventLogEntry, 1);
g_assert(data);
entry->log_type = log_type;
+ entry->exception = exception;
entry->data = data;
QTAILQ_INSERT_TAIL(&spapr->pending_events, entry, next);
}
-static sPAPREventLogEntry *rtas_event_log_dequeue(uint32_t event_mask)
+static sPAPREventLogEntry *rtas_event_log_dequeue(uint32_t event_mask, bool exception)
{
sPAPREventLogEntry *entry = NULL;
@@ -256,6 +257,10 @@ static sPAPREventLogEntry *rtas_event_log_dequeue(uint32_t event_mask)
}
QTAILQ_FOREACH(entry, &spapr->pending_events, next) {
+ if (entry->exception != exception) {
+ continue;
+ }
+
/* EPOW and hotplug events are surfaced in the same manner */
if (entry->log_type == RTAS_LOG_TYPE_EPOW ||
entry->log_type == RTAS_LOG_TYPE_HOTPLUG) {
@@ -270,7 +275,7 @@ static sPAPREventLogEntry *rtas_event_log_dequeue(uint32_t event_mask)
return entry;
}
-static bool rtas_event_log_contains(uint32_t event_mask)
+static bool rtas_event_log_contains(uint32_t event_mask, bool exception)
{
sPAPREventLogEntry *entry = NULL;
@@ -280,6 +285,10 @@ static bool rtas_event_log_contains(uint32_t event_mask)
}
QTAILQ_FOREACH(entry, &spapr->pending_events, next) {
+ if (entry->exception != exception) {
+ continue;
+ }
+
/* EPOW and hotplug events are surfaced in the same manner */
if (entry->log_type == RTAS_LOG_TYPE_EPOW ||
entry->log_type == RTAS_LOG_TYPE_HOTPLUG) {
@@ -367,7 +376,7 @@ static void spapr_powerdown_req(Notifier *n, void *opaque)
epow->event_modifier = RTAS_LOG_V6_EPOW_MODIFIER_NORMAL;
epow->extended_modifier = RTAS_LOG_V6_EPOW_XMODIFIER_PARTITION_SPECIFIC;
- rtas_event_log_queue(RTAS_LOG_TYPE_EPOW, new_epow);
+ rtas_event_log_queue(RTAS_LOG_TYPE_EPOW, new_epow, true);
qemu_irq_pulse(xics_get_qirq(spapr->icp, spapr->check_exception_irq));
}
@@ -428,7 +437,7 @@ static void spapr_hotplug_req_event(sPAPRDRConnector *drc, uint8_t hp_action)
return;
}
- rtas_event_log_queue(RTAS_LOG_TYPE_HOTPLUG, new_hp);
+ rtas_event_log_queue(RTAS_LOG_TYPE_HOTPLUG, new_hp, true);
qemu_irq_pulse(xics_get_qirq(spapr->icp, spapr->check_exception_irq));
}
@@ -466,7 +475,7 @@ static void check_exception(PowerPCCPU *cpu, sPAPREnvironment *spapr,
xinfo |= (uint64_t)rtas_ld(args, 6) << 32;
}
- event = rtas_event_log_dequeue(mask);
+ event = rtas_event_log_dequeue(mask, true);
if (!event) {
goto out_no_events;
}
@@ -488,7 +497,7 @@ static void check_exception(PowerPCCPU *cpu, sPAPREnvironment *spapr,
* do the latter here, since our code relies on edge-triggered
* interrupts.
*/
- if (rtas_event_log_contains(mask)) {
+ if (rtas_event_log_contains(mask, true)) {
qemu_irq_pulse(xics_get_qirq(spapr->icp, spapr->check_exception_irq));
}
@@ -498,6 +507,46 @@ out_no_events:
rtas_st(rets, 0, RTAS_OUT_NO_ERRORS_FOUND);
}
+static void event_scan(PowerPCCPU *cpu, sPAPREnvironment *spapr,
+ uint32_t token, uint32_t nargs,
+ target_ulong args,
+ uint32_t nret, target_ulong rets)
+{
+ uint32_t mask, buf, len, event_len;
+ sPAPREventLogEntry *event;
+ struct rtas_error_log *hdr;
+
+ if (nargs != 4 || nret != 1) {
+ rtas_st(rets, 0, RTAS_OUT_PARAM_ERROR);
+ return;
+ }
+
+ mask = rtas_ld(args, 0);
+ buf = rtas_ld(args, 2);
+ len = rtas_ld(args, 3);
+
+ event = rtas_event_log_dequeue(mask, false);
+ if (!event) {
+ goto out_no_events;
+ }
+
+ hdr = event->data;
+ event_len = be32_to_cpu(hdr->extended_length) + sizeof(*hdr);
+
+ if (event_len < len) {
+ len = event_len;
+ }
+
+ cpu_physical_memory_write(buf, event->data, len);
+ rtas_st(rets, 0, RTAS_OUT_SUCCESS);
+ g_free(event->data);
+ g_free(event);
+ return;
+
+out_no_events:
+ rtas_st(rets, 0, RTAS_OUT_NO_ERRORS_FOUND);
+}
+
void spapr_events_init(sPAPREnvironment *spapr)
{
QTAILQ_INIT(&spapr->pending_events);
@@ -506,4 +555,5 @@ void spapr_events_init(sPAPREnvironment *spapr)
qemu_register_powerdown_notifier(&spapr->epow_notifier);
spapr_rtas_register(RTAS_CHECK_EXCEPTION, "check-exception",
check_exception);
+ spapr_rtas_register(RTAS_EVENT_SCAN, "event-scan", event_scan);
}
diff --git a/include/hw/ppc/spapr.h b/include/hw/ppc/spapr.h
index 71b3e08..7b4b1bb 100644
--- a/include/hw/ppc/spapr.h
+++ b/include/hw/ppc/spapr.h
@@ -514,6 +514,8 @@ int spapr_rtas_device_tree_setup(void *fdt, hwaddr rtas_addr,
#define RTAS_ERROR_LOG_MAX 2048
+#define RTAS_EVENT_SCAN_RATE 1
+
typedef struct sPAPRTCETable sPAPRTCETable;
#define TYPE_SPAPR_TCE_TABLE "spapr-tce-table"
@@ -539,6 +541,7 @@ sPAPRTCETable *spapr_tce_find_by_liobn(target_ulong liobn);
struct sPAPREventLogEntry {
int log_type;
+ bool exception;
void *data;
QTAILQ_ENTRY(sPAPREventLogEntry) next;
};
--
2.1.0
next prev parent reply other threads:[~2015-05-01 6:42 UTC|newest]
Thread overview: 33+ messages / expand[flat|nested] mbox.gz Atom feed top
2015-05-01 6:41 [Qemu-devel] [PATCH 00/32] Accumulated -machine pseries patches 2015/05/01 David Gibson
2015-05-01 6:41 ` [Qemu-devel] [PATCH 01/32] spapr_pci: Fix unsafe signed/unsigned comparisons David Gibson
2015-05-01 6:41 ` [Qemu-devel] [PATCH 02/32] spapr_iommu: Disable in-kernel IOMMU tables for >4GB windows David Gibson
2015-05-01 6:41 ` [Qemu-devel] [PATCH 03/32] spapr_iommu: Make H_PUT_TCE_INDIRECT endian-safe David Gibson
2015-05-01 6:41 ` [Qemu-devel] [PATCH 04/32] spapr_pci: Introduce a liobn number generating macros David Gibson
2015-05-01 6:41 ` [Qemu-devel] [PATCH 05/32] spapr_vio: " David Gibson
2015-05-01 6:41 ` [Qemu-devel] [PATCH 06/32] spapr_pci: Define default DMA window size as a macro David Gibson
2015-05-01 6:41 ` [Qemu-devel] [PATCH 07/32] spapr_iommu: Add separate trace points for PCI DMA operations David Gibson
2015-05-01 6:41 ` [Qemu-devel] [PATCH 08/32] spapr_pci: Make find_phb()/find_dev() public David Gibson
2015-05-01 6:41 ` [Qemu-devel] [PATCH 09/32] spapr_iommu: Make spapr_tce_find_by_liobn() public David Gibson
2015-05-01 6:41 ` [Qemu-devel] [PATCH 10/32] spapr_pci: Rework device-tree rendering David Gibson
2015-05-01 6:41 ` [Qemu-devel] [PATCH 11/32] spapr_iommu: Give unique QOM name to TCE table David Gibson
2015-05-01 6:41 ` [Qemu-devel] [PATCH 12/32] hw/ppc/spapr_iommu: Fix the check for invalid upper bits in liobn David Gibson
2015-05-01 6:41 ` [Qemu-devel] [PATCH 13/32] pseries: Add pseries-2.4 machine type David Gibson
2015-05-01 6:41 ` [Qemu-devel] [PATCH 14/32] hw/ppc/spapr: Fix error message when firmware could not be loaded David Gibson
2015-05-01 6:41 ` [Qemu-devel] [PATCH 15/32] hw/ppc/spapr: Use error_report() instead of hw_error() David Gibson
2015-05-01 6:41 ` [Qemu-devel] [PATCH 16/32] docs: add sPAPR hotplug/dynamic-reconfiguration documentation David Gibson
2015-05-01 6:41 ` [Qemu-devel] [PATCH 17/32] spapr_drc: initial implementation of sPAPRDRConnector device David Gibson
2015-05-01 6:41 ` [Qemu-devel] [PATCH 18/32] spapr_rtas: add get/set-power-level RTAS interfaces David Gibson
2015-05-01 6:41 ` [Qemu-devel] [PATCH 19/32] spapr_rtas: add set-indicator RTAS interface David Gibson
2015-05-01 6:41 ` [Qemu-devel] [PATCH 20/32] spapr_rtas: add get-sensor-state " David Gibson
2015-05-01 6:41 ` [Qemu-devel] [PATCH 21/32] spapr: add rtas_st_buffer_direct() helper David Gibson
2015-05-01 6:41 ` [Qemu-devel] [PATCH 22/32] spapr_rtas: add ibm, configure-connector RTAS interface David Gibson
2015-05-01 6:41 ` [Qemu-devel] [PATCH 23/32] spapr_events: re-use EPOW event infrastructure for hotplug events David Gibson
2015-05-01 6:41 ` David Gibson [this message]
2015-05-01 6:41 ` [Qemu-devel] [PATCH 25/32] spapr_drc: add spapr_drc_populate_dt() David Gibson
2015-05-01 6:41 ` [Qemu-devel] [PATCH 26/32] spapr_pci: add dynamic-reconfiguration option for spapr-pci-host-bridge David Gibson
2015-05-01 6:41 ` [Qemu-devel] [PATCH 27/32] spapr_pci: create DRConnectors for each PCI slot during PHB realize David Gibson
2015-05-01 6:41 ` [Qemu-devel] [PATCH 28/32] pci: make pci_bar useable outside pci.c David Gibson
2015-05-01 6:41 ` [Qemu-devel] [PATCH 29/32] spapr_pci: enable basic hotplug operations David Gibson
2015-05-01 6:41 ` [Qemu-devel] [PATCH 30/32] spapr_pci: emit hotplug add/remove events during hotplug David Gibson
2015-05-01 6:41 ` [Qemu-devel] [PATCH 31/32] machine: add default_ram_size to machine class David Gibson
2015-05-01 6:41 ` [Qemu-devel] [PATCH 32/32] spapr: override default ram size to 512MB David Gibson
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=1430462510-14195-25-git-send-email-david@gibson.dropbear.id.au \
--to=david@gibson.dropbear.id.au \
--cc=afaerber@suse.de \
--cc=agraf@suse.de \
--cc=mdroth@linux.vnet.ibm.com \
--cc=qemu-devel@nongnu.org \
--cc=qemu-ppc@nongnu.org \
--cc=tyreld@linux.vnet.ibm.com \
/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).