From patchwork Mon Apr 15 01:14:12 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Rashmica Gupta X-Patchwork-Id: 1085423 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)) (No client certificate requested) by ozlabs.org (Postfix) with ESMTPS id 44j9Wz6CQTz9s5c for ; Mon, 15 Apr 2019 11:14:39 +1000 (AEST) Authentication-Results: ozlabs.org; dmarc=fail (p=none dis=none) header.from=gmail.com Authentication-Results: ozlabs.org; dkim=fail reason="signature verification failed" (2048-bit key; unprotected) header.d=gmail.com header.i=@gmail.com header.b="Q7ZZOXqu"; dkim-atps=neutral Received: from lists.ozlabs.org (lists.ozlabs.org [IPv6:2401:3900:2:1::3]) by lists.ozlabs.org (Postfix) with ESMTP id 44j9Wz4V2ZzDqK9 for ; Mon, 15 Apr 2019 11:14:39 +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::443; helo=mail-pf1-x443.google.com; envelope-from=rashmica.g@gmail.com; receiver=) Authentication-Results: lists.ozlabs.org; dmarc=pass (p=none dis=none) header.from=gmail.com Authentication-Results: lists.ozlabs.org; dkim=pass (2048-bit key; unprotected) header.d=gmail.com header.i=@gmail.com header.b="Q7ZZOXqu"; dkim-atps=neutral Received: from mail-pf1-x443.google.com (mail-pf1-x443.google.com [IPv6:2607:f8b0:4864:20::443]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by lists.ozlabs.org (Postfix) with ESMTPS id 44j9Wm4wbNzDqJs for ; Mon, 15 Apr 2019 11:14:28 +1000 (AEST) Received: by mail-pf1-x443.google.com with SMTP id c207so7731647pfc.7 for ; Sun, 14 Apr 2019 18:14:28 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=from:to:cc:subject:date:message-id:in-reply-to:references; bh=01R/ZR6VBa91wfCepcHE7iwEZoE4CkH0DWnEhHeiMZg=; b=Q7ZZOXqu+lp0TZSkU+Lfs0x+hDNca4sZnMt3lrfoFwVl15hVBc/1e/SzWqxmqurpwQ JWfXi3Tz8W25FBi+QomPdm25HFXf6KLDq3GkS69eKULh63VMH+JzEQmwwPLy125tm+RF RW6ELzDVr5UuKoafzdREP7Lt2TexuTF9DWhdl5wYdbt07AtKmGDeIvw0A/7Uu5UfidoZ EnmTJWEpmL+wKt0W6CPs6R/dP9WygcDTxcusUFkLG2ACBg1zzrljRgI0IN5t60UsEf6y pMJVb5m6cT9aA04VbnJT7jrnQseR+si3J+tB56usEFhl4xMqTJrGhnGxi61MQaSFYzAm JVHg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references; bh=01R/ZR6VBa91wfCepcHE7iwEZoE4CkH0DWnEhHeiMZg=; b=ryggq+5k54vFEqHhfBTvkv+w1OihaGSNUerdZWYlY1osyxxrom1iR5H1hRBx9E0RuO hAc/gA1Vz4qKQuA8xHz7TqjZTklveOHx+UWRNTQuMVLpz3dPq9HjFvPUlG432y+RAzqO HacTT8Ee9M2agAl1+gIEtHV8aYS7rzckBs1Ch2KPPxT2NUVQoBAho4X+1XRDNAYiImip 6327GVEXjLR0n7BEIeQOXTadtRSn9RBhNJGIQQ0dCLxZeEaisrLS9FubRFKhpFzFr+sQ S1F8RLfs8c2OWj4H3rnY3zoVhdPwJ3AEAC+d5Pt74t3Q5hnvS1wjr0AU3UqpaRJtgL4H Y2jg== X-Gm-Message-State: APjAAAVdXZd8mzY9XnjdcdvQuuBDanclzPU+M1ONnGs67LOyfxzuezG6 qxFyoGBxNCnxSHGTRTbTL8PeSjeV X-Google-Smtp-Source: APXvYqxqbOXVZrNJ+G3/cWZV4mpmes5lGh1ixzeCi+3S6W6oysQgOWddEt8JCKH+kqxS9+rv5FV+Dw== X-Received: by 2002:aa7:8092:: with SMTP id v18mr70615260pff.35.1555290866080; Sun, 14 Apr 2019 18:14:26 -0700 (PDT) Received: from rashmica.ozlabs.ibm.com ([122.99.82.10]) by smtp.gmail.com with ESMTPSA id m7sm64205162pgg.62.2019.04.14.18.14.23 (version=TLS1_2 cipher=ECDHE-RSA-CHACHA20-POLY1305 bits=256/256); Sun, 14 Apr 2019 18:14:25 -0700 (PDT) From: Rashmica Gupta To: pdbg@lists.ozlabs.org, alistair@popple.id.au, joel@jms.id.au Date: Mon, 15 Apr 2019 11:14:12 +1000 Message-Id: <20190415011414.22315-2-rashmica.g@gmail.com> X-Mailer: git-send-email 2.17.2 In-Reply-To: <20190415011414.22315-1-rashmica.g@gmail.com> References: <20190415011414.22315-1-rashmica.g@gmail.com> Subject: [Pdbg] [PATCH 1/3] libpdbg: use i2ctools lib 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: , MIME-Version: 1.0 Errors-To: pdbg-bounces+incoming=patchwork.ozlabs.org@lists.ozlabs.org Sender: "Pdbg" This should do the same thing as the i2ctools i2cget cmd. Signed-off-by: Rashmica Gupta --- Makefile.am | 7 ++++ configure.ac | 5 +++ libpdbg/i2cm.c | 87 +++++++++++++++++++++++++++++++++++++++++++++++ libpdbg/libpdbg.h | 3 ++ libpdbg/target.c | 11 ++++++ libpdbg/target.h | 9 +++++ p9-i2c.dts.m4 | 21 ++++++++++++ p9-kernel.dts.m4 | 8 +++++ src/i2c.c | 48 ++++++++++++++++++++++++++ src/main.c | 5 +-- src/parsers.c | 18 ++++++++++ src/parsers.h | 2 ++ 12 files changed, 222 insertions(+), 2 deletions(-) create mode 100644 libpdbg/i2cm.c create mode 100644 p9-i2c.dts.m4 create mode 100644 src/i2c.c diff --git a/Makefile.am b/Makefile.am index d34cf20..25a6edb 100644 --- a/Makefile.am +++ b/Makefile.am @@ -75,6 +75,7 @@ pdbg_SOURCES = \ src/cfam.c \ src/htm.c \ src/htm.h \ + src/i2c.c \ src/main.c \ src/main.h \ src/mem.c \ @@ -132,6 +133,11 @@ lib_LTLIBRARIES = libfdt.la libpdbg.la libfdt_la_CFLAGS = -I$(top_srcdir)/libfdt libpdbg_la_CFLAGS = -I$(top_srcdir)/libfdt -Wall -Werror +if I2CLIB +pdbg_LDADD += -li2c +else +libpdbg_la_CFLAGS += -DDISABLE_I2CLIB +endif libfdt_la_SOURCES = \ libfdt/fdt_addresses.c \ @@ -164,6 +170,7 @@ libpdbg_la_SOURCES = \ libpdbg/host.c \ libpdbg/htm.c \ libpdbg/i2c.c \ + libpdbg/i2cm.c \ libpdbg/kernel.c \ libpdbg/libpdbg.c \ libpdbg/libpdbg.h \ diff --git a/configure.ac b/configure.ac index a52e1ed..962be3a 100644 --- a/configure.ac +++ b/configure.ac @@ -42,4 +42,9 @@ want_gdbserver=false, want_gdbserver=true) AM_CONDITIONAL([GDBSERVER], [test x$want_gdbserver = xtrue]) +AC_ARG_ENABLE(i2clib, +AC_HELP_STRING([--disable-i2clib], [disables looking for the i2c lib]), +want_i2clib=false, +want_i2clib=true) +AM_CONDITIONAL([I2CLIB], [test x$want_i2clib = xtrue]) AC_OUTPUT diff --git a/libpdbg/i2cm.c b/libpdbg/i2cm.c new file mode 100644 index 0000000..0c8129b --- /dev/null +++ b/libpdbg/i2cm.c @@ -0,0 +1,87 @@ +/* Copyright 2019 IBM Corp. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + * implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include "bitutils.h" +#include "operations.h" +#include "debug.h" + + +#include +#include +#include + +#ifndef DISABLE_I2CLIB +#include + +static int kernel_i2c_get(struct i2cm *i2cm, uint32_t addr, uint16_t size, uint8_t *data) +{ + int res = 0; + //fix this is smbus not i2cget + uint32_t offset = 0; + + if (ioctl(i2cm->i2c_fd, I2C_SLAVE, addr) < 0) + return -1; + + res = i2c_smbus_read_byte_data(i2cm->i2c_fd, offset); + if (res >= 0) { + PR_DEBUG("read %x from device %x\n", res, addr); + *data = (uint64_t)res; + return res; + } + return -1; +} + +static int i2cbus_probe(struct pdbg_target *target) +{ + int i2c_fd = 0; + int len; + char i2c_path[NAME_MAX]; + + if (!target->index) + return -1; + struct i2cm *i2cm = target_to_i2cm(target); + + len = snprintf(i2c_path, NAME_MAX, "/dev/i2c-%i", target->index); + if (len >= NAME_MAX) + return -1; + i2c_fd = open(i2c_path, O_RDWR); + if (!i2c_fd) + return -1; + i2cm->i2c_fd = i2c_fd; + return 0; +} + +static struct i2cm i2c_bus = { + .target = { + .name = "I2C Bus", + .compatible = "ibm,power9-i2c-port", + .class = "i2cm", + .probe = i2cbus_probe, + }, + .read = kernel_i2c_get, +}; +DECLARE_HW_UNIT(i2c_bus); +#endif diff --git a/libpdbg/libpdbg.h b/libpdbg/libpdbg.h index 4fad158..9baab0e 100644 --- a/libpdbg/libpdbg.h +++ b/libpdbg/libpdbg.h @@ -123,6 +123,9 @@ struct pdbg_target *pdbg_address_absolute(struct pdbg_target *target, uint64_t * int fsi_read(struct pdbg_target *target, uint32_t addr, uint32_t *val); int fsi_write(struct pdbg_target *target, uint32_t addr, uint32_t val); +int i2c_read(struct pdbg_target *target, uint16_t port, uint32_t addr, + uint16_t size, uint8_t *data); + int pib_read(struct pdbg_target *target, uint64_t addr, uint64_t *val); int pib_write(struct pdbg_target *target, uint64_t addr, uint64_t val); int pib_wait(struct pdbg_target *pib_dt, uint64_t addr, uint64_t mask, uint64_t data); diff --git a/libpdbg/target.c b/libpdbg/target.c index e678470..f577bb3 100644 --- a/libpdbg/target.c +++ b/libpdbg/target.c @@ -195,6 +195,17 @@ int opb_write(struct pdbg_target *opb_dt, uint32_t addr, uint32_t data) return opb->write(opb, addr64, data); } +int i2c_read(struct pdbg_target *i2cm_dt, uint16_t port, uint32_t addr, uint16_t size, uint8_t *data) +{ + struct i2cm *i2cm; + uint64_t addr64 = addr; + + i2cm_dt = get_class_target_addr(i2cm_dt, "i2cm", &addr64); + i2cm = target_to_i2cm(i2cm_dt); + + return i2cm->read(i2cm, addr, size, data); +} + int fsi_read(struct pdbg_target *fsi_dt, uint32_t addr, uint32_t *data) { struct fsi *fsi; diff --git a/libpdbg/target.h b/libpdbg/target.h index 04897ed..14f2b79 100644 --- a/libpdbg/target.h +++ b/libpdbg/target.h @@ -138,6 +138,15 @@ struct fsi { }; #define target_to_fsi(x) container_of(x, struct fsi, target) +struct i2cm { + struct pdbg_target target; + int (*read)(struct i2cm *, uint32_t, uint16_t, uint8_t *); + int (*write)(struct i2cm *, uint32_t, uint16_t, uint8_t*); + int i2c_fd; +}; +#define target_to_i2cm(x) container_of(x, struct i2cm, target) + + struct core { struct pdbg_target target; bool release_spwkup; diff --git a/p9-i2c.dts.m4 b/p9-i2c.dts.m4 new file mode 100644 index 0000000..8e8270f --- /dev/null +++ b/p9-i2c.dts.m4 @@ -0,0 +1,21 @@ +define(`I2CBUS', `i2c-bus@$1 { +bus-frequency = <0x61a80>; +compatible = "ibm,opal-i2c", "ibm,power8-i2c-port", "ibm,power9-i2c-port"; +index = <$1>; +reg = <0x0 0x0 $1>; +}')dnl + +I2CBUS(0); +I2CBUS(1); +I2CBUS(2); +I2CBUS(3); +I2CBUS(4); +I2CBUS(5); +I2CBUS(6); +I2CBUS(7); +I2CBUS(8); +I2CBUS(9); +I2CBUS(10); +I2CBUS(11); +I2CBUS(12); +I2CBUS(13); diff --git a/p9-kernel.dts.m4 b/p9-kernel.dts.m4 index 195be59..474beca 100644 --- a/p9-kernel.dts.m4 +++ b/p9-kernel.dts.m4 @@ -22,6 +22,14 @@ include(p9-pib.dts.m4)dnl }; + i2cm@1800 { + #address-cells = <0x2>; + #size-cells = <0x1>; + reg = <0x0 0x1800 0x400>; + compatible = "ibm,kernel-i2c-master"; + include(p9-i2c.dts.m4)dnl + }; + hmfsi@100000 { #address-cells = <0x2>; #size-cells = <0x1>; diff --git a/src/i2c.c b/src/i2c.c new file mode 100644 index 0000000..9ac3d53 --- /dev/null +++ b/src/i2c.c @@ -0,0 +1,48 @@ +/* Copyright 2019 IBM Corp. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + * implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include +#include +#include + +#include "main.h" +#include "optcmd.h" +#include "path.h" +#include "target.h" + +static int geti2c(uint16_t port, uint32_t addr, uint16_t size) +{ + uint8_t *data = NULL; + struct pdbg_target *target, *selected = NULL; + + data = malloc(size); + assert(data); + + for_each_path_target_class("i2cbus", target) { + if (pdbg_target_probe(target) != PDBG_TARGET_ENABLED) + continue; + selected = target; + if (i2c_read(target, port, addr, size, data) == 0) + break; + break; + } + + if (selected == NULL) + return -1; + printf("data read: 0x%016" PRIx64 "\n", (uint64_t)*data); + return 0; +} +OPTCMD_DEFINE_CMD_WITH_ARGS(geti2c, geti2c, (DATA16, ADDRESS32, DATA16)); diff --git a/src/main.c b/src/main.c index d5f9385..1702efa 100644 --- a/src/main.c +++ b/src/main.c @@ -93,7 +93,7 @@ extern struct optcmd_cmd optcmd_threadstatus, optcmd_sreset, optcmd_regs, optcmd_probe, optcmd_getmem, optcmd_putmem, optcmd_getmemio, optcmd_putmemio, optcmd_getxer, optcmd_putxer, optcmd_getcr, optcmd_putcr, - optcmd_gdbserver; + optcmd_gdbserver, optcmd_geti2c; static struct optcmd_cmd *cmds[] = { &optcmd_getscom, &optcmd_putscom, &optcmd_getcfam, &optcmd_putcfam, @@ -103,7 +103,7 @@ static struct optcmd_cmd *cmds[] = { &optcmd_threadstatus, &optcmd_sreset, &optcmd_regs, &optcmd_probe, &optcmd_getmem, &optcmd_putmem, &optcmd_getmemio, &optcmd_putmemio, &optcmd_getxer, &optcmd_putxer, &optcmd_getcr, &optcmd_putcr, - &optcmd_gdbserver, + &optcmd_gdbserver, &optcmd_geti2c, }; /* Purely for printing usage text. We could integrate printing argument and flag @@ -145,6 +145,7 @@ static struct action actions[] = { { "sreset", "", "Reset" }, { "regs", "[--backtrace]", "State (optionally display backtrace)" }, { "gdbserver", "", "Start a gdb server" }, + { "geti2c", " ", "Read size bytes from the offset of specified device" }, }; static void print_usage(void) diff --git a/src/parsers.c b/src/parsers.c index 8575784..4c03db9 100644 --- a/src/parsers.c +++ b/src/parsers.c @@ -56,6 +56,24 @@ uint16_t *parse_number16(const char *argv) return n; } +uint8_t *parse_number8(const char *argv) +{ + unsigned long long tmp; + uint8_t *n = malloc(sizeof(*n)); + char *endptr; + + if (!argv) + return NULL; + + errno = 0; + tmp = strtoul(argv, &endptr, 0); + if (errno || *endptr != '\0' || tmp > UINT8_MAX) + return NULL; + + *n = tmp; + return n; +} + /* Parse an 8-bit number that is a power of 2 */ uint8_t *parse_number8_pow2(const char *argv) { diff --git a/src/parsers.h b/src/parsers.h index ba52178..27ada1f 100644 --- a/src/parsers.h +++ b/src/parsers.h @@ -9,6 +9,7 @@ #define DATA (parse_number64, NULL) #define DATA32 (parse_number32, NULL) #define DATA16 (parse_number16, NULL) +#define DATA8 (parse_number8, NULL) #define DEFAULT_DATA(default) (parse_number64, default) #define GPR (parse_gpr, NULL) #define SPR (parse_spr, NULL) @@ -16,6 +17,7 @@ uint64_t *parse_number64(const char *argv); uint32_t *parse_number32(const char *argv); uint16_t *parse_number16(const char *argv); +uint8_t *parse_number8(const char *argv); uint8_t *parse_number8_pow2(const char *argv); int *parse_gpr(const char *argv); int *parse_spr(const char *argv);