From patchwork Thu May 25 07:05:46 2017 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Jeremy Kerr X-Patchwork-Id: 766866 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.2 with cipher ADH-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by ozlabs.org (Postfix) with ESMTPS id 3wYL2P0VwNz9s3T for ; Thu, 25 May 2017 17:08:13 +1000 (AEST) Received: from lists.ozlabs.org (lists.ozlabs.org [IPv6:2401:3900:2:1::3]) by lists.ozlabs.org (Postfix) with ESMTP id 3wYL2N5pWQzDql3 for ; Thu, 25 May 2017 17:08:12 +1000 (AEST) X-Original-To: skiboot@lists.ozlabs.org Delivered-To: skiboot@lists.ozlabs.org Received: from ozlabs.org (ozlabs.org [IPv6:2401:3900:2:1::2]) (using TLSv1.2 with cipher ADH-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by lists.ozlabs.org (Postfix) with ESMTPS id 3wYL0g18wQzDqgh for ; Thu, 25 May 2017 17:06:43 +1000 (AEST) Received: by ozlabs.org (Postfix, from userid 1023) id 3wYL0f5wHmz9sNJ; Thu, 25 May 2017 17:06:42 +1000 (AEST) From: Jeremy Kerr To: skiboot@lists.ozlabs.org Date: Thu, 25 May 2017 17:05:46 +1000 Message-Id: <1495695955-30718-4-git-send-email-jk@ozlabs.org> X-Mailer: git-send-email 2.7.4 In-Reply-To: <1495695955-30718-1-git-send-email-jk@ozlabs.org> References: <1495695955-30718-1-git-send-email-jk@ozlabs.org> Subject: [Skiboot] [PATCH RFC 03/12] opal-prd: allow different chips for occ_reset control action X-BeenThere: skiboot@lists.ozlabs.org X-Mailman-Version: 2.1.23 Precedence: list List-Id: Mailing list for skiboot development List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: Dan Crowell MIME-Version: 1.0 Errors-To: skiboot-bounces+incoming=patchwork.ozlabs.org@lists.ozlabs.org Sender: "Skiboot" Signed-off-by: Jeremy Kerr --- external/opal-prd/opal-prd.c | 70 +++++++++++++++++++++++++++++++------------- 1 file changed, 50 insertions(+), 20 deletions(-) diff --git a/external/opal-prd/opal-prd.c b/external/opal-prd/opal-prd.c index 5e8f798..fec9770 100644 --- a/external/opal-prd/opal-prd.c +++ b/external/opal-prd/opal-prd.c @@ -100,6 +100,9 @@ struct control_msg { struct { unsigned int argc; } run_cmd; + struct { + uint64_t chip; + } occ_reset; }; unsigned int data_len; unsigned char data[]; @@ -1268,17 +1271,32 @@ static void handle_prd_control_occ_error(struct control_msg *msg) msg->response = 0; } -static void handle_prd_control_occ_reset(struct control_msg *msg) +static void handle_prd_control_occ_reset(struct control_msg *send_msg, + struct control_msg *msg) { + struct opal_prd_msg omsg; + uint64_t chip; + int rc; + + /* notify OPAL of the impending reset */ + memset(&omsg, 0, sizeof(omsg)); + omsg.hdr.type = OPAL_PRD_MSG_TYPE_OCC_RESET_NOTIFY; + omsg.hdr.size = htobe16(sizeof(omsg)); + rc = write(ctx->fd, &omsg, sizeof(omsg)); + if (rc != sizeof(omsg)) + pr_log(LOG_WARNING, "FW: Failed to send OCC_RESET message: %m"); + if (!hservice_runtime->process_occ_reset) { pr_log_nocall("process_occ_reset"); return; } - pr_debug("CTRL: calling process_occ_reset(0)"); - call_process_occ_reset(0); - msg->data_len = 0; - msg->response = 0; + chip = msg->occ_reset.chip; + + pr_debug("CTRL: calling process_occ_reset(%ld)", chip); + call_process_occ_reset(chip); + send_msg->data_len = 0; + send_msg->response = 0; } static void handle_prd_control_occ_actuation(struct control_msg *msg, @@ -1386,7 +1404,6 @@ static void handle_prd_control_run_cmd(struct control_msg *send_msg, static void handle_prd_control(struct opal_prd_ctx *ctx, int fd) { struct control_msg msg, *recv_msg, *send_msg; - struct opal_prd_msg omsg; bool enabled = false; int rc, size; @@ -1439,12 +1456,7 @@ static void handle_prd_control(struct opal_prd_ctx *ctx, int fd) handle_prd_control_occ_actuation(send_msg, enabled); break; case CONTROL_MSG_TEMP_OCC_RESET: - omsg.hdr.type = OPAL_PRD_MSG_TYPE_OCC_RESET_NOTIFY; - omsg.hdr.size = htobe16(sizeof(omsg)); - rc = write(ctx->fd, &omsg, sizeof(omsg)); - if (rc != sizeof(omsg)) - pr_log(LOG_WARNING, "FW: Failed to send OCC_RESET message: %m"); - handle_prd_control_occ_reset(send_msg); + handle_prd_control_occ_reset(send_msg, recv_msg); break; case CONTROL_MSG_TEMP_OCC_ERROR: handle_prd_control_occ_error(send_msg); @@ -1743,30 +1755,48 @@ out_close: return rc; } -static int send_occ_control(struct opal_prd_ctx *ctx, const char *str) +static int send_occ_control(struct opal_prd_ctx *ctx, int argc, char *argv[]) { struct control_msg send_msg, *recv_msg = NULL; + const char *op; int rc; + assert(argc > 1); + op = argv[0]; + memset(&send_msg, 0, sizeof(send_msg)); - if (!strcmp(str, "enable")) + if (!strcmp(op, "enable")) send_msg.type = CONTROL_MSG_ENABLE_OCCS; - else if (!strcmp(str, "disable")) + else if (!strcmp(op, "disable")) send_msg.type = CONTROL_MSG_DISABLE_OCCS; - else if (!strcmp(str, "reset")) + else if (!strcmp(op, "reset")) { + unsigned long chip = 0; + + if (argc) { + char *end; + chip = strtoul(argv[0], &end, 0); + if (end == argv[0]) { + pr_log(LOG_ERR, "CTRL: invalid argument %s", + argv[0]); + return -1; + } + } + send_msg.type = CONTROL_MSG_TEMP_OCC_RESET; - else if (!strcmp(str, "process-error")) + send_msg.occ_reset.chip = (uint64_t)chip; + + } else if (!strcmp(op, "process-error")) send_msg.type = CONTROL_MSG_TEMP_OCC_ERROR; else { - pr_log(LOG_ERR, "CTRL: Invalid OCC action '%s'", str); + pr_log(LOG_ERR, "CTRL: Invalid OCC action '%s'", op); return -1; } rc = send_prd_control(&send_msg, &recv_msg); if (recv_msg) { if (recv_msg->response || ctx->debug) - pr_debug("CTRL: OCC action %s returned status %d", str, + pr_debug("CTRL: OCC action %s returned status %d", op, recv_msg->response); free(recv_msg); } @@ -2069,7 +2099,7 @@ int main(int argc, char *argv[]) return EXIT_FAILURE; } - rc = send_occ_control(ctx, argv[optind]); + rc = send_occ_control(ctx, argc - optind, &argv[optind]); break; case ACTION_ATTR_OVERRIDE: if (optind >= argc) {