Message ID | 20200924044236.130586-12-amitay@ozlabs.org |
---|---|
State | Superseded |
Headers | show |
Series | Add p10 support to libpdbg | expand |
On Thu, 24 Sep 2020 at 04:43, Amitay Isaacs <amitay@ozlabs.org> wrote: > > Signed-off-by: Amitay Isaacs <amitay@ozlabs.org> Reviewed-by: Joel Stanley <joel@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, > ®_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, > ®_id, > -- > 2.26.2 > > -- > Pdbg mailing list > Pdbg@lists.ozlabs.org > https://lists.ozlabs.org/listinfo/pdbg
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, ®_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, ®_id,
Signed-off-by: Amitay Isaacs <amitay@ozlabs.org> --- libpdbg/sbefifo.c | 69 ++++++++++++++++++++++++++++++----------------- 1 file changed, 45 insertions(+), 24 deletions(-)