Received: by 2002:a25:4158:0:0:0:0:0 with SMTP id o85csp5134053yba; Wed, 10 Apr 2019 12:06:41 -0700 (PDT) X-Google-Smtp-Source: APXvYqyYLEsimV6+lS5QUKzG0/MA4gx2vq8vwW/UpXjyVUa3eKIZ/KH6KhGLixmor6WxdUpnhjil X-Received: by 2002:aa7:82cb:: with SMTP id f11mr45821550pfn.0.1554923201859; Wed, 10 Apr 2019 12:06:41 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1554923201; cv=none; d=google.com; s=arc-20160816; b=ools0DnwvlWdaO1ks5OQsRv8d586/Vws3R7zVNMgwddK7Gj8Itk27JlePWncDM6gSC rhFdfNJeOSpKPLepjAlOWY8MjY0xueTrXcvIrXTffXdVo4FKQExt+wLqYWNGrg9TFPxH KXiJD3rxpg0tiEem5+YZfj0cgTE6ozJENG1pzIfd4kdR54e1uxPKdPpp/ZZl0iwE8NBd e106hthDkuD8dX7iPL3hyLZiI5inox8GvwMY0uCMLcZmftLQp+SmP/9y1aE78BBDdTYx zxHXAdFweyLr9fjRPzk5Xmo9ATVups4hZTr1+6+uBTfEOJaIjk3aHAwYOE8Qifrbld36 zHsw== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:sender:content-transfer-encoding:mime-version :message-id:date:subject:cc:to:from:dkim-signature; bh=IJF9H8q67MNeTsMwLMUcQ9q9YgSQzYtibBojtDcgcJY=; b=JAJ6xX03y0FmDnrc4G4C+kjSsXMD56+yRohgimoeu/xTsP1oO4krLDxXxp6CsaO5yF rZl4dZM/NwM1jKl3XmkSyFWJaOil5iRPZ7jUpzC/UNEwi2vLhsuqWakHjRcftVdPml+l kpPkt0KkIjp13NY82vmlIlUCrbpmV3cqOmZGKjdF44N59sU4Fz7S422kTXzW9+0VsAs+ 6SDrfrfS5ClaLC3rKPYrf58HFvWO3/GgAEsHICRUD6PryFeXYG9BsS+TXmjmJqrK6KzZ Kiev8ZLDhr+yWWR1jyWxIE2u371cRNO638E2ZlI+CbHwHD/4jWmvuNUDzNQn7nH+1dd3 tkIw== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@chromium.org header.s=google header.b=TFKEnCDs; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=chromium.org Return-Path: Received: from vger.kernel.org (vger.kernel.org. [209.132.180.67]) by mx.google.com with ESMTP id 34si4786764plf.288.2019.04.10.12.06.25; Wed, 10 Apr 2019 12:06:41 -0700 (PDT) Received-SPF: pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) client-ip=209.132.180.67; Authentication-Results: mx.google.com; dkim=pass header.i=@chromium.org header.s=google header.b=TFKEnCDs; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=chromium.org Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1729937AbfDJRnz (ORCPT + 99 others); Wed, 10 Apr 2019 13:43:55 -0400 Received: from mail-io1-f66.google.com ([209.85.166.66]:33732 "EHLO mail-io1-f66.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1729318AbfDJRnz (ORCPT ); Wed, 10 Apr 2019 13:43:55 -0400 Received: by mail-io1-f66.google.com with SMTP id b6so2942421iog.0 for ; Wed, 10 Apr 2019 10:43:54 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=chromium.org; s=google; h=from:to:cc:subject:date:message-id:mime-version :content-transfer-encoding; bh=IJF9H8q67MNeTsMwLMUcQ9q9YgSQzYtibBojtDcgcJY=; b=TFKEnCDsHmcdPNRJU4IDGSEqV1YhPf3u9b+9A/qdCKkHRznqB43JNUXXmoPdUYjTvH 6ssW0XG+7VmUgSkklMSVGLej+IrS4UzD2RqxM/BLBcQcof6IcEac6bxGjC4v67IF2KDu DW8NeKA3ZVueL66Vun2giV9rpckmdFwbblc8Q= 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:mime-version :content-transfer-encoding; bh=IJF9H8q67MNeTsMwLMUcQ9q9YgSQzYtibBojtDcgcJY=; b=ffRUfRWxjSTmaCeFrhj/3ziVQKUiOIWNxvnWYWUXP6R3q1qjobLAIHFqNuQrpNViSU NN85MEBycPAMqI5dpdFSaqr6BPpVuhsPrMdNV48YaYKJiu4vqh/VVgBLIthRiaVk5U69 TEwJiYj4Nh6Mm8FJzlVhxQle/0r7HEJgBVzVrmg56xg1hYelb8aSnbky9ZYsNZUjkwML znQQDIs12va0GTWAgpvQpl911VG7fOrKCp1a5yN9uutnRZLX8//9aP2Ih9GxlSEGRojD iPgxGFYcZSuVU3+nocx2Ap6A6hVJ65onAJXYdwmPAYkV9IOX+0YSsOjfABTKWbJ+DtXk 2GIQ== X-Gm-Message-State: APjAAAUhZDS/gKuYTIRzTvUVVc8Roevuk+FVGHTn1zwH1XVHtgURenbC hwZR8zcvfMLgyuhwT70OZtiqjw== X-Received: by 2002:a6b:9189:: with SMTP id t131mr22582648iod.95.1554918234398; Wed, 10 Apr 2019 10:43:54 -0700 (PDT) Received: from ncrews2.bld.corp.google.com ([2620:15c:183:200:cb43:2cd4:65f5:5c84]) by smtp.gmail.com with ESMTPSA id j10sm1326459itj.32.2019.04.10.10.43.52 (version=TLS1_2 cipher=ECDHE-RSA-AES128-SHA bits=128/128); Wed, 10 Apr 2019 10:43:53 -0700 (PDT) From: Nick Crews To: enric.balletbo@collabora.com, bleung@chromium.org Cc: linux-kernel@vger.kernel.org, dlaurie@chromium.org, derat@google.com, groeck@google.com, dtor@google.com, sjg@chromium.org, alevkoy@google.com, Nick Crews Subject: [PATCH] platform/chrome: wilco_ec: Add h1_gpio status to debugfs Date: Wed, 10 Apr 2019 11:43:46 -0600 Message-Id: <20190410174346.225490-1-ncrews@chromium.org> X-Mailer: git-send-email 2.20.1 MIME-Version: 1.0 Content-Transfer-Encoding: 8bit Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org As part of Chrome OS's FAFT (Fully Automated Firmware Testing) tests, we need to ensure that the H1 chip is properly setting some GPIO lines. The h1_gpio attribute exposes the state of the lines: - ENTRY_TO_FACT_MODE in BIT(0) - SPI_CHROME_SEL in BIT(1) There are two reasons that I am exposing this in debugfs, and not as a GPIO: 1. This is only useful for testing, so end users shouldn't ever care about this. In fact, if it passes the tests, then the value of h1_gpio will always be 2, so it would be really uninteresting for users. 2. This GPIO is not connected to, controlled by, or really even related to the AP. The GPIO runs between the EC and the H1 security chip. Signed-off-by: Nick Crews --- drivers/platform/chrome/wilco_ec/debugfs.c | 66 +++++++++++++++++++++- 1 file changed, 65 insertions(+), 1 deletion(-) diff --git a/drivers/platform/chrome/wilco_ec/debugfs.c b/drivers/platform/chrome/wilco_ec/debugfs.c index 17c4c9068aaf..198c16476efc 100644 --- a/drivers/platform/chrome/wilco_ec/debugfs.c +++ b/drivers/platform/chrome/wilco_ec/debugfs.c @@ -4,7 +4,7 @@ * * Copyright 2019 Google LLC * - * There is only one attribute used for debugging, called raw. + * The raw attribute is very useful for EC debugging. * You can write a hexadecimal sentence to raw, and that series of bytes * will be sent to the EC. Then, you can read the bytes of response * by reading from raw. @@ -30,6 +30,16 @@ * Note that the first 32 bytes of the received MBOX[] will be printed, * even if some of the data is junk. It is up to you to know how many of * the first bytes of data are the actual response. + * + * There is also another debugfs attribute, called h1_gpio. + * As part of Chrome OS's FAFT (Fully Automated Firmware Testing) + * tests, we need to ensure that the H1 chip is properly setting + * some GPIO lines. The h1_gpio attribute exposes the state + * of the lines: + * - ENTRY_TO_FACT_MODE in BIT(0) + * - SPI_CHROME_SEL in BIT(1) + + * Output will be "0\n", "1\n", "2\n", or "3\n". */ #include @@ -189,6 +199,58 @@ static const struct file_operations fops_raw = { .llseek = no_llseek, }; +#define CMD_KB_CHROME 0x88 +#define SUB_CMD_H1_GPIO 0x0A + +struct h1_gpio_status_request { + u8 cmd; /* Always CMD_KB_CHROME */ + u8 reserved; + u8 sub_cmd; /* Always SUB_CMD_H1_GPIO */ +} __packed; + +struct hi_gpio_status_response { + u8 status; /* 0 if allowed */ + u8 val; /* BIT(0)=ENTRY_TO_FACT_MODE, BIT(1)=SPI_CHROME_SEL */ +} __packed; + +static ssize_t h1_gpio_read(struct file *file, char __user *user_buf, + size_t count, loff_t *ppos) +{ + struct h1_gpio_status_request rq; + struct hi_gpio_status_response rs; + struct wilco_ec_message msg; + char buf[3]; + int ret; + + rq.cmd = CMD_KB_CHROME; + rq.sub_cmd = SUB_CMD_H1_GPIO; + + memset(&msg, 0, sizeof(msg)); + msg.type = WILCO_EC_MSG_LEGACY; + msg.request_data = &rq; + msg.request_size = sizeof(rq); + msg.response_data = &rs; + msg.response_size = sizeof(rs); + ret = wilco_ec_mailbox(debug_info->ec, &msg); + if (ret < 0) + return ret; + if (rs.status) + return -EIO; + if (rs.val > 3) + return -EBADMSG; + + /* When rs.val <= 3, it's guaranteed to fit in buf after formatting */ + sprintf(buf, "%d\n", rs.val); + + return simple_read_from_buffer(user_buf, count, ppos, buf, sizeof(buf)); +} + +static const struct file_operations fops_h1_gpio = { + .owner = THIS_MODULE, + .read = h1_gpio_read, + .llseek = no_llseek, +}; + /** * wilco_ec_debugfs_probe() - Create the debugfs node * @pdev: The platform device, probably created in core.c @@ -210,6 +272,8 @@ static int wilco_ec_debugfs_probe(struct platform_device *pdev) if (!debug_info->dir) return 0; debugfs_create_file("raw", 0644, debug_info->dir, NULL, &fops_raw); + debugfs_create_file("h1_gpio", 0444, debug_info->dir, NULL, + &fops_h1_gpio); return 0; } -- 2.20.1