From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from eggs.gnu.org ([2001:4830:134:3::10]:54952) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1YSKMz-0005KY-5U for qemu-devel@nongnu.org; Mon, 02 Mar 2015 02:02:31 -0500 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1YSKMs-0000gt-9A for qemu-devel@nongnu.org; Mon, 02 Mar 2015 02:02:25 -0500 Date: Mon, 2 Mar 2015 18:02:46 +1100 From: David Gibson Message-ID: <20150302070246.GH29409@voom.fritz.box> References: <1425006675-19976-1-git-send-email-mdroth@linux.vnet.ibm.com> <1425006675-19976-8-git-send-email-mdroth@linux.vnet.ibm.com> MIME-Version: 1.0 Content-Type: multipart/signed; micalg=pgp-sha1; protocol="application/pgp-signature"; boundary="6lXr1rPCNTf1w0X8" Content-Disposition: inline In-Reply-To: <1425006675-19976-8-git-send-email-mdroth@linux.vnet.ibm.com> Subject: Re: [Qemu-devel] [PATCH v6 07/15] spapr_rtas: add ibm, configure-connector RTAS interface List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , To: Michael Roth 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 --6lXr1rPCNTf1w0X8 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline Content-Transfer-Encoding: quoted-printable On Thu, Feb 26, 2015 at 09:11:07PM -0600, Michael Roth wrote: > This interface is used to fetch an OF device-tree nodes that describes a > newly-attached device to guest. It is called multiple times to walk the > device-tree node and fetch individual properties into a 'workarea'/buffer > provided by the guest. >=20 > The device-tree is generated by QEMU and passed to an sPAPRDRConnector du= ring > the initial hotplug operation, and the state of these RTAS calls is track= ed by > the sPAPRDRConnector. When the last of these properties is successfully > fetched, we report as special return value to the guest and transition > the device to a 'configured' state on the QEMU/DRC side. >=20 > See docs/specs/ppc-spapr-hotplug.txt for a complete description of > this interface. >=20 > Signed-off-by: Michael Roth So, actually, here's probably the best place to explain what I had in mind for changing the internal interface for this stuff. I was thinking something like this pseudocode: struct DRCCCState { void *fdt; int offset; int depth; }; rtas_configure_connector() { ... DRCCCState *ccstate; ... /* check parameters, retrieve drc */ ccstate =3D drc->ccstate; if (!ccstate) { /* Haven't started configuring yet */ ccstate =3D malloc(...); /* Retrieve the dt fragment from the backend */ ccstate->fdt =3D drck->get_dt(...); ccstate->offset =3D 0; } while (get next tag from fdt) { switch (tag) case FDT_PROPERTY: /* Translate property into rtas return values */ return SPAPR_DR_CC_RESPONSE_NEXT_PROPERTY; /* other cases ... */ } =09 /* Fall through only if we've completed streaming out the dt */ /* Tell the back end we've finished configuring */ drck->cc_completed(...); return SPAPR_DR_CC_RESPONSE_SUCCESS; } On reset, or anything else which interrupts the configuration process, just blow away drc->ccstate. > --- > hw/ppc/spapr_rtas.c | 88 +++++++++++++++++++++++++++++++++++++++++++++++= ++++++ > 1 file changed, 88 insertions(+) >=20 > diff --git a/hw/ppc/spapr_rtas.c b/hw/ppc/spapr_rtas.c > index f80beb2..31ad35f 100644 > --- a/hw/ppc/spapr_rtas.c > +++ b/hw/ppc/spapr_rtas.c > @@ -418,6 +418,92 @@ static void rtas_get_sensor_state(PowerPCCPU *cpu, s= PAPREnvironment *spapr, > rtas_st(rets, 1, entity_sense); > } > =20 > +/* configure-connector work area offsets, int32_t units for field > + * indexes, bytes for field offset/len values. > + * > + * as documented by PAPR+ v2.7, 13.5.3.5 > + */ > +#define CC_IDX_NODE_NAME_OFFSET 2 > +#define CC_IDX_PROP_NAME_OFFSET 2 > +#define CC_IDX_PROP_LEN 3 > +#define CC_IDX_PROP_DATA_OFFSET 4 > +#define CC_VAL_DATA_OFFSET ((CC_IDX_PROP_DATA_OFFSET + 1) * 4) > +#define CC_WA_LEN 4096 > + > +static void rtas_ibm_configure_connector(PowerPCCPU *cpu, > + sPAPREnvironment *spapr, > + uint32_t token, uint32_t nargs, > + target_ulong args, uint32_t nre= t, > + target_ulong rets) > +{ > + uint64_t wa_addr; > + uint64_t wa_offset; > + uint32_t drc_index; > + sPAPRDRConnector *drc; > + sPAPRDRConnectorClass *drck; > + sPAPRDRCCResponse resp; > + const struct fdt_property *prop =3D NULL; > + char *prop_name =3D NULL; > + int prop_len, rc; > + > + if (nargs !=3D 2 || nret !=3D 1) { > + rtas_st(rets, 0, RTAS_OUT_PARAM_ERROR); > + return; > + } > + > + wa_addr =3D ((uint64_t)rtas_ld(args, 1) << 32) | rtas_ld(args, 0); > + > + drc_index =3D rtas_ld(wa_addr, 0); > + drc =3D spapr_dr_connector_by_index(drc_index); > + if (!drc) { > + DPRINTF("rtas_ibm_configure_connector: invalid sensor/DRC index:= %xh\n", > + drc_index); > + rc =3D RTAS_OUT_PARAM_ERROR; > + goto out; > + } > + drck =3D SPAPR_DR_CONNECTOR_GET_CLASS(drc); > + resp =3D drck->configure_connector(drc, &prop_name, &prop, &prop_len= ); > + > + switch (resp) { > + case SPAPR_DR_CC_RESPONSE_NEXT_CHILD: > + /* provide the name of the next OF node */ > + wa_offset =3D CC_VAL_DATA_OFFSET; > + rtas_st(wa_addr, CC_IDX_NODE_NAME_OFFSET, wa_offset); > + rtas_st_buffer_direct(wa_addr + wa_offset, CC_WA_LEN - wa_offset, > + (uint8_t *)prop_name, strlen(prop_name) + = 1); > + break; > + case SPAPR_DR_CC_RESPONSE_NEXT_PROPERTY: > + /* provide the name of the next OF property */ > + wa_offset =3D CC_VAL_DATA_OFFSET; > + rtas_st(wa_addr, CC_IDX_PROP_NAME_OFFSET, wa_offset); > + rtas_st_buffer_direct(wa_addr + wa_offset, CC_WA_LEN - wa_offset, > + (uint8_t *)prop_name, strlen(prop_name) + = 1); > + > + /* provide the length and value of the OF property. data gets pl= aced > + * immediately after NULL terminator of the OF property's name s= tring > + */ > + wa_offset +=3D strlen(prop_name) + 1, > + rtas_st(wa_addr, CC_IDX_PROP_LEN, prop_len); > + rtas_st(wa_addr, CC_IDX_PROP_DATA_OFFSET, wa_offset); > + rtas_st_buffer_direct(wa_addr + wa_offset, CC_WA_LEN - wa_offset, > + (uint8_t *)((struct fdt_property *)prop)->= data, > + prop_len); > + break; > + case SPAPR_DR_CC_RESPONSE_PREV_PARENT: > + case SPAPR_DR_CC_RESPONSE_ERROR: > + case SPAPR_DR_CC_RESPONSE_SUCCESS: > + break; > + default: > + /* drck->configure_connector() should not return anything else */ > + g_assert(false); > + } > + > + rc =3D resp; > +out: > + g_free(prop_name); > + rtas_st(rets, 0, rc); > +} > + > static struct rtas_call { > const char *name; > spapr_rtas_fn fn; > @@ -551,6 +637,8 @@ static void core_rtas_register_types(void) > rtas_set_indicator); > spapr_rtas_register(RTAS_GET_SENSOR_STATE, "get-sensor-state", > rtas_get_sensor_state); > + spapr_rtas_register(RTAS_IBM_CONFIGURE_CONNECTOR, "ibm,configure-con= nector", > + rtas_ibm_configure_connector); > } > =20 > type_init(core_rtas_register_types) --=20 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 --6lXr1rPCNTf1w0X8 Content-Type: application/pgp-signature -----BEGIN PGP SIGNATURE----- Version: GnuPG v1 iQIcBAEBAgAGBQJU9AsWAAoJEGw4ysog2bOS6k0P/22jR6gVw0tY5mv7MZy8vEG5 jqQ0vPONcdq9TiAtqHvXPm21HKP9C4LlfYYbnPJY2FDadqG2klKncPil5+Zlv2X5 cGaWaILiyiZ2WDgoIlib/ZO51+OUI6zaHBQXwuGoQl1kKJiZtvuVjgvuOCHmrfCe DQqQZ+0VcZThGiDEFP+WX85V57eZTFAXkWmfOwonnjkjcPIsepG8lLH4k4FdCLkq L5CevuPCFgucOIvjW/WMdFydwEHEbIlHl4d/gWHuqbouKbrjEXa3IaZtp85h050N XzFfulRs85QskRuQ9RUj7TNJCBJO4g9FCnZLA9GTzWvwivBDCGxzR+s16lfbRsMs sCOZ8sjzW6HgKIn6GV4cWGqab11owxJBpdBtVJB4haSD+tdi+4IqzfYZCjw48c7K PWTDcehoCXoZBI/UQmh2XfXPIa7SBsPBIKATsTfa3p6MJNFjzHEyrErH2K/EQgK2 VOMY5FkdLoZ10YNscaoiKOtd5rhWvLtymIRM7jCI/EJGU93MnVix/wWPdJhdwB26 uGBYXXkF4VJldEjL/FqFdsAFiczLIY2SNQEjlzvr45ad9bmg38z8umFiUlU0jVvL /k1HpBZj09YC1RzOkOGxEFIvpCkHpzI1BvI3LFk0uRY2KxztxD6HMKx9tlKFSoAk uByjoM0VGSvOMC0WRAJv =6p7B -----END PGP SIGNATURE----- --6lXr1rPCNTf1w0X8--