From: Michael Roth <mdroth@linux.vnet.ibm.com>
To: David Gibson <david@gibson.dropbear.id.au>
Cc: aik@ozlabs.ru, qemu-devel@nongnu.org, agraf@suse.de,
ncmike@ncultra.org, qemu-ppc@nongnu.org,
tyreld@linux.vnet.ibm.com, bharata.rao@gmail.com,
nfont@linux.vnet.ibm.com
Subject: Re: [Qemu-devel] [PATCH v5 08/16] spapr_events: re-use EPOW event infrastructure for hotplug events
Date: Tue, 24 Feb 2015 14:04:29 -0600 [thread overview]
Message-ID: <20150224200429.31752.33720@loki> (raw)
In-Reply-To: <20150224064942.GR4536@voom.redhat.com>
Quoting David Gibson (2015-02-24 00:49:42)
> On Mon, Feb 16, 2015 at 08:27:44AM -0600, Michael Roth wrote:
> > From: Nathan Fontenot <nfont@linux.vnet.ibm.com>
> >
> > This extends the data structures currently used to report EPOW events to
> > guests via the check-exception RTAS interfaces to also include event types
> > for hotplug/unplug events.
> >
> > This is currently undocumented and being finalized for inclusion in PAPR
> > specification, but we implement this here as an extension for guest
> > userspace tools to implement (existing guest kernels simply log these
> > events via a sysfs interface that's read by rtas_errd, and current
> > versions of rtas_errd/powerpc-utils already support the use of this
> > mechanism for initiating hotplug operations).
> >
> > We also add support for queues of pending RTAS events, since in the
> > case of hotplug there's chance for multiple events being in-flight
> > at any point in time.
> >
> > Signed-off-by: Nathan Fontenot <nfont@linux.vnet.ibm.com>
> > Signed-off-by: Michael Roth <mdroth@linux.vnet.ibm.com>
> > ---
> > hw/ppc/spapr.c | 2 +-
> > hw/ppc/spapr_events.c | 271 ++++++++++++++++++++++++++++++++++++++++---------
> > include/hw/ppc/spapr.h | 5 +-
> > 3 files changed, 226 insertions(+), 52 deletions(-)
> >
> > diff --git a/hw/ppc/spapr.c b/hw/ppc/spapr.c
> > index bfacc9d..861107e 100644
> > --- a/hw/ppc/spapr.c
> > +++ b/hw/ppc/spapr.c
> > @@ -1640,7 +1640,7 @@ static void ppc_spapr_init(MachineState *machine)
> > spapr->fdt_skel = spapr_create_fdt_skel(initrd_base, initrd_size,
> > kernel_size, kernel_le,
> > boot_device, kernel_cmdline,
> > - spapr->epow_irq);
> > + spapr->check_exception_irq);
> > assert(spapr->fdt_skel != NULL);
> > }
> >
> > diff --git a/hw/ppc/spapr_events.c b/hw/ppc/spapr_events.c
> > index 283e96b..0eeb1d8 100644
> > --- a/hw/ppc/spapr_events.c
> > +++ b/hw/ppc/spapr_events.c
> > @@ -32,6 +32,9 @@
> >
> > #include "hw/ppc/spapr.h"
> > #include "hw/ppc/spapr_vio.h"
> > +#include "hw/pci/pci.h"
> > +#include "hw/pci-host/spapr.h"
> > +#include "hw/ppc/spapr_drc.h"
> >
> > #include <libfdt.h>
> >
> > @@ -77,6 +80,7 @@ struct rtas_error_log {
> > #define RTAS_LOG_TYPE_ECC_UNCORR 0x00000009
> > #define RTAS_LOG_TYPE_ECC_CORR 0x0000000a
> > #define RTAS_LOG_TYPE_EPOW 0x00000040
> > +#define RTAS_LOG_TYPE_HOTPLUG 0x000000e5
> > uint32_t extended_length;
> > } QEMU_PACKED;
> >
> > @@ -166,6 +170,38 @@ struct epow_log_full {
> > struct rtas_event_log_v6_epow epow;
> > } QEMU_PACKED;
> >
> > +struct rtas_event_log_v6_hp {
> > +#define RTAS_LOG_V6_SECTION_ID_HOTPLUG 0x4850 /* HP */
> > + struct rtas_event_log_v6_section_header hdr;
> > + uint8_t hotplug_type;
> > +#define RTAS_LOG_V6_HP_TYPE_CPU 1
> > +#define RTAS_LOG_V6_HP_TYPE_MEMORY 2
> > +#define RTAS_LOG_V6_HP_TYPE_SLOT 3
> > +#define RTAS_LOG_V6_HP_TYPE_PHB 4
> > +#define RTAS_LOG_V6_HP_TYPE_PCI 5
> > + uint8_t hotplug_action;
> > +#define RTAS_LOG_V6_HP_ACTION_ADD 1
> > +#define RTAS_LOG_V6_HP_ACTION_REMOVE 2
> > + uint8_t hotplug_identifier;
> > +#define RTAS_LOG_V6_HP_ID_DRC_NAME 1
> > +#define RTAS_LOG_V6_HP_ID_DRC_INDEX 2
> > +#define RTAS_LOG_V6_HP_ID_DRC_COUNT 3
> > + uint8_t reserved;
> > + union {
> > + uint32_t index;
> > + uint32_t count;
> > + char name[1];
> > + } drc;
> > +} QEMU_PACKED;
> > +
> > +struct hp_log_full {
> > + struct rtas_error_log hdr;
> > + struct rtas_event_log_v6 v6hdr;
> > + struct rtas_event_log_v6_maina maina;
> > + struct rtas_event_log_v6_mainb mainb;
> > + struct rtas_event_log_v6_hp hp;
> > +} QEMU_PACKED;
> > +
> > #define EVENT_MASK_INTERNAL_ERRORS 0x80000000
> > #define EVENT_MASK_EPOW 0x40000000
> > #define EVENT_MASK_HOTPLUG 0x10000000
> > @@ -181,67 +217,84 @@ struct epow_log_full {
> > } \
> > } while (0)
> >
> > -void spapr_events_fdt_skel(void *fdt, uint32_t epow_irq)
> > +void spapr_events_fdt_skel(void *fdt, uint32_t check_exception_irq)
> > {
> > - uint32_t epow_irq_ranges[] = {cpu_to_be32(epow_irq), cpu_to_be32(1)};
> > - uint32_t epow_interrupts[] = {cpu_to_be32(epow_irq), 0};
> > + uint32_t irq_ranges[] = {cpu_to_be32(check_exception_irq), cpu_to_be32(1)};
> > + uint32_t interrupts[] = {cpu_to_be32(check_exception_irq), 0};
> >
> > _FDT((fdt_begin_node(fdt, "event-sources")));
> >
> > _FDT((fdt_property(fdt, "interrupt-controller", NULL, 0)));
> > _FDT((fdt_property_cell(fdt, "#interrupt-cells", 2)));
> > _FDT((fdt_property(fdt, "interrupt-ranges",
> > - epow_irq_ranges, sizeof(epow_irq_ranges))));
> > + irq_ranges, sizeof(irq_ranges))));
> >
> > _FDT((fdt_begin_node(fdt, "epow-events")));
> > - _FDT((fdt_property(fdt, "interrupts",
> > - epow_interrupts, sizeof(epow_interrupts))));
> > + _FDT((fdt_property(fdt, "interrupts", interrupts, sizeof(interrupts))));
> > _FDT((fdt_end_node(fdt)));
> >
> > _FDT((fdt_end_node(fdt)));
> > }
> >
> > -static struct epow_log_full *pending_epow;
> > -static uint32_t next_plid;
> > +typedef struct EventLogEntry {
> > + int log_type;
> > + void *data;
> > + QTAILQ_ENTRY(EventLogEntry) next;
> > +} EventLogEntry;
> >
> > -static void spapr_powerdown_req(Notifier *n, void *opaque)
> > +static struct {
> > + QTAILQ_HEAD(, EventLogEntry) pending_events;
> > +} rtas_event_log;
>
> Adding new globals is never nice. Couldn't this go into
> sPAPREnvironment, or better yet the SPAPR_MACHINE structure? (I'd
> like to merge those two when we get the chance).
Makes sense, will roll into sPAPREnvironment initially
>
> > +static void rtas_event_log_queue(int log_type, void *data)
> > {
> > - sPAPREnvironment *spapr = container_of(n, sPAPREnvironment, epow_notifier);
> > - struct rtas_error_log *hdr;
> > - struct rtas_event_log_v6 *v6hdr;
> > - struct rtas_event_log_v6_maina *maina;
> > - struct rtas_event_log_v6_mainb *mainb;
> > - struct rtas_event_log_v6_epow *epow;
> > - struct tm tm;
> > - int year;
> > + EventLogEntry *entry = g_new(EventLogEntry, 1);
> > +
> > + entry->log_type = log_type;
> > + entry->data = data;
> > + QTAILQ_INSERT_TAIL(&rtas_event_log.pending_events, entry, next);
> > +}
> >
> > - if (pending_epow) {
> > - /* For now, we just throw away earlier events if two come
> > - * along before any are consumed. This is sufficient for our
> > - * powerdown messages, but we'll need more if we do more
> > - * general error/event logging */
> > - g_free(pending_epow);
> > +static EventLogEntry *rtas_event_log_dequeue(uint32_t event_mask)
> > +{
> > + EventLogEntry *entry = NULL;
> > +
> > + /* we only queue EPOW events atm. */
> > + if ((event_mask & EVENT_MASK_EPOW) == 0) {
> > + return NULL;
> > }
> > - pending_epow = g_malloc0(sizeof(*pending_epow));
> > - hdr = &pending_epow->hdr;
> > - v6hdr = &pending_epow->v6hdr;
> > - maina = &pending_epow->maina;
> > - mainb = &pending_epow->mainb;
> > - epow = &pending_epow->epow;
> >
> > - hdr->summary = cpu_to_be32(RTAS_LOG_VERSION_6
> > - | RTAS_LOG_SEVERITY_EVENT
> > - | RTAS_LOG_DISPOSITION_NOT_RECOVERED
> > - | RTAS_LOG_OPTIONAL_PART_PRESENT
> > - | RTAS_LOG_TYPE_EPOW);
> > - hdr->extended_length = cpu_to_be32(sizeof(*pending_epow)
> > - - sizeof(pending_epow->hdr));
> > + QTAILQ_FOREACH(entry, &rtas_event_log.pending_events, next) {
> > + /* 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) {
> > + break;
> > + }
> > + }
> > +
> > + if (entry) {
> > + QTAILQ_REMOVE(&rtas_event_log.pending_events, entry, next);
> > + }
> >
> > + return entry;
> > +}
> > +
> > +static uint32_t next_plid;
> > +
> > +static void spapr_init_v6hdr(struct rtas_event_log_v6 *v6hdr)
> > +{
> > v6hdr->b0 = RTAS_LOG_V6_B0_VALID | RTAS_LOG_V6_B0_NEW_LOG
> > | RTAS_LOG_V6_B0_BIGENDIAN;
> > v6hdr->b2 = RTAS_LOG_V6_B2_POWERPC_FORMAT
> > | RTAS_LOG_V6_B2_LOG_FORMAT_PLATFORM_EVENT;
> > v6hdr->company = cpu_to_be32(RTAS_LOG_V6_COMPANY_IBM);
> > +}
> > +
> > +static void spapr_init_maina(struct rtas_event_log_v6_maina *maina,
> > + int section_count)
> > +{
> > + struct tm tm;
> > + int year;
> >
> > maina->hdr.section_id = cpu_to_be16(RTAS_LOG_V6_SECTION_ID_MAINA);
> > maina->hdr.section_length = cpu_to_be16(sizeof(*maina));
> > @@ -256,8 +309,37 @@ static void spapr_powerdown_req(Notifier *n, void *opaque)
> > | (to_bcd(tm.tm_min) << 16)
> > | (to_bcd(tm.tm_sec) << 8));
> > maina->creator_id = 'H'; /* Hypervisor */
> > - maina->section_count = 3; /* Main-A, Main-B and EPOW */
> > + maina->section_count = section_count;
> > maina->plid = next_plid++;
> > +}
> > +
> > +static void spapr_powerdown_req(Notifier *n, void *opaque)
> > +{
> > + sPAPREnvironment *spapr = container_of(n, sPAPREnvironment, epow_notifier);
> > + struct rtas_error_log *hdr;
> > + struct rtas_event_log_v6 *v6hdr;
> > + struct rtas_event_log_v6_maina *maina;
> > + struct rtas_event_log_v6_mainb *mainb;
> > + struct rtas_event_log_v6_epow *epow;
> > + struct epow_log_full *pending_epow;
> > +
> > + pending_epow = g_malloc0(sizeof(*pending_epow));
>
> The name's no longer really right as a local.
>
> > + hdr = &pending_epow->hdr;
> > + v6hdr = &pending_epow->v6hdr;
> > + maina = &pending_epow->maina;
> > + mainb = &pending_epow->mainb;
> > + epow = &pending_epow->epow;
> > +
> > + hdr->summary = cpu_to_be32(RTAS_LOG_VERSION_6
> > + | RTAS_LOG_SEVERITY_EVENT
> > + | RTAS_LOG_DISPOSITION_NOT_RECOVERED
> > + | RTAS_LOG_OPTIONAL_PART_PRESENT
> > + | RTAS_LOG_TYPE_EPOW);
> > + hdr->extended_length = cpu_to_be32(sizeof(*pending_epow)
> > + - sizeof(pending_epow->hdr));
> > +
> > + spapr_init_v6hdr(v6hdr);
> > + spapr_init_maina(maina, 3 /* Main-A, Main-B and EPOW */);
> >
> > mainb->hdr.section_id = cpu_to_be16(RTAS_LOG_V6_SECTION_ID_MAINB);
> > mainb->hdr.section_length = cpu_to_be16(sizeof(*mainb));
> > @@ -274,7 +356,78 @@ 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;
> >
> > - qemu_irq_pulse(xics_get_qirq(spapr->icp, spapr->epow_irq));
> > + rtas_event_log_queue(RTAS_LOG_TYPE_EPOW, pending_epow);
> > +
> > + qemu_irq_pulse(xics_get_qirq(spapr->icp, spapr->check_exception_irq));
>
> Shouldn't the irq pulse go into rtas_event_log_queue()?
It seems maybe it should...
"If a platform chooses to report multiple event or error sources through a
single interrupt, it must ensure that the interrupt remains asserted
or is re-asserted until check-exception has been used to process all
out-standing errors or events for that interrupt."
But another alternative would be to have rtas-check-exception re-pulse if there
are still events present for that particular IRQ. I think I'd prefer this
approach, since it makes it easier to share the queueing functionality with
rtas-event-scan (which relies on polling instead of interrupts)
>
> > +}
> > +
> > +static void spapr_hotplug_req_event(sPAPRDRConnector *drc, uint8_t hp_action)
> > +{
> > + struct hp_log_full *new_hp;
> > + struct rtas_error_log *hdr;
> > + struct rtas_event_log_v6 *v6hdr;
> > + struct rtas_event_log_v6_maina *maina;
> > + struct rtas_event_log_v6_mainb *mainb;
> > + struct rtas_event_log_v6_hp *hp;
> > + sPAPRDRConnectorClass *drck = SPAPR_DR_CONNECTOR_GET_CLASS(drc);
> > + sPAPRDRConnectorType drc_type = drck->get_type(drc);
> > +
> > + new_hp = g_malloc0(sizeof(struct hp_log_full));
> > + hdr = &new_hp->hdr;
> > + v6hdr = &new_hp->v6hdr;
> > + maina = &new_hp->maina;
> > + mainb = &new_hp->mainb;
> > + hp = &new_hp->hp;
> > +
> > + hdr->summary = cpu_to_be32(RTAS_LOG_VERSION_6
> > + | RTAS_LOG_SEVERITY_EVENT
> > + | RTAS_LOG_DISPOSITION_NOT_RECOVERED
> > + | RTAS_LOG_OPTIONAL_PART_PRESENT
> > + | RTAS_LOG_INITIATOR_HOTPLUG
> > + | RTAS_LOG_TYPE_HOTPLUG);
> > + hdr->extended_length = cpu_to_be32(sizeof(*new_hp)
> > + - sizeof(new_hp->hdr));
> > +
> > + spapr_init_v6hdr(v6hdr);
> > + spapr_init_maina(maina, 3 /* Main-A, Main-B, HP */);
> > +
> > + mainb->hdr.section_id = cpu_to_be16(RTAS_LOG_V6_SECTION_ID_MAINB);
> > + mainb->hdr.section_length = cpu_to_be16(sizeof(*mainb));
> > + mainb->subsystem_id = 0x80; /* External environment */
> > + mainb->event_severity = 0x00; /* Informational / non-error */
> > + mainb->event_subtype = 0x00; /* Normal shutdown */
> > +
> > + hp->hdr.section_id = cpu_to_be16(RTAS_LOG_V6_SECTION_ID_HOTPLUG);
> > + hp->hdr.section_length = cpu_to_be16(sizeof(*hp));
> > + hp->hdr.section_version = 1; /* includes extended modifier */
> > + hp->hotplug_action = hp_action;
> > +
> > +
> > + switch (drc_type) {
> > + case SPAPR_DR_CONNECTOR_TYPE_PCI:
> > + hp->drc.index = cpu_to_be32(drck->get_index(drc));
> > + hp->hotplug_identifier = RTAS_LOG_V6_HP_ID_DRC_INDEX;
> > + hp->hotplug_type = RTAS_LOG_V6_HP_TYPE_PCI;
> > + break;
> > + default:
> > + /* skip notification for unknown connector types */
>
> This should be an assert, shouldn't it? If code is added which can
> fire this for non-PCI types, without the corresponding non-PCI option
> here, you want to catch that.
Agreed, if hotplug events are supported for that resource type, we should be
calling this.
>
> > + g_free(new_hp);
> > + return;
> > + }
> > +
> > + rtas_event_log_queue(RTAS_LOG_TYPE_HOTPLUG, new_hp);
> > +
> > + qemu_irq_pulse(xics_get_qirq(spapr->icp, spapr->check_exception_irq));
> > +}
> > +
> > +void spapr_hotplug_req_add_event(sPAPRDRConnector *drc)
> > +{
> > + spapr_hotplug_req_event(drc, RTAS_LOG_V6_HP_ACTION_ADD);
> > +}
> > +
> > +void spapr_hotplug_req_remove_event(sPAPRDRConnector *drc)
> > +{
> > + spapr_hotplug_req_event(drc, RTAS_LOG_V6_HP_ACTION_REMOVE);
> > }
> >
> > static void check_exception(PowerPCCPU *cpu, sPAPREnvironment *spapr,
> > @@ -282,8 +435,9 @@ static void check_exception(PowerPCCPU *cpu, sPAPREnvironment *spapr,
> > target_ulong args,
> > uint32_t nret, target_ulong rets)
> > {
> > - uint32_t mask, buf, len;
> > + uint32_t mask, buf, len, event_len;
> > uint64_t xinfo;
> > + EventLogEntry *event;
> >
> > if ((nargs < 6) || (nargs > 7) || nret != 1) {
> > rtas_st(rets, 0, RTAS_OUT_PARAM_ERROR);
> > @@ -298,23 +452,40 @@ static void check_exception(PowerPCCPU *cpu, sPAPREnvironment *spapr,
> > xinfo |= (uint64_t)rtas_ld(args, 6) << 32;
> > }
> >
> > - if ((mask & EVENT_MASK_EPOW) && pending_epow) {
> > - if (sizeof(*pending_epow) < len) {
> > - len = sizeof(*pending_epow);
> > - }
> > + event = rtas_event_log_dequeue(mask);
> > + if (!event) {
> > + goto out_no_events;
> > + }
> >
> > - cpu_physical_memory_write(buf, pending_epow, len);
> > - g_free(pending_epow);
> > - pending_epow = NULL;
> > - rtas_st(rets, 0, RTAS_OUT_SUCCESS);
> > - } else {
> > - rtas_st(rets, 0, RTAS_OUT_NO_ERRORS_FOUND);
> > + switch (event->log_type) {
> > + case RTAS_LOG_TYPE_EPOW:
> > + event_len = sizeof(struct epow_log_full);
> > + break;
> > + case RTAS_LOG_TYPE_HOTPLUG:
> > + event_len = sizeof(struct hp_log_full);
> > + break;
> > + default:
> > + goto out_no_events;
>
> Doesn't one of the headers include size information you could use
> here, avoiding the switch?
Looks like hdr->extended_length + sizeof(hdr) should do the trick. Nice!
>
> > }
> > +
> > + 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)
> > {
> > - spapr->epow_irq = xics_alloc(spapr->icp, 0, 0, false);
> > + QTAILQ_INIT(&rtas_event_log.pending_events);
> > + spapr->check_exception_irq = xics_alloc(spapr->icp, 0, 0, false);
> > spapr->epow_notifier.notify = spapr_powerdown_req;
> > qemu_register_powerdown_notifier(&spapr->epow_notifier);
> > spapr_rtas_register(RTAS_CHECK_EXCEPTION, "check-exception",
> > diff --git a/include/hw/ppc/spapr.h b/include/hw/ppc/spapr.h
> > index 3cc4490..1d27708 100644
> > --- a/include/hw/ppc/spapr.h
> > +++ b/include/hw/ppc/spapr.h
> > @@ -3,6 +3,7 @@
> >
> > #include "sysemu/dma.h"
> > #include "hw/ppc/xics.h"
> > +#include "hw/ppc/spapr_drc.h"
> >
> > struct VIOsPAPRBus;
> > struct sPAPRPHBState;
> > @@ -31,7 +32,7 @@ typedef struct sPAPREnvironment {
> > struct PPCTimebase tb;
> > bool has_graphics;
> >
> > - uint32_t epow_irq;
> > + uint32_t check_exception_irq;
> > Notifier epow_notifier;
> >
> > /* Migration state */
> > @@ -498,6 +499,8 @@ int spapr_dma_dt(void *fdt, int node_off, const char *propname,
> > uint32_t liobn, uint64_t window, uint32_t size);
> > int spapr_tcet_dma_dt(void *fdt, int node_off, const char *propname,
> > sPAPRTCETable *tcet);
> > +void spapr_hotplug_req_add_event(sPAPRDRConnector *drc);
> > +void spapr_hotplug_req_remove_event(sPAPRDRConnector *drc);
> >
> > #define TYPE_SPAPR_RTC "spapr-rtc"
> >
>
> --
> David Gibson | I'll have my music baroque, and my code
> david AT gibson.dropbear.id.au | minimalist, thank you. NOT _the_ _other_
> | _way_ _around_!
> http://www.ozlabs.org/~dgibson
next prev parent reply other threads:[~2015-02-24 20:04 UTC|newest]
Thread overview: 46+ messages / expand[flat|nested] mbox.gz Atom feed top
2015-02-16 14:27 [Qemu-devel] [PATCH resend v5 00/16] spapr: add support for pci hotplug Michael Roth
2015-02-16 14:27 ` [Qemu-devel] [PATCH v5 01/16] docs: add sPAPR hotplug/dynamic-reconfiguration documentation Michael Roth
2015-02-16 14:27 ` [Qemu-devel] [PATCH v5 02/16] spapr_drc: initial implementation of sPAPRDRConnector device Michael Roth
2015-02-23 6:05 ` David Gibson
2015-02-16 14:27 ` [Qemu-devel] [PATCH v5 03/16] spapr_rtas: add get/set-power-level RTAS interfaces Michael Roth
2015-02-24 6:29 ` David Gibson
2015-02-16 14:27 ` [Qemu-devel] [PATCH v5 04/16] spapr_rtas: add set-indicator RTAS interface Michael Roth
2015-02-24 6:32 ` David Gibson
2015-02-16 14:27 ` [Qemu-devel] [PATCH v5 05/16] spapr_rtas: add get-sensor-state " Michael Roth
2015-02-24 6:33 ` David Gibson
2015-02-16 14:27 ` [Qemu-devel] [PATCH v5 06/16] spapr: add rtas_st_buffer_direct() helper Michael Roth
2015-02-16 14:27 ` [Qemu-devel] [PATCH v5 07/16] spapr_rtas: add ibm, configure-connector RTAS interface Michael Roth
2015-02-24 6:40 ` David Gibson
2015-02-24 20:43 ` Michael Roth
2015-02-25 0:48 ` David Gibson
2015-02-26 22:21 ` Michael Roth
2015-02-27 5:31 ` David Gibson
2015-02-27 17:37 ` Michael Roth
2015-03-02 6:25 ` David Gibson
2015-02-16 14:27 ` [Qemu-devel] [PATCH v5 08/16] spapr_events: re-use EPOW event infrastructure for hotplug events Michael Roth
2015-02-24 6:49 ` David Gibson
2015-02-24 20:04 ` Michael Roth [this message]
2015-02-25 0:54 ` David Gibson
2015-02-16 14:27 ` [Qemu-devel] [PATCH v5 09/16] spapr_events: event-scan RTAS interface Michael Roth
2015-02-24 9:11 ` David Gibson
2015-02-16 14:27 ` [Qemu-devel] [PATCH v5 10/16] spapr_drc: add spapr_drc_populate_dt() Michael Roth
2015-02-24 9:26 ` David Gibson
2015-02-24 19:21 ` Michael Roth
2015-02-26 15:56 ` Nathan Fontenot
2015-02-16 14:27 ` [Qemu-devel] [PATCH v5 11/16] spapr_pci: add dynamic-reconfiguration option for spapr-pci-host-bridge Michael Roth
2015-02-16 14:27 ` [Qemu-devel] [PATCH v5 12/16] spapr_pci: create DRConnectors for each PCI slot during PHB realize Michael Roth
2015-02-16 14:27 ` [Qemu-devel] [PATCH v5 13/16] spapr_pci: populate DRC dt entries for PHBs Michael Roth
2015-02-24 9:29 ` David Gibson
2015-02-24 18:52 ` Michael Roth
2015-02-16 14:27 ` [Qemu-devel] [PATCH v5 14/16] pci: make pci_bar useable outside pci.c Michael Roth
2015-02-24 10:20 ` David Gibson
2015-02-16 14:27 ` [Qemu-devel] [PATCH v5 15/16] spapr_pci: enable basic hotplug operations Michael Roth
2015-02-25 3:11 ` David Gibson
2015-02-25 5:17 ` Michael Roth
2015-02-25 6:40 ` Michael Roth
2015-02-26 20:06 ` Michael Roth
2015-02-27 5:14 ` David Gibson
2015-02-26 3:49 ` David Gibson
2015-02-16 14:27 ` [Qemu-devel] [PATCH v5 16/16] spapr_pci: emit hotplug add/remove events during hotplug Michael Roth
2015-02-25 3:18 ` David Gibson
-- strict thread matches above, loose matches on Subject: below --
2015-02-16 14:10 [Qemu-devel] [PATCH v5 00/16] spapr: add support for pci hotplug Michael Roth
2015-02-16 14:10 ` [Qemu-devel] [PATCH v5 08/16] spapr_events: re-use EPOW event infrastructure for hotplug events Michael Roth
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=20150224200429.31752.33720@loki \
--to=mdroth@linux.vnet.ibm.com \
--cc=agraf@suse.de \
--cc=aik@ozlabs.ru \
--cc=bharata.rao@gmail.com \
--cc=david@gibson.dropbear.id.au \
--cc=ncmike@ncultra.org \
--cc=nfont@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 an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.