From patchwork Tue Sep 13 04:27:27 2016 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Jeremy Kerr X-Patchwork-Id: 669138 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Received: from lists.ozlabs.org (lists.ozlabs.org [103.22.144.68]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by ozlabs.org (Postfix) with ESMTPS id 3sYBX10f62z9sD5 for ; Tue, 13 Sep 2016 14:29:05 +1000 (AEST) Received: from ozlabs.org (lists.ozlabs.org [IPv6:2401:3900:2:1::3]) by lists.ozlabs.org (Postfix) with ESMTP id 3sYBX0597tzDsQd for ; Tue, 13 Sep 2016 14:29:04 +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 AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by lists.ozlabs.org (Postfix) with ESMTPS id 3sYBWH4XqLzDrp5 for ; Tue, 13 Sep 2016 14:28:27 +1000 (AEST) Received: by ozlabs.org (Postfix, from userid 1023) id 3sYBWH1Plrz9srZ; Tue, 13 Sep 2016 14:28:27 +1000 (AEST) From: Jeremy Kerr To: skiboot@lists.ozlabs.org, Dan Crowell Date: Tue, 13 Sep 2016 12:27:27 +0800 Message-Id: <1473740847-8766-3-git-send-email-jk@ozlabs.org> X-Mailer: git-send-email 2.7.4 In-Reply-To: <1473740847-8766-1-git-send-email-jk@ozlabs.org> References: <1473740847-8766-1-git-send-email-jk@ozlabs.org> Subject: [Skiboot] [PATCH 2/2] opal-prd: Fix error code from scom_read & scom_write X-BeenThere: skiboot@lists.ozlabs.org X-Mailman-Version: 2.1.22 Precedence: list List-Id: Mailing list for skiboot development List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , MIME-Version: 1.0 Errors-To: skiboot-bounces+incoming=patchwork.ozlabs.org@lists.ozlabs.org Sender: "Skiboot" From: Benjamin Herrenschmidt Currently, we always return a zero value from scom_red & scom_write, so the HBRT implementation has no way of detecting errors during scom operations. This change uses the actual return value from the scom operation from the kernel instead. Signed-off-by: Benjamin Herrenschmidt Signed-off-by: Jeremy Kerr --- external/opal-prd/hostboot-interface.h | 6 ++++++ external/opal-prd/opal-prd.c | 16 +++++++++------- 2 files changed, 15 insertions(+), 7 deletions(-) diff --git a/external/opal-prd/hostboot-interface.h b/external/opal-prd/hostboot-interface.h index 7729a5b..0cbcdd6 100644 --- a/external/opal-prd/hostboot-interface.h +++ b/external/opal-prd/hostboot-interface.h @@ -41,6 +41,12 @@ enum MemoryError_t MEMORY_ERROR_UE = 1, }; +/** + * PRD flag: xscom_read and xscom_write return proper return codes on error. + * Previous implementations may have incorrectly ignored failures. + */ +#define OPAL_PRD_FLAGS_HAS_XSCOM_RC (1ul << 0) + struct host_interfaces { /** Interface version. */ uint64_t interface_version; diff --git a/external/opal-prd/opal-prd.c b/external/opal-prd/opal-prd.c index 775d9f1..6f2cc22 100644 --- a/external/opal-prd/opal-prd.c +++ b/external/opal-prd/opal-prd.c @@ -297,13 +297,14 @@ int hservice_scom_read(uint64_t chip_id, uint64_t addr, void *buf) "failed: %m", chip_id, addr); return 0; } + rc = (int)scom.rc; - pr_debug("SCOM: read: chip 0x%lx, addr 0x%lx, val 0x%lx", - chip_id, addr, scom.data); + pr_debug("SCOM: read: chip 0x%lx, addr 0x%lx, val 0x%lx, rc %d", + chip_id, addr, scom.data, rc); *(uint64_t *)buf = htobe64(scom.data); - return 0; + return rc; } int hservice_scom_write(uint64_t chip_id, uint64_t addr, @@ -322,11 +323,12 @@ int hservice_scom_write(uint64_t chip_id, uint64_t addr, "failed: %m", chip_id, addr); return 0; } + rc = (int)scom.rc; - pr_debug("SCOM: write: chip 0x%lx, addr 0x%lx, val 0x%lx", - chip_id, addr, scom.data); + pr_debug("SCOM: write: chip 0x%lx, addr 0x%lx, val 0x%lx, rc %d", + chip_id, addr, scom.data, rc); - return 0; + return rc; } uint64_t hservice_get_reserved_mem(const char *name, uint32_t instance) @@ -651,7 +653,7 @@ int hservice_memory_error(uint64_t i_start_addr, uint64_t i_endAddr, uint64_t hservice_get_prd_flags(void) { - return 0; + return OPAL_PRD_FLAGS_HAS_XSCOM_RC; } int hservices_init(struct opal_prd_ctx *ctx, void *code)