[Pdbg] [PATCH 11/18] libpdbg: Update sbefifo chip-ops as per changes in p10

Joel Stanley joel at jms.id.au
Mon Sep 28 15:59:48 AEST 2020


On Thu, 24 Sep 2020 at 04:43, Amitay Isaacs <amitay at ozlabs.org> wrote:
>
> Signed-off-by: Amitay Isaacs <amitay at ozlabs.org>

Reviewed-by: Joel Stanley <joel at jms.id.au>

> ---
>  libpdbg/sbefifo.c | 69 ++++++++++++++++++++++++++++++-----------------
>  1 file changed, 45 insertions(+), 24 deletions(-)
>
> diff --git a/libpdbg/sbefifo.c b/libpdbg/sbefifo.c
> index 63a37e9..1200919 100644
> --- a/libpdbg/sbefifo.c
> +++ b/libpdbg/sbefifo.c
> @@ -253,9 +253,11 @@ static int sbefifo_pib_thread_op(struct pib *pib, uint32_t oper)
>         thread_id = 0xf;
>
>         /* Enforce special-wakeup for thread stop and sreset */
> -       if ((oper & 0xf) == SBEFIFO_INSN_OP_STOP ||
> -           (oper & 0xf) == SBEFIFO_INSN_OP_SRESET)
> -               mode = 0x2;
> +       if (sbefifo_proc(sctx) == SBEFIFO_PROC_P9) {
> +               if ((oper & 0xf) == SBEFIFO_INSN_OP_STOP ||
> +                   (oper & 0xf) == SBEFIFO_INSN_OP_SRESET)
> +                       mode = 0x2;
> +       }
>
>         return sbefifo_control_insn(sctx, core_id, thread_id, oper, mode);
>  }
> @@ -285,6 +287,20 @@ static int sbefifo_pib_thread_sreset(struct pib *pib)
>         return sbefifo_pib_thread_op(pib, SBEFIFO_INSN_OP_SRESET);
>  }
>
> +static uint8_t sbefifo_core_id(struct sbefifo_context *sctx, struct thread *thread)
> +{
> +       struct pdbg_target *parent;
> +
> +       if (sbefifo_proc(sctx) == SBEFIFO_PROC_P9)
> +               /* P9 uses pervasive (chiplet) id as core-id */
> +               parent = pdbg_target_require_parent("chiplet", &thread->target);
> +       else
> +               /* P10 uses core id as core-id */
> +               parent = pdbg_target_require_parent("core", &thread->target);
> +
> +       return pdbg_target_index(parent) & 0xff;
> +}
> +
>  static int sbefifo_thread_probe(struct pdbg_target *target)
>  {
>         struct thread *thread = target_to_thread(target);
> @@ -300,21 +316,23 @@ static void sbefifo_thread_release(struct pdbg_target *target)
>
>  static int sbefifo_thread_op(struct thread *thread, uint32_t oper)
>  {
> -       struct pdbg_target *chiplet =
> -               pdbg_target_require_parent("chiplet", &thread->target);
> -       struct pdbg_target *pib = pdbg_target_require_parent("pib", chiplet);
> +       struct pdbg_target *pib = pdbg_target_require_parent("pib", &thread->target);
>         struct sbefifo *sbefifo = pib_to_sbefifo(pib);
>         struct sbefifo_context *sctx = sbefifo->get_sbefifo_context(sbefifo);
>         uint8_t mode = 0;
> +       uint8_t core_id;
>
>         /* Enforce special-wakeup for thread stop and sreset */
> -       if ((oper & 0xf) == SBEFIFO_INSN_OP_STOP ||
> -           (oper & 0xf) == SBEFIFO_INSN_OP_SRESET)
> -               mode = 0x2;
> +       if (sbefifo_proc(sctx) == SBEFIFO_PROC_P9) {
> +               if ((oper & 0xf) == SBEFIFO_INSN_OP_STOP ||
> +                   (oper & 0xf) == SBEFIFO_INSN_OP_SRESET)
> +                       mode = 0x2;
> +       }
> +
> +       core_id = sbefifo_core_id(sctx, thread);
>
> -       /* This chip-op requires core-id as pervasive (chiplet) id */
>         return sbefifo_control_insn(sctx,
> -                                   pdbg_target_index(chiplet),
> +                                   core_id,
>                                     thread->id,
>                                     oper,
>                                     mode);
> @@ -347,20 +365,21 @@ static int sbefifo_thread_sreset(struct thread *thread)
>
>  static int sbefifo_thread_getregs(struct thread *thread, struct thread_regs *regs)
>  {
> -       struct pdbg_target *chiplet = pdbg_target_require_parent("chiplet", &thread->target);
> -       struct pdbg_target *pib = pdbg_target_require_parent("pib", chiplet);
> +       struct pdbg_target *pib = pdbg_target_require_parent("pib", &thread->target);
>         struct sbefifo *sbefifo = pib_to_sbefifo(pib);
>         struct sbefifo_context *sctx = sbefifo->get_sbefifo_context(sbefifo);
>         uint32_t reg_id[34];
>         uint64_t *value;
> +       uint8_t core_id;
>         int ret, i;
>
>         for (i=0; i<32; i++)
>                 reg_id[i] = i;
>
> -       /* This chip-op requires core-id as pervasive (chiplet) id */
> +       core_id = sbefifo_core_id(sctx, thread);
> +
>         ret = sbefifo_register_get(sctx,
> -                                  pdbg_target_index(chiplet),
> +                                  core_id,
>                                    thread->id,
>                                    SBEFIFO_REGISTER_TYPE_GPR,
>                                    reg_id,
> @@ -410,7 +429,7 @@ static int sbefifo_thread_getregs(struct thread *thread, struct thread_regs *reg
>         reg_id[33] = SPR_PPR;
>
>         ret = sbefifo_register_get(sctx,
> -                                  pdbg_target_index(chiplet),
> +                                  core_id,
>                                    thread->id,
>                                    SBEFIFO_REGISTER_TYPE_SPR,
>                                    reg_id,
> @@ -461,16 +480,17 @@ static int sbefifo_thread_getregs(struct thread *thread, struct thread_regs *reg
>
>  static int sbefifo_thread_get_reg(struct thread *thread, uint8_t reg_type, uint32_t reg_id, uint64_t *value)
>  {
> -       struct pdbg_target *chiplet = pdbg_target_require_parent("chiplet", &thread->target);
> -       struct pdbg_target *pib = pdbg_target_require_parent("pib", chiplet);
> +       struct pdbg_target *pib = pdbg_target_require_parent("pib", &thread->target);
>         struct sbefifo *sbefifo = pib_to_sbefifo(pib);
>         struct sbefifo_context *sctx = sbefifo->get_sbefifo_context(sbefifo);
>         uint64_t *v;
> +       uint8_t core_id;
>         int ret;
>
> -       /* This chip-op requires core-id as pervasive (chiplet) id */
> +       core_id = sbefifo_core_id(sctx, thread);
> +
>         ret = sbefifo_register_get(sctx,
> -                                  pdbg_target_index(chiplet),
> +                                  core_id,
>                                    thread->id,
>                                    reg_type,
>                                    &reg_id,
> @@ -487,14 +507,15 @@ static int sbefifo_thread_get_reg(struct thread *thread, uint8_t reg_type, uint3
>
>  static int sbefifo_thread_put_reg(struct thread *thread, uint8_t reg_type, uint32_t reg_id, uint64_t value)
>  {
> -       struct pdbg_target *chiplet = pdbg_target_require_parent("chiplet", &thread->target);
> -       struct pdbg_target *pib = pdbg_target_require_parent("pib", chiplet);
> +       struct pdbg_target *pib = pdbg_target_require_parent("pib", &thread->target);
>         struct sbefifo *sbefifo = pib_to_sbefifo(pib);
>         struct sbefifo_context *sctx = sbefifo->get_sbefifo_context(sbefifo);
> +       uint8_t core_id;
> +
> +       core_id = sbefifo_core_id(sctx, thread);
>
> -       /* This chip-op requires core-id as pervasive (chiplet) id */
>         return sbefifo_register_put(sctx,
> -                                   pdbg_target_index(chiplet),
> +                                   core_id,
>                                     thread->id,
>                                     reg_type,
>                                     &reg_id,
> --
> 2.26.2
>
> --
> Pdbg mailing list
> Pdbg at lists.ozlabs.org
> https://lists.ozlabs.org/listinfo/pdbg


More information about the Pdbg mailing list