On Mon, Nov 2, 2026 at 1:49 PM Markus Armbruster <[email protected]> wrote:
>
> This gives properties "x-fault-inject-tag" and "x-fault-inject-mode" a
> generated type_info with a valid masked_name, so it appears in
> query-qmp-schema introspection and the qapi-type field of
> qom-list-properties output.
>
> The conversion is trivial for ufs_prop_get_fault_inject_tag.  For
> ufs_prop_get_fault_inject_tag, we need to conver UfsFaultInjectMode to
> a QAPI enum.
>
> Signed-off-by: Markus Armbruster <[email protected]>

Reviewed-by: Marc-André Lureau <[email protected]>


> ---
> Fixup needed for commit c821f2f69f1 (hw/ufs: Add experimental fault
> injection properties for holding requests)
>
>  qapi/common.json | 30 ++++++++++++++++++++++++++++++
>  hw/ufs/ufs.h     | 34 ----------------------------------
>  hw/ufs/ufs.c     | 15 +++------------
>  3 files changed, 33 insertions(+), 46 deletions(-)
>
> diff --git a/qapi/common.json b/qapi/common.json
> index 68b649ecf2..84f12c133a 100644
> --- a/qapi/common.json
> +++ b/qapi/common.json
> @@ -245,3 +245,33 @@
>      'tm_hour': 'int32',
>      'tm_min': 'int32',
>      'tm_sec': 'int32' } }
> +
> +##
> +# @UfsFaultInjectMode:
> +#     Fault injection modes for x-fault-inject-mode property.
> +#     Controls how the held transfer request and subsequent Task
> +#     Management Request (TMR) are resolved by the controller:
> +#
> +# @abort-success: TMR ABORT_TASK aborts the held request, clears its
> +#     state, and returns SUCCESS (COMPL).
> +#
> +# @abort-failed: TMR ABORT_TASK returns TASK_MANAGEMENT_FUNC_FAILED,
> +#     forcing host driver to escalate to Host Reset.
> +#
> +# @in-transition: TMR QUERY_TASK releases the held request to execute
> +#     normally through the SCSI layer and returns the real task status
> +#     (SUCCEEDED while the command is still in flight); ABORT_TASK
> +#     cancels the held request and returns FUNCTION_COMPLETE.
> +#
> +# @timeout: TMR ABORT_TASK does not complete or clear doorbell,
> +#     triggering hardware-level TMR timeout.
> +#
> +# @ssu-timeout: Intercepts SCSI START_STOP (0x1B) commands targeting
> +#     the UFS Device WLUN when x-fault-inject-tag is armed.
> +#
> +# Since: 11.2
> +##
> +{ 'enum': 'UfsFaultInjectMode',
> +  'prefix': 'UFS_FAULT_INJECT',
> +  'data': [ 'abort-success', 'abort-failed', 'in-transition', 'timeout',
> +            'ssu-timeout' ] }
> diff --git a/hw/ufs/ufs.h b/hw/ufs/ufs.h
> index 7ddc540546..0014978322 100644
> --- a/hw/ufs/ufs.h
> +++ b/hw/ufs/ufs.h
> @@ -90,39 +90,6 @@ typedef struct UfsLu {
>      UfsScsiOp scsi_op;
>  } UfsLu;
>
> -/*
> - * Fault injection modes for x-fault-inject-mode property.
> - * Controls how the held transfer request and subsequent Task Management
> - * Request (TMR) are resolved by the controller:
> - *
> - * UFS_FAULT_INJECT_ABORT_SUCCESS: TMR ABORT_TASK aborts the held request,
> - *                                 clears its state, and returns SUCCESS
> - *                                 (COMPL).
> - * UFS_FAULT_INJECT_ABORT_FAILED:  TMR ABORT_TASK returns
> - *                                 TASK_MANAGEMENT_FUNC_FAILED, forcing host
> - *                                 driver to escalate to Host Reset.
> - * UFS_FAULT_INJECT_IN_TRANSITION: TMR QUERY_TASK releases the held request 
> to
> - *                                 execute normally through the SCSI layer 
> and
> - *                                 returns the real task status (SUCCEEDED 
> while
> - *                                 the command is still in flight);
> - *                                 ABORT_TASK cancels the held request and
> - *                                 returns FUNCTION_COMPLETE.
> - * UFS_FAULT_INJECT_TIMEOUT:       TMR ABORT_TASK does not complete or clear
> - *                                 doorbell, triggering hardware-level TMR
> - *                                 timeout.
> - * UFS_FAULT_INJECT_SSU_TIMEOUT:   Intercepts SCSI START_STOP (0x1B) commands
> - *                                 targeting the UFS Device WLUN when
> - *                                 x-fault-inject-tag is armed.
> - */
> -typedef enum UfsFaultInjectMode {
> -    UFS_FAULT_INJECT_ABORT_SUCCESS = 0,
> -    UFS_FAULT_INJECT_ABORT_FAILED,
> -    UFS_FAULT_INJECT_IN_TRANSITION,
> -    UFS_FAULT_INJECT_TIMEOUT,
> -    UFS_FAULT_INJECT_SSU_TIMEOUT,
> -    UFS_FAULT_INJECT_MODE_MAX,
> -} UfsFaultInjectMode;
> -
>  /*
>   * Sentinel values for x-fault-inject-tag property.
>   * Task Tags in UFS are 8-bit (0..255). Values >= 256 are reserved as
> @@ -375,6 +342,5 @@ void ufs_unrealize(UfsHc *u);
>
>  extern const PropertyInfo ufs_prop_fault_inject_tag;
>  extern const PropertyInfo ufs_prop_fault_inject_mode;
> -extern const QEnumLookup UfsFaultInjectMode_lookup;
>
>  #endif /* HW_UFS_UFS_H */
> diff --git a/hw/ufs/ufs.c b/hw/ufs/ufs.c
> index f8da7c9554..3de67831ea 100644
> --- a/hw/ufs/ufs.c
> +++ b/hw/ufs/ufs.c
> @@ -15,6 +15,7 @@
>
>  #include "qemu/osdep.h"
>  #include "qapi/error.h"
> +#include "qapi/qapi-type-infos-common.h"
>  #include "qapi/visitor.h"
>  #include "scsi/constants.h"
>  #include "hw/core/irq.h"
> @@ -3234,17 +3235,6 @@ static void ufs_init_hc(UfsHc *u)
>      ufs_fault_inject_init(u);
>  }
>
> -const QEnumLookup UfsFaultInjectMode_lookup = {
> -    .array = (const char *const[]) {
> -        [UFS_FAULT_INJECT_ABORT_SUCCESS] = "abort-success",
> -        [UFS_FAULT_INJECT_ABORT_FAILED] = "abort-failed",
> -        [UFS_FAULT_INJECT_IN_TRANSITION] = "in-transition",
> -        [UFS_FAULT_INJECT_TIMEOUT] = "timeout",
> -        [UFS_FAULT_INJECT_SSU_TIMEOUT] = "ssu-timeout",
> -    },
> -    .size = UFS_FAULT_INJECT_MODE_MAX,
> -};
> -
>  static void ufs_prop_get_fault_inject_tag(Object *obj, Visitor *v,
>                                            const char *name, void *opaque,
>                                            Error **errp)
> @@ -3300,6 +3290,7 @@ static void 
> ufs_prop_set_default_fault_inject_tag(ObjectProperty *op,
>
>  const PropertyInfo ufs_prop_fault_inject_tag = {
>      .type = "uint32",
> +    .qapi_type = &uint32_type_info,
>      .description = "Task tag to hold for fault injection",
>      .get = ufs_prop_get_fault_inject_tag,
>      .set = ufs_prop_set_fault_inject_tag,
> @@ -3309,9 +3300,9 @@ const PropertyInfo ufs_prop_fault_inject_tag = {
>
>  const PropertyInfo ufs_prop_fault_inject_mode = {
>      .type = "UfsFaultInjectMode",
> +    .qapi_type = &UfsFaultInjectMode_type_info,
>      .description = "Fault injection mode: abort-success, abort-failed, "
>                     "in-transition, timeout, ssu-timeout",
> -    .enum_table = &UfsFaultInjectMode_lookup,
>      .get = qdev_propinfo_get_enum,
>      .set = qdev_propinfo_set_enum,
>      .set_default_value = qdev_propinfo_set_default_value_enum,
> --
> 2.55.0
>


Reply via email to