Quoting David Gibson (2017-06-06 03:32:19)
> In theory the RTAS set-indicator call can be used for a number of
> "indicators" defined by PAPR.  In practice the only ones we're ever likely
> to implement are those used for Dynamic Reconfiguration (i.e. hotplug).
> Because of this, the current implementation determines the associated DRC
> object, before dispatching based on the type of indicator.
> 
> However, this means we also need a check that we're dealing with a DR
> related indicator at all, which duplicates some of the logic from the
> switch further down.
> 
> Even though it means a bit of code duplication, things work out cleaner if
> we delegate the DRC lookup to the individual indicator type functions -
> and it also allows some further cleanups.
> 
> While we're there, remove references to "sensor", a copy/paste artefact
> from the related, but distinct "get-sensor" call.
> 
> Signed-off-by: David Gibson <da...@gibson.dropbear.id.au>

Reviewed-by: Michael Roth <mdr...@linux.vnet.ibm.com>

> ---
>  hw/ppc/spapr_drc.c  | 84 
> ++++++++++++++++++++++++++++-------------------------
>  hw/ppc/trace-events |  2 --
>  2 files changed, 44 insertions(+), 42 deletions(-)
> 
> diff --git a/hw/ppc/spapr_drc.c b/hw/ppc/spapr_drc.c
> index 1fc51c9..6c2fa93 100644
> --- a/hw/ppc/spapr_drc.c
> +++ b/hw/ppc/spapr_drc.c
> @@ -869,74 +869,78 @@ out:
>   * RTAS calls
>   */
> 
> -static bool sensor_type_is_dr(uint32_t sensor_type)
> +static uint32_t rtas_set_isolation_state(uint32_t idx, uint32_t state)
>  {
> -    switch (sensor_type) {
> -    case RTAS_SENSOR_TYPE_ISOLATION_STATE:
> -    case RTAS_SENSOR_TYPE_DR:
> -    case RTAS_SENSOR_TYPE_ALLOCATION_STATE:
> -        return true;
> +    sPAPRDRConnector *drc = spapr_drc_by_index(idx);
> +    sPAPRDRConnectorClass *drck;
> +
> +    if (!drc) {
> +        return RTAS_OUT_PARAM_ERROR;
>      }
> 
> -    return false;
> +    drck = SPAPR_DR_CONNECTOR_GET_CLASS(drc);
> +    return drck->set_isolation_state(drc, state);
>  }
> 
> -static void rtas_set_indicator(PowerPCCPU *cpu, sPAPRMachineState *spapr,
> -                               uint32_t token, uint32_t nargs,
> -                               target_ulong args, uint32_t nret,
> -                               target_ulong rets)
> +static uint32_t rtas_set_allocation_state(uint32_t idx, uint32_t state)
>  {
> -    uint32_t sensor_type;
> -    uint32_t sensor_index;
> -    uint32_t sensor_state;
> -    uint32_t ret = RTAS_OUT_SUCCESS;
> -    sPAPRDRConnector *drc;
> +    sPAPRDRConnector *drc = spapr_drc_by_index(idx);
>      sPAPRDRConnectorClass *drck;
> 
> -    if (nargs != 3 || nret != 1) {
> -        ret = RTAS_OUT_PARAM_ERROR;
> -        goto out;
> +    if (!drc) {
> +        return RTAS_OUT_PARAM_ERROR;
>      }
> 
> -    sensor_type = rtas_ld(args, 0);
> -    sensor_index = rtas_ld(args, 1);
> -    sensor_state = rtas_ld(args, 2);
> +    drck = SPAPR_DR_CONNECTOR_GET_CLASS(drc);
> +    return drck->set_allocation_state(drc, state);
> +}
> 
> -    if (!sensor_type_is_dr(sensor_type)) {
> -        goto out_unimplemented;
> -    }
> +static uint32_t rtas_set_indicator_state(uint32_t idx, uint32_t state)
> +{
> +    sPAPRDRConnector *drc = spapr_drc_by_index(idx);
> +    sPAPRDRConnectorClass *drck;
> 
> -    /* if this is a DR sensor we can assume sensor_index == drc_index */
> -    drc = spapr_drc_by_index(sensor_index);
>      if (!drc) {
> -        trace_spapr_rtas_set_indicator_invalid(sensor_index);
> +        return RTAS_OUT_PARAM_ERROR;
> +    }
> +
> +    drck = SPAPR_DR_CONNECTOR_GET_CLASS(drc);
> +    return drck->set_indicator_state(drc, state);
> +}
> +
> +static void rtas_set_indicator(PowerPCCPU *cpu, sPAPRMachineState *spapr,
> +                               uint32_t token,
> +                               uint32_t nargs, target_ulong args,
> +                               uint32_t nret, target_ulong rets)
> +{
> +    uint32_t type, idx, state;
> +    uint32_t ret = RTAS_OUT_SUCCESS;
> +
> +    if (nargs != 3 || nret != 1) {
>          ret = RTAS_OUT_PARAM_ERROR;
>          goto out;
>      }
> -    drck = SPAPR_DR_CONNECTOR_GET_CLASS(drc);
> 
> -    switch (sensor_type) {
> +    type = rtas_ld(args, 0);
> +    idx = rtas_ld(args, 1);
> +    state = rtas_ld(args, 2);
> +
> +    switch (type) {
>      case RTAS_SENSOR_TYPE_ISOLATION_STATE:
> -        ret = drck->set_isolation_state(drc, sensor_state);
> +        ret = rtas_set_isolation_state(idx, state);
>          break;
>      case RTAS_SENSOR_TYPE_DR:
> -        ret = drck->set_indicator_state(drc, sensor_state);
> +        ret = rtas_set_indicator_state(idx, state);
>          break;
>      case RTAS_SENSOR_TYPE_ALLOCATION_STATE:
> -        ret = drck->set_allocation_state(drc, sensor_state);
> +        ret = rtas_set_allocation_state(idx, state);
>          break;
>      default:
> -        goto out_unimplemented;
> +        ret = RTAS_OUT_NOT_SUPPORTED;
>      }
> 
>  out:
>      rtas_st(rets, 0, ret);
> -    return;
> -
> -out_unimplemented:
> -    /* currently only DR-related sensors are implemented */
> -    trace_spapr_rtas_set_indicator_not_supported(sensor_index, sensor_type);
> -    rtas_st(rets, 0, RTAS_OUT_NOT_SUPPORTED);
>  }
> 
>  static void rtas_get_sensor_state(PowerPCCPU *cpu, sPAPRMachineState *spapr,
> diff --git a/hw/ppc/trace-events b/hw/ppc/trace-events
> index 4979397..581fa85 100644
> --- a/hw/ppc/trace-events
> +++ b/hw/ppc/trace-events
> @@ -60,8 +60,6 @@ spapr_ovec_parse_vector(int vector, int byte, uint16_t 
> vec_len, uint8_t entry) "
>  spapr_ovec_populate_dt(int byte, uint16_t vec_len, uint8_t entry) "encoding 
> guest vector byte %3d / %3d: 0x%.2x"
> 
>  # hw/ppc/spapr_rtas.c
> -spapr_rtas_set_indicator_invalid(uint32_t index) "sensor index: 0x%"PRIx32
> -spapr_rtas_set_indicator_not_supported(uint32_t index, uint32_t type) 
> "sensor index: 0x%"PRIx32", type: %"PRIu32
>  spapr_rtas_get_sensor_state_not_supported(uint32_t index, uint32_t type) 
> "sensor index: 0x%"PRIx32", type: %"PRIu32
>  spapr_rtas_get_sensor_state_invalid(uint32_t index) "sensor index: 0x%"PRIx32
>  spapr_rtas_ibm_configure_connector_invalid(uint32_t index) "DRC index: 
> 0x%"PRIx32
> -- 
> 2.9.4
> 


Reply via email to