From patchwork Thu Sep 26 06:11:42 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Joel Stanley X-Patchwork-Id: 1167760 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) server-digest SHA256) (No client certificate requested) by ozlabs.org (Postfix) with ESMTPS id 46f4MV3XSRz9sPS for ; Thu, 26 Sep 2019 16:12:06 +1000 (AEST) Authentication-Results: ozlabs.org; dmarc=none (p=none dis=none) header.from=jms.id.au Authentication-Results: ozlabs.org; dkim=fail reason="signature verification failed" (2048-bit key; unprotected) header.d=gmail.com header.i=@gmail.com header.b="AwLk6FYX"; dkim-atps=neutral Received: from bilbo.ozlabs.org (lists.ozlabs.org [IPv6:2401:3900:2:1::3]) by lists.ozlabs.org (Postfix) with ESMTP id 46f4MV0MmFzDqld for ; Thu, 26 Sep 2019 16:12:06 +1000 (AEST) X-Original-To: pdbg@lists.ozlabs.org Delivered-To: pdbg@lists.ozlabs.org Authentication-Results: lists.ozlabs.org; spf=pass (mailfrom) smtp.mailfrom=gmail.com (client-ip=2607:f8b0:4864:20::644; helo=mail-pl1-x644.google.com; envelope-from=joel.stan@gmail.com; receiver=) Authentication-Results: lists.ozlabs.org; dmarc=none (p=none dis=none) header.from=jms.id.au Authentication-Results: lists.ozlabs.org; dkim=pass (2048-bit key; unprotected) header.d=gmail.com header.i=@gmail.com header.b="AwLk6FYX"; dkim-atps=neutral Received: from mail-pl1-x644.google.com (mail-pl1-x644.google.com [IPv6:2607:f8b0:4864:20::644]) (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 46f4MM3H1hzDqlK for ; Thu, 26 Sep 2019 16:11:58 +1000 (AEST) Received: by mail-pl1-x644.google.com with SMTP id k7so868015pll.1 for ; Wed, 25 Sep 2019 23:11:58 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=sender:from:to:subject:date:message-id:mime-version :content-transfer-encoding; bh=rAo9FersZZ0HmsN7Hnk4qmdXwKvDlSPEDuGouNZxH2E=; b=AwLk6FYXaaDrV3bhisFilH9SWr4J4vYdGNQFAsiJclWiUo5GqMSNXLOfYTw8R4s2ib 7ouvckpfzbCH+u/rJOL253rzwWb4qKVdpDnj1WmzhyVAkzMlVxSsYfLAHwtxA1hJjwFf JYrTjMrrN5OdhiA9QoO1jTLtEAppxhoJdlUmzp6U04ZwvsiBQeeBezdZXf7VqcZTqxMV CE6Z1gvaqFcPyDVSI0bQ1b7xbAg7AMKPzlJg/WO2IaOLpkSjko/R6YuU3Om9gHIegekK e3OWE6BsCtn7xJFfbKyPhX2yec63+tvvjyoNiDVfqDQqa02DWKf+LT5vi9QSLskDxaBw a3kw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:sender:from:to:subject:date:message-id :mime-version:content-transfer-encoding; bh=rAo9FersZZ0HmsN7Hnk4qmdXwKvDlSPEDuGouNZxH2E=; b=k+EWo2OxspffE0jY6RYrQ/C3Gq1jDILkoLD8zRE9/GptYGj1kMnRmjMTILBA/f4A50 SVZFbQfFKnSSqIc2UZKFsJDG43ADnba0n6gvvCS+Gn1wMvMPajevUBDdxten9/HMtp/f kZA6CsEMBl2Lmxg96N3ew3WGvALWl/16rbRIsw+HxETIHrZdHuP+tp4YMBvEpK8kQLtv BUD7natH7g+l/kW4RMTSo4aSYSU5tX0tDqzlO6chRMpIG7GQ/PnhBKa6bEN4FVHq11eU oF/JqzQfIKR+MS4rrbmHllIZ2j6WLBGmjcfonU7NmAXsMmuefBXCtBxC3chQDnXWFSvR ddJA== X-Gm-Message-State: APjAAAUS+gTbUsYyAS4FZ3jIwLXtrWLF0+CsGaOKIGvxLYm4sQ38vxW7 5QYYssostzsktpeg3sb7POxbyHoH X-Google-Smtp-Source: APXvYqzca1KFzwIbTApjWGPMuDAviXaDYvIOoZ0F0ahVxnxsMnUqpHu12J8w8S9hNO1+8LWBM1ajGg== X-Received: by 2002:a17:902:6941:: with SMTP id k1mr644042plt.252.1569478313995; Wed, 25 Sep 2019 23:11:53 -0700 (PDT) Received: from voyager.ibm.com ([36.255.48.244]) by smtp.gmail.com with ESMTPSA id d76sm963995pga.80.2019.09.25.23.11.52 for (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 25 Sep 2019 23:11:53 -0700 (PDT) From: Joel Stanley To: pdbg@lists.ozlabs.org Date: Thu, 26 Sep 2019 15:41:42 +0930 Message-Id: <20190926061142.21391-1-joel@jms.id.au> X-Mailer: git-send-email 2.23.0 MIME-Version: 1.0 Subject: [Pdbg] [PATCH v2] kernel: Use FSI master 'class' path 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 paths to sysfs entries depend on the master driver used. This means pdbg needs to use a different path when running against the hardware FSI master present in the ast2600. Instead of adding to an ever growing list of paths to check, the kernel has created a 'fsi-master' class that any driver can add itself to. On a kernel runnign this code, userspace only needs to check under /sys/class/fsi-master for any platform. This patch adds support for the class based path from a common accessor in kernel.c. It retains support for the existing gpio-fsi master. At some point in the distant future the gpio-fsi code could be deleted. Signed-off-by: Joel Stanley --- v2: - Test for new path first so that code is being tested/used - Print a debug message when no devices found --- libpdbg/dtb.c | 14 ++++++++-- libpdbg/kernel.c | 67 ++++++++++++++++++++++++++++++++++++++++------- libpdbg/libpdbg.h | 2 ++ 3 files changed, 71 insertions(+), 12 deletions(-) diff --git a/libpdbg/dtb.c b/libpdbg/dtb.c index 6c4beeda4fe6..2aea625feaf1 100644 --- a/libpdbg/dtb.c +++ b/libpdbg/dtb.c @@ -13,6 +13,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ +#define _GNU_SOURCE #include #include #include @@ -68,7 +69,7 @@ static enum pdbg_backend default_backend(void) if (rc == 0) /* AMI BMC */ return PDBG_BACKEND_I2C; - rc = access(OPENFSI_BMC, F_OK); + rc = access(kernel_get_fsi_path(), F_OK); if (rc == 0) /* Kernel interface. OpenBMC */ return PDBG_BACKEND_KERNEL; @@ -134,7 +135,16 @@ static void *bmc_target(void) if (!pdbg_backend_option) { /* Try and determine the correct device type */ - cfam_id_file = fopen(FSI_CFAM_ID, "r"); + char *path; + + rc = asprintf(&path, "%s/fsi0/slave@00:00/cfam_id", kernel_get_fsi_path()); + if (rc < 0) { + pdbg_log(PDBG_ERROR, "Unable create fsi path"); + return NULL; + } + + cfam_id_file = fopen(path, "r"); + free(path); if (!cfam_id_file) { pdbg_log(PDBG_ERROR, "Unabled to open CFAM ID file\n"); return NULL; diff --git a/libpdbg/kernel.c b/libpdbg/kernel.c index 4cc0334d7eb3..6d88298abfa7 100644 --- a/libpdbg/kernel.c +++ b/libpdbg/kernel.c @@ -13,6 +13,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ +#define _GNU_SOURCE #include #include #include @@ -29,10 +30,36 @@ #include "operations.h" #include "hwunit.h" -#define FSI_SCAN_PATH "/sys/bus/platform/devices/gpio-fsi/fsi0/rescan" -#define FSI_CFAM_PATH "/sys/devices/platform/gpio-fsi/fsi0/slave@00:00/raw" +#define OPENFSI_LEGACY_PATH "/sys/bus/platform/devices/gpio-fsi/" +#define OPENFSI_PATH "/sys/class/fsi-master/" int fsi_fd; +const char *fsi_base; + +const char *kernel_get_fsi_path(void) +{ + int rc; + + if (fsi_base) + return fsi_base; + + rc = access(OPENFSI_PATH, F_OK); + if (rc == 0) { + fsi_base = OPENFSI_PATH; + return fsi_base; + } + + rc = access(OPENFSI_LEGACY_PATH, F_OK); + if (rc == 0) { + fsi_base = OPENFSI_LEGACY_PATH; + return fsi_base; + } + + /* This is an error, but callers use this function when probing */ + PR_DEBUG("Failed to find kernel FSI path\n"); + + return NULL; +} static int kernel_fsi_getcfam(struct fsi *fsi, uint32_t addr64, uint32_t *value) { @@ -42,7 +69,7 @@ static int kernel_fsi_getcfam(struct fsi *fsi, uint32_t addr64, uint32_t *value) rc = lseek(fsi_fd, addr, SEEK_SET); if (rc < 0) { rc = errno; - PR_WARNING("Failed to seek %s", FSI_CFAM_PATH); + PR_WARNING("seek failed: %s", strerror(errno)); return rc; } @@ -69,7 +96,7 @@ static int kernel_fsi_putcfam(struct fsi *fsi, uint32_t addr64, uint32_t data) rc = lseek(fsi_fd, addr, SEEK_SET); if (rc < 0) { rc = errno; - PR_WARNING("Failed to seek %s", FSI_CFAM_PATH); + PR_WARNING("seek failed: %s", strerror(errno)); return rc; } @@ -97,18 +124,27 @@ static void kernel_fsi_destroy(struct pdbg_target *target) static void kernel_fsi_scan_devices(void) { const char one = '1'; + char *path; int rc, fd; - fd = open(FSI_SCAN_PATH, O_WRONLY | O_SYNC); + rc = asprintf(&path, "%s/fsi0/rescan", kernel_get_fsi_path()); + if (rc < 0) { + PR_ERROR("Unable create fsi path"); + return; + } + + fd = open(path, O_WRONLY | O_SYNC); if (fd < 0) { - PR_ERROR("Unable to open %s", FSI_SCAN_PATH); + PR_ERROR("Unable to open %s", path); + free(path); return; } rc = write(fd, &one, sizeof(one)); if (rc < 0) - PR_ERROR("Unable to write to %s", FSI_SCAN_PATH); + PR_ERROR("Unable to write to %s", path); + free(path); close(fd); } @@ -116,12 +152,22 @@ int kernel_fsi_probe(struct pdbg_target *target) { if (!fsi_fd) { int tries = 5; + int rc; + char *path; + + rc = asprintf(&path, "%s/fsi0/rescan", kernel_get_fsi_path()); + if (rc < 0) { + PR_ERROR("Unable create fsi path"); + return rc; + } while (tries) { /* Open first raw device */ - fsi_fd = open(FSI_CFAM_PATH, O_RDWR | O_SYNC); - if (fsi_fd >= 0) + fsi_fd = open(path, O_RDWR | O_SYNC); + if (fsi_fd >= 0) { + free(path); return 0; + } tries--; /* Scan */ @@ -129,7 +175,8 @@ int kernel_fsi_probe(struct pdbg_target *target) sleep(1); } if (fsi_fd < 0) { - PR_ERROR("Unable to open %s", FSI_CFAM_PATH); + PR_ERROR("Unable to open %s", path); + free(path); return -1; } diff --git a/libpdbg/libpdbg.h b/libpdbg/libpdbg.h index 235ff85abdc6..468553bbf4b5 100644 --- a/libpdbg/libpdbg.h +++ b/libpdbg/libpdbg.h @@ -121,6 +121,8 @@ void pdbg_target_priv_set(struct pdbg_target *target, void *priv); struct pdbg_target *pdbg_target_root(void); bool pdbg_target_compatible(struct pdbg_target *target, const char *compatible); +const char *kernel_get_fsi_path(void); + /* Translate an address offset for a target to absolute address in address * space of a "base" target. */ struct pdbg_target *pdbg_address_absolute(struct pdbg_target *target, uint64_t *addr);