From patchwork Tue Aug 20 07:19:02 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Alistair Popple X-Patchwork-Id: 1149837 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Received: from lists.ozlabs.org (lists.ozlabs.org [IPv6:2401:3900:2:1::3]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (4096 bits)) (No client certificate requested) by ozlabs.org (Postfix) with ESMTPS id 46CMc86rt4z9s3Z for ; Tue, 20 Aug 2019 17:19:20 +1000 (AEST) Authentication-Results: ozlabs.org; dmarc=none (p=none dis=none) header.from=popple.id.au Received: from bilbo.ozlabs.org (lists.ozlabs.org [IPv6:2401:3900:2:1::3]) by lists.ozlabs.org (Postfix) with ESMTP id 46CMc75Y5BzDqfM for ; Tue, 20 Aug 2019 17:19:19 +1000 (AEST) X-Original-To: pdbg@lists.ozlabs.org Delivered-To: pdbg@lists.ozlabs.org Received: from ozlabs.org (bilbo.ozlabs.org [203.11.71.1]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (2048 bits) server-digest SHA256) (No client certificate requested) by lists.ozlabs.org (Postfix) with ESMTPS id 46CMc16VgdzDqf2 for ; Tue, 20 Aug 2019 17:19:13 +1000 (AEST) Authentication-Results: lists.ozlabs.org; dmarc=none (p=none dis=none) header.from=popple.id.au Received: from authenticated.ozlabs.org (localhost [127.0.0.1]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange ECDHE (P-256) server-signature RSA-PSS (4096 bits) server-digest SHA256) (No client certificate requested) by mail.ozlabs.org (Postfix) with ESMTPSA id 46CMc14LFDz9s00; Tue, 20 Aug 2019 17:19:13 +1000 (AEST) From: Alistair Popple To: pdbg@lists.ozlabs.org Date: Tue, 20 Aug 2019 17:19:02 +1000 Message-Id: <20190820071906.25950-1-alistair@popple.id.au> X-Mailer: git-send-email 2.20.1 MIME-Version: 1.0 Subject: [Pdbg] [PATCH 1/5] libpdbg: Rename adu class to mem X-BeenThere: pdbg@lists.ozlabs.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: "mailing list for https://github.com/open-power/pdbg development" List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: Amitay Isaacs Errors-To: pdbg-bounces+incoming=patchwork.ozlabs.org@lists.ozlabs.org Sender: "Pdbg" The ADU is really an implementation of a method to access system memory. Therefore it should export an interface to access system memory rather than an implementation specific interface. Rename the class from "adu" to "mem" to reflect this. Signed-off-by: Alistair Popple Reviewed-by: Amitay Isaacs --- libpdbg/adu.c | 74 ++++++++++++++++++++++++------------------------ libpdbg/htm.c | 2 +- libpdbg/hwunit.h | 13 ++++----- libpdbg/target.c | 20 ++++++------- src/mem.c | 4 +-- src/pdbgproxy.c | 2 +- src/thread.c | 2 +- 7 files changed, 58 insertions(+), 59 deletions(-) diff --git a/libpdbg/adu.c b/libpdbg/adu.c index 3904265..25f08cd 100644 --- a/libpdbg/adu.c +++ b/libpdbg/adu.c @@ -111,7 +111,7 @@ uint8_t blog2(uint8_t x) } } -static int adu_read(struct adu *adu, uint64_t start_addr, uint8_t *output, +static int adu_read(struct mem *adu, uint64_t start_addr, uint8_t *output, uint64_t size, uint8_t block_size, bool ci) { uint8_t *output0; @@ -164,10 +164,10 @@ static int adu_read(struct adu *adu, uint64_t start_addr, uint8_t *output, int adu_getmem(struct pdbg_target *adu_target, uint64_t start_addr, uint8_t *output, uint64_t size) { - struct adu *adu; + struct mem *adu; - assert(!strcmp(adu_target->class, "adu")); - adu = target_to_adu(adu_target); + assert(!strcmp(adu_target->class, "mem")); + adu = target_to_mem(adu_target); return adu_read(adu, start_addr, output, size, 8, false); } @@ -175,10 +175,10 @@ int adu_getmem(struct pdbg_target *adu_target, uint64_t start_addr, int adu_getmem_ci(struct pdbg_target *adu_target, uint64_t start_addr, uint8_t *output, uint64_t size) { - struct adu *adu; + struct mem *adu; - assert(!strcmp(adu_target->class, "adu")); - adu = target_to_adu(adu_target); + assert(!strcmp(adu_target->class, "mem")); + adu = target_to_mem(adu_target); return adu_read(adu, start_addr, output, size, 8, true); } @@ -186,10 +186,10 @@ int adu_getmem_ci(struct pdbg_target *adu_target, uint64_t start_addr, int adu_getmem_io(struct pdbg_target *adu_target, uint64_t start_addr, uint8_t *output, uint64_t size, uint8_t blocksize) { - struct adu *adu; + struct mem *adu; - assert(!strcmp(adu_target->class, "adu")); - adu = target_to_adu(adu_target); + assert(!strcmp(adu_target->class, "mem")); + adu = target_to_mem(adu_target); /* There is no equivalent for cachable memory as blocksize * does not apply to cachable reads */ @@ -199,15 +199,15 @@ int adu_getmem_io(struct pdbg_target *adu_target, uint64_t start_addr, int __adu_getmem(struct pdbg_target *adu_target, uint64_t start_addr, uint8_t *output, uint64_t size, bool ci) { - struct adu *adu; + struct mem *adu; - assert(!strcmp(adu_target->class, "adu")); - adu = target_to_adu(adu_target); + assert(!strcmp(adu_target->class, "mem")); + adu = target_to_mem(adu_target); return adu_read(adu, start_addr, output, size, 8, ci); } -static int adu_write(struct adu *adu, uint64_t start_addr, uint8_t *input, +static int adu_write(struct mem *adu, uint64_t start_addr, uint8_t *input, uint64_t size, uint8_t block_size, bool ci) { int rc = 0, tsize; @@ -248,10 +248,10 @@ static int adu_write(struct adu *adu, uint64_t start_addr, uint8_t *input, int adu_putmem(struct pdbg_target *adu_target, uint64_t start_addr, uint8_t *input, uint64_t size) { - struct adu *adu; + struct mem *adu; - assert(!strcmp(adu_target->class, "adu")); - adu = target_to_adu(adu_target); + assert(!strcmp(adu_target->class, "mem")); + adu = target_to_mem(adu_target); return adu_write(adu, start_addr, input, size, 8, false); } @@ -259,10 +259,10 @@ int adu_putmem(struct pdbg_target *adu_target, uint64_t start_addr, int adu_putmem_ci(struct pdbg_target *adu_target, uint64_t start_addr, uint8_t *input, uint64_t size) { - struct adu *adu; + struct mem *adu; - assert(!strcmp(adu_target->class, "adu")); - adu = target_to_adu(adu_target); + assert(!strcmp(adu_target->class, "mem")); + adu = target_to_mem(adu_target); return adu_write(adu, start_addr, input, size, 8, true); } @@ -270,10 +270,10 @@ int adu_putmem_ci(struct pdbg_target *adu_target, uint64_t start_addr, int adu_putmem_io(struct pdbg_target *adu_target, uint64_t start_addr, uint8_t *input, uint64_t size, uint8_t block_size) { - struct adu *adu; + struct mem *adu; - assert(!strcmp(adu_target->class, "adu")); - adu = target_to_adu(adu_target); + assert(!strcmp(adu_target->class, "mem")); + adu = target_to_mem(adu_target); return adu_write(adu, start_addr, input, size, block_size, true); } @@ -281,15 +281,15 @@ int adu_putmem_io(struct pdbg_target *adu_target, uint64_t start_addr, int __adu_putmem(struct pdbg_target *adu_target, uint64_t start_addr, uint8_t *input, uint64_t size, bool ci) { - struct adu *adu; + struct mem *adu; - assert(!strcmp(adu_target->class, "adu")); - adu = target_to_adu(adu_target); + assert(!strcmp(adu_target->class, "mem")); + adu = target_to_mem(adu_target); return adu_write(adu, start_addr, input, size, 8, ci); } -static int adu_lock(struct adu *adu) +static int adu_lock(struct mem *adu) { uint64_t val; @@ -304,7 +304,7 @@ static int adu_lock(struct adu *adu) return 0; } -static int adu_unlock(struct adu *adu) +static int adu_unlock(struct mem *adu) { uint64_t val; @@ -321,7 +321,7 @@ static int adu_unlock(struct adu *adu) return 0; } -static int adu_reset(struct adu *adu) +static int adu_reset(struct mem *adu) { uint64_t val; @@ -332,7 +332,7 @@ static int adu_reset(struct adu *adu) return 0; } -static int p8_adu_getmem(struct adu *adu, uint64_t addr, uint64_t *data, +static int p8_adu_getmem(struct mem *adu, uint64_t addr, uint64_t *data, int ci, uint8_t block_size) { uint64_t ctrl_reg, cmd_reg, val; @@ -394,7 +394,7 @@ out: } -int p8_adu_putmem(struct adu *adu, uint64_t addr, uint64_t data, int size, +int p8_adu_putmem(struct mem *adu, uint64_t addr, uint64_t data, int size, int ci, uint8_t block_size) { int rc = 0; @@ -455,7 +455,7 @@ out: return rc; } -static int p9_adu_getmem(struct adu *adu, uint64_t addr, uint64_t *data, +static int p9_adu_getmem(struct mem *adu, uint64_t addr, uint64_t *data, int ci, uint8_t block_size) { uint64_t ctrl_reg, cmd_reg, val; @@ -512,7 +512,7 @@ retry: return 0; } -static int p9_adu_putmem(struct adu *adu, uint64_t addr, uint64_t data, int size, +static int p9_adu_putmem(struct mem *adu, uint64_t addr, uint64_t data, int size, int ci, uint8_t block_size) { uint64_t ctrl_reg, cmd_reg, val; @@ -569,11 +569,11 @@ retry: return 0; } -static struct adu p8_adu = { +static struct mem p8_adu = { .target = { .name = "POWER8 ADU", .compatible = "ibm,power8-adu", - .class = "adu", + .class = "mem", }, .getmem = p8_adu_getmem, .putmem = p8_adu_putmem, @@ -582,11 +582,11 @@ static struct adu p8_adu = { }; DECLARE_HW_UNIT(p8_adu); -static struct adu p9_adu = { +static struct mem p9_adu = { .target = { .name = "POWER9 ADU", .compatible = "ibm,power9-adu", - .class = "adu", + .class = "mem", }, .getmem = p9_adu_getmem, .putmem = p9_adu_putmem, diff --git a/libpdbg/htm.c b/libpdbg/htm.c index 72fe570..4d23e82 100644 --- a/libpdbg/htm.c +++ b/libpdbg/htm.c @@ -782,7 +782,7 @@ static int __do_htm_start(struct htm *htm, bool wrap) /* * Instead of the HTM_TRIG_START, this is where you might want * to call do_adu_magic() - * for_each_child_target("adu", core, do_adu_magic, NULL, NULL); + * for_each_child_target("mem", core, do_adu_magic, NULL, NULL); * see what I mean? */ diff --git a/libpdbg/hwunit.h b/libpdbg/hwunit.h index 1bfb872..2618941 100644 --- a/libpdbg/hwunit.h +++ b/libpdbg/hwunit.h @@ -56,14 +56,14 @@ struct htm { }; #define target_to_htm(x) container_of(x, struct htm, target) -struct adu { +struct mem { struct pdbg_target target; - int (*getmem)(struct adu *, uint64_t, uint64_t *, int, uint8_t); - int (*putmem)(struct adu *, uint64_t, uint64_t, int, int, uint8_t); - int (*read)(struct adu *, uint64_t, uint8_t *, uint64_t, uint8_t, bool); - int (*write)(struct adu *, uint64_t, uint8_t *, uint64_t, uint8_t, bool); + int (*getmem)(struct mem *, uint64_t, uint64_t *, int, uint8_t); + int (*putmem)(struct mem *, uint64_t, uint64_t, int, int, uint8_t); + int (*read)(struct mem *, uint64_t, uint8_t *, uint64_t, uint8_t, bool); + int (*write)(struct mem *, uint64_t, uint8_t *, uint64_t, uint8_t, bool); }; -#define target_to_adu(x) container_of(x, struct adu, target) +#define target_to_mem(x) container_of(x, struct mem, target) struct sbefifo { struct pdbg_target target; @@ -151,4 +151,3 @@ struct xbus { #define target_to_xbus(x) container_of(x, struct xbus, target) #endif /* __HWUNIT_H */ - diff --git a/libpdbg/target.c b/libpdbg/target.c index 1436f7f..2396804 100644 --- a/libpdbg/target.c +++ b/libpdbg/target.c @@ -250,7 +250,7 @@ int mem_read(struct pdbg_target *target, uint64_t addr, uint8_t *output, uint64_ int rc = -1; assert(pdbg_target_is_class(target, "sbefifo") || - pdbg_target_is_class(target, "adu")); + pdbg_target_is_class(target, "mem")); if (pdbg_target_is_class(target, "sbefifo")) { struct sbefifo *sbefifo; @@ -259,11 +259,11 @@ int mem_read(struct pdbg_target *target, uint64_t addr, uint8_t *output, uint64_ rc = sbefifo->mem_read(sbefifo, addr, output, size, ci); } - if (pdbg_target_is_class(target, "adu")) { - struct adu *adu; + if (pdbg_target_is_class(target, "mem")) { + struct mem *mem; - adu = target_to_adu(target); - rc = adu->read(adu, addr, output, size, block_size, ci); + mem = target_to_mem(target); + rc = mem->read(mem, addr, output, size, block_size, ci); } return rc; @@ -274,7 +274,7 @@ int mem_write(struct pdbg_target *target, uint64_t addr, uint8_t *input, uint64_ int rc = -1; assert(pdbg_target_is_class(target, "sbefifo") || - pdbg_target_is_class(target, "adu")); + pdbg_target_is_class(target, "mem")); if (pdbg_target_is_class(target, "sbefifo")) { struct sbefifo *sbefifo; @@ -283,11 +283,11 @@ int mem_write(struct pdbg_target *target, uint64_t addr, uint8_t *input, uint64_ rc = sbefifo->mem_write(sbefifo, addr, input, size, ci); } - if (pdbg_target_is_class(target, "adu")) { - struct adu *adu; + if (pdbg_target_is_class(target, "mem")) { + struct mem *mem; - adu = target_to_adu(target); - rc = adu->write(adu, addr, input, size, block_size, ci); + mem = target_to_mem(target); + rc = mem->write(mem, addr, input, size, block_size, ci); } return rc; diff --git a/src/mem.c b/src/mem.c index 0b8ad7e..cacd394 100644 --- a/src/mem.c +++ b/src/mem.c @@ -112,7 +112,7 @@ static int _getmem(uint64_t addr, uint64_t size, uint8_t block_size, bool ci, bo goto done; } - pdbg_for_each_class_target("adu", target) { + pdbg_for_each_class_target("mem", target) { if (pdbg_target_probe(target) != PDBG_TARGET_ENABLED) continue; @@ -205,7 +205,7 @@ static int _putmem(uint64_t addr, uint8_t block_size, bool ci) goto done; } - pdbg_for_each_class_target("adu", target) { + pdbg_for_each_class_target("mem", target) { if (pdbg_target_probe(target) != PDBG_TARGET_ENABLED) continue; diff --git a/src/pdbgproxy.c b/src/pdbgproxy.c index 5bba03f..4177f01 100644 --- a/src/pdbgproxy.c +++ b/src/pdbgproxy.c @@ -532,7 +532,7 @@ static int gdbserver(uint16_t port) littleendian = 0x01 & msr; /* Select ADU target */ - pdbg_for_each_class_target("adu", adu) { + pdbg_for_each_class_target("mem", adu) { if (pdbg_target_probe(adu) == PDBG_TARGET_ENABLED) break; } diff --git a/src/thread.c b/src/thread.c index a7ceaf2..663f290 100644 --- a/src/thread.c +++ b/src/thread.c @@ -365,7 +365,7 @@ static int thread_regs_print(struct reg_flags flags) if (flags.do_backtrace) { struct pdbg_target *adu; - pdbg_for_each_class_target("adu", adu) { + pdbg_for_each_class_target("mem", adu) { if (pdbg_target_probe(adu) == PDBG_TARGET_ENABLED) { dump_stack(®s, adu); break; From patchwork Tue Aug 20 07:19:03 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Alistair Popple X-Patchwork-Id: 1149838 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Received: from lists.ozlabs.org (lists.ozlabs.org [IPv6:2401:3900:2:1::3]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (4096 bits)) (No client certificate requested) by ozlabs.org (Postfix) with ESMTPS id 46CMcG5yrgz9s3Z for ; Tue, 20 Aug 2019 17:19:26 +1000 (AEST) Authentication-Results: ozlabs.org; dmarc=none (p=none dis=none) header.from=popple.id.au Received: from bilbo.ozlabs.org (lists.ozlabs.org [IPv6:2401:3900:2:1::3]) by lists.ozlabs.org (Postfix) with ESMTP id 46CMcG3M9nzDqf6 for ; Tue, 20 Aug 2019 17:19:26 +1000 (AEST) X-Original-To: pdbg@lists.ozlabs.org Delivered-To: pdbg@lists.ozlabs.org Received: from ozlabs.org (bilbo.ozlabs.org [IPv6:2401:3900:2:1::2]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (2048 bits)) (No client certificate requested) by lists.ozlabs.org (Postfix) with ESMTPS id 46CMc23CntzDqf6 for ; Tue, 20 Aug 2019 17:19:14 +1000 (AEST) Authentication-Results: lists.ozlabs.org; dmarc=none (p=none dis=none) header.from=popple.id.au Received: from authenticated.ozlabs.org (localhost [127.0.0.1]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange ECDHE (P-256) server-signature RSA-PSS (4096 bits) server-digest SHA256) (No client certificate requested) by mail.ozlabs.org (Postfix) with ESMTPSA id 46CMc20PLhz9sN4; Tue, 20 Aug 2019 17:19:14 +1000 (AEST) From: Alistair Popple To: pdbg@lists.ozlabs.org Date: Tue, 20 Aug 2019 17:19:03 +1000 Message-Id: <20190820071906.25950-2-alistair@popple.id.au> X-Mailer: git-send-email 2.20.1 In-Reply-To: <20190820071906.25950-1-alistair@popple.id.au> References: <20190820071906.25950-1-alistair@popple.id.au> MIME-Version: 1.0 Subject: [Pdbg] [PATCH 2/5] sbefifo: Rework the memory interfaces X-BeenThere: pdbg@lists.ozlabs.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: "mailing list for https://github.com/open-power/pdbg development" List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: pdbg-bounces+incoming=patchwork.ozlabs.org@lists.ozlabs.org Sender: "Pdbg" The SBEFIFO unit introduced it's own implementation specific interface for accessing memory. Instead it should conform to the existing memory access interfaces. This patch splits the SBEFIFO memory access into it's own hardware unit so that it can conform with the existing interfaces. Signed-off-by: Alistair Popple --- libpdbg/hwunit.h | 2 -- libpdbg/sbefifo.c | 38 ++++++++++++++++++++++++++++++-------- libpdbg/target.c | 38 ++++++++------------------------------ p9-kernel.dts.m4 | 8 ++++++++ p9-pib.dts.m4 | 5 ----- src/mem.c | 46 ++++++---------------------------------------- 6 files changed, 52 insertions(+), 85 deletions(-) diff --git a/libpdbg/hwunit.h b/libpdbg/hwunit.h index 2618941..a359af0 100644 --- a/libpdbg/hwunit.h +++ b/libpdbg/hwunit.h @@ -68,8 +68,6 @@ struct mem { struct sbefifo { struct pdbg_target target; int (*istep)(struct sbefifo *, uint32_t major, uint32_t minor); - int (*mem_read)(struct sbefifo *, uint64_t, uint8_t *, uint64_t, bool); - int (*mem_write)(struct sbefifo *, uint64_t, uint8_t *, uint64_t, bool); int (*thread_start)(struct sbefifo *, uint32_t core_id, uint32_t thread_id); int (*thread_stop)(struct sbefifo *, uint32_t core_id, uint32_t thread_id); int (*thread_step)(struct sbefifo *, uint32_t core_id, uint32_t thread_id); diff --git a/libpdbg/sbefifo.c b/libpdbg/sbefifo.c index 784db32..5c63512 100644 --- a/libpdbg/sbefifo.c +++ b/libpdbg/sbefifo.c @@ -244,9 +244,9 @@ static int sbefifo_op_istep(struct sbefifo *sbefifo, return 0; } -static int sbefifo_op_getmem(struct sbefifo *sbefifo, +static int sbefifo_op_getmem(struct mem *sbefifo, uint64_t addr, uint8_t *data, uint64_t size, - bool ci) + uint8_t block_size, bool ci) { uint8_t *out; uint64_t start_addr, end_addr; @@ -257,6 +257,11 @@ static int sbefifo_op_getmem(struct sbefifo *sbefifo, align = ci ? 8 : 128; + if (block_size && block_size != 8) { + PR_ERROR("sbefifo: Only 8 byte block sizes are supported\n"); + return -1; + }; + start_addr = addr & (~(uint64_t)(align-1)); end_addr = (addr + size + (align-1)) & (~(uint64_t)(align-1)); @@ -285,7 +290,8 @@ static int sbefifo_op_getmem(struct sbefifo *sbefifo, msg[5] = htobe32(len); out_len = len + 4; - rc = sbefifo_op(sbefifo, msg, sizeof(msg), cmd, &out, &out_len, &status); + rc = sbefifo_op(target_to_sbefifo(sbefifo->target.parent), msg, sizeof(msg), cmd, + &out, &out_len, &status); if (rc) return rc; @@ -304,9 +310,9 @@ static int sbefifo_op_getmem(struct sbefifo *sbefifo, return 0; } -static int sbefifo_op_putmem(struct sbefifo *sbefifo, +static int sbefifo_op_putmem(struct mem *sbefifo, uint64_t addr, uint8_t *data, uint64_t size, - bool ci) + uint8_t block_size, bool ci) { uint8_t *out; uint32_t *msg; @@ -316,6 +322,11 @@ static int sbefifo_op_putmem(struct sbefifo *sbefifo, align = ci ? 8 : 128; + if (block_size && block_size != 8) { + PR_ERROR("sbefifo: Only 8 byte block sizes are supported\n"); + return -1; + }; + if (addr & (align-1)) { PR_ERROR("sbefifo: Address must be aligned to %d bytes\n", align); return -1; @@ -353,7 +364,8 @@ static int sbefifo_op_putmem(struct sbefifo *sbefifo, memcpy(&msg[6], data, len); out_len = 4; - rc = sbefifo_op(sbefifo, msg, msg_len, cmd, &out, &out_len, &status); + rc = sbefifo_op(target_to_sbefifo(sbefifo->target.parent), msg, msg_len, cmd, + &out, &out_len, &status); if (rc) return rc; @@ -484,6 +496,17 @@ static int sbefifo_probe(struct pdbg_target *target) return 0; } +struct mem sbefifo_mem = { + .target = { + .name = "SBE FIFO Chip-op based memory access", + .compatible = "ibm,sbefifo-mem", + .class = "mem", + }, + .read = sbefifo_op_getmem, + .write = sbefifo_op_putmem, +}; +DECLARE_HW_UNIT(sbefifo_mem); + struct sbefifo kernel_sbefifo = { .target = { .name = "Kernel based FSI SBE FIFO", @@ -492,8 +515,6 @@ struct sbefifo kernel_sbefifo = { .probe = sbefifo_probe, }, .istep = sbefifo_op_istep, - .mem_read = sbefifo_op_getmem, - .mem_write = sbefifo_op_putmem, .thread_start = sbefifo_op_thread_start, .thread_stop = sbefifo_op_thread_stop, .thread_step = sbefifo_op_thread_step, @@ -508,4 +529,5 @@ __attribute__((constructor)) static void register_sbefifo(void) { pdbg_hwunit_register(&kernel_sbefifo_hw_unit); + pdbg_hwunit_register(&sbefifo_mem_hw_unit); } diff --git a/libpdbg/target.c b/libpdbg/target.c index 2396804..67191b5 100644 --- a/libpdbg/target.c +++ b/libpdbg/target.c @@ -247,48 +247,26 @@ int fsi_write_mask(struct pdbg_target *fsi_dt, uint32_t addr, uint32_t data, uin int mem_read(struct pdbg_target *target, uint64_t addr, uint8_t *output, uint64_t size, uint8_t block_size, bool ci) { + struct mem *mem; int rc = -1; - assert(pdbg_target_is_class(target, "sbefifo") || - pdbg_target_is_class(target, "mem")); + assert(pdbg_target_is_class(target, "mem")); - if (pdbg_target_is_class(target, "sbefifo")) { - struct sbefifo *sbefifo; - - sbefifo = target_to_sbefifo(target); - rc = sbefifo->mem_read(sbefifo, addr, output, size, ci); - } - - if (pdbg_target_is_class(target, "mem")) { - struct mem *mem; - - mem = target_to_mem(target); - rc = mem->read(mem, addr, output, size, block_size, ci); - } + mem = target_to_mem(target); + rc = mem->read(mem, addr, output, size, block_size, ci); return rc; } int mem_write(struct pdbg_target *target, uint64_t addr, uint8_t *input, uint64_t size, uint8_t block_size, bool ci) { + struct mem *mem; int rc = -1; - assert(pdbg_target_is_class(target, "sbefifo") || - pdbg_target_is_class(target, "mem")); + assert(pdbg_target_is_class(target, "mem")); - if (pdbg_target_is_class(target, "sbefifo")) { - struct sbefifo *sbefifo; - - sbefifo = target_to_sbefifo(target); - rc = sbefifo->mem_write(sbefifo, addr, input, size, ci); - } - - if (pdbg_target_is_class(target, "mem")) { - struct mem *mem; - - mem = target_to_mem(target); - rc = mem->write(mem, addr, input, size, block_size, ci); - } + mem = target_to_mem(target); + rc = mem->write(mem, addr, input, size, block_size, ci); return rc; } diff --git a/p9-kernel.dts.m4 b/p9-kernel.dts.m4 index 9ab46b8..aa4bcac 100644 --- a/p9-kernel.dts.m4 +++ b/p9-kernel.dts.m4 @@ -28,6 +28,10 @@ index = <0x0>; compatible = "ibm,kernel-sbefifo"; device-path = "/dev/sbefifo1"; + + sbefifo-mem@0 { + compatible = "ibm,sbefifo-mem"; + }; }; hmfsi@100000 { @@ -53,6 +57,10 @@ index = <0x1>; compatible = "ibm,kernel-sbefifo"; device-path = "/dev/sbefifo2"; + + sbefifo-mem@0 { + compatible = "ibm,sbefifo-mem"; + }; }; }; }; diff --git a/p9-pib.dts.m4 b/p9-pib.dts.m4 index 3e312e5..3a99157 100644 --- a/p9-pib.dts.m4 +++ b/p9-pib.dts.m4 @@ -36,11 +36,6 @@ reg = <0x0 HEX(CHIPLET_BASE($1)) 0xfffff>; }')dnl -adu@90000 { - compatible = "ibm,power9-adu"; - reg = <0x0 0x90000 0x5>; -}; - htm@5012880 { compatible = "ibm,power9-nhtm"; reg = <0x0 0x5012880 0x40>; diff --git a/src/mem.c b/src/mem.c index cacd394..53d33b8 100644 --- a/src/mem.c +++ b/src/mem.c @@ -95,23 +95,6 @@ static int _getmem(uint64_t addr, uint64_t size, uint8_t block_size, bool ci, bo buf = malloc(size); assert(buf); - pdbg_for_each_class_target("sbefifo", target) { - if (pdbg_target_probe(target) != PDBG_TARGET_ENABLED) - continue; - - pdbg_set_progress_tick(progress_tick); - progress_init(); - rc = mem_read(target, addr, buf, size, block_size, ci); - progress_end(); - if (rc) { - PR_ERROR("Unable to read memory using sbefifo\n"); - continue; - } - - count++; - goto done; - } - pdbg_for_each_class_target("mem", target) { if (pdbg_target_probe(target) != PDBG_TARGET_ENABLED) continue; @@ -121,15 +104,15 @@ static int _getmem(uint64_t addr, uint64_t size, uint8_t block_size, bool ci, bo rc = mem_read(target, addr, buf, size, block_size, ci); progress_end(); if (rc) { - PR_ERROR("Unable to read memory using adu\n"); + PR_ERROR("Unable to read memory from %s\n", + pdbg_target_path(target)); continue; } count++; - goto done; + break; } -done: if (count > 0) { uint64_t i; bool printable = true; @@ -188,23 +171,6 @@ static int _putmem(uint64_t addr, uint8_t block_size, bool ci) buf = read_stdin(&buflen); assert(buf); - pdbg_for_each_class_target("sbefifo", target) { - if (pdbg_target_probe(target) != PDBG_TARGET_ENABLED) - continue; - - pdbg_set_progress_tick(progress_tick); - progress_init(); - rc = mem_write(target, addr, buf, buflen, block_size, ci); - progress_end(); - if (rc) { - printf("Unable to write memory using sbefifo\n"); - continue; - } - - count++; - goto done; - } - pdbg_for_each_class_target("mem", target) { if (pdbg_target_probe(target) != PDBG_TARGET_ENABLED) continue; @@ -214,15 +180,15 @@ static int _putmem(uint64_t addr, uint8_t block_size, bool ci) rc = mem_write(target, addr, buf, buflen, block_size, ci); progress_end(); if (rc) { - printf("Unable to write memory using adu\n"); + printf("Unable to write memory using %s\n", + pdbg_target_path(target)); continue; } count++; - goto done; + break; } -done: if (count > 0) printf("Wrote %zu bytes starting at 0x%016" PRIx64 "\n", buflen, addr); From patchwork Tue Aug 20 07:19:04 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Alistair Popple X-Patchwork-Id: 1149839 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Received: from lists.ozlabs.org (lists.ozlabs.org [IPv6:2401:3900:2:1::3]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (4096 bits)) (No client certificate requested) by ozlabs.org (Postfix) with ESMTPS id 46CMcL1wffz9s3Z for ; Tue, 20 Aug 2019 17:19:30 +1000 (AEST) Authentication-Results: ozlabs.org; dmarc=none (p=none dis=none) header.from=popple.id.au Received: from bilbo.ozlabs.org (lists.ozlabs.org [IPv6:2401:3900:2:1::3]) by lists.ozlabs.org (Postfix) with ESMTP id 46CMcK64cKzDqfC for ; Tue, 20 Aug 2019 17:19:29 +1000 (AEST) X-Original-To: pdbg@lists.ozlabs.org Delivered-To: pdbg@lists.ozlabs.org Received: from ozlabs.org (bilbo.ozlabs.org [203.11.71.1]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (2048 bits)) (No client certificate requested) by lists.ozlabs.org (Postfix) with ESMTPS id 46CMc30NgXzDqf2 for ; Tue, 20 Aug 2019 17:19:15 +1000 (AEST) Authentication-Results: lists.ozlabs.org; dmarc=none (p=none dis=none) header.from=popple.id.au Received: from authenticated.ozlabs.org (localhost [127.0.0.1]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange ECDHE (P-256) server-signature RSA-PSS (4096 bits) server-digest SHA256) (No client certificate requested) by mail.ozlabs.org (Postfix) with ESMTPSA id 46CMc25K9mz9s00; Tue, 20 Aug 2019 17:19:14 +1000 (AEST) From: Alistair Popple To: pdbg@lists.ozlabs.org Date: Tue, 20 Aug 2019 17:19:04 +1000 Message-Id: <20190820071906.25950-3-alistair@popple.id.au> X-Mailer: git-send-email 2.20.1 In-Reply-To: <20190820071906.25950-1-alistair@popple.id.au> References: <20190820071906.25950-1-alistair@popple.id.au> MIME-Version: 1.0 Subject: [Pdbg] [PATCH 3/5] device.c: Extend dt_expand to operate with different root nodes X-BeenThere: pdbg@lists.ozlabs.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: "mailing list for https://github.com/open-power/pdbg development" List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: Amitay Isaacs Errors-To: pdbg-bounces+incoming=patchwork.ozlabs.org@lists.ozlabs.org Sender: "Pdbg" Signed-off-by: Alistair Popple Reviewed-by: Amitay Isaacs --- libpdbg/device.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/libpdbg/device.c b/libpdbg/device.c index 07f373d..2fcb184 100644 --- a/libpdbg/device.c +++ b/libpdbg/device.c @@ -574,11 +574,11 @@ static int dt_expand_node(struct pdbg_target *node, const void *fdt, int fdt_nod return nextoffset; } -static void dt_expand(const void *fdt) +static void dt_expand(void *root, const void *fdt) { PR_DEBUG("FDT: Parsing fdt @%p\n", fdt); - if (dt_expand_node(pdbg_dt_root, fdt, 0) < 0) + if (dt_expand_node(root, fdt, 0) < 0) abort(); } @@ -634,7 +634,7 @@ void pdbg_targets_init(void *fdt) return; } - dt_expand(fdt); + dt_expand(pdbg_dt_root, fdt); } char *pdbg_target_path(const struct pdbg_target *target) From patchwork Tue Aug 20 07:19:05 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Alistair Popple X-Patchwork-Id: 1149840 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Received: from lists.ozlabs.org (lists.ozlabs.org [IPv6:2401:3900:2:1::3]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (4096 bits)) (No client certificate requested) by ozlabs.org (Postfix) with ESMTPS id 46CMcN5KM1z9sN4 for ; Tue, 20 Aug 2019 17:19:32 +1000 (AEST) Authentication-Results: ozlabs.org; dmarc=none (p=none dis=none) header.from=popple.id.au Received: from bilbo.ozlabs.org (lists.ozlabs.org [IPv6:2401:3900:2:1::3]) by lists.ozlabs.org (Postfix) with ESMTP id 46CMcN2yxzzDqfM for ; Tue, 20 Aug 2019 17:19:32 +1000 (AEST) X-Original-To: pdbg@lists.ozlabs.org Delivered-To: pdbg@lists.ozlabs.org Received: from ozlabs.org (bilbo.ozlabs.org [IPv6:2401:3900:2:1::2]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (2048 bits)) (No client certificate requested) by lists.ozlabs.org (Postfix) with ESMTPS id 46CMc33vxCzDqf6 for ; Tue, 20 Aug 2019 17:19:15 +1000 (AEST) Authentication-Results: lists.ozlabs.org; dmarc=none (p=none dis=none) header.from=popple.id.au Received: from authenticated.ozlabs.org (localhost [127.0.0.1]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange ECDHE (P-256) server-signature RSA-PSS (4096 bits) server-digest SHA256) (No client certificate requested) by mail.ozlabs.org (Postfix) with ESMTPSA id 46CMc3246jz9sN4; Tue, 20 Aug 2019 17:19:15 +1000 (AEST) From: Alistair Popple To: pdbg@lists.ozlabs.org Date: Tue, 20 Aug 2019 17:19:05 +1000 Message-Id: <20190820071906.25950-4-alistair@popple.id.au> X-Mailer: git-send-email 2.20.1 In-Reply-To: <20190820071906.25950-1-alistair@popple.id.au> References: <20190820071906.25950-1-alistair@popple.id.au> MIME-Version: 1.0 Subject: [Pdbg] [PATCH 4/5] libpdbg: Rework dt_new_node() X-BeenThere: pdbg@lists.ozlabs.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: "mailing list for https://github.com/open-power/pdbg development" List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: pdbg-bounces+incoming=patchwork.ozlabs.org@lists.ozlabs.org Sender: "Pdbg" Simplify the control logic for dt_new_node() by splitting out the initialisation from the HW unit. Should be no functional change. Signed-off-by: Alistair Popple --- libpdbg/device.c | 89 +++++++++++++++++++++++++++++------------------- 1 file changed, 54 insertions(+), 35 deletions(-) diff --git a/libpdbg/device.c b/libpdbg/device.c index 2fcb184..c4cbc44 100644 --- a/libpdbg/device.c +++ b/libpdbg/device.c @@ -64,60 +64,79 @@ static const char *take_name(const char *name) return name; } -static struct pdbg_target *dt_new_node(const char *name, const void *fdt, int node_offset) +/* Adds information representing an actual target */ +static struct pdbg_target *pdbg_target_new(const void *fdt, int node_offset) { + struct pdbg_target *target; + struct pdbg_target_class *target_class; const struct hw_unit_info *hw_info = NULL; const struct fdt_property *prop; - struct pdbg_target *node; - size_t size = sizeof(*node); - - if (fdt) { - prop = fdt_get_property(fdt, node_offset, "compatible", NULL); - if (prop) { - int i, prop_len = fdt32_to_cpu(prop->len); - - /* - * If I understand correctly, the property we have - * here can be a stringlist with a few compatible - * strings - */ - i = 0; - while (i < prop_len) { - hw_info = pdbg_hwunit_find_compatible(&prop->data[i]); - if (hw_info) { - size = hw_info->size; - break; - } - - i += strlen(&prop->data[i]) + 1; + size_t size; + + prop = fdt_get_property(fdt, node_offset, "compatible", NULL); + if (prop) { + int i, prop_len = fdt32_to_cpu(prop->len); + + /* + * If I understand correctly, the property we have + * here can be a stringlist with a few compatible + * strings + */ + i = 0; + while (i < prop_len) { + hw_info = pdbg_hwunit_find_compatible(&prop->data[i]); + if (hw_info) { + size = hw_info->size; + break; } + + i += strlen(&prop->data[i]) + 1; } } - node = calloc(1, size); - if (!node) { + if (!hw_info) + /* Couldn't find anything implementing this target */ + return NULL; + + target = calloc(1, size); + if (!target) { prerror("Failed to allocate node\n"); abort(); } - if (hw_info) { - struct pdbg_target_class *target_class; + /* hw_info->hw_unit points to a per-target struct type. This + * works because the first member in the per-target struct is + * guaranteed to be the struct pdbg_target (see the comment + * above DECLARE_HW_UNIT). */ + memcpy(target, hw_info->hw_unit, size); + target_class = get_target_class(target->class); + list_add_tail(&target_class->targets, &target->class_link); + + return target; +} - /* hw_info->hw_unit points to a per-target struct type. This - * works because the first member in the per-target struct is - * guaranteed to be the struct pdbg_target (see the comment - * above DECLARE_HW_UNIT). */ - memcpy(node, hw_info->hw_unit, size); - target_class = get_target_class(node->class); - list_add_tail(&target_class->targets, &node->class_link); +static struct pdbg_target *dt_new_node(const char *name, const void *fdt, int node_offset) +{ + struct pdbg_target *node = NULL; + size_t size = sizeof(*node); + + if (fdt) + node = pdbg_target_new(fdt, node_offset); + + if (!node) + node = calloc(1, size); + + if (!node) { + prerror("Failed to allocate node\n"); + abort(); } node->dn_name = take_name(name); node->parent = NULL; list_head_init(&node->properties); list_head_init(&node->children); - /* FIXME: locking? */ node->phandle = ++last_phandle; + return node; } From patchwork Tue Aug 20 07:19:06 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Alistair Popple X-Patchwork-Id: 1149841 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Received: from lists.ozlabs.org (lists.ozlabs.org [203.11.71.2]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (4096 bits) server-digest SHA256) (No client certificate requested) by ozlabs.org (Postfix) with ESMTPS id 46CMcR56xPz9s00 for ; Tue, 20 Aug 2019 17:19:35 +1000 (AEST) Authentication-Results: ozlabs.org; dmarc=none (p=none dis=none) header.from=popple.id.au Received: from bilbo.ozlabs.org (lists.ozlabs.org [IPv6:2401:3900:2:1::3]) by lists.ozlabs.org (Postfix) with ESMTP id 46CMcQ6t9szDqfD for ; Tue, 20 Aug 2019 17:19:34 +1000 (AEST) X-Original-To: pdbg@lists.ozlabs.org Delivered-To: pdbg@lists.ozlabs.org Received: from ozlabs.org (bilbo.ozlabs.org [IPv6:2401:3900:2:1::2]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (2048 bits)) (No client certificate requested) by lists.ozlabs.org (Postfix) with ESMTPS id 46CMc41mwXzDqf2 for ; Tue, 20 Aug 2019 17:19:16 +1000 (AEST) Authentication-Results: lists.ozlabs.org; dmarc=none (p=none dis=none) header.from=popple.id.au Received: from authenticated.ozlabs.org (localhost [127.0.0.1]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange ECDHE (P-256) server-signature RSA-PSS (4096 bits) server-digest SHA256) (No client certificate requested) by mail.ozlabs.org (Postfix) with ESMTPSA id 46CMc35h1Nz9sN6; Tue, 20 Aug 2019 17:19:15 +1000 (AEST) From: Alistair Popple To: pdbg@lists.ozlabs.org Date: Tue, 20 Aug 2019 17:19:06 +1000 Message-Id: <20190820071906.25950-5-alistair@popple.id.au> X-Mailer: git-send-email 2.20.1 In-Reply-To: <20190820071906.25950-1-alistair@popple.id.au> References: <20190820071906.25950-1-alistair@popple.id.au> MIME-Version: 1.0 Subject: [Pdbg] [PATCH 5/5] libpdbg: Change get_target_class() to take a pdbg_target X-BeenThere: pdbg@lists.ozlabs.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: "mailing list for https://github.com/open-power/pdbg development" List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: Amitay Isaacs Errors-To: pdbg-bounces+incoming=patchwork.ozlabs.org@lists.ozlabs.org Sender: "Pdbg" No behavioural change. Signed-off-by: Alistair Popple Reviewed-by: Amitay Isaacs --- libpdbg/device.c | 2 +- libpdbg/target.c | 8 ++++---- libpdbg/target.h | 2 +- 3 files changed, 6 insertions(+), 6 deletions(-) diff --git a/libpdbg/device.c b/libpdbg/device.c index c4cbc44..13d3314 100644 --- a/libpdbg/device.c +++ b/libpdbg/device.c @@ -109,7 +109,7 @@ static struct pdbg_target *pdbg_target_new(const void *fdt, int node_offset) * guaranteed to be the struct pdbg_target (see the comment * above DECLARE_HW_UNIT). */ memcpy(target, hw_info->hw_unit, size); - target_class = get_target_class(target->class); + target_class = get_target_class(target); list_add_tail(&target_class->targets, &target->class_link); return target; diff --git a/libpdbg/target.c b/libpdbg/target.c index 67191b5..5808d02 100644 --- a/libpdbg/target.c +++ b/libpdbg/target.c @@ -356,18 +356,18 @@ struct pdbg_target_class *require_target_class(const char *name) } /* Returns the existing class or allocates space for a new one */ -struct pdbg_target_class *get_target_class(const char *name) +struct pdbg_target_class *get_target_class(struct pdbg_target *target) { struct pdbg_target_class *target_class; - if ((target_class = find_target_class(name))) + if ((target_class = find_target_class(target->class))) return target_class; /* Need to allocate a new class */ - PR_DEBUG("Allocating %s target class\n", name); + PR_DEBUG("Allocating %s target class\n", target->class); target_class = calloc(1, sizeof(*target_class)); assert(target_class); - target_class->name = strdup(name); + target_class->name = strdup(target->class); list_head_init(&target_class->targets); list_add_tail(&target_classes, &target_class->class_head_link); return target_class; diff --git a/libpdbg/target.h b/libpdbg/target.h index 9394447..2ecbf98 100644 --- a/libpdbg/target.h +++ b/libpdbg/target.h @@ -55,7 +55,7 @@ struct pdbg_target { struct pdbg_target *require_target_parent(struct pdbg_target *target); struct pdbg_target_class *find_target_class(const char *name); struct pdbg_target_class *require_target_class(const char *name); -struct pdbg_target_class *get_target_class(const char *name); +struct pdbg_target_class *get_target_class(struct pdbg_target *target); bool pdbg_target_is_class(struct pdbg_target *target, const char *class); extern struct list_head empty_list;