From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from eggs.gnu.org ([2001:4830:134:3::10]:58587) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1YC0O9-0004u7-Kd for qemu-devel@nongnu.org; Fri, 16 Jan 2015 01:28:11 -0500 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1YC0O4-0005CR-9S for qemu-devel@nongnu.org; Fri, 16 Jan 2015 01:28:09 -0500 Date: Fri, 16 Jan 2015 17:25:58 +1100 From: David Gibson Message-ID: <20150116062558.GL5297@voom.fritz.box> References: <1419337831-16552-1-git-send-email-mdroth@linux.vnet.ibm.com> <1419337831-16552-5-git-send-email-mdroth@linux.vnet.ibm.com> MIME-Version: 1.0 Content-Type: multipart/signed; micalg=pgp-sha1; protocol="application/pgp-signature"; boundary="QqzFzR/RUlLahzby" Content-Disposition: inline In-Reply-To: <1419337831-16552-5-git-send-email-mdroth@linux.vnet.ibm.com> Subject: Re: [Qemu-devel] [PATCH v4 04/17] spapr_rtas: add set-indicator 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 --QqzFzR/RUlLahzby Content-Type: text/plain; charset=us-ascii Content-Disposition: inline Content-Transfer-Encoding: quoted-printable On Tue, Dec 23, 2014 at 06:30:18AM -0600, Michael Roth wrote: > From: Mike Day >=20 > Signed-off-by: Mike Day > Signed-off-by: Michael Roth > --- > hw/ppc/spapr_rtas.c | 80 +++++++++++++++++++++++++++++++++++++++++++++++= ++++++ > 1 file changed, 80 insertions(+) >=20 > diff --git a/hw/ppc/spapr_rtas.c b/hw/ppc/spapr_rtas.c > index a2fb533..6aa325f 100644 > --- a/hw/ppc/spapr_rtas.c > +++ b/hw/ppc/spapr_rtas.c > @@ -35,6 +35,18 @@ > #include "qapi-event.h" > =20 > #include > +#include "hw/ppc/spapr_drc.h" > + > +/* #define DEBUG_SPAPR */ > + > +#ifdef DEBUG_SPAPR > +#define DPRINTF(fmt, ...) \ > + do { fprintf(stderr, fmt, ## __VA_ARGS__); } while (0) > +#else > +#define DPRINTF(fmt, ...) \ > + do { } while (0) > +#endif > + > =20 > static void rtas_display_character(PowerPCCPU *cpu, sPAPREnvironment *sp= apr, > uint32_t token, uint32_t nargs, > @@ -311,6 +323,72 @@ static void rtas_get_power_level(PowerPCCPU *cpu, sP= APREnvironment *spapr, > rtas_st(rets, 1, 100); > } > =20 > +/* > + * indicator/sensor types > + * as defined by PAPR+ 2.7 7.3.5.4, Table 41 > + * > + * NOTE: currently only DR-related sensors are implemented here > + */ > +#define RTAS_SENSOR_TYPE_ISOLATION_STATE 9001 > +#define RTAS_SENSOR_TYPE_DR 9002 > +#define RTAS_SENSOR_TYPE_ALLOCATION_STATE 9003 > +#define RTAS_SENSOR_TYPE_ENTITY_SENSE RTAS_SENSOR_TYPE_ALLOCATION_STATE These should probably go in a header. > +static bool sensor_type_is_dr(uint32_t sensor_type) > +{ > + switch (sensor_type) { > + case RTAS_SENSOR_TYPE_ISOLATION_STATE: > + case RTAS_SENSOR_TYPE_DR: > + case RTAS_SENSOR_TYPE_ALLOCATION_STATE: > + return true; > + } > + > + return false; > +} > + > +static void rtas_set_indicator(PowerPCCPU *cpu, sPAPREnvironment *spapr, > + uint32_t token, uint32_t nargs, > + target_ulong args, uint32_t nret, > + target_ulong rets) > +{ > + uint32_t sensor_type =3D rtas_ld(args, 0); > + uint32_t sensor_index =3D rtas_ld(args, 1); > + uint32_t sensor_state =3D rtas_ld(args, 2); You must validate nargs anr nret before reading the RTAS parameters. > + sPAPRDRConnector *drc; > + sPAPRDRConnectorClass *drck; > + > + if (sensor_type_is_dr(sensor_type)) { > + /* if this is a DR sensor we can assume sensor_index =3D=3D drc_= index */ > + drc =3D spapr_dr_connector_by_index(sensor_index); > + drck =3D SPAPR_DR_CONNECTOR_GET_CLASS(drc); I'd reverse the sense of the if, and move these initializations after the if. That makes it more obvious that these can't be uninitialized when you use them below. > + } else { > + /* currently only DR-related sensors are implemented */ > + goto out_unimplemented; > + } > + > + switch (sensor_type) { > + case RTAS_SENSOR_TYPE_ISOLATION_STATE: > + drck->set_isolation_state(drc, sensor_state); > + break; > + case RTAS_SENSOR_TYPE_DR: > + drck->set_indicator_state(drc, sensor_state); > + break; > + case RTAS_SENSOR_TYPE_ALLOCATION_STATE: > + drck->set_allocation_state(drc, sensor_state); > + break; > + default: > + goto out_unimplemented; > + } > + > + rtas_st(rets, 0, RTAS_OUT_SUCCESS); > + return; > + > +out_unimplemented: > + DPRINTF("rtas_set_indicator: sensor/indicator not implemented: %d\n", > + sensor_type); > + rtas_st(rets, 0, RTAS_OUT_PARAM_ERROR); > +} > + > static struct rtas_call { > const char *name; > spapr_rtas_fn fn; > @@ -444,6 +522,8 @@ static void core_rtas_register_types(void) > rtas_set_power_level); > spapr_rtas_register(RTAS_GET_POWER_LEVEL, "get-power-level", > rtas_get_power_level); > + spapr_rtas_register(RTAS_SET_INDICATOR, "set-indicator", > + rtas_set_indicator); > } > =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 --QqzFzR/RUlLahzby Content-Type: application/pgp-signature -----BEGIN PGP SIGNATURE----- Version: GnuPG v1 iQIcBAEBAgAGBQJUuK72AAoJEGw4ysog2bOSE38QAJFU0v5uqcZas2v2Tgnat+Rv q33KtToUZjHV1SsZRzL5L1ElP3L9vrNWt9dvHyBenKoH6R9KBzCzCVPCsCreZYuu lSnMyNwwXhsC4iHzGRNgY+P5zMxQS8zwN0p+Pawb/pUKNW+Q2DSnraLuvVifgQ8D UbmGF9GcIHZ6Hyd+f04Fp1j008nJn7n1Mt21QEnz3EQ8oLIwOdXjq7K8uEfVrqug pszjSyRuZZHYpEIpSHIqCLxnACaa9v5uyFMHmBZqPQRQWPE827X3bFTb860TaxJe h+sKS/H3zXjrvThQfZTn91EjI1Jp4ZJGk9kxsP7v+MT/VaiJWPrNCzjPblFQaVmx PZ+wBlk+kwfFVuzvtrxld7c+n3C4iPSQrOrrJ4NxK+A1bkjWvHXLXnqGJEOJz6cE RsNtJiaNohfYJGOEimQmr2JeBZbD3V24FFix9YCzH/O3tbwVtIP2BldT4O+njjZF bG0Fu4ZwDq+qBp5CjbqijejvJ9C9TXEwHobGsDD/uXPqGGyQg7oTYOOcW0e4UiQQ Q3Eo1W7JEa1IdVsIxR2CJEgb8tBlhvUTFEZbC/6NQDvLpD7AaegXe/SOudxGldT4 O+EyvF8ZLx6kEK0SV3r6PS7HylOQuncF9g5K9zXOv+ABILNqpzpjJ/Ff0S/8aWt7 y3/46MktvfsKLZGv1O32 =Seow -----END PGP SIGNATURE----- --QqzFzR/RUlLahzby--