Reviewed-by: Glenn Miles <mil...@linux.ibm.com>

On Mon, 2025-05-12 at 13:10 +1000, Nicholas Piggin wrote:
> Implement the phys (aka hard) VP push. PowerVM uses this operation.
> 
> Signed-off-by: Nicholas Piggin <npig...@gmail.com>
> ---
>  hw/intc/xive.c         |  2 ++
>  hw/intc/xive2.c        | 11 +++++++++++
>  include/hw/ppc/xive2.h |  2 ++
>  3 files changed, 15 insertions(+)
> 
> diff --git a/hw/intc/xive.c b/hw/intc/xive.c
> index 807a1c1c34..69118999e6 100644
> --- a/hw/intc/xive.c
> +++ b/hw/intc/xive.c
> @@ -747,6 +747,8 @@ static const XiveTmOp xive2_tm_operations[] = {
>        xive_tm_set_pool_lgs, NULL },
>      { XIVE_TM_HV_PAGE, TM_QW3_HV_PHYS + TM_CPPR,  1, true, true,
>        xive2_tm_set_hv_cppr, NULL },
> +    { XIVE_TM_HV_PAGE, TM_QW3_HV_PHYS + TM_WORD2, 1, false, true,
> +      xive2_tm_push_phys_ctx, NULL },
>      { XIVE_TM_HV_PAGE, TM_QW3_HV_PHYS + TM_WORD2, 1, true, true,
>        NULL, xive_tm_vt_poll },
>      { XIVE_TM_HV_PAGE, TM_QW3_HV_PHYS + TM_T,     1, true, true,
> diff --git a/hw/intc/xive2.c b/hw/intc/xive2.c
> index de1ccad685..a9b188b909 100644
> --- a/hw/intc/xive2.c
> +++ b/hw/intc/xive2.c
> @@ -1005,6 +1005,11 @@ static void xive2_tm_push_ctx(XivePresenter *xptr, 
> XiveTCTX *tctx,
>  
>      /* First update the thead context */
>      switch (size) {
> +    case 1:
> +        tctx->regs[ring + TM_WORD2] = value & 0xff;
> +        cam = xive2_tctx_hw_cam_line(xptr, tctx);
> +        cam |= ((value & 0xc0) << 24); /* V and H bits */
> +        break;
>      case 4:
>          cam = value;
>          w2 = cpu_to_be32(cam);
> @@ -1040,6 +1045,12 @@ void xive2_tm_push_pool_ctx(XivePresenter *xptr, 
> XiveTCTX *tctx,
>      xive2_tm_push_ctx(xptr, tctx, offset, value, size, TM_QW2_HV_POOL);
>  }
>  
> +void xive2_tm_push_phys_ctx(XivePresenter *xptr, XiveTCTX *tctx,
> +                            hwaddr offset, uint64_t value, unsigned size)
> +{
> +    xive2_tm_push_ctx(xptr, tctx, offset, value, size, TM_QW3_HV_PHYS);
> +}
> +
>  /* returns -1 if ring is invalid, but still populates block and index */
>  static int xive2_tctx_get_nvp_indexes(XiveTCTX *tctx, uint8_t ring,
>                                        uint8_t *nvp_blk, uint32_t *nvp_idx)
> diff --git a/include/hw/ppc/xive2.h b/include/hw/ppc/xive2.h
> index 45266c2a8b..f4437e2c79 100644
> --- a/include/hw/ppc/xive2.h
> +++ b/include/hw/ppc/xive2.h
> @@ -146,6 +146,8 @@ void xive2_tm_push_pool_ctx(XivePresenter *xptr, XiveTCTX 
> *tctx,
>                              hwaddr offset, uint64_t value, unsigned size);
>  uint64_t xive2_tm_pull_pool_ctx(XivePresenter *xptr, XiveTCTX *tctx,
>                                  hwaddr offset, unsigned size);
> +void xive2_tm_push_phys_ctx(XivePresenter *xptr, XiveTCTX *tctx,
> +                            hwaddr offset, uint64_t value, unsigned size);
>  uint64_t xive2_tm_pull_phys_ctx(XivePresenter *xptr, XiveTCTX *tctx,
>                                  hwaddr offset, unsigned size);
>  void xive2_tm_pull_phys_ctx_ol(XivePresenter *xptr, XiveTCTX *tctx,


Reply via email to