From patchwork Wed Mar 22 02:59:44 2017 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Michael Neuling X-Patchwork-Id: 741845 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 3vnvZ26k74z9s2s for ; Wed, 22 Mar 2017 14:00:26 +1100 (AEDT) Received: from lists.ozlabs.org (lists.ozlabs.org [IPv6:2401:3900:2:1::3]) by lists.ozlabs.org (Postfix) with ESMTP id 3vnvZ25X5wzDqZq for ; Wed, 22 Mar 2017 14:00:26 +1100 (AEDT) X-Original-To: skiboot@lists.ozlabs.org Delivered-To: skiboot@lists.ozlabs.org Received: from ozlabs.org (ozlabs.org [103.22.144.67]) (using TLSv1.2 with cipher ADH-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by lists.ozlabs.org (Postfix) with ESMTPS id 3vnvYH46tQzDqBv for ; Wed, 22 Mar 2017 13:59:47 +1100 (AEDT) Received: from localhost.localdomain (localhost [127.0.0.1]) by ozlabs.org (Postfix) with ESMTP id 3vnvYH29pyz9s7l; Wed, 22 Mar 2017 13:59:47 +1100 (AEDT) Received: by localhost.localdomain (Postfix, from userid 1000) id 1B214EEEE29; Wed, 22 Mar 2017 13:59:47 +1100 (AEDT) From: Michael Neuling To: stewart@linux.vnet.ibm.com Date: Wed, 22 Mar 2017 13:59:44 +1100 Message-Id: <20170322025945.18182-4-mikey@neuling.org> X-Mailer: git-send-email 2.9.3 In-Reply-To: <20170322025945.18182-1-mikey@neuling.org> References: <20170322025945.18182-1-mikey@neuling.org> Subject: [Skiboot] [PATCH 4/5] xscom: Add indirect form 1 scoms 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: skiboot@lists.ozlabs.org, mikey@neuling.org, =?UTF-8?q?C=C3=A9dric=20Le=20Goater?= MIME-Version: 1.0 Errors-To: skiboot-bounces+incoming=patchwork.ozlabs.org@lists.ozlabs.org Sender: "Skiboot" Add code to perform indirect form 1 scoms. POWER8 does form 0 only. POWER9 adds form 1. The form is determined from the address only. Hardware only allows writes for form 1. Only hostboot uses these scoms during IPL, so they are unused by skiboot currently. Signed-off-by: Michael Neuling --- hw/xscom.c | 48 ++++++++++++++++++++++++++++++++++++++++++++++-- 1 file changed, 46 insertions(+), 2 deletions(-) diff --git a/hw/xscom.c b/hw/xscom.c index 1add658776..7f3e329fee 100644 --- a/hw/xscom.c +++ b/hw/xscom.c @@ -317,7 +317,8 @@ static int __xscom_write(uint32_t gcid, uint32_t pcb_addr, uint64_t val) /* * Indirect XSCOM access functions */ -static int xscom_indirect_read(uint32_t gcid, uint64_t pcb_addr, uint64_t *val) +static int xscom_indirect_read_form0(uint32_t gcid, uint64_t pcb_addr, + uint64_t *val) { uint32_t addr; uint64_t data; @@ -360,7 +361,18 @@ static int xscom_indirect_read(uint32_t gcid, uint64_t pcb_addr, uint64_t *val) return rc; } -static int xscom_indirect_write(uint32_t gcid, uint64_t pcb_addr, uint64_t val) +static int xscom_indirect_read(uint32_t gcid, uint64_t pcb_addr, uint64_t *val) +{ + uint64_t form = (pcb_addr >> 60) & 1; + + if ((proc_gen == proc_gen_p9) && (form == 1)) + return OPAL_UNSUPPORTED; + + return xscom_indirect_read_form0(gcid, pcb_addr, val); +} + +static int xscom_indirect_write_form0(uint32_t gcid, uint64_t pcb_addr, + uint64_t val) { uint32_t addr; uint64_t data; @@ -402,6 +414,38 @@ static int xscom_indirect_write(uint32_t gcid, uint64_t pcb_addr, uint64_t val) return rc; } +static int xscom_indirect_write_form1(uint32_t gcid, uint64_t pcb_addr, + uint64_t val) +{ + uint32_t addr; + uint64_t data; + int rc; + + if (proc_gen < proc_gen_p9) + return OPAL_UNSUPPORTED; + if (val & 0xfff0000000000000ULL) + return OPAL_PARAMETER; + + /* Mangle address and data for form1 */ + addr = (pcb_addr & 0x000ffffffff); + data = (pcb_addr & 0xfff00000000) << 20; + data |= val; + rc = __xscom_write(gcid, addr, data); + if (rc) + val = (uint64_t)-1; + return rc; +} + +static int xscom_indirect_write(uint32_t gcid, uint64_t pcb_addr, uint64_t val) +{ + uint64_t form = (pcb_addr >> 60) & 1; + + if ((proc_gen == proc_gen_p9) && (form == 1)) + return xscom_indirect_write_form1(gcid, pcb_addr, val); + + return xscom_indirect_write_form0(gcid, pcb_addr, val); +} + static uint32_t xscom_decode_chiplet(uint32_t partid, uint64_t *pcb_addr) { uint32_t gcid = (partid & 0x0fffffff) >> 4;