From: Michael Roth <mdroth@linux.vnet.ibm.com>
To: qemu-devel@nongnu.org
Cc: aik@ozlabs.ru, agraf@suse.de, ncmike@ncultra.org,
paulus@samba.org, tyreld@linux.vnet.ibm.com,
nfont@linux.vnet.ibm.com, qemu-ppc@nongnu.org
Subject: [Qemu-devel] [PATCH v2 02/14] spapr_pci: populate DRC dt entries for PHBs
Date: Thu, 5 Dec 2013 16:32:53 -0600 [thread overview]
Message-ID: <1386282785-466-3-git-send-email-mdroth@linux.vnet.ibm.com> (raw)
In-Reply-To: <1386282785-466-1-git-send-email-mdroth@linux.vnet.ibm.com>
Reserve 32 entries of type PCI in each PHB's initial FDT. This
advertises to guests that each PHB is DR-capable device with
physical hotpluggable slots. This is necessary for allowing
hotplugging of devices to it later via bus rescan or guest rpaphp
hotplug module.
Each entry is assigned a name of "Slot <<bus_idx>*32 +1>",
advertised as a hotpluggable PCI slot, and assigned to power domain
-1 to indicate to the guest that power management is handled by the
hardware.
This models a DR-capable PCI expansion device attached to a host/lpar
via a single PHB with 32 physical hotpluggable slots (as opposed to a
virtual bridge device with external management console). Hotplug will
be handled by the guest via bus rescan or the rpaphp hotplug module.
Signed-off-by: Michael Roth <mdroth@linux.vnet.ibm.com>
---
hw/ppc/spapr.c | 3 +-
hw/ppc/spapr_pci.c | 102 +++++++++++++++++++++++++++++++++++++++++++
include/hw/pci-host/spapr.h | 1 +
3 files changed, 105 insertions(+), 1 deletion(-)
diff --git a/hw/ppc/spapr.c b/hw/ppc/spapr.c
index ec3ba43..0607559 100644
--- a/hw/ppc/spapr.c
+++ b/hw/ppc/spapr.c
@@ -739,7 +739,8 @@ static void spapr_finalize_fdt(sPAPREnvironment *spapr,
QLIST_FOREACH(phb, &spapr->phbs, list) {
drc_entry = spapr_add_phb_to_drc_table(phb->buid, 2 /* Unusable */);
g_assert(drc_entry);
- ret = spapr_populate_pci_dt(phb, PHANDLE_XICP, fdt);
+ ret = spapr_populate_pci_dt(phb, PHANDLE_XICP, drc_entry->drc_index,
+ fdt);
}
if (ret < 0) {
diff --git a/hw/ppc/spapr_pci.c b/hw/ppc/spapr_pci.c
index 7763149..7568a03 100644
--- a/hw/ppc/spapr_pci.c
+++ b/hw/ppc/spapr_pci.c
@@ -759,8 +759,104 @@ PCIHostState *spapr_create_phb(sPAPREnvironment *spapr, int index)
#define b_fff(x) b_x((x), 8, 3) /* function number */
#define b_rrrrrrrr(x) b_x((x), 0, 8) /* register number */
+static void spapr_create_drc_phb_dt_entries(void *fdt, int bus_off, int phb_index)
+{
+ char char_buf[1024];
+ uint32_t int_buf[SPAPR_DRC_PHB_SLOT_MAX + 1];
+ uint32_t *entries;
+ int i, ret, offset;
+
+ /* ibm,drc-indexes */
+ memset(int_buf, 0 , sizeof(int_buf));
+ int_buf[0] = SPAPR_DRC_PHB_SLOT_MAX;
+
+ for (i = 1; i <= SPAPR_DRC_PHB_SLOT_MAX; i++) {
+ int_buf[i] = SPAPR_DRC_DEV_ID_BASE + (phb_index << 8) + ((i - 1) << 3);
+ }
+
+ ret = fdt_setprop(fdt, bus_off, "ibm,drc-indexes", int_buf,
+ sizeof(int_buf));
+ if (ret) {
+ fprintf(stderr, "error adding 'ibm,drc-indexes' field for PHB FDT");
+ }
+
+ /* ibm,drc-power-domains */
+ memset(int_buf, 0, sizeof(int_buf));
+ int_buf[0] = SPAPR_DRC_PHB_SLOT_MAX;
+
+ for (i = 1; i <= SPAPR_DRC_PHB_SLOT_MAX; i++) {
+ int_buf[i] = 0xffffffff;
+ }
+
+ ret = fdt_setprop(fdt, bus_off, "ibm,drc-power-domains", int_buf,
+ sizeof(int_buf));
+ if (ret) {
+ fprintf(stderr,
+ "error adding 'ibm,drc-power-domains' field for PHB FDT");
+ }
+
+ /* ibm,drc-names */
+ memset(char_buf, 0, sizeof(char_buf));
+ entries = (uint32_t *)&char_buf[0];
+ *entries = SPAPR_DRC_PHB_SLOT_MAX;
+ offset = sizeof(*entries);
+
+ for (i = 1; i <= SPAPR_DRC_PHB_SLOT_MAX; i++) {
+ offset += sprintf(char_buf + offset, "Slot %d",
+ (phb_index * SPAPR_DRC_PHB_SLOT_MAX) + i - 1);
+ char_buf[offset++] = '\0';
+ }
+
+ ret = fdt_setprop(fdt, bus_off, "ibm,drc-names", char_buf, offset);
+ if (ret) {
+ fprintf(stderr, "error adding 'ibm,drc-names' field for PHB FDT");
+ }
+
+ /* ibm,drc-types */
+ memset(char_buf, 0, sizeof(char_buf));
+ entries = (uint32_t *)&char_buf[0];
+ *entries = SPAPR_DRC_PHB_SLOT_MAX;
+ offset = sizeof(*entries);
+
+ for (i = 0; i < SPAPR_DRC_PHB_SLOT_MAX; i++) {
+ offset += sprintf(char_buf + offset, "28");
+ char_buf[offset++] = '\0';
+ }
+
+ ret = fdt_setprop(fdt, bus_off, "ibm,drc-types", char_buf, offset);
+ if (ret) {
+ fprintf(stderr, "error adding 'ibm,drc-types' field for PHB FDT");
+ }
+
+ /* we want the initial indicator state to be 0 - "empty", when we
+ * hot-plug an adaptor in the slot, we need to set the indicator
+ * to 1 - "present."
+ */
+
+ /* ibm,indicator-9003 */
+ memset(int_buf, 0, sizeof(int_buf));
+ int_buf[0] = SPAPR_DRC_PHB_SLOT_MAX;
+
+ ret = fdt_setprop(fdt, bus_off, "ibm,indicator-9003", int_buf,
+ sizeof(int_buf));
+ if (ret) {
+ fprintf(stderr, "error adding 'ibm,indicator-9003' field for PHB FDT");
+ }
+
+ /* ibm,sensor-9003 */
+ memset(int_buf, 0, sizeof(int_buf));
+ int_buf[0] = SPAPR_DRC_PHB_SLOT_MAX;
+
+ ret = fdt_setprop(fdt, bus_off, "ibm,sensor-9003", int_buf,
+ sizeof(int_buf));
+ if (ret) {
+ fprintf(stderr, "error adding 'ibm,sensor-9003' field for PHB FDT");
+ }
+}
+
int spapr_populate_pci_dt(sPAPRPHBState *phb,
uint32_t xics_phandle,
+ uint32_t drc_index,
void *fdt)
{
int bus_off, i, j;
@@ -842,6 +938,12 @@ int spapr_populate_pci_dt(sPAPRPHBState *phb,
phb->dma_liobn, phb->dma_window_start,
phb->dma_window_size);
+ spapr_create_drc_phb_dt_entries(fdt, bus_off, phb->index);
+ if (drc_index) {
+ _FDT(fdt_setprop(fdt, bus_off, "ibm,my-drc-index", &drc_index,
+ sizeof(drc_index)));
+ }
+
return 0;
}
diff --git a/include/hw/pci-host/spapr.h b/include/hw/pci-host/spapr.h
index 970b4a9..43d19a5 100644
--- a/include/hw/pci-host/spapr.h
+++ b/include/hw/pci-host/spapr.h
@@ -86,6 +86,7 @@ PCIHostState *spapr_create_phb(sPAPREnvironment *spapr, int index);
int spapr_populate_pci_dt(sPAPRPHBState *phb,
uint32_t xics_phandle,
+ uint32_t drc_index,
void *fdt);
void spapr_pci_msi_init(sPAPREnvironment *spapr, hwaddr addr);
--
1.7.9.5
next prev parent reply other threads:[~2013-12-05 22:33 UTC|newest]
Thread overview: 39+ messages / expand[flat|nested] mbox.gz Atom feed top
2013-12-05 22:32 [Qemu-devel] [PATCH v2 00/14] spapr: add support for pci hotplug Michael Roth
2013-12-05 22:32 ` [Qemu-devel] [PATCH v2 01/14] spapr: populate DRC entries for root dt node Michael Roth
2013-12-16 2:59 ` Alexey Kardashevskiy
2013-12-16 4:54 ` Alexey Kardashevskiy
2014-01-16 20:51 ` Michael Roth
2014-01-20 2:58 ` Alexey Kardashevskiy
2014-01-20 14:12 ` Mike Day
2014-01-20 17:24 ` Michael Roth
2014-01-20 17:59 ` Mike Day
2014-01-20 18:51 ` Michael Roth
2013-12-05 22:32 ` Michael Roth [this message]
2013-12-05 22:32 ` [Qemu-devel] [PATCH v2 03/14] spapr: add helper to retrieve a PHB/device DrcEntry Michael Roth
2013-12-05 22:32 ` [Qemu-devel] [PATCH v2 04/14] spapr_pci: add set-indicator RTAS interface Michael Roth
2013-12-16 4:26 ` Alexey Kardashevskiy
2014-01-16 20:54 ` Michael Roth
2013-12-05 22:32 ` [Qemu-devel] [PATCH v2 05/14] spapr_pci: add get/set-power-level RTAS interfaces Michael Roth
2013-12-16 3:09 ` Alexey Kardashevskiy
2014-01-16 21:01 ` Michael Roth
2013-12-05 22:32 ` [Qemu-devel] [PATCH v2 06/14] spapr_pci: add get-sensor-state RTAS interface Michael Roth
2013-12-05 22:32 ` [Qemu-devel] [PATCH v2 07/14] spapr_pci: add ibm, configure-connector " Michael Roth
2013-12-05 22:32 ` [Qemu-devel] [PATCH v2 08/14] memory: add memory_region_find_subregion Michael Roth
2013-12-05 22:33 ` [Qemu-devel] [PATCH v2 09/14] pci: make pci_bar useable outside pci.c Michael Roth
2013-12-05 22:33 ` [Qemu-devel] [PATCH v2 10/14] pci: allow 0 address for PCI IO regions Michael Roth
2013-12-05 23:33 ` Peter Maydell
2013-12-10 21:42 ` Michael Roth
2013-12-10 22:14 ` Peter Maydell
2013-12-10 23:03 ` [Qemu-devel] [Qemu-ppc] " Benjamin Herrenschmidt
2013-12-12 14:34 ` [Qemu-devel] " Michael S. Tsirkin
2013-12-05 22:33 ` [Qemu-devel] [PATCH v2 11/14] spapr_pci: enable basic hotplug operations Michael Roth
2013-12-16 4:36 ` Alexey Kardashevskiy
2014-01-16 21:22 ` Michael Roth
2013-12-05 22:33 ` [Qemu-devel] [PATCH v2 12/14] spapr_events: re-use EPOW event infrastructure for hotplug events Michael Roth
2013-12-16 5:05 ` Alexey Kardashevskiy
2014-01-16 21:32 ` Michael Roth
2013-12-05 22:33 ` [Qemu-devel] [PATCH v2 13/14] spapr_events: event-scan RTAS interface Michael Roth
2013-12-16 4:57 ` Alexey Kardashevskiy
2013-12-05 22:33 ` [Qemu-devel] [PATCH v2 14/14] spapr_pci: emit hotplug add/remove events during hotplug Michael Roth
2013-12-16 5:06 ` Alexey Kardashevskiy
2014-01-10 8:29 ` [Qemu-devel] [PATCH v2 00/14] spapr: add support for pci hotplug Alexey Kardashevskiy
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=1386282785-466-3-git-send-email-mdroth@linux.vnet.ibm.com \
--to=mdroth@linux.vnet.ibm.com \
--cc=agraf@suse.de \
--cc=aik@ozlabs.ru \
--cc=ncmike@ncultra.org \
--cc=nfont@linux.vnet.ibm.com \
--cc=paulus@samba.org \
--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).