From patchwork Thu Nov 28 06:24:15 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Nicholas Piggin X-Patchwork-Id: 1201894 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.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 47NnjF56F7z9s7T for ; Thu, 28 Nov 2019 17:26:41 +1100 (AEDT) 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="NVAJGa5T"; 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 47NnjF3g7gzDqKj for ; Thu, 28 Nov 2019 17:26:41 +1100 (AEDT) X-Original-To: skiboot@lists.ozlabs.org Delivered-To: skiboot@lists.ozlabs.org Authentication-Results: lists.ozlabs.org; spf=pass (sender SPF authorized) smtp.mailfrom=gmail.com (client-ip=2607:f8b0:4864:20::442; helo=mail-pf1-x442.google.com; envelope-from=npiggin@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="NVAJGa5T"; dkim-atps=neutral Received: from mail-pf1-x442.google.com (mail-pf1-x442.google.com [IPv6:2607:f8b0:4864:20::442]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (2048 bits) server-digest SHA256) (No client certificate requested) by lists.ozlabs.org (Postfix) with ESMTPS id 47Nnh70JTbzDqyY for ; Thu, 28 Nov 2019 17:25:40 +1100 (AEDT) Received: by mail-pf1-x442.google.com with SMTP id x28so12617288pfo.6 for ; Wed, 27 Nov 2019 22:25:40 -0800 (PST) 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 :mime-version:content-transfer-encoding; bh=ABHnyc9cGiUchiY4LlVwkTd97Le2d9Q8dXvPTCHUoFc=; b=NVAJGa5ToQuMEuCIXtlFp+cLn4cEJkCLoIDVnWXU3sP+Be9WnYEUfhDBQ0x2dDMpf/ EnETM/IaE0p1BCVbo6eTSDbk/V0gBeaDb6tYu9PXas1x6vu/6HHcj67lS774giMGVpBH 3QhxT6+7VGUBrmX7byfnhSv5LyGHGW5Zhiq3Q1btFLOhb3ZHL682ExIyY2WQul3wdX3K LbRNeHdyQpiOTMp/otQqc0NabGJLLEOWue5XizSHwFhJnNc5jEoGwbpJiUPbUXUd2yPH czJnwlG2uj4eqacvJoTvea07wVJPrv6K+BTIuradY/DIIszpWMJKybZtbMhjvhxktipH ZWXw== 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:mime-version:content-transfer-encoding; bh=ABHnyc9cGiUchiY4LlVwkTd97Le2d9Q8dXvPTCHUoFc=; b=NYPdqNcgWMhNVpBOx0rlZikjdJ3kc3xtJvPDwl4V6m9QfM/C2iMyOhJMS5Fa7Jdkd/ XqtUm1d3Zp4JxjkEV2Tt2jgYI8SZaf6gnJw9SPwkcgh4FJYtv9QaO/v+fqrBRffQz+OJ N5oDIknAw0Z2S9fXHxrF+yP6ATPi41crPVucBjcbb6cxOW2oscLC51kq9r1dzmVleeMG JWyx7K5gY/bXyFRnOaLlxFKgz62sJ/VBDxZHkKndFvGSX7cgyVW0IxvCbB1by/eWrZt2 99a017BrGCHrHayNY+M/XEgMLSTlTRv7FZPae0tVcKz+o4o+d6Are65x4RSL0GK+H9X6 VnOA== X-Gm-Message-State: APjAAAWxRRIzvrw8Xq+xFw3Ce4eIPvdBM4p8Rs8s6S0GYWR7NZXFaUw5 tzDsC5/1FhZ1fHikX7N6qbBSmcLN X-Google-Smtp-Source: APXvYqyK4/iGiwYdgCEagIGYZAPWeR+CLk1sTU1lQGAn4mdXcA4eTTcvoruauokoyEcu7iSLn/yryg== X-Received: by 2002:a62:8243:: with SMTP id w64mr51561089pfd.0.1574922337469; Wed, 27 Nov 2019 22:25:37 -0800 (PST) Received: from bobo.local0.net ([203.194.47.34]) by smtp.gmail.com with ESMTPSA id e5sm8463196pjv.29.2019.11.27.22.25.35 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 27 Nov 2019 22:25:37 -0800 (PST) From: Nicholas Piggin To: skiboot@lists.ozlabs.org Date: Thu, 28 Nov 2019 16:24:15 +1000 Message-Id: <20191128062442.20690-2-npiggin@gmail.com> X-Mailer: git-send-email 2.23.0 In-Reply-To: <20191128062442.20690-1-npiggin@gmail.com> References: <20191128062442.20690-1-npiggin@gmail.com> MIME-Version: 1.0 Subject: [Skiboot] [PATCH v8 01/28] asm/cvc_entry.S: r2 save fix X-BeenThere: skiboot@lists.ozlabs.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: Mailing list for skiboot development List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: skiboot-bounces+incoming=patchwork.ozlabs.org@lists.ozlabs.org Sender: "Skiboot" The TOC save area for the current stack frame should be used to save r2, not the caller's frame. Acked-by: Stewart Smith Signed-off-by: Nicholas Piggin --- asm/cvc_entry.S | 9 +++++++-- include/stack.h | 2 ++ 2 files changed, 9 insertions(+), 2 deletions(-) diff --git a/asm/cvc_entry.S b/asm/cvc_entry.S index 1296e88fe..3e8b3fdad 100644 --- a/asm/cvc_entry.S +++ b/asm/cvc_entry.S @@ -24,6 +24,11 @@ #.include "kernel/ppcconsts.S" +# Updated hostboot location is src/securerom/rom_entry.S. +# This also has a fix for TOC save frame pointer. + +#include + .section .text .global __cvc_verify_v1 @@ -33,10 +38,10 @@ __cvc_verify_v1: __cvc_sha512_v1: call_rom_entry: - std %r2, 40(%r1) mflr %r0 std %r0, 16(%r1) stdu %r1, -128(%r1) + std %r2, STACK_TOC_OFFSET(%r1) li %r2, 0 mtctr %r3 mr %r3, %r4 @@ -45,8 +50,8 @@ call_rom_entry: mr %r6, %r7 mr %r7, %r8 bctrl + ld %r2, STACK_TOC_OFFSET(%r1) addi %r1, %r1, 128 - ld %r2, 40(%r1) ld %r0, 16(%r1) mtlr %r0 blr diff --git a/include/stack.h b/include/stack.h index 3ad52d64c..09d22adb6 100644 --- a/include/stack.h +++ b/include/stack.h @@ -11,6 +11,8 @@ #define STACK_ENTRY_RESET 0x0100 /* System reset */ #define STACK_ENTRY_SOFTPATCH 0x1500 /* Soft patch (denorm emulation) */ +#define STACK_TOC_OFFSET 40 + /* Safety/ABI gap at top of stack */ #define STACK_TOP_GAP 0x100 From patchwork Thu Nov 28 06:24:16 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Nicholas Piggin X-Patchwork-Id: 1201892 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.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (4096 bits) server-digest SHA256) (No client certificate requested) by ozlabs.org (Postfix) with ESMTPS id 47NnhH6vFcz9sP4 for ; Thu, 28 Nov 2019 17:25:51 +1100 (AEDT) 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="CJXEyYCE"; 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 47NnhH2K81zDqyf for ; Thu, 28 Nov 2019 17:25:51 +1100 (AEDT) X-Original-To: skiboot@lists.ozlabs.org Delivered-To: skiboot@lists.ozlabs.org Authentication-Results: lists.ozlabs.org; spf=pass (sender SPF authorized) smtp.mailfrom=gmail.com (client-ip=2607:f8b0:4864:20::641; helo=mail-pl1-x641.google.com; envelope-from=npiggin@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="CJXEyYCE"; dkim-atps=neutral Received: from mail-pl1-x641.google.com (mail-pl1-x641.google.com [IPv6:2607:f8b0:4864:20::641]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (2048 bits) server-digest SHA256) (No client certificate requested) by lists.ozlabs.org (Postfix) with ESMTPS id 47Nnh714vbzDqyc for ; Thu, 28 Nov 2019 17:25:42 +1100 (AEDT) Received: by mail-pl1-x641.google.com with SMTP id s10so11148030plp.2 for ; Wed, 27 Nov 2019 22:25:42 -0800 (PST) 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 :mime-version:content-transfer-encoding; bh=ZH3kc4PtPjVkIsHqCzSJ1NXZCF0M8ei3mKZnUcJmbok=; b=CJXEyYCEIx4XriqVtwpFScoytfcWN+1Yhcj9QLxzsdsAKkyKj0EGzYGNUuWmdCSW3o hXOjXrdRuvMLZZK2+PcJOvSRgLvpw8VS4ATNoavtCxJx/iUJH3FVLy/384SbfdJeHk/S MOb4Fm06uNAQcFFhZpMCY0Av7mIjpAZc+Lbl3ih85yT8Zz8QHQ9Rl+fznCg3oHYvOTYL QpwZMp1FO8bhelnQ7/yiN/PTQ1ZSaEeVF69TWY/mRKM8VWANlK5a9goxU96DX0ZMLDxx QvWfnWrdPsMxCPswhsncOu1FDJIx3uk/vJ7peyZDCa+cTHXN2sd1gz4rJkv2gs15Ty48 aCFA== 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:mime-version:content-transfer-encoding; bh=ZH3kc4PtPjVkIsHqCzSJ1NXZCF0M8ei3mKZnUcJmbok=; b=NPUuZoCtf0IbRS+4cu2oscZtFggTXsUG0u3PosAZULd9cFHIXc/Y2s6y0U5RvQ6pX2 tz/XK8D1LsR/EW8tOKCFYAnerteeEqg3WjmnpL42hAt4ZWWl3k+ABylgQDW9euMwhvUN cQdEUvLO2dUiqQiCF0vXe2WZ7B2re2kyGV1yn5us0LnL11m7Lax1NqKgY9zBM1Zc3ZsG o/Iq3892q8Ocwe51dH4+fhXNg2JqlJrQayWI+CQYdLuP53PVnS7q6vZjbWNcd2zpwro0 szAmQF4nIgEtpIE4t4BAVKIpF+RmgurLvMtBr6RtreXfAluL3aiC6ti7QKGUnIUyQ/kj 8gcA== X-Gm-Message-State: APjAAAVkZFa/D49C0NYOCf2BDcAixFRI55KbrRWwPyhPls6sri87XFQA fn5zxhnTB0i6SLRSVHEJ6eSwGtiX X-Google-Smtp-Source: APXvYqwzF2viv56gD15aaDp2JaCptls8DGtDS2P3gHr3tZB4gQjH7t+ODvjPqxNdBDcyH0lvzM8QTQ== X-Received: by 2002:a17:902:8f94:: with SMTP id z20mr8141978plo.21.1574922340565; Wed, 27 Nov 2019 22:25:40 -0800 (PST) Received: from bobo.local0.net ([203.194.47.34]) by smtp.gmail.com with ESMTPSA id e5sm8463196pjv.29.2019.11.27.22.25.37 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 27 Nov 2019 22:25:40 -0800 (PST) From: Nicholas Piggin To: skiboot@lists.ozlabs.org Date: Thu, 28 Nov 2019 16:24:16 +1000 Message-Id: <20191128062442.20690-3-npiggin@gmail.com> X-Mailer: git-send-email 2.23.0 In-Reply-To: <20191128062442.20690-1-npiggin@gmail.com> References: <20191128062442.20690-1-npiggin@gmail.com> MIME-Version: 1.0 Subject: [Skiboot] [PATCH v8 02/28] capp: fix endian conversion X-BeenThere: skiboot@lists.ozlabs.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: Mailing list for skiboot development List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: Andrew Donnellan Errors-To: skiboot-bounces+incoming=patchwork.ozlabs.org@lists.ozlabs.org Sender: "Skiboot" Acked-by: Stewart Smith Reviewed-by: Andrew Donnellan Signed-off-by: Nicholas Piggin --- hw/capp.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/hw/capp.c b/hw/capp.c index 709e6db14..269deb637 100644 --- a/hw/capp.c +++ b/hw/capp.c @@ -168,7 +168,7 @@ int64_t capp_load_ucode(unsigned int chip_id, uint32_t opal_id, /* 'CAPPULID' in ASCII */ if ((be64_to_cpu(ucode->eyecatcher) != 0x43415050554C4944UL) || - (be64_to_cpu(ucode->version != 1))) { + (be64_to_cpu(ucode->version) != 1)) { PHBERR(opal_id, chip_id, index, "CAPP: ucode header invalid\n"); return OPAL_HARDWARE; From patchwork Thu Nov 28 06:24:17 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Nicholas Piggin X-Patchwork-Id: 1201895 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.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 47Nnjz37RZz9s7T for ; Thu, 28 Nov 2019 17:27:18 +1100 (AEDT) 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="gY6wLJxt"; 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 47Nnjx3YbTzDr0T for ; Thu, 28 Nov 2019 17:27:17 +1100 (AEDT) X-Original-To: skiboot@lists.ozlabs.org Delivered-To: skiboot@lists.ozlabs.org Authentication-Results: lists.ozlabs.org; spf=pass (sender SPF authorized) smtp.mailfrom=gmail.com (client-ip=2607:f8b0:4864:20::644; helo=mail-pl1-x644.google.com; envelope-from=npiggin@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="gY6wLJxt"; dkim-atps=neutral Received: from mail-pl1-x644.google.com (mail-pl1-x644.google.com [IPv6:2607:f8b0:4864:20::644]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (2048 bits) server-digest SHA256) (No client certificate requested) by lists.ozlabs.org (Postfix) with ESMTPS id 47NnhB4vTfzDqyG for ; Thu, 28 Nov 2019 17:25:46 +1100 (AEDT) Received: by mail-pl1-x644.google.com with SMTP id ay6so11164311plb.0 for ; Wed, 27 Nov 2019 22:25:46 -0800 (PST) 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 :mime-version:content-transfer-encoding; bh=4g1glazentiY+r5dTTVw8P8c6tzS+RObTXg5gCOgMpA=; b=gY6wLJxtAgEUN7vZKimxrxyh/ckRDxEXTpr4l/nsIxgpDRBCdeEMVqVEH5eZeI+t+c 2P06Pp8TOd1bHyqHXFIJIbLXkZOlDvJxq0ME3PTpByoCG2MGQYa7HcK4E/ms7E8P1+lF u37GpqCBxQXkPQOyIJWnmQeZKwT+2DV/3usyjW4VdFrCZBGLrU0J/i1zS3CtnB5oQ7ZD 2OKvyx06cG8vu1dLcaQ72BUE4b2zsnJWFiuenWjAHbFmY55g8JlfeYIAHYsicgvXdG8g 6zABuNUoe9sE7j9w094IzpHkaKic7GZ1Odlj9R0fNaqkjM0Xl870/u04CKcpnVgH8Fu6 wFPQ== 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:mime-version:content-transfer-encoding; bh=4g1glazentiY+r5dTTVw8P8c6tzS+RObTXg5gCOgMpA=; b=VabIglEz7bPUU7wm+76bgXIx5LG65eowEl/PdQXIeBW4fk8/oMf7g17f1V50vMYTE9 LdarS+E8ztLX2E0g8O4H9lKDqaOcINYXi3Oyqv+p2hGYH7H234NvMFSfTOoWhnOzx4FI rcZ/F5DzbxjBdnYz8Gq0P/5m23gdPzxPGnKLgozH6q5L71y4/7EhsyYk4f2S3gtVj+1Z +spCBHr755SG/EVFKwUlM/BNClOACLeV++b8vs4Ex3HpqjGYQeUaOfUErJZWhmOqEyCY +7E5eQlGi7ao2BH96s45a+Cn41Z16GfR4YSTGyJdFFwddFXrQrvFAN6FocWNspEP246G H0Cg== X-Gm-Message-State: APjAAAUHVu2J2FybuknJs4I08QnkgT3eXH8MMMY5ihFiN7+FbU4jGb9Z SM35A8ohUc5D8EdgVTWNOc7/cChF X-Google-Smtp-Source: APXvYqwpd5YUmWBPvMWUtmklQfRlK3/IIs/sgC3ououibF/QW5hTrzm49rDGKSJv2PW4Ur06g0BW8A== X-Received: by 2002:a17:902:143:: with SMTP id 61mr8132019plb.343.1574922343644; Wed, 27 Nov 2019 22:25:43 -0800 (PST) Received: from bobo.local0.net ([203.194.47.34]) by smtp.gmail.com with ESMTPSA id e5sm8463196pjv.29.2019.11.27.22.25.41 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 27 Nov 2019 22:25:43 -0800 (PST) From: Nicholas Piggin To: skiboot@lists.ozlabs.org Date: Thu, 28 Nov 2019 16:24:17 +1000 Message-Id: <20191128062442.20690-4-npiggin@gmail.com> X-Mailer: git-send-email 2.23.0 In-Reply-To: <20191128062442.20690-1-npiggin@gmail.com> References: <20191128062442.20690-1-npiggin@gmail.com> MIME-Version: 1.0 Subject: [Skiboot] [PATCH v8 03/28] cpu: use dt accessor device tree access X-BeenThere: skiboot@lists.ozlabs.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: Mailing list for skiboot development List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: skiboot-bounces+incoming=patchwork.ozlabs.org@lists.ozlabs.org Sender: "Skiboot" Signed-off-by: Nicholas Piggin --- core/cpu.c | 2 +- core/device.c | 1 + core/fdt.c | 4 ++-- core/interrupts.c | 4 ++-- core/pci.c | 28 +++++++++++++--------------- hdata/fsp.c | 7 ++++--- hdata/iohub.c | 32 ++++++++++++++++---------------- hdata/test/op920.wsp.dts | 20 ++++++++++++++------ hdata/test/p8-840-spira.dts | 14 +++++++------- hdata/test/p81-811.spira.dts | 23 ++++++++++++----------- hw/fsp/fsp-sysparam.c | 4 ++-- hw/fsp/fsp.c | 2 +- hw/imc.c | 4 ++-- hw/lpc.c | 6 +++--- hw/psi.c | 8 ++++---- hw/vas.c | 6 ++---- 16 files changed, 86 insertions(+), 79 deletions(-) diff --git a/core/cpu.c b/core/cpu.c index 99d016f0d..370bf4b03 100644 --- a/core/cpu.c +++ b/core/cpu.c @@ -1214,7 +1214,7 @@ void init_all_cpus(void) t = &cpu_stacks[pir + thread].cpu; init_cpu_thread(t, state, pir + thread); t->trace = boot_cpu->trace; - t->server_no = ((const u32 *)p->prop)[thread]; + t->server_no = dt_property_get_cell(p, thread); t->is_secondary = true; t->primary = pt; t->node = cpu; diff --git a/core/device.c b/core/device.c index ce0171b67..0118d485f 100644 --- a/core/device.c +++ b/core/device.c @@ -1110,6 +1110,7 @@ void dt_adjust_subtree_phandle(struct dt_node *dev, continue; phandle = dt_prop_get_u32(node, *name); phandle += import_phandle; + phandle = cpu_to_be32(phandle); memcpy((char *)&prop->prop, &phandle, prop->len); } } diff --git a/core/fdt.c b/core/fdt.c index d3c6d9fa1..e093e8b54 100644 --- a/core/fdt.c +++ b/core/fdt.c @@ -146,8 +146,8 @@ static void create_dtb_reservemap(void *fdt, const struct dt_node *root) ranges = (const void *)prop->prop; for (i = 0; i < prop->len / (sizeof(uint64_t) * 2); i++) { - base = *(ranges++); - size = *(ranges++); + base = be64_to_cpu(*(ranges++)); + size = be64_to_cpu(*(ranges++)); save_err(fdt_add_reservemap_entry(fdt, base, size)); } } diff --git a/core/interrupts.c b/core/interrupts.c index b0c1da198..10baa15f6 100644 --- a/core/interrupts.c +++ b/core/interrupts.c @@ -231,8 +231,8 @@ void add_opal_interrupts(void) names[tns++] = 0; i = count++; irqs = realloc(irqs, 8 * count); - irqs[i*2] = isn; - irqs[i*2+1] = iflags; + irqs[i*2] = cpu_to_be32(isn); + irqs[i*2+1] = cpu_to_be32(iflags); } } unlock(&irq_lock); diff --git a/core/pci.c b/core/pci.c index f74d7163f..e497fd50c 100644 --- a/core/pci.c +++ b/core/pci.c @@ -1312,7 +1312,7 @@ void pci_std_swizzle_irq_map(struct dt_node *np, { uint32_t *map, *p; int dev, irq, esize, edevcount; - size_t map_size, isize; + size_t map_size; /* Some emulated setups don't use standard interrupts * representation @@ -1320,9 +1320,6 @@ void pci_std_swizzle_irq_map(struct dt_node *np, if (lstate->int_size == 0) return; - /* Size in bytes of a target interrupt */ - isize = lstate->int_size * sizeof(uint32_t); - /* Calculate the size of a map entry: * * 3 cells : PCI Address @@ -1362,22 +1359,23 @@ void pci_std_swizzle_irq_map(struct dt_node *np, for (dev = 0; dev < edevcount; dev++) { for (irq = 0; irq < 4; irq++) { /* Calculate pin */ + size_t i; uint32_t new_irq = (irq + dev + swizzle) % 4; /* PCI address portion */ - *(p++) = dev << (8 + 3); + *(p++) = cpu_to_be32(dev << (8 + 3)); *(p++) = 0; *(p++) = 0; /* PCI interrupt portion */ - *(p++) = irq + 1; + *(p++) = cpu_to_be32(irq + 1); /* Parent phandle */ - *(p++) = lstate->int_parent[new_irq]; + *(p++) = cpu_to_be32(lstate->int_parent[new_irq]); /* Parent desc */ - memcpy(p, lstate->int_val[new_irq], isize); - p += lstate->int_size; + for (i = 0; i < lstate->int_size; i++) + *(p++) = cpu_to_be32(lstate->int_val[new_irq][i]); } } @@ -1526,16 +1524,16 @@ static void __noinline pci_add_one_device_node(struct phb *phb, char name[MAX_NAME]; char compat[MAX_NAME]; uint32_t rev_class; - uint32_t reg[5]; + __be32 reg[5]; uint8_t intpin; bool is_pcie; - const uint32_t ranges_direct[] = { + const __be32 ranges_direct[] = { /* 64-bit direct mapping. We know the bridges * don't cover the entire address space so * use 0xf00... as a good compromise. */ - 0x02000000, 0x0, 0x0, - 0x02000000, 0x0, 0x0, - 0xf0000000, 0x0}; + cpu_to_be32(0x02000000), 0x0, 0x0, + cpu_to_be32(0x02000000), 0x0, 0x0, + cpu_to_be32(0xf0000000), 0x0}; pci_cfg_read32(phb, pd->bdfn, PCI_CFG_REV_ID, &rev_class); pci_cfg_read8(phb, pd->bdfn, PCI_CFG_INT_PIN, &intpin); @@ -1611,7 +1609,7 @@ static void __noinline pci_add_one_device_node(struct phb *phb, * entry in the "reg" property. That's enough for Linux and we might * even want to make this legit in future ePAPR */ - reg[0] = pd->bdfn << 8; + reg[0] = cpu_to_be32(pd->bdfn << 8); reg[1] = reg[2] = reg[3] = reg[4] = 0; dt_add_property(np, "reg", reg, sizeof(reg)); diff --git a/hdata/fsp.c b/hdata/fsp.c index 5923f1feb..fe36eef18 100644 --- a/hdata/fsp.c +++ b/hdata/fsp.c @@ -206,7 +206,7 @@ static void fsp_create_links(const void *spss, int index, chip = fsp_create_link(iopath, i, index); lp = lcount++; links = realloc(links, 4 * lcount); - links[lp] = chip; + links[lp] = cpu_to_be32(chip); } if (links) dt_add_property(fsp_node, "ibm,psi-links", links, lcount * 4); @@ -268,7 +268,7 @@ static void add_uart(const struct spss_iopath *iopath, struct dt_node *lpc) be32_to_cpu(iopath->lpc.uart_baud)); } -static void add_chip_id_to_sensors(struct dt_node *sensor_node, __be32 slca_index) +static void add_chip_id_to_sensors(struct dt_node *sensor_node, uint32_t slca_index) { unsigned int i; const void *hdif; @@ -347,7 +347,8 @@ static void add_ipmi_sensors(struct dt_node *bmc_node) dt_add_property_cells(sensor_node, "ipmi-sensor-type", ipmi_sensors->data[i].type); - add_chip_id_to_sensors(sensor_node, ipmi_sensors->data[i].slca_index); + add_chip_id_to_sensors(sensor_node, + be32_to_cpu(ipmi_sensors->data[i].slca_index)); } } diff --git a/hdata/iohub.c b/hdata/iohub.c index 6921d95ce..6647e6aac 100644 --- a/hdata/iohub.c +++ b/hdata/iohub.c @@ -20,7 +20,7 @@ static bool io_get_lx_info(const void *kwvpd, unsigned int kwvpd_sz, { const void *lxr; char recname[5]; - uint32_t lxrbuf[2] = { 0, 0 }; + beint32_t lxrbuf[2] = { 0, 0 }; /* Find LXRn, where n is the index passed in*/ strcpy(recname, "LXR0"); @@ -38,17 +38,17 @@ static bool io_get_lx_info(const void *kwvpd, unsigned int kwvpd_sz, return false; } - memcpy(lxrbuf, lxr, sizeof(uint32_t)*2); + memcpy(lxrbuf, lxr, sizeof(beint32_t)*2); - prlog(PR_DEBUG, "CEC: LXRn=%d LXR=%08x%08x\n", lx_idx, lxrbuf[0], lxrbuf[1]); + prlog(PR_DEBUG, "CEC: LXRn=%d LXR=%08x%08x\n", lx_idx, be32_to_cpu(lxrbuf[0]), be32_to_cpu(lxrbuf[1])); prlog(PR_DEBUG, "CEC: LX Info added to %llx\n", (long long)hn); /* Add the LX info */ if (!dt_has_node_property(hn, "ibm,vpd-lx-info", NULL)) { dt_add_property_cells(hn, "ibm,vpd-lx-info", lx_idx, - lxrbuf[0], - lxrbuf[1]); + be32_to_cpu(lxrbuf[0]), + be32_to_cpu(lxrbuf[1])); } return true; @@ -109,12 +109,12 @@ static struct dt_node *io_add_phb3(const struct cechub_io_hub *hub, /* "reg" property contains in order the PE, PCI and SPCI XSCOM * addresses */ - reg[0] = pe_xscom; - reg[1] = 0x20; - reg[2] = pci_xscom; - reg[3] = 0x05; - reg[4] = spci_xscom; - reg[5] = 0x15; + reg[0] = cpu_to_be32(pe_xscom); + reg[1] = cpu_to_be32(0x20); + reg[2] = cpu_to_be32(pci_xscom); + reg[3] = cpu_to_be32(0x05); + reg[4] = cpu_to_be32(spci_xscom); + reg[5] = cpu_to_be32(0x15); dt_add_property(pbcq, "reg", reg, sizeof(reg)); /* A couple more things ... */ @@ -214,10 +214,10 @@ static struct dt_node *io_add_phb4(const struct cechub_io_hub *hub, return NULL; /* "reg" property contains (in order) the PE and PCI XSCOM addresses */ - reg[0] = pe_xscom; - reg[1] = 0x100; - reg[2] = pci_xscom; - reg[3] = 0x200; + reg[0] = cpu_to_be32(pe_xscom); + reg[1] = cpu_to_be32(0x100); + reg[2] = cpu_to_be32(pci_xscom); + reg[3] = cpu_to_be32(0x200); dt_add_property(pbcq, "reg", reg, sizeof(reg)); /* The hubs themselves go under the stacks */ @@ -322,7 +322,7 @@ static void io_add_p8_cec_vpd(const struct HDIF_common_hdr *sp_iohubs) } if (be32_to_cpu(iokids->count) > 1) { prlog(PR_WARNING, "CEC: WARNING ! More than 1 IO KID !!! (%d)\n", - iokids->count); + be32_to_cpu(iokids->count)); /* Ignoring the additional ones */ } diff --git a/hdata/test/op920.wsp.dts b/hdata/test/op920.wsp.dts index 057021f4d..e26fa1272 100644 --- a/hdata/test/op920.wsp.dts +++ b/hdata/test/op920.wsp.dts @@ -76,6 +76,7 @@ sensor@8 { phandle = <0x2b>; compatible = "ibm,ipmi-sensor"; + ibm,chip-id = <0x00>; reg = <0x8>; ipmi-sensor-type = <0x7>; }; @@ -83,6 +84,7 @@ sensor@9 { phandle = <0x3f>; compatible = "ibm,ipmi-sensor"; + ibm,chip-id = <0x08>; reg = <0x9>; ipmi-sensor-type = <0x7>; }; @@ -139,6 +141,7 @@ sensor@59 { phandle = <0x18>; compatible = "ibm,ipmi-sensor"; + ibm,chip-id = <0x00>; reg = <0x59>; ipmi-sensor-type = <0x1>; }; @@ -146,6 +149,7 @@ sensor@5a { phandle = <0x1a>; compatible = "ibm,ipmi-sensor"; + ibm,chip-id = <0x00>; reg = <0x5a>; ipmi-sensor-type = <0x7>; }; @@ -153,6 +157,7 @@ sensor@a3 { phandle = <0x2c>; compatible = "ibm,ipmi-sensor"; + ibm,chip-id = <0x08>; reg = <0xa3>; ipmi-sensor-type = <0x1>; }; @@ -160,6 +165,7 @@ sensor@a4 { phandle = <0x2e>; compatible = "ibm,ipmi-sensor"; + ibm,chip-id = <0x08>; reg = <0xa4>; ipmi-sensor-type = <0x7>; }; @@ -433,6 +439,7 @@ sensor@e0 { phandle = <0x19>; compatible = "ibm,ipmi-sensor"; + ibm,chip-id = <0x00>; reg = <0xe0>; ipmi-sensor-type = <0x1>; }; @@ -440,6 +447,7 @@ sensor@e1 { phandle = <0x2d>; compatible = "ibm,ipmi-sensor"; + ibm,chip-id = <0x08>; reg = <0xe1>; ipmi-sensor-type = <0x1>; }; @@ -4166,7 +4174,7 @@ pbcq@4010c00 { phandle = <0x140>; - reg = <0xc0104 0x10000 0x8010d 0x20000>; + reg = <0x4010c00 0x100 0xd010800 0x200>; compatible = "ibm,power9-pbcq"; ibm,pec-index = <0x0>; #address-cells = <0x1>; @@ -4186,7 +4194,7 @@ pbcq@4011000 { phandle = <0x142>; - reg = <0x100104 0x10000 0x8010e 0x20000>; + reg = <0x4011000 0x100 0xe010800 0x200>; compatible = "ibm,power9-pbcq"; ibm,pec-index = <0x1>; #address-cells = <0x1>; @@ -4215,7 +4223,7 @@ pbcq@4011400 { phandle = <0x145>; - reg = <0x140104 0x10000 0x8010f 0x20000>; + reg = <0x4011400 0x100 0xf010800 0x200>; compatible = "ibm,power9-pbcq"; ibm,pec-index = <0x2>; #address-cells = <0x1>; @@ -4796,7 +4804,7 @@ pbcq@4010c00 { phandle = <0x15c>; - reg = <0xc0104 0x10000 0x8010d 0x20000>; + reg = <0x4010c00 0x100 0xd010800 0x200>; compatible = "ibm,power9-pbcq"; ibm,pec-index = <0x0>; #address-cells = <0x1>; @@ -4816,7 +4824,7 @@ pbcq@4011000 { phandle = <0x15e>; - reg = <0x100104 0x10000 0x8010e 0x20000>; + reg = <0x4011000 0x100 0xe010800 0x200>; compatible = "ibm,power9-pbcq"; ibm,pec-index = <0x1>; #address-cells = <0x1>; @@ -4845,7 +4853,7 @@ pbcq@4011400 { phandle = <0x161>; - reg = <0x140104 0x10000 0x8010f 0x20000>; + reg = <0x4011400 0x100 0xf010800 0x200>; compatible = "ibm,power9-pbcq"; ibm,pec-index = <0x2>; #address-cells = <0x1>; diff --git a/hdata/test/p8-840-spira.dts b/hdata/test/p8-840-spira.dts index dfd262845..d2efe54d5 100644 --- a/hdata/test/p8-840-spira.dts +++ b/hdata/test/p8-840-spira.dts @@ -1,8 +1,8 @@ /dts-v1/; -/memreserve/ 0x000070fd07000000 0x0000100000000000; -/memreserve/ 0x00006afd07000000 0x0000060000000000; -/memreserve/ 0x000051fd07000000 0x0000190000000000; +/memreserve/ 0x00000007fd510000 0x0000000000190000; +/memreserve/ 0x00000007fd6a0000 0x0000000000060000; +/memreserve/ 0x00000007fd700000 0x0000000000100000; / { phandle = <0x1>; #address-cells = <0x2>; @@ -991,7 +991,7 @@ pbcq@2012000 { phandle = <0x4c>; - reg = <0x200102 0x20000000 0x200109 0x5000000 0x3c0109 0x15000000>; + reg = <0x2012000 0x20 0x9012000 0x05 0x9013c00 0x15>; compatible = "ibm,power8-pbcq"; ibm,phb-index = <0x0>; ibm,hub-id = <0x0>; @@ -1002,7 +1002,7 @@ pbcq@2012400 { phandle = <0x4d>; - reg = <0x240102 0x20000000 0x240109 0x5000000 0x403c0109 0x15000000>; + reg = <0x2012400 0x20 0x9012400 0x05 0x9013c40 0x15>; compatible = "ibm,power8-pbcq"; ibm,phb-index = <0x1>; ibm,hub-id = <0x0>; @@ -1056,7 +1056,7 @@ pbcq@2012000 { phandle = <0x4e>; - reg = <0x200102 0x20000000 0x200109 0x5000000 0x3c0109 0x15000000>; + reg = <0x2012000 0x20 0x9012000 0x05 0x9013c00 0x15>; compatible = "ibm,power8-pbcq"; ibm,phb-index = <0x0>; ibm,hub-id = <0x1>; @@ -1067,7 +1067,7 @@ pbcq@2012400 { phandle = <0x4f>; - reg = <0x240102 0x20000000 0x240109 0x5000000 0x403c0109 0x15000000>; + reg = <0x2012400 0x20 0x9012400 0x05 0x9013c40 0x15>; compatible = "ibm,power8-pbcq"; ibm,phb-index = <0x1>; ibm,hub-id = <0x1>; diff --git a/hdata/test/p81-811.spira.dts b/hdata/test/p81-811.spira.dts index cea6a32c5..379da8e12 100644 --- a/hdata/test/p81-811.spira.dts +++ b/hdata/test/p81-811.spira.dts @@ -1,8 +1,9 @@ /dts-v1/; -/memreserve/ 0x000070fd1f000000 0x0000100000000000; -/memreserve/ 0x00d06bfd1f000000 0x0030040000000000; -/memreserve/ 0x006058fd1f000000 0x0070130000000000; +/memreserve/ 0x0000001ffd586000 0x0000000000137000; +/memreserve/ 0x0000001ffd6bd000 0x0000000000043000; +/memreserve/ 0x0000001ffd700000 0x0000000000100000; + / { phandle = <0x1>; #address-cells = <0x2>; @@ -1401,7 +1402,7 @@ hw-version = <0x2>; sw-version = <0x1>; primary; - ibm,psi-links = <0x0 0x10000000>; + ibm,psi-links = <0x0 0x10>; }; }; @@ -2209,7 +2210,7 @@ pbcq@2012000 { phandle = <0x95>; - reg = <0x200102 0x20000000 0x200109 0x5000000 0x3c0109 0x15000000>; + reg = <0x2012000 0x20 0x9012000 0x05 0x9013c00 0x15>; compatible = "ibm,power8-pbcq"; ibm,phb-index = <0x0>; ibm,hub-id = <0x0>; @@ -2220,7 +2221,7 @@ pbcq@2012400 { phandle = <0x96>; - reg = <0x240102 0x20000000 0x240109 0x5000000 0x403c0109 0x15000000>; + reg = <0x2012400 0x20 0x9012400 0x05 0x9013c40 0x15>; compatible = "ibm,power8-pbcq"; ibm,phb-index = <0x1>; ibm,hub-id = <0x0>; @@ -2273,7 +2274,7 @@ pbcq@2012000 { phandle = <0x97>; - reg = <0x200102 0x20000000 0x200109 0x5000000 0x3c0109 0x15000000>; + reg = <0x2012000 0x20 0x9012000 0x05 0x9013c00 0x15>; compatible = "ibm,power8-pbcq"; ibm,phb-index = <0x0>; ibm,hub-id = <0x1>; @@ -2284,7 +2285,7 @@ pbcq@2012400 { phandle = <0x98>; - reg = <0x240102 0x20000000 0x240109 0x5000000 0x403c0109 0x15000000>; + reg = <0x2012400 0x20 0x9012400 0x05 0x9013c40 0x15>; compatible = "ibm,power8-pbcq"; ibm,phb-index = <0x1>; ibm,hub-id = <0x1>; @@ -2336,7 +2337,7 @@ pbcq@2012000 { phandle = <0x99>; - reg = <0x200102 0x20000000 0x200109 0x5000000 0x3c0109 0x15000000>; + reg = <0x2012000 0x20 0x9012000 0x05 0x9013c00 0x15>; compatible = "ibm,power8-pbcq"; ibm,phb-index = <0x0>; ibm,hub-id = <0x2>; @@ -2388,7 +2389,7 @@ pbcq@2012000 { phandle = <0x9a>; - reg = <0x200102 0x20000000 0x200109 0x5000000 0x3c0109 0x15000000>; + reg = <0x2012000 0x20 0x9012000 0x05 0x9013c00 0x15>; compatible = "ibm,power8-pbcq"; ibm,phb-index = <0x0>; ibm,hub-id = <0x3>; @@ -2399,7 +2400,7 @@ pbcq@2012400 { phandle = <0x9b>; - reg = <0x240102 0x20000000 0x240109 0x5000000 0x403c0109 0x15000000>; + reg = <0x2012400 0x20 0x9012400 0x05 0x9013c40 0x15>; compatible = "ibm,power8-pbcq"; ibm,phb-index = <0x1>; ibm,hub-id = <0x3>; diff --git a/hw/fsp/fsp-sysparam.c b/hw/fsp/fsp-sysparam.c index 09005ef87..0e1e8181f 100644 --- a/hw/fsp/fsp-sysparam.c +++ b/hw/fsp/fsp-sysparam.c @@ -469,8 +469,8 @@ static void add_opal_sysparam_node(void) strcpy(s, sysparam_attrs[i].name); s = s + strlen(sysparam_attrs[i].name) + 1; - ids[i] = sysparam_attrs[i].id; - lens[i] = sysparam_attrs[i].length; + ids[i] = cpu_to_be32(sysparam_attrs[i].id); + lens[i] = cpu_to_be32(sysparam_attrs[i].length); perms[i] = sysparam_attrs[i].perm; } diff --git a/hw/fsp/fsp.c b/hw/fsp/fsp.c index f368998fb..2b2c5379a 100644 --- a/hw/fsp/fsp.c +++ b/hw/fsp/fsp.c @@ -1912,7 +1912,7 @@ static void fsp_init_links(struct dt_node *fsp_node) u64 reg; u32 link; - link = ((const u32 *)linksprop->prop)[i]; + link = be32_to_cpu(((const __be32 *)linksprop->prop)[i]); fiop = &fsp->iopath[i]; fiop->psi = psi_find_link(link); if (fiop->psi == NULL) { diff --git a/hw/imc.c b/hw/imc.c index ca06f3c36..16b060d39 100644 --- a/hw/imc.c +++ b/hw/imc.c @@ -458,8 +458,8 @@ static void imc_dt_update_nest_node(struct dt_node *dev) base_addr = malloc(sizeof(uint64_t) * nr_chip); chipids = malloc(sizeof(uint32_t) * nr_chip); for_each_chip(chip) { - base_addr[i] = chip->homer_base; - chipids[i] = chip->id; + base_addr[i] = cpu_to_be64(chip->homer_base); + chipids[i] = cpu_to_be32(chip->id); i++; } diff --git a/hw/lpc.c b/hw/lpc.c index 354d2b4f0..3411f036f 100644 --- a/hw/lpc.c +++ b/hw/lpc.c @@ -884,9 +884,9 @@ static void lpc_create_int_map(struct lpcm *lpc, struct dt_node *psi_node) continue; *(pmap++) = 0; *(pmap++) = 0; - *(pmap++) = i; - *(pmap++) = psi_node->phandle; - *(pmap++) = lpc->sirq_routes[i] + P9_PSI_IRQ_LPC_SIRQ0; + *(pmap++) = cpu_to_be32(i); + *(pmap++) = cpu_to_be32(psi_node->phandle); + *(pmap++) = cpu_to_be32(lpc->sirq_routes[i] + P9_PSI_IRQ_LPC_SIRQ0); } if (pmap == map) return; diff --git a/hw/psi.c b/hw/psi.c index 73e49ceb7..30c2a6cbc 100644 --- a/hw/psi.c +++ b/hw/psi.c @@ -786,10 +786,10 @@ static void psi_create_p9_int_map(struct psi *psi, struct dt_node *np) int i; for (i = 0; i < P9_PSI_NUM_IRQS; i++) { - map[i][0] = i; - map[i][1] = get_ics_phandle(); - map[i][2] = psi->interrupt + i; - map[i][3] = 1; + map[i][0] = cpu_to_be32(i); + map[i][1] = cpu_to_be32(get_ics_phandle()); + map[i][2] = cpu_to_be32(psi->interrupt + i); + map[i][3] = cpu_to_be32(1); } dt_add_property(np, "interrupt-map", map, sizeof(map)); dt_add_property_cells(np, "#address-cells", 0); diff --git a/hw/vas.c b/hw/vas.c index b913519b9..b4af31d12 100644 --- a/hw/vas.c +++ b/hw/vas.c @@ -379,7 +379,6 @@ static struct vas *alloc_vas(uint32_t chip_id, uint32_t vas_id, uint64_t base) static void create_mm_dt_node(struct proc_chip *chip) { - int gcid; struct dt_node *dn; struct vas *vas; uint64_t hvwc_start, hvwc_len; @@ -388,7 +387,6 @@ static void create_mm_dt_node(struct proc_chip *chip) uint64_t pbf_start, pbf_nbits; vas = chip->vas; - gcid = chip->id; get_hvwc_mmio_bar(chip->id, &hvwc_start, &hvwc_len); get_uwc_mmio_bar(chip->id, &uwc_start, &uwc_len); get_paste_bar(chip->id, &pbar_start, &pbar_len); @@ -404,8 +402,8 @@ static void create_mm_dt_node(struct proc_chip *chip) pbar_start, pbar_len, pbf_start, pbf_nbits); - dt_add_property(dn, "ibm,vas-id", &vas->vas_id, sizeof(vas->vas_id)); - dt_add_property(dn, "ibm,chip-id", &gcid, sizeof(gcid)); + dt_add_property_cells(dn, "ibm,vas-id", vas->vas_id); + dt_add_property_cells(dn, "ibm,chip-id", chip->id); if (vas->vas_irq) { dt_add_property_cells(dn, "interrupts", vas->vas_irq, 0); dt_add_property_cells(dn, "interrupt-parent", From patchwork Thu Nov 28 06:24:18 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Nicholas Piggin X-Patchwork-Id: 1201896 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.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 47Nnkf4hBDz9s7T for ; Thu, 28 Nov 2019 17:27:54 +1100 (AEDT) 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="GSt8evZV"; 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 47Nnkf3X1hzDqPN for ; Thu, 28 Nov 2019 17:27:54 +1100 (AEDT) X-Original-To: skiboot@lists.ozlabs.org Delivered-To: skiboot@lists.ozlabs.org Authentication-Results: lists.ozlabs.org; spf=pass (sender SPF authorized) smtp.mailfrom=gmail.com (client-ip=2607:f8b0:4864:20::434; helo=mail-pf1-x434.google.com; envelope-from=npiggin@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="GSt8evZV"; dkim-atps=neutral Received: from mail-pf1-x434.google.com (mail-pf1-x434.google.com [IPv6:2607:f8b0:4864:20::434]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (2048 bits) server-digest SHA256) (No client certificate requested) by lists.ozlabs.org (Postfix) with ESMTPS id 47NnhG1fbTzDqyf for ; Thu, 28 Nov 2019 17:25:50 +1100 (AEDT) Received: by mail-pf1-x434.google.com with SMTP id h14so2431680pfe.10 for ; Wed, 27 Nov 2019 22:25:50 -0800 (PST) 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 :mime-version:content-transfer-encoding; bh=ODu5MCxYq2GeRlz8DLWWalB4+gYndlFvuxbLc6gtpoU=; b=GSt8evZVRij/+VlfuaOyuSKFD/+ZdTuL8cYOD21yG0qHiuebu09Q0Fn5YqFxbPqXed gFVdTwIAqziCta+bYim0OMcF9TjaTWoDVI/mykrLa6xKPwo3uE5pVr6mUXIZD1Dex8t/ +YhFesBgSbvwpciLC0gJR8J/TU3lEjXyQzcG6ceIEJ4yYrXAO/g9xTer5GMd7YAC62k+ q2qpzQdGaD/oT5tr4eyjdTiDxwaY3qTRHFJVyIkvM/VD1hwpSFgNUiehvvY1gnXmwD4l /DO7oVpK6x9k1GV5t8waSmBwQU2pNCgE4Q9IEC5xfGMHcy+F+sCJGiK47+muesoIiNsW UnSQ== 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:mime-version:content-transfer-encoding; bh=ODu5MCxYq2GeRlz8DLWWalB4+gYndlFvuxbLc6gtpoU=; b=lqBz/snbBYDIEg7YBdU2NFb36IdD85YASsomEwznznCsikzSd8eqDFnJCpXfCz3Fi8 iQOg5XTm9iGsRMz4Db2PyAyeZJuaMbR2noQWzRPE/rxv18LESvOmB8+Ep9ziUdoFJUPB YrRR0Q2VG393EqXbgSUqswOESiNEn8/nbarMgoqvnlUdLj0Rqyin9rExm9A1kOT/XdzG dWNpRm2XRMiCFh+EMjLlxFE2QsC6m0vk3o3fNG5L5UWYMCXvOh9Bwrin7nGvtT0sI9Gt Gtkfsd2/uSq8d5pQc/eCsqvU1NaGLe5fl6vj8UrIDGUdmYJ0JMI95OKspKrPXyXHZ2j0 zCxA== X-Gm-Message-State: APjAAAVgRsqC8CuBfQgWZBw3krBEZaBkMn8uLys2VOXw7frGEzkmh7rl 7GrpVfvQyXwxm5YBV2+MuSLrmqk3uPk= X-Google-Smtp-Source: APXvYqwRi2K/9Rns5Fzbzu4EIqKvdOabk19JJ2juxl9AeSBbIv7iFhBtXVe4oyiRVEVkvWwvig+O1A== X-Received: by 2002:a65:4387:: with SMTP id m7mr9182961pgp.449.1574922346803; Wed, 27 Nov 2019 22:25:46 -0800 (PST) Received: from bobo.local0.net ([203.194.47.34]) by smtp.gmail.com with ESMTPSA id e5sm8463196pjv.29.2019.11.27.22.25.44 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 27 Nov 2019 22:25:46 -0800 (PST) From: Nicholas Piggin To: skiboot@lists.ozlabs.org Date: Thu, 28 Nov 2019 16:24:18 +1000 Message-Id: <20191128062442.20690-5-npiggin@gmail.com> X-Mailer: git-send-email 2.23.0 In-Reply-To: <20191128062442.20690-1-npiggin@gmail.com> References: <20191128062442.20690-1-npiggin@gmail.com> MIME-Version: 1.0 Subject: [Skiboot] [PATCH v8 04/28] opal-api: add endian conversions to most opal calls X-BeenThere: skiboot@lists.ozlabs.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: Mailing list for skiboot development List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: skiboot-bounces+incoming=patchwork.ozlabs.org@lists.ozlabs.org Sender: "Skiboot" This adds missing endian conversions to most calls, sufficient at least to handle calls from a kernel booting on mambo. Subsystems requiring more extensive changes (e.g., xive) will be done with individual changes. Signed-off-by: Nicholas Piggin --- core/console.c | 19 ++++--- core/interrupts.c | 8 ++- core/ipmi-opal.c | 6 +-- core/pci-opal.c | 98 ++++++++++++++++++++++++++++--------- core/powercap.c | 14 ++++-- core/psr.c | 14 ++++-- core/sensor.c | 52 +++++++++++--------- hw/dts.c | 12 ++--- hw/fake-rtc.c | 11 +++-- hw/fsp/fsp-console.c | 26 +++++----- hw/fsp/fsp-rtc.c | 25 +++++----- hw/fsp/fsp-sensor.c | 8 +-- hw/ipmi/ipmi-rtc.c | 11 +++-- hw/lpc-rtc.c | 11 +++-- hw/lpc-uart.c | 16 +++--- hw/npu2-opencapi.c | 12 +++-- hw/occ-sensor.c | 13 +++-- hw/xscom.c | 19 ++++++- include/console.h | 6 +-- include/cpu.h | 2 +- include/dts.h | 2 +- include/fsp.h | 2 +- include/occ.h | 2 +- include/platform.h | 2 +- platforms/ibm-fsp/ibm-fsp.h | 2 +- platforms/mambo/mambo.c | 9 +++- 26 files changed, 266 insertions(+), 136 deletions(-) diff --git a/core/console.c b/core/console.c index 139ba4a97..ac88f0c71 100644 --- a/core/console.c +++ b/core/console.c @@ -351,22 +351,25 @@ void memcons_add_properties(void) * complicated since they can come from the in-memory console (BML) or from the * internal skiboot console driver. */ -static int64_t dummy_console_write(int64_t term_number, int64_t *length, +static int64_t dummy_console_write(int64_t term_number, __be64 *length, const uint8_t *buffer) { + uint64_t l; + if (term_number != 0) return OPAL_PARAMETER; if (!opal_addr_valid(length) || !opal_addr_valid(buffer)) return OPAL_PARAMETER; - write(0, buffer, *length); + l = be64_to_cpu(*length); + write(0, buffer, l); return OPAL_SUCCESS; } static int64_t dummy_console_write_buffer_space(int64_t term_number, - int64_t *length) + __be64 *length) { if (term_number != 0) return OPAL_PARAMETER; @@ -375,21 +378,25 @@ static int64_t dummy_console_write_buffer_space(int64_t term_number, return OPAL_PARAMETER; if (length) - *length = INMEM_CON_OUT_LEN; + *length = cpu_to_be64(INMEM_CON_OUT_LEN); return OPAL_SUCCESS; } -static int64_t dummy_console_read(int64_t term_number, int64_t *length, +static int64_t dummy_console_read(int64_t term_number, __be64 *length, uint8_t *buffer) { + uint64_t l; + if (term_number != 0) return OPAL_PARAMETER; if (!opal_addr_valid(length) || !opal_addr_valid(buffer)) return OPAL_PARAMETER; - *length = read(0, buffer, *length); + l = be64_to_cpu(*length); + l = read(0, buffer, l); + *length = cpu_to_be64(l); opal_update_pending_evt(OPAL_EVENT_CONSOLE_INPUT, 0); return OPAL_SUCCESS; diff --git a/core/interrupts.c b/core/interrupts.c index 10baa15f6..d4a2c3124 100644 --- a/core/interrupts.c +++ b/core/interrupts.c @@ -439,9 +439,11 @@ static int64_t opal_set_xive(uint32_t isn, uint16_t server, uint8_t priority) } opal_call(OPAL_SET_XIVE, opal_set_xive, 3); -static int64_t opal_get_xive(uint32_t isn, uint16_t *server, uint8_t *priority) +static int64_t opal_get_xive(uint32_t isn, __be16 *server, uint8_t *priority) { struct irq_source *is = irq_find_source(isn); + uint16_t s; + int64_t ret; if (!opal_addr_valid(server)) return OPAL_PARAMETER; @@ -449,7 +451,9 @@ static int64_t opal_get_xive(uint32_t isn, uint16_t *server, uint8_t *priority) if (!is || !is->ops->get_xive) return OPAL_PARAMETER; - return is->ops->get_xive(is, isn, server, priority); + ret = is->ops->get_xive(is, isn, &s, priority); + *server = cpu_to_be16(s); + return ret; } opal_call(OPAL_GET_XIVE, opal_get_xive, 3); diff --git a/core/ipmi-opal.c b/core/ipmi-opal.c index 796508ca0..d36962d36 100644 --- a/core/ipmi-opal.c +++ b/core/ipmi-opal.c @@ -57,7 +57,7 @@ static int64_t opal_ipmi_send(uint64_t interface, } static int64_t opal_ipmi_recv(uint64_t interface, - struct opal_ipmi_msg *opal_ipmi_msg, uint64_t *msg_len) + struct opal_ipmi_msg *opal_ipmi_msg, __be64 *msg_len) { struct ipmi_msg *msg; int64_t rc; @@ -82,7 +82,7 @@ static int64_t opal_ipmi_recv(uint64_t interface, goto out_del_msg; } - if (*msg_len - sizeof(struct opal_ipmi_msg) < msg->resp_size + 1) { + if (be64_to_cpu(*msg_len) - sizeof(struct opal_ipmi_msg) < msg->resp_size + 1) { rc = OPAL_RESOURCE; goto out_del_msg; } @@ -101,7 +101,7 @@ static int64_t opal_ipmi_recv(uint64_t interface, msg->cmd, msg->netfn >> 2, msg->resp_size); /* Add one as the completion code is returned in the message data */ - *msg_len = msg->resp_size + sizeof(struct opal_ipmi_msg) + 1; + *msg_len = cpu_to_be64(msg->resp_size + sizeof(struct opal_ipmi_msg) + 1); ipmi_free_msg(msg); return OPAL_SUCCESS; diff --git a/core/pci-opal.c b/core/pci-opal.c index 828ce8a97..25c701e6f 100644 --- a/core/pci-opal.c +++ b/core/pci-opal.c @@ -58,9 +58,38 @@ OPAL_PCICFG_ACCESS_WRITE(write_byte, write8, uint8_t) OPAL_PCICFG_ACCESS_WRITE(write_half_word, write16, uint16_t) OPAL_PCICFG_ACCESS_WRITE(write_word, write32, uint32_t) +static int64_t opal_pci_config_read_half_word_be(uint64_t phb_id, + uint64_t bus_dev_func, + uint64_t offset, + __be16 *__data) +{ + uint16_t data; + int64_t rc; + + rc = opal_pci_config_read_half_word(phb_id, bus_dev_func, offset, &data); + *__data = cpu_to_be16(data); + + return rc; +} + +static int64_t opal_pci_config_read_word_be(uint64_t phb_id, + uint64_t bus_dev_func, + uint64_t offset, + __be32 *__data) +{ + uint32_t data; + int64_t rc; + + rc = opal_pci_config_read_word(phb_id, bus_dev_func, offset, &data); + *__data = cpu_to_be32(data); + + return rc; +} + + opal_call(OPAL_PCI_CONFIG_READ_BYTE, opal_pci_config_read_byte, 4); -opal_call(OPAL_PCI_CONFIG_READ_HALF_WORD, opal_pci_config_read_half_word, 4); -opal_call(OPAL_PCI_CONFIG_READ_WORD, opal_pci_config_read_word, 4); +opal_call(OPAL_PCI_CONFIG_READ_HALF_WORD, opal_pci_config_read_half_word_be, 4); +opal_call(OPAL_PCI_CONFIG_READ_WORD, opal_pci_config_read_word_be, 4); opal_call(OPAL_PCI_CONFIG_WRITE_BYTE, opal_pci_config_write_byte, 4); opal_call(OPAL_PCI_CONFIG_WRITE_HALF_WORD, opal_pci_config_write_half_word, 4); opal_call(OPAL_PCI_CONFIG_WRITE_WORD, opal_pci_config_write_word, 4); @@ -87,14 +116,15 @@ void opal_pci_eeh_clear_evt(uint64_t phb_id) static int64_t opal_pci_eeh_freeze_status(uint64_t phb_id, uint64_t pe_number, uint8_t *freeze_state, - uint16_t *pci_error_type, - uint64_t *phb_status) + __be16 *__pci_error_type, + __be64 *__phb_status) { struct phb *phb = pci_get_phb(phb_id); + uint16_t pci_error_type; int64_t rc; - if (!opal_addr_valid(freeze_state) || !opal_addr_valid(pci_error_type) - || !opal_addr_valid(phb_status)) + if (!opal_addr_valid(freeze_state) || !opal_addr_valid(__pci_error_type) + || !opal_addr_valid(__phb_status)) return OPAL_PARAMETER; if (!phb) @@ -103,12 +133,13 @@ static int64_t opal_pci_eeh_freeze_status(uint64_t phb_id, uint64_t pe_number, return OPAL_UNSUPPORTED; phb_lock(phb); - if (phb_status) + if (__phb_status) prlog(PR_ERR, "PHB#%04llx: %s: deprecated PHB status\n", phb_id, __func__); rc = phb->ops->eeh_freeze_status(phb, pe_number, freeze_state, - pci_error_type, NULL); + &pci_error_type, NULL); + *__pci_error_type = cpu_to_be16(pci_error_type); phb_unlock(phb); return rc; @@ -371,12 +402,14 @@ opal_call(OPAL_PCI_SET_XIVE_PE, opal_pci_set_xive_pe, 3); static int64_t opal_get_msi_32(uint64_t phb_id, uint32_t mve_number, uint32_t xive_num, uint8_t msi_range, - uint32_t *msi_address, uint32_t *message_data) + __be32 *__msi_address, __be32 *__message_data) { struct phb *phb = pci_get_phb(phb_id); + uint32_t msi_address; + uint32_t message_data; int64_t rc; - if (!opal_addr_valid(msi_address) || !opal_addr_valid(message_data)) + if (!opal_addr_valid(__msi_address) || !opal_addr_valid(__message_data)) return OPAL_PARAMETER; if (!phb) @@ -385,21 +418,26 @@ static int64_t opal_get_msi_32(uint64_t phb_id, uint32_t mve_number, return OPAL_UNSUPPORTED; phb_lock(phb); rc = phb->ops->get_msi_32(phb, mve_number, xive_num, msi_range, - msi_address, message_data); + &msi_address, &message_data); phb_unlock(phb); + *__msi_address = cpu_to_be32(msi_address); + *__message_data = cpu_to_be32(message_data); + return rc; } opal_call(OPAL_GET_MSI_32, opal_get_msi_32, 6); static int64_t opal_get_msi_64(uint64_t phb_id, uint32_t mve_number, uint32_t xive_num, uint8_t msi_range, - uint64_t *msi_address, uint32_t *message_data) + __be64 *__msi_address, __be32 *__message_data) { struct phb *phb = pci_get_phb(phb_id); + uint64_t msi_address; + uint32_t message_data; int64_t rc; - if (!opal_addr_valid(msi_address) || !opal_addr_valid(message_data)) + if (!opal_addr_valid(__msi_address) || !opal_addr_valid(__message_data)) return OPAL_PARAMETER; if (!phb) @@ -408,9 +446,12 @@ static int64_t opal_get_msi_64(uint64_t phb_id, uint32_t mve_number, return OPAL_UNSUPPORTED; phb_lock(phb); rc = phb->ops->get_msi_64(phb, mve_number, xive_num, msi_range, - msi_address, message_data); + &msi_address, &message_data); phb_unlock(phb); + *__msi_address = cpu_to_be64(msi_address); + *__message_data = cpu_to_be32(message_data); + return rc; } opal_call(OPAL_GET_MSI_64, opal_get_msi_64, 6); @@ -918,14 +959,17 @@ static int64_t opal_pci_get_phb_diag_data2(uint64_t phb_id, } opal_call(OPAL_PCI_GET_PHB_DIAG_DATA2, opal_pci_get_phb_diag_data2, 3); -static int64_t opal_pci_next_error(uint64_t phb_id, uint64_t *first_frozen_pe, - uint16_t *pci_error_type, uint16_t *severity) +static int64_t opal_pci_next_error(uint64_t phb_id, __be64 *__first_frozen_pe, + __be16 *__pci_error_type, __be16 *__severity) { struct phb *phb = pci_get_phb(phb_id); + uint64_t first_frozen_pe; + uint16_t pci_error_type; + uint16_t severity; int64_t rc; - if (!opal_addr_valid(first_frozen_pe) || - !opal_addr_valid(pci_error_type) || !opal_addr_valid(severity)) + if (!opal_addr_valid(__first_frozen_pe) || + !opal_addr_valid(__pci_error_type) || !opal_addr_valid(__severity)) return OPAL_PARAMETER; if (!phb) @@ -935,10 +979,14 @@ static int64_t opal_pci_next_error(uint64_t phb_id, uint64_t *first_frozen_pe, phb_lock(phb); opal_pci_eeh_clear_evt(phb_id); - rc = phb->ops->next_error(phb, first_frozen_pe, pci_error_type, - severity); + rc = phb->ops->next_error(phb, &first_frozen_pe, &pci_error_type, + &severity); phb_unlock(phb); + *__first_frozen_pe = cpu_to_be64(first_frozen_pe); + *__pci_error_type = cpu_to_be16(pci_error_type); + *__severity = cpu_to_be16(severity); + return rc; } opal_call(OPAL_PCI_NEXT_ERROR, opal_pci_next_error, 4); @@ -999,11 +1047,12 @@ static int64_t opal_pci_set_p2p(uint64_t phbid_init, uint64_t phbid_target, } opal_call(OPAL_PCI_SET_P2P, opal_pci_set_p2p, 4); -static int64_t opal_pci_get_pbcq_tunnel_bar(uint64_t phb_id, uint64_t *addr) +static int64_t opal_pci_get_pbcq_tunnel_bar(uint64_t phb_id, __be64 *__addr) { struct phb *phb = pci_get_phb(phb_id); + uint64_t addr; - if (!opal_addr_valid(addr)) + if (!opal_addr_valid(__addr)) return OPAL_PARAMETER; if (!phb) @@ -1012,8 +1061,11 @@ static int64_t opal_pci_get_pbcq_tunnel_bar(uint64_t phb_id, uint64_t *addr) return OPAL_UNSUPPORTED; phb_lock(phb); - phb->ops->get_tunnel_bar(phb, addr); + phb->ops->get_tunnel_bar(phb, &addr); phb_unlock(phb); + + *__addr = cpu_to_be64(addr); + return OPAL_SUCCESS; } opal_call(OPAL_PCI_GET_PBCQ_TUNNEL_BAR, opal_pci_get_pbcq_tunnel_bar, 2); diff --git a/core/powercap.c b/core/powercap.c index b9d172b54..de2a79095 100644 --- a/core/powercap.c +++ b/core/powercap.c @@ -7,13 +7,19 @@ #include -static int opal_get_powercap(u32 handle, int token __unused, u32 *pcap) +static int opal_get_powercap(u32 handle, int token __unused, __be32 *__pcap) { - if (!pcap || !opal_addr_valid(pcap)) + if (!__pcap || !opal_addr_valid(__pcap)) return OPAL_PARAMETER; - if (powercap_get_class(handle) == POWERCAP_CLASS_OCC) - return occ_get_powercap(handle, pcap); + if (powercap_get_class(handle) == POWERCAP_CLASS_OCC) { + u32 pcap; + int rc; + + rc = occ_get_powercap(handle, &pcap); + *__pcap = cpu_to_be32(pcap); + return rc; + } return OPAL_UNSUPPORTED; }; diff --git a/core/psr.c b/core/psr.c index 4cd3768ae..6698df8d2 100644 --- a/core/psr.c +++ b/core/psr.c @@ -10,13 +10,19 @@ #include static int opal_get_power_shift_ratio(u32 handle, int token __unused, - u32 *ratio) + __be32 *__ratio) { - if (!ratio || !opal_addr_valid(ratio)) + if (!__ratio || !opal_addr_valid(__ratio)) return OPAL_PARAMETER; - if (psr_get_class(handle) == PSR_CLASS_OCC) - return occ_get_psr(handle, ratio); + if (psr_get_class(handle) == PSR_CLASS_OCC) { + u32 ratio; + int rc; + + rc = occ_get_psr(handle, &ratio); + *__ratio = cpu_to_be32(ratio); + return rc; + } return OPAL_UNSUPPORTED; }; diff --git a/core/sensor.c b/core/sensor.c index a804f968a..d63d909e6 100644 --- a/core/sensor.c +++ b/core/sensor.c @@ -20,12 +20,12 @@ static LIST_HEAD(async_read_list); struct sensor_async_read { struct list_node link; - u64 *sensor_data64; - u32 *sensor_data32; + __be64 *val; + __be32 *opal_data; int token; }; -static int add_to_async_read_list(int token, u32 *data32, u64 *data64) +static int add_to_async_read_list(int token, __be32 *opal_data, __be64 *val) { struct sensor_async_read *req; @@ -34,8 +34,8 @@ static int add_to_async_read_list(int token, u32 *data32, u64 *data64) return OPAL_NO_MEM; req->token = token; - req->sensor_data64 = data64; - req->sensor_data32 = data32; + req->val = val; + req->opal_data = opal_data; lock(&async_read_list_lock); list_add_tail(&async_read_list, &req->link); @@ -59,50 +59,58 @@ void check_sensor_read(int token) if (!req) goto out; - *req->sensor_data32 = *req->sensor_data64; - free(req->sensor_data64); + *req->opal_data = cpu_to_be32(be64_to_cpu(*req->val)); + free(req->val); list_del(&req->link); free(req); out: unlock(&async_read_list_lock); } -static s64 opal_sensor_read_u64(u32 sensor_hndl, int token, u64 *sensor_data) +static s64 opal_sensor_read_64(u32 sensor_hndl, int token, __be64 *data) { + s64 rc; + switch (sensor_get_family(sensor_hndl)) { case SENSOR_DTS: - return dts_sensor_read(sensor_hndl, token, sensor_data); + rc = dts_sensor_read(sensor_hndl, token, data); + return rc; + case SENSOR_OCC: - return occ_sensor_read(sensor_hndl, sensor_data); + rc = occ_sensor_read(sensor_hndl, data); + return rc; + default: break; } - if (platform.sensor_read) - return platform.sensor_read(sensor_hndl, token, sensor_data); + if (platform.sensor_read) { + rc = platform.sensor_read(sensor_hndl, token, data); + return rc; + } return OPAL_UNSUPPORTED; } static int64_t opal_sensor_read(uint32_t sensor_hndl, int token, - uint32_t *sensor_data) + __be32 *data) { - u64 *val; - s64 ret; + __be64 *val; + s64 rc; val = zalloc(sizeof(*val)); if (!val) return OPAL_NO_MEM; - ret = opal_sensor_read_u64(sensor_hndl, token, val); - if (!ret) { - *sensor_data = *val; + rc = opal_sensor_read_64(sensor_hndl, token, val); + if (rc == OPAL_SUCCESS) { + *data = cpu_to_be32(be64_to_cpu(*val)); free(val); - } else if (ret == OPAL_ASYNC_COMPLETION) { - ret = add_to_async_read_list(token, sensor_data, val); + } else if (rc == OPAL_ASYNC_COMPLETION) { + rc = add_to_async_read_list(token, data, val); } - return ret; + return rc; } static int opal_sensor_group_clear(u32 group_hndl, int token) @@ -139,6 +147,6 @@ void sensor_init(void) /* Register OPAL interface */ opal_register(OPAL_SENSOR_READ, opal_sensor_read, 3); opal_register(OPAL_SENSOR_GROUP_CLEAR, opal_sensor_group_clear, 2); - opal_register(OPAL_SENSOR_READ_U64, opal_sensor_read_u64, 3); + opal_register(OPAL_SENSOR_READ_U64, opal_sensor_read_64, 3); opal_register(OPAL_SENSOR_GROUP_ENABLE, opal_sensor_group_enable, 3); } diff --git a/hw/dts.c b/hw/dts.c index 31b068b78..c21c5c779 100644 --- a/hw/dts.c +++ b/hw/dts.c @@ -174,9 +174,9 @@ static void dts_async_read_temp(struct timer *t __unused, void *data, rc = dts_read_core_temp_p9(cpu->pir, &dts); if (!rc) { if (cpu->sensor_attr == SENSOR_DTS_ATTR_TEMP_MAX) - *cpu->sensor_data = dts.temp; + *cpu->sensor_data = cpu_to_be64(dts.temp); else if (cpu->sensor_attr == SENSOR_DTS_ATTR_TEMP_TRIP) - *cpu->sensor_data = dts.trip; + *cpu->sensor_data = cpu_to_be64(dts.trip); } if (!swkup_rc) @@ -191,7 +191,7 @@ static void dts_async_read_temp(struct timer *t __unused, void *data, } static int dts_read_core_temp(u32 pir, struct dts *dts, u8 attr, - int token, u64 *sensor_data) + int token, __be64 *sensor_data) { struct cpu_thread *cpu; int rc; @@ -286,7 +286,7 @@ enum sensor_dts_class { */ #define centaur_get_id(rid) (0x80000000 | ((rid) & 0x3ff)) -int64_t dts_sensor_read(u32 sensor_hndl, int token, u64 *sensor_data) +int64_t dts_sensor_read(u32 sensor_hndl, int token, __be64 *sensor_data) { uint8_t attr = sensor_get_attr(sensor_hndl); uint32_t rid = sensor_get_rid(sensor_hndl); @@ -313,9 +313,9 @@ int64_t dts_sensor_read(u32 sensor_hndl, int token, u64 *sensor_data) return rc; if (attr == SENSOR_DTS_ATTR_TEMP_MAX) - *sensor_data = dts.temp; + *sensor_data = cpu_to_be64(dts.temp); else if (attr == SENSOR_DTS_ATTR_TEMP_TRIP) - *sensor_data = dts.trip; + *sensor_data = cpu_to_be64(dts.trip); return 0; } diff --git a/hw/fake-rtc.c b/hw/fake-rtc.c index 328be97d9..fd2882d68 100644 --- a/hw/fake-rtc.c +++ b/hw/fake-rtc.c @@ -34,13 +34,15 @@ static int64_t fake_rtc_write(uint32_t ymd, uint64_t hmsm) return OPAL_SUCCESS; } -static int64_t fake_rtc_read(uint32_t *ymd, uint64_t *hmsm) +static int64_t fake_rtc_read(__be32 *__ymd, __be64 *__hmsm) { time_t sec; struct tm tm_calculated; + uint32_t ymd; + uint64_t hmsm; - if (!ymd || !hmsm) + if (!__ymd || !__hmsm) return OPAL_PARAMETER; /* Compute the emulated clock value */ @@ -48,10 +50,13 @@ static int64_t fake_rtc_read(uint32_t *ymd, uint64_t *hmsm) sec = tb_to_secs(mftb() - tb_synctime) + mktime(&tm_offset); gmtime_r(&sec, &tm_calculated); - tm_to_datetime(&tm_calculated, ymd, hmsm); + tm_to_datetime(&tm_calculated, &ymd, &hmsm); unlock(&emulation_lock); + *__ymd = cpu_to_be32(ymd); + *__hmsm = cpu_to_be64(hmsm); + return OPAL_SUCCESS; } diff --git a/hw/fsp/fsp-console.c b/hw/fsp/fsp-console.c index 1a2ecaba0..624efb469 100644 --- a/hw/fsp/fsp-console.c +++ b/hw/fsp/fsp-console.c @@ -579,7 +579,7 @@ void fsp_console_preinit(void) } -static int64_t fsp_console_write(int64_t term_number, int64_t *length, +static int64_t fsp_console_write(int64_t term_number, __be64 *__length, const uint8_t *buffer) { struct fsp_serial *fs; @@ -596,7 +596,7 @@ static int64_t fsp_console_write(int64_t term_number, int64_t *length, return OPAL_CLOSED; } /* Clamp to a reasonable size */ - requested = *length; + requested = be64_to_cpu(*__length); if (requested > 0x1000) requested = 0x1000; written = fsp_write_vserial(fs, buffer, requested); @@ -618,7 +618,7 @@ static int64_t fsp_console_write(int64_t term_number, int64_t *length, buffer[6], buffer[6], buffer[7], buffer[7]); #endif /* OPAL_DEBUG_CONSOLE_IO */ - *length = written; + *__length = cpu_to_be64(written); unlock(&fsp_con_lock); if (written) @@ -628,11 +628,12 @@ static int64_t fsp_console_write(int64_t term_number, int64_t *length, } static int64_t fsp_console_write_buffer_space(int64_t term_number, - int64_t *length) + __be64 *__length) { static bool elog_generated = false; struct fsp_serial *fs; struct fsp_serbuf_hdr *sb; + int64_t length; if (term_number < 0 || term_number >= MAX_SERIAL) return OPAL_PARAMETER; @@ -645,15 +646,16 @@ static int64_t fsp_console_write_buffer_space(int64_t term_number, return OPAL_CLOSED; } sb = fs->out_buf; - *length = (sb->next_out + SER_BUF_DATA_SIZE - sb->next_in - 1) + length = (sb->next_out + SER_BUF_DATA_SIZE - sb->next_in - 1) % SER_BUF_DATA_SIZE; unlock(&fsp_con_lock); /* Console buffer has enough space to write incoming data */ - if (*length != fs->out_buf_prev_len) { - fs->out_buf_prev_len = *length; + if (length != fs->out_buf_prev_len) { + fs->out_buf_prev_len = length; fs->out_buf_timeout = 0; + *__length = cpu_to_be64(length); return OPAL_SUCCESS; } @@ -667,8 +669,10 @@ static int64_t fsp_console_write_buffer_space(int64_t term_number, secs_to_tb(SER_BUFFER_OUT_TIMEOUT); } - if (tb_compare(mftb(), fs->out_buf_timeout) != TB_AAFTERB) + if (tb_compare(mftb(), fs->out_buf_timeout) != TB_AAFTERB) { + *__length = cpu_to_be64(length); return OPAL_SUCCESS; + } /* * FSP is still active but not reading console data. Hence @@ -686,13 +690,13 @@ static int64_t fsp_console_write_buffer_space(int64_t term_number, return OPAL_RESOURCE; } -static int64_t fsp_console_read(int64_t term_number, int64_t *length, +static int64_t fsp_console_read(int64_t term_number, __be64 *__length, uint8_t *buffer) { struct fsp_serial *fs; struct fsp_serbuf_hdr *sb; bool pending = false; - uint32_t old_nin, n, i, chunk, req = *length; + uint32_t old_nin, n, i, chunk, req = be64_to_cpu(*__length); int rc = OPAL_SUCCESS; if (term_number < 0 || term_number >= MAX_SERIAL) @@ -716,7 +720,7 @@ static int64_t fsp_console_read(int64_t term_number, int64_t *length, pending = true; n = req; } - *length = n; + *__length = cpu_to_be64(n); chunk = SER_BUF_DATA_SIZE - sb->next_out; if (chunk > n) diff --git a/hw/fsp/fsp-rtc.c b/hw/fsp/fsp-rtc.c index 53838f87c..e68836e66 100644 --- a/hw/fsp/fsp-rtc.c +++ b/hw/fsp/fsp-rtc.c @@ -249,12 +249,13 @@ static int64_t fsp_rtc_send_read_request(void) return OPAL_BUSY_EVENT; } -static int64_t fsp_opal_rtc_read(uint32_t *year_month_day, - uint64_t *hour_minute_second_millisecond) +static int64_t fsp_opal_rtc_read(__be32 *__ymd, __be64 *__hmsm) { int64_t rc; + uint32_t ymd; + uint64_t hmsm; - if (!year_month_day || !hour_minute_second_millisecond) + if (!__ymd || !__hmsm) return OPAL_PARAMETER; lock(&rtc_lock); @@ -267,8 +268,7 @@ static int64_t fsp_opal_rtc_read(uint32_t *year_month_day, /* During R/R of FSP, read cached TOD */ if (fsp_in_rr()) { if (rtc_tod_state == RTC_TOD_VALID) { - rtc_cache_get_datetime(year_month_day, - hour_minute_second_millisecond); + rtc_cache_get_datetime(&ymd, &hmsm); rc = OPAL_SUCCESS; } else { rc = OPAL_INTERNAL_ERROR; @@ -290,11 +290,9 @@ static int64_t fsp_opal_rtc_read(uint32_t *year_month_day, opal_rtc_eval_events(true); if (rtc_tod_state == RTC_TOD_VALID) { - rtc_cache_get_datetime(year_month_day, - hour_minute_second_millisecond); + rtc_cache_get_datetime(&ymd, &hmsm); prlog(PR_TRACE,"FSP-RTC Cached datetime: %x %llx\n", - *year_month_day, - *hour_minute_second_millisecond); + ymd, hmsm); rc = OPAL_SUCCESS; } else { rc = OPAL_INTERNAL_ERROR; @@ -306,8 +304,7 @@ static int64_t fsp_opal_rtc_read(uint32_t *year_month_day, prlog(PR_TRACE, "RTC read timed out\n"); if (rtc_tod_state == RTC_TOD_VALID) { - rtc_cache_get_datetime(year_month_day, - hour_minute_second_millisecond); + rtc_cache_get_datetime(&ymd, &hmsm); rc = OPAL_SUCCESS; } else { rc = OPAL_INTERNAL_ERROR; @@ -319,6 +316,12 @@ static int64_t fsp_opal_rtc_read(uint32_t *year_month_day, } out: unlock(&rtc_lock); + + if (rc == OPAL_SUCCESS) { + *__ymd = cpu_to_be32(ymd); + *__hmsm = cpu_to_be64(hmsm); + } + return rc; } diff --git a/hw/fsp/fsp-sensor.c b/hw/fsp/fsp-sensor.c index 43c8ce40b..74deac7a7 100644 --- a/hw/fsp/fsp-sensor.c +++ b/hw/fsp/fsp-sensor.c @@ -70,7 +70,7 @@ enum spcn_attr { /* Parsed sensor attributes, passed through OPAL */ struct opal_sensor_data { uint64_t async_token; /* Asynchronous token */ - uint64_t *sensor_data; /* Kernel pointer to copy data */ + __be64 *sensor_data; /* Kernel pointer to copy data */ enum spcn_attr spcn_attr; /* Modifier attribute */ uint16_t rid; /* Sensor RID */ uint8_t frc; /* Sensor resource class */ @@ -243,7 +243,7 @@ static void fsp_sensor_process_data(struct opal_sensor_data *attr) sensor_buf_ptr += spcn_mod_data[attr->mod_index].entry_size; } - *(attr->sensor_data) = sensor_data; + *attr->sensor_data = cpu_to_be64(sensor_data); if (sensor_data == INVALID_DATA) queue_msg_for_delivery(OPAL_PARTIAL, attr); else @@ -345,7 +345,7 @@ static void fsp_sensor_read_complete(struct fsp_msg *msg) unlock(&sensor_lock); return; err: - *(attr->sensor_data) = INVALID_DATA; + *attr->sensor_data = cpu_to_be64(INVALID_DATA); queue_msg_for_delivery(rc, attr); unlock(&sensor_lock); log_simple_error(&e_info(OPAL_RC_SENSOR_ASYNC_COMPLETE), @@ -496,7 +496,7 @@ static int64_t parse_sensor_id(uint32_t handler, struct opal_sensor_data *attr) int64_t fsp_opal_read_sensor(uint32_t sensor_hndl, int token, - uint64_t *sensor_data) + __be64 *sensor_data) { struct opal_sensor_data *attr; int64_t rc; diff --git a/hw/ipmi/ipmi-rtc.c b/hw/ipmi/ipmi-rtc.c index deb4addcb..ad98f21c6 100644 --- a/hw/ipmi/ipmi-rtc.c +++ b/hw/ipmi/ipmi-rtc.c @@ -62,12 +62,13 @@ static int64_t ipmi_set_sel_time(uint32_t _tv) return ipmi_queue_msg(msg); } -static int64_t ipmi_opal_rtc_read(uint32_t *y_m_d, - uint64_t *h_m_s_m) +static int64_t ipmi_opal_rtc_read(__be32 *__ymd, __be64 *__hmsm) { int ret = 0; + uint32_t ymd; + uint64_t hmsm; - if (!y_m_d || !h_m_s_m) + if (!__ymd || !__hmsm) return OPAL_PARAMETER; switch(time_status) { @@ -83,7 +84,9 @@ static int64_t ipmi_opal_rtc_read(uint32_t *y_m_d, break; case updated: - rtc_cache_get_datetime(y_m_d, h_m_s_m); + rtc_cache_get_datetime(&ymd, &hmsm); + *__ymd = cpu_to_be32(ymd); + *__hmsm = cpu_to_be64(hmsm); time_status = idle; ret = OPAL_SUCCESS; break; diff --git a/hw/lpc-rtc.c b/hw/lpc-rtc.c index f560c8c9f..ba15941fb 100644 --- a/hw/lpc-rtc.c +++ b/hw/lpc-rtc.c @@ -139,14 +139,15 @@ static void lpc_init_hw(void) unlock(&rtc_lock); } -static int64_t lpc_opal_rtc_read(uint32_t *y_m_d, - uint64_t *h_m_s_m) +static int64_t lpc_opal_rtc_read(__be32 *__ymd, __be64 *__hmsm) { uint8_t val; int64_t rc = OPAL_SUCCESS; struct tm tm; + uint32_t ymd; + uint64_t hmsm; - if (!y_m_d || !h_m_s_m) + if (!__ymd || !__hmsm) return OPAL_PARAMETER; /* Return busy if updating. This is somewhat racy, but will @@ -172,7 +173,9 @@ static int64_t lpc_opal_rtc_read(uint32_t *y_m_d, rtc_cache_update(&tm); /* Convert to OPAL time */ - tm_to_datetime(&tm, y_m_d, h_m_s_m); + tm_to_datetime(&tm, &ymd, &hmsm); + *__ymd = cpu_to_be32(ymd); + *__hmsm = cpu_to_be64(hmsm); } return rc; diff --git a/hw/lpc-uart.c b/hw/lpc-uart.c index feca229b6..b37e04201 100644 --- a/hw/lpc-uart.c +++ b/hw/lpc-uart.c @@ -255,10 +255,10 @@ static uint32_t uart_tx_buf_space(void) (out_buf_prod + OUT_BUF_SIZE - out_buf_cons) % OUT_BUF_SIZE; } -static int64_t uart_opal_write(int64_t term_number, int64_t *length, +static int64_t uart_opal_write(int64_t term_number, __be64 *__length, const uint8_t *buffer) { - size_t written = 0, len = *length; + size_t written = 0, len = be64_to_cpu(*__length); if (term_number != 0) return OPAL_PARAMETER; @@ -277,19 +277,19 @@ static int64_t uart_opal_write(int64_t term_number, int64_t *length, unlock(&uart_lock); - *length = written; + *__length = cpu_to_be64(written); return OPAL_SUCCESS; } static int64_t uart_opal_write_buffer_space(int64_t term_number, - int64_t *length) + __be64 *__length) { if (term_number != 0) return OPAL_PARAMETER; lock(&uart_lock); - *length = uart_tx_buf_space(); + *__length = cpu_to_be64(uart_tx_buf_space()); unlock(&uart_lock); return OPAL_SUCCESS; @@ -326,10 +326,10 @@ static void uart_adjust_opal_event(void) } /* This is called with the console lock held */ -static int64_t uart_opal_read(int64_t term_number, int64_t *length, +static int64_t uart_opal_read(int64_t term_number, __be64 *__length, uint8_t *buffer) { - size_t req_count = *length, read_cnt = 0; + size_t req_count = be64_to_cpu(*__length), read_cnt = 0; uint8_t lsr = 0; if (term_number != 0) @@ -373,7 +373,7 @@ static int64_t uart_opal_read(int64_t term_number, int64_t *length, /* Adjust the OPAL event */ uart_adjust_opal_event(); - *length = read_cnt; + *__length = cpu_to_be64(read_cnt); return OPAL_SUCCESS; } diff --git a/hw/npu2-opencapi.c b/hw/npu2-opencapi.c index ed6650f4b..19589c92d 100644 --- a/hw/npu2-opencapi.c +++ b/hw/npu2-opencapi.c @@ -2250,10 +2250,12 @@ out: } static int64_t opal_npu_mem_alloc(uint64_t phb_id, uint32_t __unused bdfn, - uint64_t size, uint64_t *bar) + uint64_t size, __be64 *__bar) { struct phb *phb = pci_get_phb(phb_id); struct npu2_dev *dev; + uint64_t bar; + int64_t rc; if (!phb || phb->phb_type != phb_type_npu_v2_opencapi) @@ -2263,10 +2265,14 @@ static int64_t opal_npu_mem_alloc(uint64_t phb_id, uint32_t __unused bdfn, if (!dev) return OPAL_PARAMETER; - if (!opal_addr_valid(bar)) + if (!opal_addr_valid(__bar)) return OPAL_PARAMETER; - return alloc_mem_bar(dev, size, bar); + rc = alloc_mem_bar(dev, size, &bar); + if (rc == OPAL_SUCCESS) + *__bar = cpu_to_be64(bar); + + return rc; } opal_call(OPAL_NPU_MEM_ALLOC, opal_npu_mem_alloc, 4); diff --git a/hw/occ-sensor.c b/hw/occ-sensor.c index 8434c1930..da846bd92 100644 --- a/hw/occ-sensor.c +++ b/hw/occ-sensor.c @@ -241,13 +241,14 @@ static void *select_sensor_buffer(struct occ_sensor_data_header *hb, int id) return buffer; } -int occ_sensor_read(u32 handle, u64 *data) +int occ_sensor_read(u32 handle, __be64 *data) { struct occ_sensor_data_header *hb; struct occ_sensor_name *md; u16 id = sensor_get_rid(handle); u8 occ_num = sensor_get_frc(handle); u8 attr = sensor_get_attr(handle); + u64 d; void *buff; if (occ_num > MAX_OCCS) @@ -271,15 +272,17 @@ int occ_sensor_read(u32 handle, u64 *data) if (!buff) return OPAL_HARDWARE; - *data = read_sensor(buff, attr); - if (!*data) + d = read_sensor(buff, attr); + if (!d) return OPAL_SUCCESS; md = get_names_block(hb); if (md[id].type == OCC_SENSOR_TYPE_POWER && attr == SENSOR_ACCUMULATOR) - scale_energy(&md[id], data); + scale_energy(&md[id], &d); else - scale_sensor(&md[id], data); + scale_sensor(&md[id], &d); + + *data = cpu_to_be64(d); return OPAL_SUCCESS; } diff --git a/hw/xscom.c b/hw/xscom.c index f3f4e1039..2800134e8 100644 --- a/hw/xscom.c +++ b/hw/xscom.c @@ -631,7 +631,17 @@ int _xscom_read(uint32_t partid, uint64_t pcb_addr, uint64_t *val, bool take_loc return rc; } -opal_call(OPAL_XSCOM_READ, xscom_read, 3); +static int64_t opal_xscom_read(uint32_t partid, uint64_t pcb_addr, __be64 *__val) +{ + uint64_t val; + int64_t rc; + + rc = xscom_read(partid, pcb_addr, &val); + *__val = cpu_to_be64(val); + + return rc; +} +opal_call(OPAL_XSCOM_READ, opal_xscom_read, 3); int _xscom_write(uint32_t partid, uint64_t pcb_addr, uint64_t val, bool take_lock) { @@ -675,7 +685,12 @@ int _xscom_write(uint32_t partid, uint64_t pcb_addr, uint64_t val, bool take_loc unlock(&xscom_lock); return rc; } -opal_call(OPAL_XSCOM_WRITE, xscom_write, 3); + +static int64_t opal_xscom_write(uint32_t partid, uint64_t pcb_addr, uint64_t val) +{ + return xscom_write(partid, pcb_addr, val); +} +opal_call(OPAL_XSCOM_WRITE, opal_xscom_write, 3); /* * Perform a xscom read-modify-write. diff --git a/include/console.h b/include/console.h index 26602b7ac..230b825b0 100644 --- a/include/console.h +++ b/include/console.h @@ -47,13 +47,13 @@ struct opal_con_ops { */ void (*init)(void); - int64_t (*write)(int64_t term, int64_t *len, const uint8_t *buf); - int64_t (*read)(int64_t term, int64_t *len, uint8_t *buf); + int64_t (*write)(int64_t term, __be64 *__len, const uint8_t *buf); + int64_t (*read)(int64_t term, __be64 *__len, uint8_t *buf); /* * returns the amount of space available in the console write buffer */ - int64_t (*space)(int64_t term_number, int64_t *length); + int64_t (*space)(int64_t term_number, __be64 *__length); /* * Forces the write buffer to be flushed by the driver diff --git a/include/cpu.h b/include/cpu.h index 5fdcc9862..7b1c1bcf3 100644 --- a/include/cpu.h +++ b/include/cpu.h @@ -103,7 +103,7 @@ struct cpu_thread { */ struct lock dts_lock; struct timer dts_timer; - u64 *sensor_data; + __be64 *sensor_data; u32 sensor_attr; u32 token; bool dts_read_in_progress; diff --git a/include/dts.h b/include/dts.h index 2b54054e4..66f81a294 100644 --- a/include/dts.h +++ b/include/dts.h @@ -6,7 +6,7 @@ #include -extern int64_t dts_sensor_read(u32 sensor_hndl, int token, u64 *sensor_data); +extern int64_t dts_sensor_read(u32 sensor_hndl, int token, __be64 *sensor_data); extern bool dts_sensor_create_nodes(struct dt_node *sensors); #endif /* __DTS_H */ diff --git a/include/fsp.h b/include/fsp.h index b4c17598e..b2827b327 100644 --- a/include/fsp.h +++ b/include/fsp.h @@ -819,7 +819,7 @@ extern void fsp_memory_err_init(void); /* Sensor */ extern void fsp_init_sensor(void); extern int64_t fsp_opal_read_sensor(uint32_t sensor_hndl, int token, - uint64_t *sensor_data); + __be64 *sensor_data); /* Diagnostic */ extern void fsp_init_diag(void); diff --git a/include/occ.h b/include/occ.h index 0030af5ae..ab45e9e46 100644 --- a/include/occ.h +++ b/include/occ.h @@ -32,7 +32,7 @@ bool occ_get_gpu_presence(struct proc_chip *chip, int gpu_num); /* OCC Inband Sensors */ extern bool occ_sensors_init(void); -extern int occ_sensor_read(u32 handle, u64 *data); +extern int occ_sensor_read(u32 handle, __be64 *data); extern int occ_sensor_group_clear(u32 group_hndl, int token); extern void occ_add_sensor_groups(struct dt_node *sg, u32 *phandles, u32 *ptype, int nr_phandles, int chipid); diff --git a/include/platform.h b/include/platform.h index 412f8fc80..6ecdbe474 100644 --- a/include/platform.h +++ b/include/platform.h @@ -258,7 +258,7 @@ struct platform { * Read a sensor value */ int64_t (*sensor_read)(uint32_t sensor_hndl, int token, - uint64_t *sensor_data); + __be64 *sensor_data); /* * Return the heartbeat time */ diff --git a/platforms/ibm-fsp/ibm-fsp.h b/platforms/ibm-fsp/ibm-fsp.h index b3418e692..16af68f8c 100644 --- a/platforms/ibm-fsp/ibm-fsp.h +++ b/platforms/ibm-fsp/ibm-fsp.h @@ -15,7 +15,7 @@ struct errorlog; extern int elog_fsp_commit(struct errorlog *buf); extern int64_t ibm_fsp_sensor_read(uint32_t sensor_hndl, int token, - uint64_t *sensor_data); + __be64 *sensor_data); /* Apollo PCI support */ extern void apollo_pci_setup_phb(struct phb *phb, diff --git a/platforms/mambo/mambo.c b/platforms/mambo/mambo.c index e523cd3eb..aa1bf8305 100644 --- a/platforms/mambo/mambo.c +++ b/platforms/mambo/mambo.c @@ -173,11 +173,13 @@ static void bogus_disk_flash_init(void) } } -static int64_t mambo_rtc_read(uint32_t *ymd, uint64_t *hmsm) +static int64_t mambo_rtc_read(__be32 *ymd, __be64 *hmsm) { int64_t mambo_time; struct tm t; time_t mt; + uint32_t __ymd; + uint64_t __hmsm; if (!ymd || !hmsm) return OPAL_PARAMETER; @@ -185,7 +187,10 @@ static int64_t mambo_rtc_read(uint32_t *ymd, uint64_t *hmsm) mambo_time = callthru0(SIM_GET_TIME_CODE); mt = mambo_time >> 32; gmtime_r(&mt, &t); - tm_to_datetime(&t, ymd, hmsm); + tm_to_datetime(&t, &__ymd, &__hmsm); + + *ymd = cpu_to_be32(__ymd); + *hmsm = cpu_to_be64(__hmsm); return OPAL_SUCCESS; } From patchwork Thu Nov 28 06:24:19 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Nicholas Piggin X-Patchwork-Id: 1201897 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.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 47NnlC3HXPz9s7T for ; Thu, 28 Nov 2019 17:28:23 +1100 (AEDT) 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="dIGz846l"; 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 47NnlC2MvSzDr0P for ; Thu, 28 Nov 2019 17:28:23 +1100 (AEDT) X-Original-To: skiboot@lists.ozlabs.org Delivered-To: skiboot@lists.ozlabs.org Authentication-Results: lists.ozlabs.org; spf=pass (sender SPF authorized) smtp.mailfrom=gmail.com (client-ip=2607:f8b0:4864:20::1044; helo=mail-pj1-x1044.google.com; envelope-from=npiggin@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="dIGz846l"; dkim-atps=neutral Received: from mail-pj1-x1044.google.com (mail-pj1-x1044.google.com [IPv6:2607:f8b0:4864:20::1044]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (2048 bits) server-digest SHA256) (No client certificate requested) by lists.ozlabs.org (Postfix) with ESMTPS id 47NnhJ1rbczDr0N for ; Thu, 28 Nov 2019 17:25:52 +1100 (AEDT) Received: by mail-pj1-x1044.google.com with SMTP id r67so3644432pjb.0 for ; Wed, 27 Nov 2019 22:25:52 -0800 (PST) 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 :mime-version:content-transfer-encoding; bh=69ui2/24JD15cAgbWjPacdj5c9d2kZZR+bTuBl5U9AY=; b=dIGz846lDtG66+fwMO5UF2dXTTMRhR+jXE2372u0VTOci6N/VDxNybWpUz+r0w1KeM vKuUqK/UGWXD7TfkKJ02D2oPHhWwuHNKHUiusPJcSKz43c+VxjIY6bSk187MR7TEM4aQ 9OHJGIK1rdeWrUVT22XzFxU7LQBiOgCkMpTiEtFkAxHTDEtjbCOC+yQbgcSs9sUwb85M 5ouCuWQ50lNQOq17QA8YUy59HcSBJsRZjFgcsxVCU9ZtKYulg+Xdx2a+vYqWkRw4bUTt qpK+CdWtNiAn3nSBsmXDnECXs6IJjSmcj3ypaqO+8qEyQ2nT2zrxOimCG4COHrfGYHdg CvDA== 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:mime-version:content-transfer-encoding; bh=69ui2/24JD15cAgbWjPacdj5c9d2kZZR+bTuBl5U9AY=; b=e23SMc2jlRO0TuyLbzN+Fnyf/OYU11Oc518kprqPlsGBFlHmjdF/QjPYm+/xU2U7ph P3+mlzOeX6kDSQlyb55OSkJVDfn7USJbQEexhmU0wim/tHYyYKL8g3f7RFCJETduq5yt VauFCHWIHwOWzlQqcL5fEpVjO0P3BAZFH1f654X/Mj10VxaPQKj7dbG9qJfZdWaJy0kR 30X1KjE0Y6n7OYeQ3nDsvaQQisC+o+k4uCun7NTt1Ixq38BNd9G/vbk7Q95uYNzftb5v oLB2O8Jdszqcrv8mwQDn0xLC5Kc4q1UPmsoywnHh3y+WsnD9/0XyLYyPx5gTkHdTHwRe GyUA== X-Gm-Message-State: APjAAAX9WybPWdrn1+Cbg5PRlGyM0QQkWm8El6w0lCf7UTnyoiYjM3NX GQRbBzUyctF8Nd/xh697hIFT/5Vz7/A= X-Google-Smtp-Source: APXvYqwf4a/wDWddWU8AgyGvdE8TdhrDR4yLEyd+EmP31sbvZ+LPFoBv3N1KwRb+AqwWXJP+sCYeYg== X-Received: by 2002:a17:902:aa97:: with SMTP id d23mr7897075plr.337.1574922349499; Wed, 27 Nov 2019 22:25:49 -0800 (PST) Received: from bobo.local0.net ([203.194.47.34]) by smtp.gmail.com with ESMTPSA id e5sm8463196pjv.29.2019.11.27.22.25.47 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 27 Nov 2019 22:25:49 -0800 (PST) From: Nicholas Piggin To: skiboot@lists.ozlabs.org Date: Thu, 28 Nov 2019 16:24:19 +1000 Message-Id: <20191128062442.20690-6-npiggin@gmail.com> X-Mailer: git-send-email 2.23.0 In-Reply-To: <20191128062442.20690-1-npiggin@gmail.com> References: <20191128062442.20690-1-npiggin@gmail.com> MIME-Version: 1.0 Subject: [Skiboot] [PATCH v8 05/28] elf: endian conversions X-BeenThere: skiboot@lists.ozlabs.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: Mailing list for skiboot development List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: skiboot-bounces+incoming=patchwork.ozlabs.org@lists.ozlabs.org Sender: "Skiboot" Signed-off-by: Nicholas Piggin --- core/flash.c | 36 +++++--- core/init.c | 92 ++++++++++--------- include/elf.h | 235 +++++++++++++++++++++++++++++++++--------------- include/stack.h | 4 + include/types.h | 4 + 5 files changed, 248 insertions(+), 123 deletions(-) diff --git a/core/flash.c b/core/flash.c index 7fbfca22b..5fc3f3946 100644 --- a/core/flash.c +++ b/core/flash.c @@ -520,24 +520,38 @@ const char *flash_map_resource_name(enum resource_id id) static size_t sizeof_elf_from_hdr(void *buf) { - struct elf_hdr *elf = (struct elf_hdr*) buf; + struct elf_hdr *elf = (struct elf_hdr *)buf; size_t sz = 0; BUILD_ASSERT(SECURE_BOOT_HEADERS_SIZE > sizeof(struct elf_hdr)); - BUILD_ASSERT(SECURE_BOOT_HEADERS_SIZE > sizeof(struct elf64_hdr)); - BUILD_ASSERT(SECURE_BOOT_HEADERS_SIZE > sizeof(struct elf32_hdr)); + BUILD_ASSERT(SECURE_BOOT_HEADERS_SIZE > sizeof(struct elf64be_hdr)); + BUILD_ASSERT(SECURE_BOOT_HEADERS_SIZE > sizeof(struct elf32be_hdr)); if (elf->ei_ident == ELF_IDENT) { if (elf->ei_class == ELF_CLASS_64) { - struct elf64_hdr *elf64 = (struct elf64_hdr*) buf; - sz = le64_to_cpu(elf64->e_shoff) + - ((uint32_t)le16_to_cpu(elf64->e_shentsize) * - (uint32_t)le16_to_cpu(elf64->e_shnum)); + if (elf->ei_data == ELF_DATA_LSB) { + struct elf64le_hdr *kh = (struct elf64le_hdr *)buf; + sz = le64_to_cpu(kh->e_shoff) + + ((uint32_t)le16_to_cpu(kh->e_shentsize) * + (uint32_t)le16_to_cpu(kh->e_shnum)); + } else { + struct elf64be_hdr *kh = (struct elf64be_hdr *)buf; + sz = be64_to_cpu(kh->e_shoff) + + ((uint32_t)be16_to_cpu(kh->e_shentsize) * + (uint32_t)be16_to_cpu(kh->e_shnum)); + } } else if (elf->ei_class == ELF_CLASS_32) { - struct elf32_hdr *elf32 = (struct elf32_hdr*) buf; - sz = le32_to_cpu(elf32->e_shoff) + - (le16_to_cpu(elf32->e_shentsize) * - le16_to_cpu(elf32->e_shnum)); + if (elf->ei_data == ELF_DATA_LSB) { + struct elf32le_hdr *kh = (struct elf32le_hdr *)buf; + sz = le32_to_cpu(kh->e_shoff) + + (le16_to_cpu(kh->e_shentsize) * + le16_to_cpu(kh->e_shnum)); + } else { + struct elf32be_hdr *kh = (struct elf32be_hdr *)buf; + sz = be32_to_cpu(kh->e_shoff) + + (be16_to_cpu(kh->e_shentsize) * + be16_to_cpu(kh->e_shnum)); + } } } diff --git a/core/init.c b/core/init.c index a7083456e..d90695c16 100644 --- a/core/init.c +++ b/core/init.c @@ -89,9 +89,9 @@ static void checksum_romem(void); static bool try_load_elf64_le(struct elf_hdr *header) { - struct elf64_hdr *kh = (struct elf64_hdr *)header; + struct elf64le_hdr *kh = (struct elf64le_hdr *)header; uint64_t load_base = (uint64_t)kh; - struct elf64_phdr *ph; + struct elf64le_phdr *ph; unsigned int i; printf("INIT: 64-bit LE kernel discovered\n"); @@ -103,7 +103,7 @@ static bool try_load_elf64_le(struct elf_hdr *header) * to work for the Linux Kernel because it's a fairly dumb ELF * but it will not work for any ELF binary. */ - ph = (struct elf64_phdr *)(load_base + le64_to_cpu(kh->e_phoff)); + ph = (struct elf64le_phdr *)(load_base + le64_to_cpu(kh->e_phoff)); for (i = 0; i < le16_to_cpu(kh->e_phnum); i++, ph++) { if (le32_to_cpu(ph->p_type) != ELF_PTYPE_LOAD) continue; @@ -137,23 +137,24 @@ static bool try_load_elf64_le(struct elf_hdr *header) static bool try_load_elf64(struct elf_hdr *header) { - struct elf64_hdr *kh = (struct elf64_hdr *)header; + struct elf64be_hdr *kh = (struct elf64be_hdr *)header; + struct elf64le_hdr *khle = (struct elf64le_hdr *)header; uint64_t load_base = (uint64_t)kh; - struct elf64_phdr *ph; - struct elf64_shdr *sh; + struct elf64be_phdr *ph; + struct elf64be_shdr *sh; unsigned int i; /* Check it's a ppc64 LE ELF */ - if (kh->ei_ident == ELF_IDENT && - kh->ei_data == ELF_DATA_LSB && - kh->e_machine == le16_to_cpu(ELF_MACH_PPC64)) { + if (khle->ei_ident == ELF_IDENT && + khle->ei_data == ELF_DATA_LSB && + le16_to_cpu(khle->e_machine) == ELF_MACH_PPC64) { return try_load_elf64_le(header); } /* Check it's a ppc64 ELF */ if (kh->ei_ident != ELF_IDENT || kh->ei_data != ELF_DATA_MSB || - kh->e_machine != ELF_MACH_PPC64) { + be16_to_cpu(kh->e_machine) != ELF_MACH_PPC64) { prerror("INIT: Kernel doesn't look like an ppc64 ELF\n"); return false; } @@ -165,16 +166,18 @@ static bool try_load_elf64(struct elf_hdr *header) * to work for the Linux Kernel because it's a fairly dumb ELF * but it will not work for any ELF binary. */ - ph = (struct elf64_phdr *)(load_base + kh->e_phoff); - for (i = 0; i < kh->e_phnum; i++, ph++) { - if (ph->p_type != ELF_PTYPE_LOAD) + ph = (struct elf64be_phdr *)(load_base + be64_to_cpu(kh->e_phoff)); + for (i = 0; i < be16_to_cpu(kh->e_phnum); i++, ph++) { + if (be32_to_cpu(ph->p_type) != ELF_PTYPE_LOAD) continue; - if (ph->p_vaddr > kh->e_entry || - (ph->p_vaddr + ph->p_memsz) < kh->e_entry) + if (be64_to_cpu(ph->p_vaddr) > be64_to_cpu(kh->e_entry) || + (be64_to_cpu(ph->p_vaddr) + be64_to_cpu(ph->p_memsz)) < + be64_to_cpu(kh->e_entry)) continue; /* Get our entry */ - kernel_entry = kh->e_entry - ph->p_vaddr + ph->p_offset; + kernel_entry = be64_to_cpu(kh->e_entry) - + be64_to_cpu(ph->p_vaddr) + be64_to_cpu(ph->p_offset); break; } @@ -189,23 +192,27 @@ static bool try_load_elf64(struct elf_hdr *header) * into an executable section or not to figure this out. Default * to assuming it obeys the ABI. */ - sh = (struct elf64_shdr *)(load_base + kh->e_shoff); - for (i = 0; i < kh->e_shnum; i++, sh++) { - if (sh->sh_addr <= kh->e_entry && - (sh->sh_addr + sh->sh_size) > kh->e_entry) + sh = (struct elf64be_shdr *)(load_base + be64_to_cpu(kh->e_shoff)); + for (i = 0; i < be16_to_cpu(kh->e_shnum); i++, sh++) { + if (be64_to_cpu(sh->sh_addr) <= be64_to_cpu(kh->e_entry) && + (be64_to_cpu(sh->sh_addr) + be64_to_cpu(sh->sh_size)) > + be64_to_cpu(kh->e_entry)) break; } - if (i == kh->e_shnum || !(sh->sh_flags & ELF_SFLAGS_X)) { + if (i == be16_to_cpu(kh->e_shnum) || + !(be64_to_cpu(sh->sh_flags) & ELF_SFLAGS_X)) { kernel_entry = *(uint64_t *)(kernel_entry + load_base); - kernel_entry = kernel_entry - ph->p_vaddr + ph->p_offset; + kernel_entry = kernel_entry - + be64_to_cpu(ph->p_vaddr) + be64_to_cpu(ph->p_offset); } kernel_entry += load_base; kernel_32bit = false; - kernel_size = kh->e_shoff + - ((uint32_t)kh->e_shentsize * (uint32_t)kh->e_shnum); + kernel_size = be64_to_cpu(kh->e_shoff) + + ((uint32_t)be16_to_cpu(kh->e_shentsize) * + (uint32_t)be16_to_cpu(kh->e_shnum)); printf("INIT: 64-bit kernel entry at 0x%llx, size 0x%lx\n", kernel_entry, kernel_size); @@ -215,9 +222,9 @@ static bool try_load_elf64(struct elf_hdr *header) static bool try_load_elf32_le(struct elf_hdr *header) { - struct elf32_hdr *kh = (struct elf32_hdr *)header; + struct elf32le_hdr *kh = (struct elf32le_hdr *)header; uint64_t load_base = (uint64_t)kh; - struct elf32_phdr *ph; + struct elf32le_phdr *ph; unsigned int i; printf("INIT: 32-bit LE kernel discovered\n"); @@ -229,7 +236,7 @@ static bool try_load_elf32_le(struct elf_hdr *header) * to work for the Linux Kernel because it's a fairly dumb ELF * but it will not work for any ELF binary. */ - ph = (struct elf32_phdr *)(load_base + le32_to_cpu(kh->e_phoff)); + ph = (struct elf32le_phdr *)(load_base + le32_to_cpu(kh->e_phoff)); for (i = 0; i < le16_to_cpu(kh->e_phnum); i++, ph++) { if (le32_to_cpu(ph->p_type) != ELF_PTYPE_LOAD) continue; @@ -259,22 +266,23 @@ static bool try_load_elf32_le(struct elf_hdr *header) static bool try_load_elf32(struct elf_hdr *header) { - struct elf32_hdr *kh = (struct elf32_hdr *)header; + struct elf32be_hdr *kh = (struct elf32be_hdr *)header; + struct elf32le_hdr *khle = (struct elf32le_hdr *)header; uint64_t load_base = (uint64_t)kh; - struct elf32_phdr *ph; + struct elf32be_phdr *ph; unsigned int i; /* Check it's a ppc32 LE ELF */ - if (header->ei_ident == ELF_IDENT && - header->ei_data == ELF_DATA_LSB && - header->e_machine == le16_to_cpu(ELF_MACH_PPC32)) { + if (khle->ei_ident == ELF_IDENT && + khle->ei_data == ELF_DATA_LSB && + le16_to_cpu(khle->e_machine) == ELF_MACH_PPC32) { return try_load_elf32_le(header); } /* Check it's a ppc32 ELF */ - if (header->ei_ident != ELF_IDENT || - header->ei_data != ELF_DATA_MSB || - header->e_machine != ELF_MACH_PPC32) { + if (kh->ei_ident != ELF_IDENT || + kh->ei_data != ELF_DATA_MSB || + be16_to_cpu(kh->e_machine) != ELF_MACH_PPC32) { prerror("INIT: Kernel doesn't look like an ppc32 ELF\n"); return false; } @@ -286,16 +294,18 @@ static bool try_load_elf32(struct elf_hdr *header) * to work for the Linux Kernel because it's a fairly dumb ELF * but it will not work for any ELF binary. */ - ph = (struct elf32_phdr *)(load_base + kh->e_phoff); - for (i = 0; i < kh->e_phnum; i++, ph++) { - if (ph->p_type != ELF_PTYPE_LOAD) + ph = (struct elf32be_phdr *)(load_base + be32_to_cpu(kh->e_phoff)); + for (i = 0; i < be16_to_cpu(kh->e_phnum); i++, ph++) { + if (be32_to_cpu(ph->p_type) != ELF_PTYPE_LOAD) continue; - if (ph->p_vaddr > kh->e_entry || - (ph->p_vaddr + ph->p_memsz) < kh->e_entry) + if (be32_to_cpu(ph->p_vaddr) > be32_to_cpu(kh->e_entry) || + (be32_to_cpu(ph->p_vaddr) + be32_to_cpu(ph->p_memsz)) < + be32_to_cpu(kh->e_entry)) continue; /* Get our entry */ - kernel_entry = kh->e_entry - ph->p_vaddr + ph->p_offset; + kernel_entry = be32_to_cpu(kh->e_entry) - + be32_to_cpu(ph->p_vaddr) + be32_to_cpu(ph->p_offset); break; } diff --git a/include/elf.h b/include/elf.h index 93524bb99..f3e071de1 100644 --- a/include/elf.h +++ b/include/elf.h @@ -5,11 +5,16 @@ #define __ELF_H #include +#include /* Generic ELF header */ struct elf_hdr { uint32_t ei_ident; +#if HAVE_BIG_ENDIAN #define ELF_IDENT 0x7F454C46 +#else +#define ELF_IDENT 0x464C457F +#endif uint8_t ei_class; #define ELF_CLASS_32 1 #define ELF_CLASS_64 2 @@ -18,68 +23,190 @@ struct elf_hdr { #define ELF_DATA_MSB 2 uint8_t ei_version; uint8_t ei_pad[9]; - uint16_t e_type; - uint16_t e_machine; +}; + #define ELF_MACH_PPC32 0x14 #define ELF_MACH_PPC64 0x15 - uint32_t e_version; + +/* 64-bit ELF header */ +struct elf64be_hdr { + uint32_t ei_ident; + uint8_t ei_class; + uint8_t ei_data; + uint8_t ei_version; + uint8_t ei_pad[9]; + __be16 e_type; + __be16 e_machine; + __be32 e_version; + __be64 e_entry; + __be64 e_phoff; + __be64 e_shoff; + __be32 e_flags; + __be16 e_ehsize; + __be16 e_phentsize; + __be16 e_phnum; + __be16 e_shentsize; + __be16 e_shnum; + __be16 e_shstrndx; +}; + +/* 64-bit ELF program header */ +struct elf64be_phdr { + __be32 p_type; +#define ELF_PTYPE_LOAD 1 + __be32 p_flags; +#define ELF_PFLAGS_R 0x4 +#define ELF_PFLAGS_W 0x2 +#define ELF_PFLAGS_X 0x1 + __be64 p_offset; + __be64 p_vaddr; + __be64 p_paddr; + __be64 p_filesz; + __be64 p_memsz; + __be64 p_align; +}; + +/* 64-bit ELF section header */ +struct elf64be_shdr { + __be32 sh_name; + __be32 sh_type; + __be64 sh_flags; +#define ELF_SFLAGS_X 0x4 +#define ELF_SFLAGS_A 0x2 +#define ELF_SFLAGS_W 0x1 + __be64 sh_addr; + __be64 sh_offset; + __be64 sh_size; + __be32 sh_link; + __be32 sh_info; + __be64 sh_addralign; + __be64 sh_entsize; +}; + +/* 32-bit ELF header */ +struct elf32be_hdr { + uint32_t ei_ident; + uint8_t ei_class; + uint8_t ei_data; + uint8_t ei_version; + uint8_t ei_pad[9]; + __be16 e_type; + __be16 e_machine; + __be32 e_version; + __be32 e_entry; + __be32 e_phoff; + __be32 e_shoff; + __be32 e_flags; + __be16 e_ehsize; + __be16 e_phentsize; + __be16 e_phnum; + __be16 e_shentsize; + __be16 e_shnum; + __be16 e_shstrndx; +}; + +/* 32-bit ELF program header*/ +struct elf32be_phdr { + __be32 p_type; + __be32 p_offset; + __be32 p_vaddr; + __be32 p_paddr; + __be32 p_filesz; + __be32 p_memsz; + __be32 p_flags; + __be32 p_align; }; /* 64-bit ELF header */ -struct elf64_hdr { +struct elf64le_hdr { uint32_t ei_ident; uint8_t ei_class; uint8_t ei_data; uint8_t ei_version; uint8_t ei_pad[9]; - uint16_t e_type; - uint16_t e_machine; - uint32_t e_version; - uint64_t e_entry; - uint64_t e_phoff; - uint64_t e_shoff; - uint32_t e_flags; - uint16_t e_ehsize; - uint16_t e_phentsize; - uint16_t e_phnum; - uint16_t e_shentsize; - uint16_t e_shnum; - uint16_t e_shstrndx; + __le16 e_type; + __le16 e_machine; + __le32 e_version; + __le64 e_entry; + __le64 e_phoff; + __le64 e_shoff; + __le32 e_flags; + __le16 e_ehsize; + __le16 e_phentsize; + __le16 e_phnum; + __le16 e_shentsize; + __le16 e_shnum; + __le16 e_shstrndx; }; /* 64-bit ELF program header */ -struct elf64_phdr { - uint32_t p_type; +struct elf64le_phdr { + __le32 p_type; #define ELF_PTYPE_LOAD 1 - uint32_t p_flags; + __le32 p_flags; #define ELF_PFLAGS_R 0x4 #define ELF_PFLAGS_W 0x2 #define ELF_PFLAGS_X 0x1 - uint64_t p_offset; - uint64_t p_vaddr; - uint64_t p_paddr; - uint64_t p_filesz; - uint64_t p_memsz; - uint64_t p_align; + __le64 p_offset; + __le64 p_vaddr; + __le64 p_paddr; + __le64 p_filesz; + __le64 p_memsz; + __le64 p_align; }; /* 64-bit ELF section header */ -struct elf64_shdr { - uint32_t sh_name; - uint32_t sh_type; - uint64_t sh_flags; +struct elf64le_shdr { + __le32 sh_name; + __le32 sh_type; + __le64 sh_flags; #define ELF_SFLAGS_X 0x4 #define ELF_SFLAGS_A 0x2 #define ELF_SFLAGS_W 0x1 - uint64_t sh_addr; - uint64_t sh_offset; - uint64_t sh_size; - uint32_t sh_link; - uint32_t sh_info; - uint64_t sh_addralign; - int64_t sh_entsize; + __le64 sh_addr; + __le64 sh_offset; + __le64 sh_size; + __le32 sh_link; + __le32 sh_info; + __le64 sh_addralign; + __le64 sh_entsize; +}; + +/* 32-bit ELF header */ +struct elf32le_hdr { + uint32_t ei_ident; + uint8_t ei_class; + uint8_t ei_data; + uint8_t ei_version; + uint8_t ei_pad[9]; + __le16 e_type; + __le16 e_machine; + __le32 e_version; + __le32 e_entry; + __le32 e_phoff; + __le32 e_shoff; + __le32 e_flags; + __le16 e_ehsize; + __le16 e_phentsize; + __le16 e_phnum; + __le16 e_shentsize; + __le16 e_shnum; + __le16 e_shstrndx; +}; + +/* 32-bit ELF program header*/ +struct elf32le_phdr { + __le32 p_type; + __le32 p_offset; + __le32 p_vaddr; + __le32 p_paddr; + __le32 p_filesz; + __le32 p_memsz; + __le32 p_flags; + __le32 p_align; }; + /* Some relocation related stuff used in relocate.c */ struct elf64_dyn { int64_t d_tag; @@ -101,39 +228,5 @@ struct elf64_rela { /* relocs we support */ #define R_PPC64_RELATIVE 22 -/* 32-bit ELF header */ -struct elf32_hdr { - uint32_t ei_ident; - uint8_t ei_class; - uint8_t ei_data; - uint8_t ei_version; - uint8_t ei_pad[9]; - uint16_t e_type; - uint16_t e_machine; - uint32_t e_version; - uint32_t e_entry; - uint32_t e_phoff; - uint32_t e_shoff; - uint32_t e_flags; - uint16_t e_ehsize; - uint16_t e_phentsize; - uint16_t e_phnum; - uint16_t e_shentsize; - uint16_t e_shnum; - uint16_t e_shstrndx; -}; - -/* 32-bit ELF program header*/ -struct elf32_phdr { - uint32_t p_type; - uint32_t p_offset; - uint32_t p_vaddr; - uint32_t p_paddr; - uint32_t p_filesz; - uint32_t p_memsz; - uint32_t p_flags; - uint32_t p_align; -}; - #endif /* __ELF_H */ diff --git a/include/stack.h b/include/stack.h index 09d22adb6..b0d6df17d 100644 --- a/include/stack.h +++ b/include/stack.h @@ -11,7 +11,11 @@ #define STACK_ENTRY_RESET 0x0100 /* System reset */ #define STACK_ENTRY_SOFTPATCH 0x1500 /* Soft patch (denorm emulation) */ +#if HAVE_BIG_ENDIAN #define STACK_TOC_OFFSET 40 +#else +#define STACK_TOC_OFFSET 24 +#endif /* Safety/ABI gap at top of stack */ #define STACK_TOP_GAP 0x100 diff --git a/include/types.h b/include/types.h index a7a45f5cb..e7660f6b7 100644 --- a/include/types.h +++ b/include/types.h @@ -11,5 +11,9 @@ typedef beint16_t __be16; typedef beint32_t __be32; typedef beint64_t __be64; +typedef leint16_t __le16; +typedef leint32_t __le32; +typedef leint64_t __le64; + #endif /* __TYPES_H */ From patchwork Thu Nov 28 06:24:20 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Nicholas Piggin X-Patchwork-Id: 1201898 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 47NnlW700pz9s7T for ; Thu, 28 Nov 2019 17:28:39 +1100 (AEDT) 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="IASDdUG/"; 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 47NnlW5sfbzDr0v for ; Thu, 28 Nov 2019 17:28:39 +1100 (AEDT) X-Original-To: skiboot@lists.ozlabs.org Delivered-To: skiboot@lists.ozlabs.org Authentication-Results: lists.ozlabs.org; spf=pass (sender SPF authorized) smtp.mailfrom=gmail.com (client-ip=2607:f8b0:4864:20::441; helo=mail-pf1-x441.google.com; envelope-from=npiggin@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="IASDdUG/"; dkim-atps=neutral Received: from mail-pf1-x441.google.com (mail-pf1-x441.google.com [IPv6:2607:f8b0:4864:20::441]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (2048 bits) server-digest SHA256) (No client certificate requested) by lists.ozlabs.org (Postfix) with ESMTPS id 47NnhL6pKZzDqyg for ; Thu, 28 Nov 2019 17:25:54 +1100 (AEDT) Received: by mail-pf1-x441.google.com with SMTP id p24so12625409pfn.4 for ; Wed, 27 Nov 2019 22:25:54 -0800 (PST) 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 :mime-version:content-transfer-encoding; bh=4hjunjg3NXZ2G2IfHTctnTs2v7nQufULBIOgtvrJVaM=; b=IASDdUG/ewBKuvV1GlphIRDyANR8KeNYV3Cx/ZyZQOD7YJ1YuQnTDmRV3TanHyolaf p8kxiUcZ/iMAxfKYEh1eBGEWJi8l5BJVQcgb0uOq0TJ4mqpk2eQjeGAv4uV+c2cojg7h I+mNp5ZrVivvYHY4bIL9DkzRk78ydX4xwQgQgFloSMbP2i4XzWYAPNRS2kXMU0OvhALC 8NVpIFAAE2cZv4dRRAZDufANZyfoerkFwCRjhJpb2QxeBWBur9lL4CNUjxdxS/U7QO3l pZGhQFjvR05Vq0eMt0wDqK0dAlAbUqMJ0Uz+HmvBo8ioqNO117SGnDjx5596quUysvRW ucXw== 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:mime-version:content-transfer-encoding; bh=4hjunjg3NXZ2G2IfHTctnTs2v7nQufULBIOgtvrJVaM=; b=L+dKRbnUOiAbU0prezZuCigQ3QbbYcS/Oor/eSWbZLIuoKWDtYY31YY5w10/Dw84Rd SzoQ2lhPRF7uAV0XFms0bg+zvwBZtkJ3kWse5LhtKC4gICVi3Ng5CR00FRXNaEWZHQ3Z 4strpS2go9vrEOP+50ySsffQHtkcBR+FuVRrKVWYkVliLrKqCpHUgqf1pihZLSGhjUzz QqYPhJOVQR4NM4rkejA4HMCRVYKPPD39SrUXi6JxNn7NVeHMPjSLYWbqOsKpyFgaadao 79FBGXnzH4+O3jhJ9yzQQkqQir5KtRWl64kVyOcWjXK1k4BB5iJhx18mclF8gh19Fjgd CiJA== X-Gm-Message-State: APjAAAUL7WITW48RbHtVojnbG3W0Zv3JVg1RHHglo3HqnPJPYIqeH3hp 6CLBHK/2tCQaXu5UrkJq/1+F0c7Cb9I= X-Google-Smtp-Source: APXvYqxA7ozepj3iSN0GREzzX6aQIfx5iG98z1mqXj3oxs1gR1tlrHOKs1gTAso92VyqoU5jXkj83w== X-Received: by 2002:aa7:9d09:: with SMTP id k9mr51044631pfp.154.1574922351967; Wed, 27 Nov 2019 22:25:51 -0800 (PST) Received: from bobo.local0.net ([203.194.47.34]) by smtp.gmail.com with ESMTPSA id e5sm8463196pjv.29.2019.11.27.22.25.49 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 27 Nov 2019 22:25:51 -0800 (PST) From: Nicholas Piggin To: skiboot@lists.ozlabs.org Date: Thu, 28 Nov 2019 16:24:20 +1000 Message-Id: <20191128062442.20690-7-npiggin@gmail.com> X-Mailer: git-send-email 2.23.0 In-Reply-To: <20191128062442.20690-1-npiggin@gmail.com> References: <20191128062442.20690-1-npiggin@gmail.com> MIME-Version: 1.0 Subject: [Skiboot] [PATCH v8 06/28] spira: fix endian conversions in spira data structures X-BeenThere: skiboot@lists.ozlabs.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: Mailing list for skiboot development List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: skiboot-bounces+incoming=patchwork.ozlabs.org@lists.ozlabs.org Sender: "Skiboot" Labels can't be used for static initialisers that require endian conversion. Use constants for these. Signed-off-by: Nicholas Piggin --- hdata/spira.c | 59 +++++++++++++++++++++++++--------------- hdata/test/hdata_to_dt.c | 3 ++ 2 files changed, 40 insertions(+), 22 deletions(-) diff --git a/hdata/spira.c b/hdata/spira.c index 6e4da3c02..2d0e875e3 100644 --- a/hdata/spira.c +++ b/hdata/spira.c @@ -33,41 +33,61 @@ __section(".procin.data") struct proc_init_data proc_init_data = { .regs_ptr = HDIF_IDATA_PTR(offsetof(struct proc_init_data, regs), 0x10), .regs = { .nia = CPU_TO_BE64(0x180), - .msr = CPU_TO_BE64(0x9000000000000000ULL), /* SF | HV */ + .msr = CPU_TO_BE64(MSR_SF | MSR_HV), }, }; +extern struct cpu_ctl_init_data cpu_ctl_init_data; extern struct sp_addr_table cpu_ctl_spat_area; -__section(".cpuctrl.data") struct sp_addr_table cpu_ctl_spat_area; -__section(".cpuctrl.data") struct sp_attn_area cpu_ctl_sp_attn_area1; -__section(".cpuctrl.data") struct sp_attn_area cpu_ctl_sp_attn_area2; +extern struct sp_attn_area cpu_ctl_sp_attn_area1; +extern struct sp_attn_area cpu_ctl_sp_attn_area2; extern struct hsr_data_area cpu_ctl_hsr_area; + +/* + * cpuctrl.data begins at CPU_CTL_OFF - cpu_ctl_init_data is located there. + * + sizeof(struct cpu_ctl_init_data) - cpu_ctl_spat_area + * + sizeof(struct sp_addr_table) - cpu_ctl_sp_attn_area1 + * + sizeof(struct sp_attn_area) - cpu_ctl_sp_attn_area2 + * + sizeof(struct sp_attn_area) - cpu_ctl_hsr_area + * + * Can't use CPU_TO_BE64 directly on the labels as a constant initialiser. + * + * CPU_CTL_INIT_DATA_OFF is offset from 0, the others are addressed from the + * relocated address (+SKIBOOT_BASE) + */ +#define CPU_CTL_INIT_DATA_OFF (CPU_CTL_OFF) +#define CPU_CTL_SPAT_AREA_OFF (CPU_CTL_INIT_DATA_OFF + sizeof(struct cpu_ctl_init_data) + SKIBOOT_BASE) +#define CPU_CTL_SP_ATTN_AREA1_OFF (CPU_CTL_SPAT_AREA_OFF + sizeof(struct sp_addr_table)) +#define CPU_CTL_SP_ATTN_AREA2_OFF (CPU_CTL_SP_ATTN_AREA1_OFF + sizeof(struct sp_attn_area)) +#define CPU_CTL_HSR_AREA_OFF (CPU_CTL_SP_ATTN_AREA2_OFF + sizeof(struct sp_attn_area)) + __section(".cpuctrl.data") struct hsr_data_area cpu_ctl_hsr_area; +__section(".cpuctrl.data") struct sp_attn_area cpu_ctl_sp_attn_area2; +__section(".cpuctrl.data") struct sp_attn_area cpu_ctl_sp_attn_area1; +__section(".cpuctrl.data") struct sp_addr_table cpu_ctl_spat_area; -extern struct cpu_ctl_init_data cpu_ctl_init_data; __section(".cpuctrl.data") struct cpu_ctl_init_data cpu_ctl_init_data = { .hdr = HDIF_SIMPLE_HDR(CPU_CTL_HDIF_SIG, 2, struct cpu_ctl_init_data), - .cpu_ctl = HDIF_IDATA_PTR(offsetof(struct cpu_ctl_init_data, cpu_ctl_lt), sizeof(struct cpu_ctl_legacy_table)), -#if !defined(TEST) + .cpu_ctl = HDIF_IDATA_PTR(offsetof(struct cpu_ctl_init_data, cpu_ctl_lt), + sizeof(struct cpu_ctl_legacy_table)), .cpu_ctl_lt = { .spat = { - .addr = CPU_TO_BE64((unsigned long)&(cpu_ctl_spat_area) + SKIBOOT_BASE), + .addr = CPU_TO_BE64(CPU_CTL_SPAT_AREA_OFF), .size = CPU_TO_BE64(sizeof(struct sp_addr_table)), }, .sp_attn_area1 = { - .addr = CPU_TO_BE64((unsigned long)&(cpu_ctl_sp_attn_area1) + SKIBOOT_BASE), + .addr = CPU_TO_BE64(CPU_CTL_SP_ATTN_AREA1_OFF), .size = CPU_TO_BE64(sizeof(struct sp_attn_area)), }, .sp_attn_area2 = { - .addr = CPU_TO_BE64((unsigned long)&(cpu_ctl_sp_attn_area2) + SKIBOOT_BASE), + .addr = CPU_TO_BE64(CPU_CTL_SP_ATTN_AREA2_OFF), .size = CPU_TO_BE64(sizeof(struct sp_attn_area)), }, .hsr_area = { - .addr = CPU_TO_BE64((unsigned long)&(cpu_ctl_hsr_area) + SKIBOOT_BASE), + .addr = CPU_TO_BE64(CPU_CTL_HSR_AREA_OFF), .size = CPU_TO_BE64(sizeof(struct hsr_data_area)), }, }, -#endif }; /* Populate MDST table @@ -131,15 +151,12 @@ __section(".spira.data") struct spira spira = { .alloc_len = CPU_TO_BE32(sizeof(init_mdst_table)), }, -#if !defined(TEST) .cpu_ctrl = { - .addr = CPU_TO_BE64((unsigned long)&cpu_ctl_init_data), + .addr = CPU_TO_BE64(CPU_CTL_INIT_DATA_OFF), .alloc_cnt = CPU_TO_BE16(1), .act_cnt = CPU_TO_BE16(1), - .alloc_len = - CPU_TO_BE32(sizeof(cpu_ctl_init_data)), + .alloc_len = CPU_TO_BE32(sizeof(cpu_ctl_init_data)), }, -#endif }, }; @@ -170,15 +187,13 @@ __section(".spirah.data") struct spirah spirah = { .alloc_len = CPU_TO_BE32(sizeof(struct proc_init_data)), }, -#if !defined(TEST) .cpu_ctrl = { - .addr = CPU_TO_BE64((unsigned long)&cpu_ctl_init_data), + .addr = CPU_TO_BE64(CPU_CTL_INIT_DATA_OFF), .alloc_cnt = CPU_TO_BE16(1), .act_cnt = CPU_TO_BE16(1), .alloc_len = CPU_TO_BE32(sizeof(cpu_ctl_init_data)), }, -#endif .mdump_src = { .addr = CPU_TO_BE64(MDST_TABLE_OFF), .alloc_cnt = CPU_TO_BE16(MDST_TABLE_SIZE / sizeof(struct mdst_table)), @@ -1695,8 +1710,8 @@ static void update_spirah_addr(void) if (proc_gen < proc_gen_p9) return; - *spirah_offset = SPIRAH_OFF; - *spira_offset = SPIRA_OFF; + *spirah_offset = CPU_TO_BE64(SPIRAH_OFF); + *spira_offset = CPU_TO_BE64(SPIRA_OFF); spirah.ntuples.hs_data_area.addr = CPU_TO_BE64(SPIRA_HEAP_BASE - SKIBOOT_BASE); spirah.ntuples.mdump_res.addr = CPU_TO_BE64(MDRT_TABLE_BASE - SKIBOOT_BASE); #endif diff --git a/hdata/test/hdata_to_dt.c b/hdata/test/hdata_to_dt.c index 4605d507e..11b7a3aca 100644 --- a/hdata/test/hdata_to_dt.c +++ b/hdata/test/hdata_to_dt.c @@ -67,6 +67,9 @@ unsigned long tb_hz = 512000000; #define SPR_PVR 0x11f /* RO: Processor version register */ +#define MSR_SF 0x8000000000000000ULL +#define MSR_HV 0x1000000000000000ULL + #define __CPU_H struct cpu_thread { uint32_t pir; From patchwork Thu Nov 28 06:24:21 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Nicholas Piggin X-Patchwork-Id: 1201899 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.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 47Nnlv5QZZz9sPJ for ; Thu, 28 Nov 2019 17:28:59 +1100 (AEDT) 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="GLD9KJQH"; 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 47Nnlv1S6MzDqS4 for ; Thu, 28 Nov 2019 17:28:59 +1100 (AEDT) X-Original-To: skiboot@lists.ozlabs.org Delivered-To: skiboot@lists.ozlabs.org Authentication-Results: lists.ozlabs.org; spf=pass (sender SPF authorized) smtp.mailfrom=gmail.com (client-ip=2607:f8b0:4864:20::643; helo=mail-pl1-x643.google.com; envelope-from=npiggin@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="GLD9KJQH"; dkim-atps=neutral Received: from mail-pl1-x643.google.com (mail-pl1-x643.google.com [IPv6:2607:f8b0:4864:20::643]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (2048 bits) server-digest SHA256) (No client certificate requested) by lists.ozlabs.org (Postfix) with ESMTPS id 47NnhP2Yj8zDr0d for ; Thu, 28 Nov 2019 17:25:57 +1100 (AEDT) Received: by mail-pl1-x643.google.com with SMTP id ay6so11164498plb.0 for ; Wed, 27 Nov 2019 22:25:57 -0800 (PST) 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 :mime-version:content-transfer-encoding; bh=QbjC3e4vIgJcURgVKwN7PCvoE+PMcaSrTzeRwFq4iyA=; b=GLD9KJQHvL6FdAPAwAPSrjTXdQ5qXxFcbucQFknu9LJenT/6HuQexL8RdzzWdQD3Rz ta9t8LZqrT5bkICBX4L2q4pNkOz2YSkRbAQc66ZdTCR2o9JyZJgCBiJpexRwO1PgvoK7 dcnR/FET4oDhpdVWPvkpc1wlMj+jL22rRQXo3VMf8cHt/WwwOjtejtYd6ORH4y+9PstM EqCciGYC+h16FJeWFawgTAzPxcNOdZbVEmc831QbPlExqqHBuGHKRXlGJlLHxfFX5mL1 oKfWxrDsQ9Xmc7w7Cs4+J9Kd+9bKGYSjz9t3JQqGzRWKJDhv/MwPqlkIj3OXnf7VGFqU MuGA== 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:mime-version:content-transfer-encoding; bh=QbjC3e4vIgJcURgVKwN7PCvoE+PMcaSrTzeRwFq4iyA=; b=BgLlXVs3Z6wcF++zL8c5Z4lvxpdeh2pTFl+LtH26vvDgzeydJBEhRbkqHNjROMc7jB 2MHdbhMAs4oA0eEq1nRPioNoxd2QVSmV8vZexsZl1BQSCG7LeWVXhwDdiwysBibYAvrn gi1JwE/gseyOn332OPrxNqXAb1pm1++8hJr2A5TvhyRmEQNbOPZFMLQdLCQDW1fnikpB fIV/XgTiafx592drEQdl50OTsewzmC7rruOQkmZeVK7jTP/y/RJNLbkFuNt1H6/POE3k RhRk11jROtYEOuXveWbkWRO2xcrDxfrWf5VtFLMX1N9dgwmZmHTBpUTxh7FuuKu/x0iR Ssng== X-Gm-Message-State: APjAAAUpRD++GbpNkA+kimgxbU1nYC7c+66DzBg1xTNR9hjvn9QseLFw O8pJoBRcqsDDUgeprqP1WkaPzd4cWiI= X-Google-Smtp-Source: APXvYqxnwn9pWpgHPFszmXJeZdjpJWDbh75uM1F4vBS16FDBar2uClC/9gbOWB+7ZApGhSCqoIHndg== X-Received: by 2002:a17:902:8d81:: with SMTP id v1mr8078611plo.289.1574922354874; Wed, 27 Nov 2019 22:25:54 -0800 (PST) Received: from bobo.local0.net ([203.194.47.34]) by smtp.gmail.com with ESMTPSA id e5sm8463196pjv.29.2019.11.27.22.25.52 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 27 Nov 2019 22:25:54 -0800 (PST) From: Nicholas Piggin To: skiboot@lists.ozlabs.org Date: Thu, 28 Nov 2019 16:24:21 +1000 Message-Id: <20191128062442.20690-8-npiggin@gmail.com> X-Mailer: git-send-email 2.23.0 In-Reply-To: <20191128062442.20690-1-npiggin@gmail.com> References: <20191128062442.20690-1-npiggin@gmail.com> MIME-Version: 1.0 Subject: [Skiboot] [PATCH v8 07/28] hdata: endian conversions X-BeenThere: skiboot@lists.ozlabs.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: Mailing list for skiboot development List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: skiboot-bounces+incoming=patchwork.ozlabs.org@lists.ozlabs.org Sender: "Skiboot" Reviewed-by: Vasant Hegde Signed-off-by: Nicholas Piggin --- hdata/memory.c | 3 ++- hdata/spira.c | 6 +++--- 2 files changed, 5 insertions(+), 4 deletions(-) diff --git a/hdata/memory.c b/hdata/memory.c index 9af7ae71d..9e5e99b9c 100644 --- a/hdata/memory.c +++ b/hdata/memory.c @@ -135,7 +135,8 @@ static bool add_address_range(struct dt_node *root, "on Chip 0x%x mattr: 0x%x pattr: 0x%x status:0x%x\n", (long long)be64_to_cpu(arange->start), (long long)be64_to_cpu(arange->end), - chip_id, arange->mirror_attr, mem_type, mem_status); + chip_id, be32_to_cpu(arange->mirror_attr), + mem_type, mem_status); /* reg contains start and length */ reg[0] = cleanup_addr(be64_to_cpu(arange->start)); diff --git a/hdata/spira.c b/hdata/spira.c index 2d0e875e3..f62170710 100644 --- a/hdata/spira.c +++ b/hdata/spira.c @@ -953,7 +953,7 @@ static void dt_init_secureboot_node(const struct iplparams_sysparams *sysparams) static void opal_dump_add_mpipl_boot(const struct iplparams_iplparams *p) { - u32 mdrt_cnt = spira.ntuples.mdump_res.act_cnt; + u32 mdrt_cnt = be16_to_cpu(spira.ntuples.mdump_res.act_cnt); u32 mdrt_max_cnt = MDRT_TABLE_SIZE / sizeof(struct mdrt_table); struct dt_node *dump_node; @@ -976,7 +976,7 @@ static void opal_dump_add_mpipl_boot(const struct iplparams_iplparams *p) return; } - if (p->cec_ipl_attrib != IPLPARAMS_ATTRIB_MEM_PRESERVE) { + if (be16_to_cpu(p->cec_ipl_attrib) != IPLPARAMS_ATTRIB_MEM_PRESERVE) { prlog(PR_DEBUG, "DUMP: Memory not preserved\n"); return; } @@ -1660,7 +1660,7 @@ static void add_npus(void) static void fixup_spira(void) { #if !defined(TEST) - spiras = (struct spiras *)CPU_TO_BE64(SPIRA_HEAP_BASE); + spiras = (struct spiras *)SPIRA_HEAP_BASE; #endif /* Validate SPIRA-S signature */ From patchwork Thu Nov 28 06:24:22 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Nicholas Piggin X-Patchwork-Id: 1201900 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.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 47NnmF0Cksz9s7T for ; Thu, 28 Nov 2019 17:29:17 +1100 (AEDT) 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="eh0lnUSu"; 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 47NnmD69lzzDr0k for ; Thu, 28 Nov 2019 17:29:16 +1100 (AEDT) X-Original-To: skiboot@lists.ozlabs.org Delivered-To: skiboot@lists.ozlabs.org Authentication-Results: lists.ozlabs.org; spf=pass (sender SPF authorized) smtp.mailfrom=gmail.com (client-ip=2607:f8b0:4864:20::1042; helo=mail-pj1-x1042.google.com; envelope-from=npiggin@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="eh0lnUSu"; dkim-atps=neutral Received: from mail-pj1-x1042.google.com (mail-pj1-x1042.google.com [IPv6:2607:f8b0:4864:20::1042]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (2048 bits) server-digest SHA256) (No client certificate requested) by lists.ozlabs.org (Postfix) with ESMTPS id 47NnhT00ltzDr0V for ; Thu, 28 Nov 2019 17:26:00 +1100 (AEDT) Received: by mail-pj1-x1042.google.com with SMTP id v93so8141767pjb.6 for ; Wed, 27 Nov 2019 22:26:00 -0800 (PST) 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 :mime-version:content-transfer-encoding; bh=uTtjqdDqUVQYvpfq9YjDER1OXrAR1H0VJS0uzzjs0M4=; b=eh0lnUSu3z1ovbodbFeJtz3bW545WqqZIrxKYNUu2ajvPtL5dO311BMrIMidReZrtt qQU2Kw3ejZohf+i8F/5zXu5ZksFIaJvve2bz4EftBQ7mpj4O3T78Z7K+gVH5nsIa3vEs fkRUEDSjU5FmOQVJ4gorVsTBvttnF+2nInj499Q4ew2VpxYpKMlh3YcVfh0TTsBlImyO 5JTtBFpqOTbTizGDlMJpGnWYyYp8KIdBN0Ni0MG0ws+hIbcLydVxEUlox/yqEMh/Dq/I hNuIchwd+wAZ6dU7QlMyj8fCb0FFk8MXu3XgR5aQqd0pHD7E7DFSxvxSDyCsqJiTqrFD hClQ== 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:mime-version:content-transfer-encoding; bh=uTtjqdDqUVQYvpfq9YjDER1OXrAR1H0VJS0uzzjs0M4=; b=ChYQERdyieWJQk/rw+YWCf64RlaUEW3iZZpYlpPpQDKP6A+ZUO+Qxpm7G+GgrqRZAy ZBLKNI85jKVqknoHubK41ZzwhMDZcBk/eD9y6UNXfZUcR14NQ5Rwubs6xs7hNnN6YfXg FejPRkBu0+N1+q4j9fw5Ms6h1cMYx/kUO5OEEWeAfZMq49XLriKzdgPgpJFS25Q25dTk Cs3A9D+3Xif3d2m4xI9Vkz3MtSsKP09VsQ+uEpnuGRDKnB4zzDSbEvXbfkvj0ULwTY40 ZAe5ebLuLmEvmXRiZhfZCwzmPo1BnsV2mHRlOri3IUOb2AInT5mvzrRwGtgMtAJ1Dejg e3Ow== X-Gm-Message-State: APjAAAXqQ3sRpL7OOgwXjIFZr+NEcjE7ZFBrHE1tNX0vH2ymADzTWDE0 5w4JX89IvILOGQ+B4z8LMhOdKHxo31g= X-Google-Smtp-Source: APXvYqywSuV3rxT8bYfSSwPU/SoJ7/jM6I2L0/AkLA9XUYrApFVG7tFMMQVh6dT0sr20yF9H1whc8A== X-Received: by 2002:a17:90a:fc91:: with SMTP id ci17mr10713376pjb.13.1574922357326; Wed, 27 Nov 2019 22:25:57 -0800 (PST) Received: from bobo.local0.net ([203.194.47.34]) by smtp.gmail.com with ESMTPSA id e5sm8463196pjv.29.2019.11.27.22.25.55 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 27 Nov 2019 22:25:56 -0800 (PST) From: Nicholas Piggin To: skiboot@lists.ozlabs.org Date: Thu, 28 Nov 2019 16:24:22 +1000 Message-Id: <20191128062442.20690-9-npiggin@gmail.com> X-Mailer: git-send-email 2.23.0 In-Reply-To: <20191128062442.20690-1-npiggin@gmail.com> References: <20191128062442.20690-1-npiggin@gmail.com> MIME-Version: 1.0 Subject: [Skiboot] [PATCH v8 08/28] naca: move naca definition from asm to C X-BeenThere: skiboot@lists.ozlabs.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: Mailing list for skiboot development List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: skiboot-bounces+incoming=patchwork.ozlabs.org@lists.ozlabs.org Sender: "Skiboot" This results in the same layout and location of the naca and hv data structures. Signed-off-by: Nicholas Piggin --- asm/asm-offsets.c | 2 -- asm/head.S | 50 ------------------------------------------ hdata/Makefile.inc | 2 +- hdata/hdata.h | 2 ++ hdata/naca.c | 26 ++++++++++++++++++++++ hdata/naca.h | 54 ++++++++++++++++++++++++++++++++++++++++++++++ hdata/spira.c | 11 ++++------ hdata/spira.h | 6 +++++- include/mem-map.h | 2 ++ skiboot.lds.S | 5 +++++ 10 files changed, 99 insertions(+), 61 deletions(-) create mode 100644 hdata/naca.c create mode 100644 hdata/naca.h diff --git a/asm/asm-offsets.c b/asm/asm-offsets.c index e4584059c..61a25cab3 100644 --- a/asm/asm-offsets.c +++ b/asm/asm-offsets.c @@ -25,8 +25,6 @@ int main(void); int main(void) { - OFFSET(SPIRA_ACTUAL_SIZE, spira, reserved); - OFFSET(CPUTHREAD_PIR, cpu_thread, pir); OFFSET(CPUTHREAD_SAVE_R1, cpu_thread, save_r1); OFFSET(CPUTHREAD_STATE, cpu_thread, state); diff --git a/asm/head.S b/asm/head.S index e59f63871..b38cc870b 100644 --- a/asm/head.S +++ b/asm/head.S @@ -810,56 +810,6 @@ enter_nap: bne 1b nap b . -/* - * - * NACA structure, accessed by the FPS to find the SPIRA - * - */ - . = 0x4000 -.global naca -naca: - .llong spirah /* 0x0000 : SPIRA-H */ - .llong 0 /* 0x0008 : Reserved */ - .llong 0 /* 0x0010 : Reserved */ - .llong hv_release_data /* 0x0018 : HV release data */ - .llong 0 /* 0x0020 : Reserved */ - .llong 0 /* 0x0028 : Reserved */ - .llong spira /* 0x0030 : SP Interface Root */ - .llong hv_lid_load_table /* 0x0038 : LID load table */ - .llong 0 /* 0x0040 : Reserved */ - .space 68 - .long 0 /* 0x008c : Reserved */ - .space 16 - .long SPIRA_ACTUAL_SIZE /* 0x00a0 : Actual size of SPIRA */ - .space 28 - .llong 0 /* 0x00c0 : resident module loadmap */ - .space 136 - .llong 0 /* 0x0150 : reserved */ - .space 40 - .llong 0 /* 0x0180 : reserved */ - .space 36 - .long 0 /* 0x01ac : control flags */ - .byte 0 /* 0x01b0 : reserved */ - .space 4 - .byte 0 /* 0x01b5 : default state for SW attn */ - .space 1 - .byte 0x01 /* 0x01b7 : PCIA format */ - .llong hdat_entry /* 0x01b8 : Primary thread entry */ - .llong hdat_entry /* 0x01c0 : Secondary thread entry */ - .space 0xe38 - - .balign 0x10 -hv_release_data: - .space 58 - .llong 0x666 /* VRM ? */ - - .balign 0x10 -hv_lid_load_table: - .long 0x10 - .long 0x10 - .long 0 - .long 0 - /* * diff --git a/hdata/Makefile.inc b/hdata/Makefile.inc index 2d52f7654..49690f3c5 100644 --- a/hdata/Makefile.inc +++ b/hdata/Makefile.inc @@ -1,7 +1,7 @@ # -*-Makefile-*- SUBDIRS += hdata -HDATA_OBJS = spira.o pcia.o hdif.o memory.o fsp.o iohub.o vpd.o slca.o +HDATA_OBJS = naca.o spira.o pcia.o hdif.o memory.o fsp.o iohub.o vpd.o slca.o HDATA_OBJS += cpu-common.o vpd-common.o hostservices.o i2c.o tpmrel.o DEVSRC_OBJ = hdata/built-in.a diff --git a/hdata/hdata.h b/hdata/hdata.h index 7504b1e8f..580e5c75b 100644 --- a/hdata/hdata.h +++ b/hdata/hdata.h @@ -5,6 +5,8 @@ #define __HDATA_H #include +#include "hdif.h" +#include "spira.h" struct dt_node; diff --git a/hdata/naca.c b/hdata/naca.c new file mode 100644 index 000000000..b215c39eb --- /dev/null +++ b/hdata/naca.c @@ -0,0 +1,26 @@ +#include +#include +#include + +#include "naca.h" +#include "spira.h" + +__section(".naca.data") struct naca naca = { + .spirah_addr = CPU_TO_BE64(SPIRAH_OFF), + .hv_release_data_addr = CPU_TO_BE64(NACA_OFF + offsetof(struct naca, hv_release_data)), + .spira_addr = CPU_TO_BE64(SPIRA_OFF), + .lid_table_addr = CPU_TO_BE64(NACA_OFF + offsetof(struct naca, hv_lid_load_table)), + .spira_size = CPU_TO_BE32(SPIRA_ACTUAL_SIZE), + .hv_load_map_addr = 0, + .attn_enabled = 0, + .pcia_supported = 1, + .__primary_thread_entry = CPU_TO_BE64(0x180), + .__secondary_thread_entry = CPU_TO_BE64(0x180), + .hv_release_data = { + .vrm = CPU_TO_BE64(0x666), /* ? */ + }, + .hv_lid_load_table = { + .w0 = CPU_TO_BE32(0x10), + .w1 = CPU_TO_BE32(0x10), + }, +}; diff --git a/hdata/naca.h b/hdata/naca.h new file mode 100644 index 000000000..1271b59a5 --- /dev/null +++ b/hdata/naca.h @@ -0,0 +1,54 @@ +// SPDX-License-Identifier: Apache-2.0 +/* Copyright 2019 IBM Corp. */ + +#ifndef __NACA_H +#define __NACA_H + +#include +#include +#include + +struct hv_release_data { + uint8_t reserved_0x0[58]; + __be64 vrm; +} __packed __attribute__((aligned(0x10))); + +struct hv_lid_load_table { + __be32 w0; + __be32 w1; + __be32 w2; + __be32 w3; +} __packed __attribute__((aligned(0x10))); + +/* + * NACA structure, accessed by the FSP to find the SPIRA + */ +struct naca { + __be64 spirah_addr; /* 0x0000 */ + uint8_t reserved_0x8[0x10]; + __be64 hv_release_data_addr; /* 0x0018 */ + uint8_t reserved_0x20[0x10]; + __be64 spira_addr; /* 0x0030 */ + __be64 lid_table_addr; /* 0x0038 */ + uint8_t reserved_0x40[0x60]; + __be32 spira_size; /* 0x00a0 */ + uint8_t reserved_0xa4[0x1c]; + __be64 hv_load_map_addr; /* 0x00c0 */ + uint8_t reserved_0xc8[0xe4]; + uint8_t flags[4]; /* 0x01ac */ + uint8_t reserved_0x1b0[0x5]; + uint8_t attn_enabled; /* 0x01b5 */ + uint8_t reserved_0x1b6[0x1]; + uint8_t pcia_supported; /* 0x01b7 */ + __be64 __primary_thread_entry; /* 0x01b8 */ + __be64 __secondary_thread_entry; /* 0x01c0 */ + uint8_t reserved_0x1d0[0xe38]; + + /* Not part of the naca but it's convenient to put them here */ + struct hv_release_data hv_release_data; + struct hv_lid_load_table hv_lid_load_table; +} __packed __attribute((aligned(0x10))); + +extern struct naca naca; + +#endif diff --git a/hdata/spira.c b/hdata/spira.c index f62170710..7e19d3d5c 100644 --- a/hdata/spira.c +++ b/hdata/spira.c @@ -3,7 +3,6 @@ #include #include -#include "spira.h" #include #include #include @@ -15,6 +14,8 @@ #include "hdata.h" #include "hostservices.h" +#include "naca.h" +#include "spira.h" /* Processor Initialization structure, contains * the initial NIA and MSR values for the entry @@ -1703,15 +1704,11 @@ static void fixup_spira(void) static void update_spirah_addr(void) { #if !defined(TEST) - extern uint32_t naca; - uint64_t *spirah_offset = (uint64_t *)&naca; - uint64_t *spira_offset = (uint64_t *)((u64)(&naca) + 0x30); - if (proc_gen < proc_gen_p9) return; - *spirah_offset = CPU_TO_BE64(SPIRAH_OFF); - *spira_offset = CPU_TO_BE64(SPIRA_OFF); + naca.spirah_addr = CPU_TO_BE64(SPIRAH_OFF); + naca.spira_addr = CPU_TO_BE64(SPIRA_OFF); spirah.ntuples.hs_data_area.addr = CPU_TO_BE64(SPIRA_HEAP_BASE - SKIBOOT_BASE); spirah.ntuples.mdump_res.addr = CPU_TO_BE64(MDRT_TABLE_BASE - SKIBOOT_BASE); #endif diff --git a/hdata/spira.h b/hdata/spira.h index 2c944be9f..2c2872260 100644 --- a/hdata/spira.h +++ b/hdata/spira.h @@ -66,6 +66,8 @@ struct spira_ntuples { struct spira_ntuple proc_dump_area; /* 0x400 */ }; +#define SPIRA_RESERVED_BYTES 0x60 + struct spira { struct HDIF_common_hdr hdr; struct HDIF_idata_ptr ntuples_ptr; @@ -77,9 +79,11 @@ struct spira { * * According to FSP engineers, this is an okay thing to do. */ - u8 reserved[0x60]; + u8 reserved[SPIRA_RESERVED_BYTES]; } __packed __align(0x100); +#define SPIRA_ACTUAL_SIZE (sizeof(struct spira) - SPIRA_RESERVED_BYTES) + extern struct spira spira; /* SPIRA-H signature */ diff --git a/include/mem-map.h b/include/mem-map.h index 61ecac3c8..8ac11e916 100644 --- a/include/mem-map.h +++ b/include/mem-map.h @@ -21,6 +21,8 @@ */ #define EXCEPTION_VECTORS_END 0x2000 +#define NACA_OFF 0x4000 + /* The NACA and other stuff in head.S need to be at the start: we * give it 64k before placing the SPIRA and related data. */ diff --git a/skiboot.lds.S b/skiboot.lds.S index 1dc0ca92e..1822334b2 100644 --- a/skiboot.lds.S +++ b/skiboot.lds.S @@ -59,6 +59,11 @@ SECTIONS KEEP(*(.head)) } + . = NACA_OFF; + .naca : { + KEEP(*(.naca.data)) + } + . = SPIRA_OFF; .spira : { KEEP(*(.spira.data)) From patchwork Thu Nov 28 06:24:23 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Nicholas Piggin X-Patchwork-Id: 1201901 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 47Nnmc06ktz9s7T for ; Thu, 28 Nov 2019 17:29:36 +1100 (AEDT) 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="KZm5zatg"; 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 47Nnmb5wC5zDr1b for ; Thu, 28 Nov 2019 17:29:35 +1100 (AEDT) X-Original-To: skiboot@lists.ozlabs.org Delivered-To: skiboot@lists.ozlabs.org Authentication-Results: lists.ozlabs.org; spf=pass (sender SPF authorized) smtp.mailfrom=gmail.com (client-ip=2607:f8b0:4864:20::635; helo=mail-pl1-x635.google.com; envelope-from=npiggin@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="KZm5zatg"; dkim-atps=neutral Received: from mail-pl1-x635.google.com (mail-pl1-x635.google.com [IPv6:2607:f8b0:4864:20::635]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (2048 bits) server-digest SHA256) (No client certificate requested) by lists.ozlabs.org (Postfix) with ESMTPS id 47NnhW17xVzDqyp for ; Thu, 28 Nov 2019 17:26:03 +1100 (AEDT) Received: by mail-pl1-x635.google.com with SMTP id bb5so11145099plb.4 for ; Wed, 27 Nov 2019 22:26:02 -0800 (PST) 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 :mime-version:content-transfer-encoding; bh=Kz0m8Sp33uW3ADbId7wxsn9lPAYk0+pFnpGc8D2Kceo=; b=KZm5zatgGwH/Ig0clr3ZawSa8nI17rcJaL7IVAEIZGNtL9tLrh2kYWdYvQ8YeJNaGt 9Z6AfxpXmTB3wtwzK3BhQcMqwS6hPEWltnJWy/fTsv54q8w9ofKqNy/or6LUjOxs6hsm GoMnmp/LAw4lAg7Aa7OLPptWtyHqGmgfKu2g9XMJFBu2xsw7TDYzXPg+KodeyAUcMrQj TclVXSt6+emYRSSOCDg1PHvZbR+iFKeuDai3CIagTb87LKNcXvrGAEcdykXB8go1MNcw j/ndxIOrDVsM13O0pyABp89Mf99T38nIzKPcw+fNaDefmgJWzU5Htar1dnnmGULgxFLo 29dA== 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:mime-version:content-transfer-encoding; bh=Kz0m8Sp33uW3ADbId7wxsn9lPAYk0+pFnpGc8D2Kceo=; b=hoe2bYkbKJ60IaSdT6HXMK8pqrpRAyq812dHVyT+/EscabzdmauD4D1WVdgHgYqh5z 84+sB3vocwr0f4vRy1+kBt50WgclgSkEfPiyf1wM2/E2+6SMs12/og4xz7xEFdrnhAPg 8HQchrMgb6yKW2BdlUhfdcjO46qJqEV+rJU2MVb52NBTnJ5IL5ufOhJ1OMmJ0w2vygzt 9lubvyEnFJIS675l47yM6nbUMbUjBQsK3Q+pHKS8GuN26DzWEa7fTuYHVEI56QJrireX e9svRGbvfAzwgzQmI6v14zvtuzJ8I+d3iRfpRVz2bdtUMAgeL15tW5/uDQ6Dtfa8WMEW cy0A== X-Gm-Message-State: APjAAAVtiMhp9GYuqecshs4Zfsz/hBOXyoWx658x2o9wM5P3Sz1hj4X9 Qlz/yiu1c0R9gAwAjh88deeaQVojIRY= X-Google-Smtp-Source: APXvYqxaMACkCfnP1ariqxtmNysND8XWLY/iAw2Djev3h2Su6GxFeNXu7A2e9cTPpIytTogZsbQEgg== X-Received: by 2002:a17:90a:71cc:: with SMTP id m12mr10841354pjs.21.1574922359802; Wed, 27 Nov 2019 22:25:59 -0800 (PST) Received: from bobo.local0.net ([203.194.47.34]) by smtp.gmail.com with ESMTPSA id e5sm8463196pjv.29.2019.11.27.22.25.57 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 27 Nov 2019 22:25:59 -0800 (PST) From: Nicholas Piggin To: skiboot@lists.ozlabs.org Date: Thu, 28 Nov 2019 16:24:23 +1000 Message-Id: <20191128062442.20690-10-npiggin@gmail.com> X-Mailer: git-send-email 2.23.0 In-Reply-To: <20191128062442.20690-1-npiggin@gmail.com> References: <20191128062442.20690-1-npiggin@gmail.com> MIME-Version: 1.0 Subject: [Skiboot] [PATCH v8 09/28] io: endian conversions for io accessors X-BeenThere: skiboot@lists.ozlabs.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: Mailing list for skiboot development List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: skiboot-bounces+incoming=patchwork.ozlabs.org@lists.ozlabs.org Sender: "Skiboot" This requires a small change to flash drivers which assumed 4-byte LPC reads would not change endian. _raw accessors could be added if this becomes a signifcant pattern, but for now this hack works. Signed-off-by: Nicholas Piggin --- include/io.h | 79 ++++++++++++++++++++++++++++++------- libflash/ipmi-hiomap.c | 20 +++++++--- libflash/mbox-flash.c | 20 +++++++--- libflash/test/mbox-server.c | 31 ++++++++++++++- 4 files changed, 121 insertions(+), 29 deletions(-) diff --git a/include/io.h b/include/io.h index c6203a274..57dddd49f 100644 --- a/include/io.h +++ b/include/io.h @@ -9,6 +9,7 @@ #include #include #include +#include #include /* @@ -35,10 +36,10 @@ static inline uint8_t in_8(const volatile uint8_t *addr) static inline uint16_t __in_be16(const volatile uint16_t *addr) { - uint16_t val; + __be16 val; asm volatile("lhzcix %0,0,%1" : "=r"(val) : "r"(addr), "m"(*addr) : "memory"); - return val; + return be16_to_cpu(val); } static inline uint16_t in_be16(const volatile uint16_t *addr) @@ -47,17 +48,26 @@ static inline uint16_t in_be16(const volatile uint16_t *addr) return __in_be16(addr); } +static inline uint16_t __in_le16(const volatile uint16_t *addr) +{ + __le16 val; + asm volatile("lhzcix %0,0,%1" : + "=r"(val) : "r"(addr), "m"(*addr) : "memory"); + return le16_to_cpu(val); +} + static inline uint16_t in_le16(const volatile uint16_t *addr) { - return bswap_16(in_be16(addr)); + sync(); + return __in_le16(addr); } static inline uint32_t __in_be32(const volatile uint32_t *addr) { - uint32_t val; + __be32 val; asm volatile("lwzcix %0,0,%1" : "=r"(val) : "r"(addr), "m"(*addr) : "memory"); - return val; + return be32_to_cpu(val); } static inline uint32_t in_be32(const volatile uint32_t *addr) @@ -66,17 +76,26 @@ static inline uint32_t in_be32(const volatile uint32_t *addr) return __in_be32(addr); } +static inline uint32_t __in_le32(const volatile uint32_t *addr) +{ + __le32 val; + asm volatile("lwzcix %0,0,%1" : + "=r"(val) : "r"(addr), "m"(*addr) : "memory"); + return le32_to_cpu(val); +} + static inline uint32_t in_le32(const volatile uint32_t *addr) { - return bswap_32(in_be32(addr)); + sync(); + return __in_le32(addr); } static inline uint64_t __in_be64(const volatile uint64_t *addr) { - uint64_t val; + __be64 val; asm volatile("ldcix %0,0,%1" : "=r"(val) : "r"(addr), "m"(*addr) : "memory"); - return val; + return be64_to_cpu(val); } static inline uint64_t in_be64(const volatile uint64_t *addr) @@ -85,9 +104,18 @@ static inline uint64_t in_be64(const volatile uint64_t *addr) return __in_be64(addr); } +static inline uint64_t __in_le64(const volatile uint64_t *addr) +{ + __le64 val; + asm volatile("ldcix %0,0,%1" : + "=r"(val) : "r"(addr), "m"(*addr) : "memory"); + return le64_to_cpu(val); +} + static inline uint64_t in_le64(const volatile uint64_t *addr) { - return bswap_64(in_be64(addr)); + sync(); + return __in_le64(addr); } static inline void __out_8(volatile uint8_t *addr, uint8_t val) @@ -105,7 +133,7 @@ static inline void out_8(volatile uint8_t *addr, uint8_t val) static inline void __out_be16(volatile uint16_t *addr, uint16_t val) { asm volatile("sthcix %0,0,%1" - : : "r"(val), "r"(addr), "m"(*addr) : "memory"); + : : "r"(cpu_to_be16(val)), "r"(addr), "m"(*addr) : "memory"); } static inline void out_be16(volatile uint16_t *addr, uint16_t val) @@ -114,15 +142,22 @@ static inline void out_be16(volatile uint16_t *addr, uint16_t val) return __out_be16(addr, val); } +static inline void __out_le16(volatile uint16_t *addr, uint16_t val) +{ + asm volatile("sthcix %0,0,%1" + : : "r"(cpu_to_le16(val)), "r"(addr), "m"(*addr) : "memory"); +} + static inline void out_le16(volatile uint16_t *addr, uint16_t val) { - out_be16(addr, bswap_16(val)); + sync(); + return __out_le16(addr, val); } static inline void __out_be32(volatile uint32_t *addr, uint32_t val) { asm volatile("stwcix %0,0,%1" - : : "r"(val), "r"(addr), "m"(*addr) : "memory"); + : : "r"(cpu_to_be32(val)), "r"(addr), "m"(*addr) : "memory"); } static inline void out_be32(volatile uint32_t *addr, uint32_t val) @@ -131,15 +166,22 @@ static inline void out_be32(volatile uint32_t *addr, uint32_t val) return __out_be32(addr, val); } +static inline void __out_le32(volatile uint32_t *addr, uint32_t val) +{ + asm volatile("stwcix %0,0,%1" + : : "r"(cpu_to_le32(val)), "r"(addr), "m"(*addr) : "memory"); +} + static inline void out_le32(volatile uint32_t *addr, uint32_t val) { - out_be32(addr, bswap_32(val)); + sync(); + return __out_le32(addr, val); } static inline void __out_be64(volatile uint64_t *addr, uint64_t val) { asm volatile("stdcix %0,0,%1" - : : "r"(val), "r"(addr), "m"(*addr) : "memory"); + : : "r"(cpu_to_be64(val)), "r"(addr), "m"(*addr) : "memory"); } static inline void out_be64(volatile uint64_t *addr, uint64_t val) @@ -148,9 +190,16 @@ static inline void out_be64(volatile uint64_t *addr, uint64_t val) return __out_be64(addr, val); } +static inline void __out_le64(volatile uint64_t *addr, uint64_t val) +{ + asm volatile("stdcix %0,0,%1" + : : "r"(cpu_to_le64(val)), "r"(addr), "m"(*addr) : "memory"); +} + static inline void out_le64(volatile uint64_t *addr, uint64_t val) { - out_be64(addr, bswap_64(val)); + sync(); + return __out_le64(addr, val); } /* Assistant to macros used to access PCI config space */ diff --git a/libflash/ipmi-hiomap.c b/libflash/ipmi-hiomap.c index 7327b83a3..7591dfee6 100644 --- a/libflash/ipmi-hiomap.c +++ b/libflash/ipmi-hiomap.c @@ -570,8 +570,13 @@ static int lpc_window_read(struct ipmi_hiomap *ctx, uint32_t pos, /* XXX: make this read until it's aligned */ if (len > 3 && !(off & 3)) { rc = lpc_read(OPAL_LPC_FW, off, &dat, 4); - if (!rc) - *(uint32_t *)buf = dat; + if (!rc) { + /* + * lpc_read swaps to CPU endian but it's not + * really a 32-bit value, so convert back. + */ + *(__be32 *)buf = cpu_to_be32(dat); + } chunk = 4; } else { rc = lpc_read(OPAL_LPC_FW, off, &dat, 1); @@ -615,12 +620,15 @@ static int lpc_window_write(struct ipmi_hiomap *ctx, uint32_t pos, uint32_t chunk; if (len > 3 && !(off & 3)) { - rc = lpc_write(OPAL_LPC_FW, off, - *(uint32_t *)buf, 4); + /* endian swap: see lpc_window_write */ + uint32_t dat = be32_to_cpu(*(__be32 *)buf); + + rc = lpc_write(OPAL_LPC_FW, off, dat, 4); chunk = 4; } else { - rc = lpc_write(OPAL_LPC_FW, off, - *(uint8_t *)buf, 1); + uint8_t dat = *(uint8_t *)buf; + + rc = lpc_write(OPAL_LPC_FW, off, dat, 1); chunk = 1; } if (rc) { diff --git a/libflash/mbox-flash.c b/libflash/mbox-flash.c index 9d47fe7ea..5df020f55 100644 --- a/libflash/mbox-flash.c +++ b/libflash/mbox-flash.c @@ -159,8 +159,13 @@ static int lpc_window_read(struct mbox_flash_data *mbox_flash, uint32_t pos, /* XXX: make this read until it's aligned */ if (len > 3 && !(off & 3)) { rc = lpc_read(OPAL_LPC_FW, off, &dat, 4); - if (!rc) - *(uint32_t *)buf = dat; + if (!rc) { + /* + * lpc_read swaps to CPU endian but it's not + * really a 32-bit value, so convert back. + */ + *(__be32 *)buf = cpu_to_be32(dat); + } chunk = 4; } else { rc = lpc_read(OPAL_LPC_FW, off, &dat, 1); @@ -194,12 +199,15 @@ static int lpc_window_write(struct mbox_flash_data *mbox_flash, uint32_t pos, uint32_t chunk; if (len > 3 && !(off & 3)) { - rc = lpc_write(OPAL_LPC_FW, off, - *(uint32_t *)buf, 4); + /* endian swap: see lpc_window_write */ + uint32_t dat = be32_to_cpu(*(__be32 *)buf); + + rc = lpc_write(OPAL_LPC_FW, off, dat, 4); chunk = 4; } else { - rc = lpc_write(OPAL_LPC_FW, off, - *(uint8_t *)buf, 1); + uint8_t dat = *(uint8_t *)buf; + + rc = lpc_write(OPAL_LPC_FW, off, dat, 1); chunk = 1; } if (rc) { diff --git a/libflash/test/mbox-server.c b/libflash/test/mbox-server.c index 3f879dfa4..59786ca14 100644 --- a/libflash/test/mbox-server.c +++ b/libflash/test/mbox-server.c @@ -100,7 +100,21 @@ int64_t lpc_read(enum OpalLPCAddressType __unused addr_type, uint32_t addr, /* Let it read from a write window... Spec says it ok! */ if (!check_window(addr, sz) || server_state.win_type == WIN_CLOSED) return 1; - memcpy(data, server_state.lpc_base + addr, sz); + + switch (sz) { + case 1: + *(uint8_t *)data = *(uint8_t *)(server_state.lpc_base + addr); + break; + case 2: + *(uint16_t *)data = be16_to_cpu(*(uint16_t *)(server_state.lpc_base + addr)); + break; + case 4: + *(uint32_t *)data = be32_to_cpu(*(uint32_t *)(server_state.lpc_base + addr)); + break; + default: + prerror("Invalid data size %d\n", sz); + return 1; + } return 0; } @@ -111,7 +125,20 @@ int64_t lpc_write(enum OpalLPCAddressType __unused addr_type, uint32_t addr, { if (!check_window(addr, sz) || server_state.win_type != WIN_WRITE) return 1; - memcpy(server_state.lpc_base + addr, &data, sz); + switch (sz) { + case 1: + *(uint8_t *)(server_state.lpc_base + addr) = data; + break; + case 2: + *(uint16_t *)(server_state.lpc_base + addr) = cpu_to_be16(data); + break; + case 4: + *(uint32_t *)(server_state.lpc_base + addr) = cpu_to_be32(data); + break; + default: + prerror("Invalid data size %d\n", sz); + return 1; + } return 0; } From patchwork Thu Nov 28 06:24:24 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Nicholas Piggin X-Patchwork-Id: 1201902 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.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 47Nnmw0vwTz9sPJ for ; Thu, 28 Nov 2019 17:29:52 +1100 (AEDT) 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="DoLO7+WA"; 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 47Nnmv0TgXzDr0m for ; Thu, 28 Nov 2019 17:29:51 +1100 (AEDT) X-Original-To: skiboot@lists.ozlabs.org Delivered-To: skiboot@lists.ozlabs.org Authentication-Results: lists.ozlabs.org; spf=pass (sender SPF authorized) smtp.mailfrom=gmail.com (client-ip=2607:f8b0:4864:20::543; helo=mail-pg1-x543.google.com; envelope-from=npiggin@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="DoLO7+WA"; dkim-atps=neutral Received: from mail-pg1-x543.google.com (mail-pg1-x543.google.com [IPv6:2607:f8b0:4864:20::543]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (2048 bits) server-digest SHA256) (No client certificate requested) by lists.ozlabs.org (Postfix) with ESMTPS id 47NnhY33xrzDr0D for ; Thu, 28 Nov 2019 17:26:05 +1100 (AEDT) Received: by mail-pg1-x543.google.com with SMTP id k1so12357064pgg.12 for ; Wed, 27 Nov 2019 22:26:05 -0800 (PST) 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 :mime-version:content-transfer-encoding; bh=l2i6VgWiENS9CWUysFibYFV7sjFhs5PNWT8Cvdl9zvs=; b=DoLO7+WALUsy++3eaJnrnubaRixleWLgzfMCESqW82c0SyfsDZet0YQVuNa8I8Olab vpNMGNBLNNACAMupR67Jkuu5jmxQ/+FBZYpPzYChL1wJCpUq7nBoKZBeYv5w3aUQpDoC ss/t9BH5OmfvIkMdMZ0tPJiydWGbOghSQVLG46RZ39FoBXKYeB1XhZ25npePIBm/HpXR oi+/drX5kqHD0CxzaVVfGs0j0R8rJEgThTCl/AnChr8XHMmooJjuVx/pCJkmxITQwKGc GkVmmhW0w2tcaEUUlKrz/vWFP/5LWdOUH7tZb7ieNFbC40TnEDPZdqXrs6ISHtaUH7e3 9Sng== 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:mime-version:content-transfer-encoding; bh=l2i6VgWiENS9CWUysFibYFV7sjFhs5PNWT8Cvdl9zvs=; b=taXFWf0rBBM2zL21zHxAk/qMGgHiIhjXuCZ8QMZUXlkhnt9R+ly52X7ZVVljpXYT5U /DaO//0qVE5/Vpinhy+ptwJQJ94DtDJhiWtj2Df7Hk3ScHL7vmZMj3UfotDqE9/UcSuM kDnfe6xc6XJoJx0i9YaVDTdEZLAEE31qghfMJeGPZF7eqeZfIjrnZE/Z8QLMpA47qMyt LBQ9bAYXLwvphna6ZGame5W+pFJQbRVtWClw3wKdzNHHqcEbT+SeshyQRwjK5owsNi0b fVyB5NTiau2gXZyg58TOPGy0DjnUS0qPGmRzzMKPaxVf3NccN3SLQODLUc6Q1Gl7uFmr nM3w== X-Gm-Message-State: APjAAAWZJXlQQZuBB+OqvdQyl5xUY5z0h+a0mCmGLNaYm3QwmF9hTpUq GyBoY3uLHDKi3vv/pu+wZXbfTlmolpg= X-Google-Smtp-Source: APXvYqxKjDrs4FJj1rDPXH2d5MHyD3uLMz8ErgK/qNe80UhmIvDpJMGeGzHp9LTjt8XuZEklv+UqIQ== X-Received: by 2002:aa7:8e15:: with SMTP id c21mr51897948pfr.122.1574922361995; Wed, 27 Nov 2019 22:26:01 -0800 (PST) Received: from bobo.local0.net ([203.194.47.34]) by smtp.gmail.com with ESMTPSA id e5sm8463196pjv.29.2019.11.27.22.26.00 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 27 Nov 2019 22:26:01 -0800 (PST) From: Nicholas Piggin To: skiboot@lists.ozlabs.org Date: Thu, 28 Nov 2019 16:24:24 +1000 Message-Id: <20191128062442.20690-11-npiggin@gmail.com> X-Mailer: git-send-email 2.23.0 In-Reply-To: <20191128062442.20690-1-npiggin@gmail.com> References: <20191128062442.20690-1-npiggin@gmail.com> MIME-Version: 1.0 Subject: [Skiboot] [PATCH v8 10/28] hmi: endian conversions X-BeenThere: skiboot@lists.ozlabs.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: Mailing list for skiboot development List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: skiboot-bounces+incoming=patchwork.ozlabs.org@lists.ozlabs.org Sender: "Skiboot" Signed-off-by: Nicholas Piggin --- core/hmi.c | 20 ++++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/core/hmi.c b/core/hmi.c index cb158c01c..3e38e04d5 100644 --- a/core/hmi.c +++ b/core/hmi.c @@ -399,7 +399,7 @@ static bool decode_core_fir(struct cpu_thread *cpu, if (core_fir & PPC_BIT(xstop_bits[i].bit)) { found = true; hmi_evt->u.xstop_error.xstop_reason - |= xstop_bits[i].reason; + |= cpu_to_be32(xstop_bits[i].reason); } } return found; @@ -430,7 +430,7 @@ static void find_core_checkstop_reason(struct OpalHMIEvent *hmi_evt, /* Initialize xstop_error fields. */ hmi_evt->u.xstop_error.xstop_reason = 0; - hmi_evt->u.xstop_error.u.pir = cpu->pir; + hmi_evt->u.xstop_error.u.pir = cpu_to_be32(cpu->pir); if (decode_core_fir(cpu, hmi_evt)) queue_hmi_event(hmi_evt, 0, out_flags); @@ -521,7 +521,7 @@ static void find_nx_checkstop_reason(int flat_chip_id, hmi_evt->severity = OpalHMI_SEV_FATAL; hmi_evt->type = OpalHMI_ERROR_MALFUNC_ALERT; hmi_evt->u.xstop_error.xstop_type = CHECKSTOP_TYPE_NX; - hmi_evt->u.xstop_error.u.chip_id = flat_chip_id; + hmi_evt->u.xstop_error.u.chip_id = cpu_to_be32(flat_chip_id); /* Get DMA & Engine FIR data register value. */ if (xscom_read(flat_chip_id, nx_dma_engine_fir, &nx_dma_fir) != 0) { @@ -539,12 +539,12 @@ static void find_nx_checkstop_reason(int flat_chip_id, for (i = 0; i < ARRAY_SIZE(nx_dma_xstop_bits); i++) if (nx_dma_fir & PPC_BIT(nx_dma_xstop_bits[i].bit)) hmi_evt->u.xstop_error.xstop_reason - |= nx_dma_xstop_bits[i].reason; + |= cpu_to_be32(nx_dma_xstop_bits[i].reason); for (i = 0; i < ARRAY_SIZE(nx_pbi_xstop_bits); i++) if (nx_pbi_fir_val & PPC_BIT(nx_pbi_xstop_bits[i].bit)) hmi_evt->u.xstop_error.xstop_reason - |= nx_pbi_xstop_bits[i].reason; + |= cpu_to_be32(nx_pbi_xstop_bits[i].reason); /* * Set NXDMAENGFIR[38] to signal PRD that service action is required. @@ -705,8 +705,8 @@ static void find_npu2_checkstop_reason(int flat_chip_id, hmi_evt->severity = OpalHMI_SEV_WARNING; hmi_evt->type = OpalHMI_ERROR_MALFUNC_ALERT; hmi_evt->u.xstop_error.xstop_type = CHECKSTOP_TYPE_NPU; - hmi_evt->u.xstop_error.xstop_reason = xstop_reason; - hmi_evt->u.xstop_error.u.chip_id = flat_chip_id; + hmi_evt->u.xstop_error.xstop_reason = cpu_to_be32(xstop_reason); + hmi_evt->u.xstop_error.u.chip_id = cpu_to_be32(flat_chip_id); /* Marking the event as recoverable so that we don't crash */ queue_hmi_event(hmi_evt, 1, out_flags); @@ -774,7 +774,7 @@ static void find_npu_checkstop_reason(int flat_chip_id, hmi_evt->severity = OpalHMI_SEV_WARNING; hmi_evt->type = OpalHMI_ERROR_MALFUNC_ALERT; hmi_evt->u.xstop_error.xstop_type = CHECKSTOP_TYPE_NPU; - hmi_evt->u.xstop_error.u.chip_id = flat_chip_id; + hmi_evt->u.xstop_error.u.chip_id = cpu_to_be32(flat_chip_id); /* The HMI is "recoverable" because it shouldn't crash the system */ queue_hmi_event(hmi_evt, 1, out_flags); @@ -1116,7 +1116,7 @@ static int handle_tfac_errors(struct OpalHMIEvent *hmi_evt, uint64_t *out_flags) uint64_t tfmr = mfspr(SPR_TFMR); /* Initialize the hmi event with old value of TFMR */ - hmi_evt->tfmr = tfmr; + hmi_evt->tfmr = cpu_to_be64(tfmr); /* A TFMR parity/corrupt error makes us ignore all the local stuff.*/ if (tfmr & SPR_TFMR_TFMR_CORRUPT) { @@ -1204,7 +1204,7 @@ static int handle_hmi_exception(uint64_t hmer, struct OpalHMIEvent *hmi_evt, prlog(PR_DEBUG, "Received HMI interrupt: HMER = 0x%016llx\n", hmer); /* Initialize the hmi event with old value of HMER */ if (hmi_evt) - hmi_evt->hmer = hmer; + hmi_evt->hmer = cpu_to_be64(hmer); /* Handle Timer/TOD errors separately */ if (hmer & (SPR_HMER_TFAC_ERROR | SPR_HMER_TFMR_PARITY_ERROR)) { From patchwork Thu Nov 28 06:24:25 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Nicholas Piggin X-Patchwork-Id: 1201904 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.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 47NnnP1xsLz9sPJ for ; Thu, 28 Nov 2019 17:30:17 +1100 (AEDT) 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="kP75K+Un"; 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 47NnnP0DWDzDr0r for ; Thu, 28 Nov 2019 17:30:17 +1100 (AEDT) X-Original-To: skiboot@lists.ozlabs.org Delivered-To: skiboot@lists.ozlabs.org Authentication-Results: lists.ozlabs.org; spf=pass (sender SPF authorized) smtp.mailfrom=gmail.com (client-ip=2607:f8b0:4864:20::443; helo=mail-pf1-x443.google.com; envelope-from=npiggin@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="kP75K+Un"; dkim-atps=neutral Received: from mail-pf1-x443.google.com (mail-pf1-x443.google.com [IPv6:2607:f8b0:4864:20::443]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (2048 bits) server-digest SHA256) (No client certificate requested) by lists.ozlabs.org (Postfix) with ESMTPS id 47Nnhb2pv4zDr0N for ; Thu, 28 Nov 2019 17:26:07 +1100 (AEDT) Received: by mail-pf1-x443.google.com with SMTP id i187so8443472pfc.7 for ; Wed, 27 Nov 2019 22:26:07 -0800 (PST) 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 :mime-version:content-transfer-encoding; bh=MZwmjUoBVg4bwFw+Fm3BPVOUeFJaFWLd0Z8jxIqjiX0=; b=kP75K+UnDZCgsfQBjFV5y7iYJSbJituKFKbKOEunvscwoAMml+nPIjYs8CGXRrHv0y XRO9eRo0GDtUbc6zQOHMkMpVeHXh80g0PrpUQBXRTVvDT7w+Iy3c46LsfOiRTdRHPYf8 JaiaaAP3mvKttxhTq32EoPLUkte22QrwZTk1TTbmkCalKHDux616hn3Szpd3uRSzj05D HsShd59e8G9J7zB/krm2qV0vqR13nZBPyiqGjyaH0gOxvt6+WZOSmo6otBpp1o3AIBaW Hm/hl1q7mJXhUxG0h0mgGekZqPViyfPq1Twq0sl9eRR6rgilif1l3o6KIzEiq0YqUP3f rxvA== 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:mime-version:content-transfer-encoding; bh=MZwmjUoBVg4bwFw+Fm3BPVOUeFJaFWLd0Z8jxIqjiX0=; b=Mxjrxz72E0xPD7RZeuSvc8pNZEnrfjJOe24FOOAYPlOnP3VpwnYNjX5dUYC+KcLmJQ ab/T3bRb6nMFuaKepN6lNF11hOvjExKAFKx0iAKsfV7JecskTbtAUG7m8ZajZZQC14o7 V5FjOIx4mS6C6zJutY3wUaVAYmwH2lSATZ/6YSw1aXuWG7XAmZN0YZKZQQCfm/6lvBCJ f16lIlhEePmv14g6g/f2OpWAj7hybtnumw3naJa1Rr4PacE4FLSgjAXn5o58lABFHeyk RAXQuijM4dhsMBy9x/qLBQ7osLOimC59NgmTMyOYuh+fXMN4R7C0Ha+Q40v3u9jRR7v9 D7TQ== X-Gm-Message-State: APjAAAUmGHjRL8M8QSVX9zets9NMMK5AAh+8CEDThfagRA4O4fYwkRH6 vJteIYiisD+nUg0OsQu6VF/+rbcUPV0= X-Google-Smtp-Source: APXvYqwxX1aTMZoF1DMvqiMegUeDmn6u2IRIq+rnkxEKtXcLeLhEUX970uQ/ke2mcpc7Mwxq0+iNyA== X-Received: by 2002:a62:1a09:: with SMTP id a9mr9173679pfa.64.1574922364631; Wed, 27 Nov 2019 22:26:04 -0800 (PST) Received: from bobo.local0.net ([203.194.47.34]) by smtp.gmail.com with ESMTPSA id e5sm8463196pjv.29.2019.11.27.22.26.02 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 27 Nov 2019 22:26:04 -0800 (PST) From: Nicholas Piggin To: skiboot@lists.ozlabs.org Date: Thu, 28 Nov 2019 16:24:25 +1000 Message-Id: <20191128062442.20690-12-npiggin@gmail.com> X-Mailer: git-send-email 2.23.0 In-Reply-To: <20191128062442.20690-1-npiggin@gmail.com> References: <20191128062442.20690-1-npiggin@gmail.com> MIME-Version: 1.0 Subject: [Skiboot] [PATCH v8 11/28] cvc: allow BE cvc code to be called from LE context X-BeenThere: skiboot@lists.ozlabs.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: Mailing list for skiboot development List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: skiboot-bounces+incoming=patchwork.ozlabs.org@lists.ozlabs.org Sender: "Skiboot" Signed-off-by: Nicholas Piggin --- asm/cvc_entry.S | 42 ++++++++++++++++++------------------------ libstb/cvc.c | 16 +++++++++++----- libstb/cvc.h | 2 +- 3 files changed, 30 insertions(+), 30 deletions(-) diff --git a/asm/cvc_entry.S b/asm/cvc_entry.S index 3e8b3fdad..94cd1aec1 100644 --- a/asm/cvc_entry.S +++ b/asm/cvc_entry.S @@ -1,28 +1,9 @@ # SPDX-License-Identifier: Apache-2.0 -# IBM_PROLOG_BEGIN_TAG -# This is an automatically generated prolog. -# -# $Source: src/usr/secureboot/base/rom_entry.S $ -# -# OpenPOWER HostBoot Project -# -# COPYRIGHT International Business Machines Corp. 2013,2016 -# -# 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. -# -# IBM_PROLOG_END_TAG - -#.include "kernel/ppcconsts.S" + +# Derived from automatically generated HostBoot rom_entry.S + +#include +#include # Updated hostboot location is src/securerom/rom_entry.S. # This also has a fix for TOC save frame pointer. @@ -49,7 +30,20 @@ call_rom_entry: mr %r5, %r6 mr %r6, %r7 mr %r7, %r8 +#if HAVE_BIG_ENDIAN bctrl +#else + bl $+4 +1: mflr %r9 + addi %r9,%r9,2f - 1b + mtspr SPR_HSRR0, %r9 + mfmsr %r9 + xori %r9,%r9,MSR_LE + mtspr SPR_HSRR1, %r9 + hrfid +2: .long 0x2104804e /* bctrl */ + FIXUP_ENDIAN +#endif ld %r2, STACK_TOC_OFFSET(%r1) addi %r1, %r1, 128 ld %r0, 16(%r1) diff --git a/libstb/cvc.c b/libstb/cvc.c index dca4ac857..4fc29c08d 100644 --- a/libstb/cvc.c +++ b/libstb/cvc.c @@ -305,16 +305,19 @@ int call_cvc_sha512(const uint8_t *data, size_t data_len, uint8_t *digest, if (!service) return OPAL_UNSUPPORTED; - if (service->version == 1) + if (service->version == 1) { + unsigned long msr = mfmsr(); __cvc_sha512_v1((void*) service->addr, data, data_len, digest); - else + assert(msr == mfmsr()); + } else { return OPAL_UNSUPPORTED; + } return OPAL_SUCCESS; } int call_cvc_verify(void *container, size_t len, const void *hw_key_hash, - size_t hw_key_hash_size, uint64_t *log) + size_t hw_key_hash_size, __be64 *log) { ROM_hw_params hw_params; ROM_response rc; @@ -335,12 +338,15 @@ int call_cvc_verify(void *container, size_t len, const void *hw_key_hash, memset(&hw_params, 0, sizeof(ROM_hw_params)); memcpy(&hw_params.hw_key_hash, hw_key_hash, hw_key_hash_size); - if (service->version == 1) + if (service->version == 1) { + unsigned long msr = mfmsr(); rc = __cvc_verify_v1((void*) service->addr, (ROM_container_raw*) container, &hw_params); - else + assert(msr == mfmsr()); + } else { return OPAL_UNSUPPORTED; + } if (log) *log = hw_params.log; diff --git a/libstb/cvc.h b/libstb/cvc.h index 6d8546fb2..ef105f76d 100644 --- a/libstb/cvc.h +++ b/libstb/cvc.h @@ -30,7 +30,7 @@ int cvc_init(void); * */ int call_cvc_verify(void *buf, size_t size, const void *hw_key_hash, - size_t hw_key_hash_size, uint64_t *log); + size_t hw_key_hash_size, __be64 *log); /* * call_cvc_sha512 - Call the CVC-sha512 service to calculate a sha512 hash. From patchwork Thu Nov 28 06:24:26 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Patchwork-Submitter: Nicholas Piggin X-Patchwork-Id: 1201905 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.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 47Nnnq2hM1z9s7T for ; Thu, 28 Nov 2019 17:30:39 +1100 (AEDT) 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="h5ZEaU0M"; 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 47Nnnq1NGDzDr0R for ; Thu, 28 Nov 2019 17:30:39 +1100 (AEDT) X-Original-To: skiboot@lists.ozlabs.org Delivered-To: skiboot@lists.ozlabs.org Authentication-Results: lists.ozlabs.org; spf=pass (sender SPF authorized) smtp.mailfrom=gmail.com (client-ip=2607:f8b0:4864:20::62e; helo=mail-pl1-x62e.google.com; envelope-from=npiggin@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="h5ZEaU0M"; dkim-atps=neutral Received: from mail-pl1-x62e.google.com (mail-pl1-x62e.google.com [IPv6:2607:f8b0:4864:20::62e]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (2048 bits) server-digest SHA256) (No client certificate requested) by lists.ozlabs.org (Postfix) with ESMTPS id 47Nnhj1qzSzDr0K for ; Thu, 28 Nov 2019 17:26:12 +1100 (AEDT) Received: by mail-pl1-x62e.google.com with SMTP id w7so11118428plz.12 for ; Wed, 27 Nov 2019 22:26:12 -0800 (PST) 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 :mime-version:content-transfer-encoding; bh=8W+G9puK03/GNQpRCeSkgxlVqQMcp6pFwN5Gu7ZSR6I=; b=h5ZEaU0MT+z1ekFzX9r1Tbo/J0H2ggihOYkUw9NHqaIZCl3x4+RpztJLNiMzjJ7EB7 oDstKcxKs1ySzV0mDHTYxCl6L4mM1/XNsTi2RNXJZHQ9xwarcnXbjCC4+LCrDpJ6j/Tv nMyF36YtSXkbw475mCcHHzrBXIsFKKFmYxqvWvcHETx7hFNXKh6OYCK2JAHTlFQb63TA lzC5Ic305fHJCyztftA3n6Dfq4W4Ftxs8TChcqtIJjzOAwOQx0xzib1hSYHFsQXxXNYe 4uI61JaRBHPES6LTcDr9MTc5lCeJwzCK06bLh3HhQ9+kdkhxWE0ZYCCyRsA2gxD43bsa 6U9w== 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:mime-version:content-transfer-encoding; bh=8W+G9puK03/GNQpRCeSkgxlVqQMcp6pFwN5Gu7ZSR6I=; b=s3TTKXI3xi+cfkWGcbDUSQFxCqqLOyguhq0lcG7Vgq/N9bppVDxtuXLht7fcvISdJn V9PUhnsUG/v0UIRNAQTvj+pI0V34GmegEG6Er2NU0TRgJtz/PVKZpqX5Tata852+CrsM 3jR3gHckmzoctfZ61NVhChoLo0npFUakmlWj50AUo/NbDjagHE3J+VJ+Ne/d8UAlIljl R5NVGeWV/M7qPNT8MSFO6eLpBTzZge0xzENm5caxtYOJJJNfuWUNRmspkGqT6h2ztQRS Ovjzuql40qYRZA65CTyLLqcsWUQ9zoWuBsniACmyMwPTjtKGUbyZwNXs9WyLpeltjWj8 V82A== X-Gm-Message-State: APjAAAWQFGcCphKR1d/rAEiZ1FzP4Ip3GmRrQ+NwG/cm5lCB23tXLFXA zKKAHYbA1IyDLWokxHLciJtPLW5RpLw= X-Google-Smtp-Source: APXvYqxtY8CvuH5g+9OJNdSo+iH1IpZTSzgVKAWjzwcJvt2ND7nCJ1RRDGBlU6MC3Oyi8odiwtWXwQ== X-Received: by 2002:a17:902:8606:: with SMTP id f6mr7955869plo.74.1574922368222; Wed, 27 Nov 2019 22:26:08 -0800 (PST) Received: from bobo.local0.net ([203.194.47.34]) by smtp.gmail.com with ESMTPSA id e5sm8463196pjv.29.2019.11.27.22.26.04 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 27 Nov 2019 22:26:07 -0800 (PST) From: Nicholas Piggin To: skiboot@lists.ozlabs.org Date: Thu, 28 Nov 2019 16:24:26 +1000 Message-Id: <20191128062442.20690-13-npiggin@gmail.com> X-Mailer: git-send-email 2.23.0 In-Reply-To: <20191128062442.20690-1-npiggin@gmail.com> References: <20191128062442.20690-1-npiggin@gmail.com> MIME-Version: 1.0 Subject: [Skiboot] [PATCH v8 12/28] xive: make endian-clean X-BeenThere: skiboot@lists.ozlabs.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: Mailing list for skiboot development List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: skiboot-bounces+incoming=patchwork.ozlabs.org@lists.ozlabs.org Sender: "Skiboot" Convert xive opal calls, dt construction, and in-memory hardware tables to use explicit endian conversions. Reviewed-by: Cédric Le Goater Signed-off-by: Nicholas Piggin --- hw/xive.c | 389 +++++++++++++++++++++-------------------- include/xive-p9-regs.h | 51 +++--- include/xive-regs.h | 26 +++ include/xive.h | 2 +- 4 files changed, 257 insertions(+), 211 deletions(-) diff --git a/hw/xive.c b/hw/xive.c index 80ab25001..41575dae7 100644 --- a/hw/xive.c +++ b/hw/xive.c @@ -396,7 +396,7 @@ struct xive { /* Indirect END/EQ table. NULL entries are unallocated, count is * the numbre of pointers (ie, sub page placeholders). */ - uint64_t *eq_ind_base; + __be64 *eq_ind_base; uint32_t eq_ind_count; /* EQ allocation bitmap. Each bit represent 8 EQs */ @@ -405,7 +405,7 @@ struct xive { /* Indirect NVT/VP table. NULL entries are unallocated, count is * the numbre of pointers (ie, sub page placeholders). */ - uint64_t *vp_ind_base; + __be64 *vp_ind_base; uint32_t vp_ind_count; /* Pool of donated pages for provisioning indirect EQ and VP pages */ @@ -717,7 +717,7 @@ static struct xive_eq *xive_get_eq(struct xive *x, unsigned int idx) if (idx >= (x->eq_ind_count * EQ_PER_PAGE)) return NULL; - p = (struct xive_eq *)(x->eq_ind_base[idx / EQ_PER_PAGE] & + p = (struct xive_eq *)(be64_to_cpu(x->eq_ind_base[idx / EQ_PER_PAGE]) & VSD_ADDRESS_MASK); if (!p) return NULL; @@ -749,7 +749,7 @@ static struct xive_ive *xive_get_ive(struct xive *x, unsigned int isn) /* If using single-escalation, don't let anybody get to the individual * esclation interrupts */ - if (eq->w0 & EQ_W0_UNCOND_ESCALATE) + if (xive_get_field32(EQ_W0_UNCOND_ESCALATE, eq->w0)) return NULL; /* Grab the buried IVE */ @@ -777,7 +777,7 @@ static struct xive_vp *xive_get_vp(struct xive *x, unsigned int idx) struct xive_vp *p; assert(idx < (x->vp_ind_count * VP_PER_PAGE)); - p = (struct xive_vp *)(x->vp_ind_base[idx / VP_PER_PAGE] & + p = (struct xive_vp *)(be64_to_cpu(x->vp_ind_base[idx / VP_PER_PAGE]) & VSD_ADDRESS_MASK); if (!p) return NULL; @@ -791,8 +791,8 @@ static void xive_init_default_vp(struct xive_vp *vp, memset(vp, 0, sizeof(struct xive_vp)); /* Stash the EQ base in the pressure relief interrupt field */ - vp->w1 = (eq_blk << 28) | eq_idx; - vp->w0 = VP_W0_VALID; + vp->w1 = cpu_to_be32((eq_blk << 28) | eq_idx); + vp->w0 = xive_set_field32(VP_W0_VALID, 0, 1); } static void xive_init_emu_eq(uint32_t vp_blk, uint32_t vp_idx, @@ -801,19 +801,20 @@ static void xive_init_emu_eq(uint32_t vp_blk, uint32_t vp_idx, { memset(eq, 0, sizeof(struct xive_eq)); - eq->w1 = EQ_W1_GENERATION; - eq->w3 = ((uint64_t)backing_page) & EQ_W3_OP_DESC_LO; - eq->w2 = (((uint64_t)backing_page) >> 32) & EQ_W2_OP_DESC_HI; - - eq->w6 = SETFIELD(EQ_W6_NVT_BLOCK, 0ul, vp_blk) | - SETFIELD(EQ_W6_NVT_INDEX, 0ul, vp_idx); - eq->w7 = SETFIELD(EQ_W7_F0_PRIORITY, 0ul, prio); - eq->w0 = EQ_W0_VALID | EQ_W0_ENQUEUE | - SETFIELD(EQ_W0_QSIZE, 0ul, EQ_QSIZE_64K) | - EQ_W0_FIRMWARE; + eq->w1 = xive_set_field32(EQ_W1_GENERATION, 0, 1); + eq->w3 = cpu_to_be32(((uint64_t)backing_page) & EQ_W3_OP_DESC_LO); + eq->w2 = cpu_to_be32((((uint64_t)backing_page) >> 32) & EQ_W2_OP_DESC_HI); + eq->w6 = xive_set_field32(EQ_W6_NVT_BLOCK, 0, vp_blk) | + xive_set_field32(EQ_W6_NVT_INDEX, 0, vp_idx); + eq->w7 = xive_set_field32(EQ_W7_F0_PRIORITY, 0, prio); + eq->w0 = xive_set_field32(EQ_W0_VALID, 0, 1) | + xive_set_field32(EQ_W0_ENQUEUE, 0, 1) | + xive_set_field32(EQ_W0_FIRMWARE, 0, 1) | + xive_set_field32(EQ_W0_QSIZE, 0, EQ_QSIZE_64K) | #ifdef EQ_ALWAYS_NOTIFY - eq->w0 |= EQ_W0_UCOND_NOTIFY; + xive_set_field32(EQ_W0_UCOND_NOTIFY, 0, 1) | #endif + 0 ; } static uint32_t *xive_get_eq_buf(uint32_t eq_blk, uint32_t eq_idx) @@ -825,8 +826,8 @@ static uint32_t *xive_get_eq_buf(uint32_t eq_blk, uint32_t eq_idx) assert(x); eq = xive_get_eq(x, eq_idx); assert(eq); - assert(eq->w0 & EQ_W0_VALID); - addr = (((uint64_t)eq->w2) & 0x0fffffff) << 32 | eq->w3; + assert(xive_get_field32(EQ_W0_VALID, eq->w0)); + addr = ((((uint64_t)be32_to_cpu(eq->w2)) & 0x0fffffff) << 32) | be32_to_cpu(eq->w3); return (uint32_t *)addr; } @@ -895,8 +896,8 @@ static uint32_t xive_alloc_eq_set(struct xive *x, bool alloc_indirect) } } memset(page, 0, 0x10000); - x->eq_ind_base[ind_idx] = vsd_flags | - (((uint64_t)page) & VSD_ADDRESS_MASK); + x->eq_ind_base[ind_idx] = cpu_to_be64(vsd_flags | + (((uint64_t)page) & VSD_ADDRESS_MASK)); /* Any cache scrub needed ? */ } @@ -942,7 +943,7 @@ static bool xive_provision_vp_ind(struct xive *x, uint32_t vp_idx, uint32_t orde vsd = ((uint64_t)page) & VSD_ADDRESS_MASK; vsd |= SETFIELD(VSD_TSIZE, 0ull, 4); vsd |= SETFIELD(VSD_MODE, 0ull, VSD_MODE_EXCLUSIVE); - x->vp_ind_base[i] = vsd; + x->vp_ind_base[i] = cpu_to_be64(vsd); } return true; } @@ -1041,7 +1042,7 @@ enum xive_cache_type { static int64_t __xive_cache_watch(struct xive *x, enum xive_cache_type ctype, uint64_t block, uint64_t idx, uint32_t start_dword, uint32_t dword_count, - uint64_t *new_data, bool light_watch, + __be64 *new_data, bool light_watch, bool synchronous); static void xive_scrub_workaround_vp(struct xive *x, uint32_t block, uint32_t idx __unused) @@ -1196,7 +1197,7 @@ static int64_t xive_eqc_scrub(struct xive *x, uint64_t block, uint64_t idx) static int64_t __xive_cache_watch(struct xive *x, enum xive_cache_type ctype, uint64_t block, uint64_t idx, uint32_t start_dword, uint32_t dword_count, - uint64_t *new_data, bool light_watch, + __be64 *new_data, bool light_watch, bool synchronous) { uint64_t sreg, sregx, dreg0, dreg0x; @@ -1249,7 +1250,7 @@ static int64_t __xive_cache_watch(struct xive *x, enum xive_cache_type ctype, * one written. */ for (i = start_dword + dword_count - 1; i >= start_dword ;i--) { - uint64_t dw = new_data[i - start_dword]; + uint64_t dw = be64_to_cpu(new_data[i - start_dword]); __xive_regw(x, dreg0 + i * 8, dreg0x + i, dw, NULL); } @@ -1296,7 +1297,7 @@ static int64_t xive_eqc_cache_update(struct xive *x, uint64_t block, bool synchronous) { return __xive_cache_watch(x, xive_cache_eqc, block, idx, - 0, 4, (uint64_t *)eq, false, synchronous); + 0, 4, (__be64 *)eq, false, synchronous); } static int64_t xive_vpc_cache_update(struct xive *x, uint64_t block, @@ -1304,7 +1305,7 @@ static int64_t xive_vpc_cache_update(struct xive *x, uint64_t block, bool synchronous) { return __xive_cache_watch(x, xive_cache_vpc, block, idx, - 0, 8, (uint64_t *)vp, false, synchronous); + 0, 8, (__be64 *)vp, false, synchronous); } static bool xive_set_vsd(struct xive *x, uint32_t tbl, uint32_t idx, uint64_t v) @@ -1690,7 +1691,7 @@ static bool xive_prealloc_tables(struct xive *x) vsd |= SETFIELD(VSD_TSIZE, 0ull, 4); vsd |= SETFIELD(VSD_MODE, 0ull, VSD_MODE_EXCLUSIVE); vsd |= VSD_FIRMWARE; - x->vp_ind_base[i] = vsd; + x->vp_ind_base[i] = cpu_to_be64(vsd); } /* Allocate the queue overflow pages */ @@ -1704,7 +1705,7 @@ static bool xive_prealloc_tables(struct xive *x) static void xive_add_provisioning_properties(void) { - uint32_t chips[XIVE_MAX_CHIPS]; + __be32 chips[XIVE_MAX_CHIPS]; uint32_t i, count; dt_add_property_cells(xive_dt_node, @@ -1712,7 +1713,7 @@ static void xive_add_provisioning_properties(void) count = 1 << xive_chips_alloc_bits; for (i = 0; i < count; i++) - chips[i] = xive_block_to_chip[i]; + chips[i] = cpu_to_be32(xive_block_to_chip[i]); dt_add_property(xive_dt_node, "ibm,xive-provision-chips", chips, 4 * count); } @@ -1837,7 +1838,9 @@ uint32_t xive_alloc_hw_irqs(uint32_t chip_id, uint32_t count, uint32_t align) for (i = 0; i < count; i++) { struct xive_ive *ive = xive_get_ive(x, base + i); - ive->w = IVE_VALID | IVE_MASKED | SETFIELD(IVE_EQ_DATA, 0ul, base + i); + ive->w = xive_set_field64(IVE_VALID, 0ul, 1) | + xive_set_field64(IVE_MASKED, 0ul, 1) | + xive_set_field64(IVE_EQ_DATA, 0ul, base + i); } unlock(&x->lock); @@ -1883,8 +1886,9 @@ uint32_t xive_alloc_ipi_irqs(uint32_t chip_id, uint32_t count, uint32_t align) for (i = 0; i < count; i++) { struct xive_ive *ive = xive_get_ive(x, base + i); - ive->w = IVE_VALID | IVE_MASKED | - SETFIELD(IVE_EQ_DATA, 0ul, base + i); + ive->w = xive_set_field64(IVE_VALID, 0ul, 1) | + xive_set_field64(IVE_MASKED, 0ul, 1) | + xive_set_field64(IVE_EQ_DATA, 0ul, base + i); } unlock(&x->lock); @@ -2020,17 +2024,17 @@ static bool xive_get_irq_targetting(uint32_t isn, uint32_t *out_target, ive = xive_get_ive(x, isn); if (!ive) return false; - if (!(ive->w & IVE_VALID) && !is_escalation) { + if (!xive_get_field64(IVE_VALID, ive->w) && !is_escalation) { xive_err(x, "ISN %x lead to invalid IVE !\n", isn); return false; } if (out_lirq) - *out_lirq = GETFIELD(IVE_EQ_DATA, ive->w); + *out_lirq = xive_get_field64(IVE_EQ_DATA, ive->w); /* Find the EQ and its xive instance */ - eq_blk = GETFIELD(IVE_EQ_BLOCK, ive->w); - eq_idx = GETFIELD(IVE_EQ_INDEX, ive->w); + eq_blk = xive_get_field64(IVE_EQ_BLOCK, ive->w); + eq_idx = xive_get_field64(IVE_EQ_INDEX, ive->w); eq_x = xive_from_vc_blk(eq_blk); /* This can fail if the interrupt hasn't been initialized yet @@ -2045,15 +2049,15 @@ static bool xive_get_irq_targetting(uint32_t isn, uint32_t *out_target, /* XXX Check valid and format 0 */ /* No priority conversion, return the actual one ! */ - if (ive->w & IVE_MASKED) + if (xive_get_field64(IVE_MASKED, ive->w)) prio = 0xff; else - prio = GETFIELD(EQ_W7_F0_PRIORITY, eq->w7); + prio = xive_get_field32(EQ_W7_F0_PRIORITY, eq->w7); if (out_prio) *out_prio = prio; - vp_blk = GETFIELD(EQ_W6_NVT_BLOCK, eq->w6); - vp_idx = GETFIELD(EQ_W6_NVT_INDEX, eq->w6); + vp_blk = xive_get_field32(EQ_W6_NVT_BLOCK, eq->w6); + vp_idx = xive_get_field32(EQ_W6_NVT_INDEX, eq->w6); server = VP2PIR(vp_blk, vp_idx); if (out_target) @@ -2103,8 +2107,8 @@ static inline bool xive_eq_for_target(uint32_t target, uint8_t prio, /* Grab it, it's in the pressure relief interrupt field, * top 4 bits are the block (word 1). */ - eq_blk = vp->w1 >> 28; - eq_idx = vp->w1 & 0x0fffffff; + eq_blk = be32_to_cpu(vp->w1) >> 28; + eq_idx = be32_to_cpu(vp->w1) & 0x0fffffff; /* Currently the EQ block and VP block should be the same */ if (eq_blk != vp_blk) { @@ -2139,7 +2143,7 @@ static int64_t xive_set_irq_targetting(uint32_t isn, uint32_t target, ive = xive_get_ive(x, isn); if (!ive) return OPAL_PARAMETER; - if (!(ive->w & IVE_VALID) && !is_escalation) { + if (!xive_get_field64(IVE_VALID, ive->w) && !is_escalation) { xive_err(x, "ISN %x lead to invalid IVE !\n", isn); return OPAL_PARAMETER; } @@ -2155,14 +2159,14 @@ static int64_t xive_set_irq_targetting(uint32_t isn, uint32_t target, /* Are we masking ? */ if (prio == 0xff && !is_escalation) { - new_ive.w |= IVE_MASKED; + new_ive.w = xive_set_field64(IVE_MASKED, new_ive.w, 1); xive_vdbg(x, "ISN %x masked !\n", isn); /* Put prio 7 in the EQ */ prio = XIVE_MAX_PRIO; } else { /* Unmasking */ - new_ive.w &= ~IVE_MASKED; + new_ive.w = xive_set_field64(IVE_MASKED, new_ive.w, 0); xive_vdbg(x, "ISN %x unmasked !\n", isn); /* For normal interrupt sources, keep track of which ones @@ -2186,13 +2190,13 @@ static int64_t xive_set_irq_targetting(uint32_t isn, uint32_t target, /* Try to update it atomically to avoid an intermediary * stale state */ - new_ive.w = SETFIELD(IVE_EQ_BLOCK, new_ive.w, eq_blk); - new_ive.w = SETFIELD(IVE_EQ_INDEX, new_ive.w, eq_idx); + new_ive.w = xive_set_field64(IVE_EQ_BLOCK, new_ive.w, eq_blk); + new_ive.w = xive_set_field64(IVE_EQ_INDEX, new_ive.w, eq_idx); } - new_ive.w = SETFIELD(IVE_EQ_DATA, new_ive.w, lirq); + new_ive.w = xive_set_field64(IVE_EQ_DATA, new_ive.w, lirq); xive_vdbg(x,"ISN %x routed to eq %x/%x lirq=%08x IVE=%016llx !\n", - isn, eq_blk, eq_idx, lirq, new_ive.w); + isn, eq_blk, eq_idx, lirq, be64_to_cpu(new_ive.w)); /* Updating the cache differs between real IVEs and escalation * IVEs inside an EQ @@ -2394,7 +2398,7 @@ static void __xive_source_eoi(struct irq_source *is, uint32_t isn) */ /* If it's invalid or masked, don't do anything */ - if ((ive->w & IVE_MASKED) || !(ive->w & IVE_VALID)) + if (xive_get_field64(IVE_MASKED, ive->w) || !xive_get_field64(IVE_VALID, ive->w)) return; /* Grab MMIO control address for that ESB */ @@ -2761,13 +2765,17 @@ static bool xive_check_eq_update(struct xive *x, uint32_t idx, struct xive_eq *e if (memcmp(eq, &eq2, sizeof(struct xive_eq)) != 0) { xive_err(x, "EQ update mismatch idx %d\n", idx); xive_err(x, "want: %08x %08x %08x %08x\n", - eq->w0, eq->w1, eq->w2, eq->w3); + be32_to_cpu(eq->w0), be32_to_cpu(eq->w1), + be32_to_cpu(eq->w2), be32_to_cpu(eq->w3)); xive_err(x, " %08x %08x %08x %08x\n", - eq->w4, eq->w5, eq->w6, eq->w7); + be32_to_cpu(eq->w4), be32_to_cpu(eq->w5), + be32_to_cpu(eq->w6), be32_to_cpu(eq->w7)); xive_err(x, "got : %08x %08x %08x %08x\n", - eq2.w0, eq2.w1, eq2.w2, eq2.w3); + be32_to_cpu(eq2.w0), be32_to_cpu(eq2.w1), + be32_to_cpu(eq2.w2), be32_to_cpu(eq2.w3)); xive_err(x, " %08x %08x %08x %08x\n", - eq2.w4, eq2.w5, eq2.w6, eq2.w7); + be32_to_cpu(eq2.w4), be32_to_cpu(eq2.w5), + be32_to_cpu(eq2.w6), be32_to_cpu(eq2.w7)); return false; } return true; @@ -2783,13 +2791,17 @@ static bool xive_check_vpc_update(struct xive *x, uint32_t idx, struct xive_vp * if (memcmp(vp, &vp2, sizeof(struct xive_vp)) != 0) { xive_err(x, "VP update mismatch idx %d\n", idx); xive_err(x, "want: %08x %08x %08x %08x\n", - vp->w0, vp->w1, vp->w2, vp->w3); + be32_to_cpu(vp->w0), be32_to_cpu(vp->w1), + be32_to_cpu(vp->w2), be32_to_cpu(vp->w3)); xive_err(x, " %08x %08x %08x %08x\n", - vp->w4, vp->w5, vp->w6, vp->w7); + be32_to_cpu(vp->w4), be32_to_cpu(vp->w5), + be32_to_cpu(vp->w6), be32_to_cpu(vp->w7)); xive_err(x, "got : %08x %08x %08x %08x\n", - vp2.w0, vp2.w1, vp2.w2, vp2.w3); + be32_to_cpu(vp2.w0), be32_to_cpu(vp2.w1), + be32_to_cpu(vp2.w2), be32_to_cpu(vp2.w3)); xive_err(x, " %08x %08x %08x %08x\n", - vp2.w4, vp2.w5, vp2.w6, vp2.w7); + be32_to_cpu(vp2.w4), be32_to_cpu(vp2.w5), + be32_to_cpu(vp2.w6), be32_to_cpu(vp2.w7)); return false; } return true; @@ -2821,7 +2833,7 @@ static void xive_special_cache_check(struct xive *x, uint32_t blk, uint32_t idx) memset(vp_m, (~i) & 0xff, sizeof(*vp_m)); sync(); - vp.w1 = (i << 16) | i; + vp.w1 = cpu_to_be32((i << 16) | i); xive_vpc_cache_update(x, blk, idx, &vp, true); if (!xive_check_vpc_update(x, idx, &vp)) { xive_dbg(x, "Test failed at %d iterations\n", i); @@ -3065,7 +3077,7 @@ static void xive_init_cpu(struct cpu_thread *c) static void xive_init_cpu_properties(struct cpu_thread *cpu) { struct cpu_thread *t; - uint32_t iprop[8][2] = { }; + __be32 iprop[8][2] = { }; uint32_t i; assert(cpu_thread_count <= 8); @@ -3076,7 +3088,7 @@ static void xive_init_cpu_properties(struct cpu_thread *cpu) t = (i == 0) ? cpu : find_cpu_by_pir(cpu->pir + i); if (!t) continue; - iprop[i][0] = t->xstate->ipi_irq; + iprop[i][0] = cpu_to_be32(t->xstate->ipi_irq); iprop[i][1] = 0; /* Edge */ } dt_add_property(cpu->node, "interrupts", iprop, cpu_thread_count * 8); @@ -3147,7 +3159,7 @@ static uint32_t xive_read_eq(struct xive_cpu_state *xs, bool just_peek) unlock(&xs->xive->lock); eq = xive_get_eq(xs->xive, xs->eq_idx + XIVE_EMULATION_PRIO); prerror("EQ @%p W0=%08x W1=%08x qbuf @%p\n", - eq, eq->w0, eq->w1, xs->eqbuf); + eq, be32_to_cpu(eq->w0), be32_to_cpu(eq->w1), xs->eqbuf); } log_add(xs, LOG_TYPE_POPQ, 7, cur, xs->eqbuf[(xs->eqptr + 1) & xs->eqmsk], @@ -3364,20 +3376,20 @@ static bool check_misrouted_ipi(struct cpu_thread *me, uint32_t irq) xive_cpu_err(me, "no ive attached\n"); return true; } - xive_cpu_err(me, "ive=%016llx\n", ive->w); + xive_cpu_err(me, "ive=%016llx\n", be64_to_cpu(ive->w)); for_each_chip(chip) { x = chip->xive; if (!x) continue; ive = x->ivt_base; for (i = 0; i < MAX_INT_ENTRIES; i++) { - if ((ive[i].w & IVE_EQ_DATA) == irq) { - eq_blk = GETFIELD(IVE_EQ_BLOCK, ive[i].w); - eq_idx = GETFIELD(IVE_EQ_INDEX, ive[i].w); + if (xive_get_field64(IVE_EQ_DATA, ive[i].w) == irq) { + eq_blk = xive_get_field64(IVE_EQ_BLOCK, ive[i].w); + eq_idx = xive_get_field64(IVE_EQ_INDEX, ive[i].w); xive_cpu_err(me, "Found source: 0x%x ive=%016llx\n" " eq 0x%x/%x", BLKIDX_TO_GIRQ(x->block_id, i), - ive[i].w, eq_blk, eq_idx); + be64_to_cpu(ive[i].w), eq_blk, eq_idx); xive_dump_eq(eq_blk, eq_idx); } } @@ -3395,7 +3407,7 @@ static inline bool check_misrouted_ipi(struct cpu_thread *c __unused, } #endif -static int64_t opal_xive_get_xirr(uint32_t *out_xirr, bool just_poll) +static int64_t opal_xive_get_xirr(__be32 *out_xirr, bool just_poll) { struct cpu_thread *c = this_cpu(); struct xive_cpu_state *xs = c->xstate; @@ -3479,7 +3491,7 @@ static int64_t opal_xive_get_xirr(uint32_t *out_xirr, bool just_poll) false, false); unlock(&xs->xive->lock); eq = xive_get_eq(xs->xive, xs->eq_idx + XIVE_EMULATION_PRIO); - log_add(xs, LOG_TYPE_EQD, 2, eq->w0, eq->w1); + log_add(xs, LOG_TYPE_EQD, 2, be32_to_cpu(eq->w0), be32_to_cpu(eq->w1)); } #endif /* XIVE_PERCPU_LOG */ @@ -3502,7 +3514,7 @@ static int64_t opal_xive_get_xirr(uint32_t *out_xirr, bool just_poll) if (check_misrouted_ipi(c, val)) val = 2; - *out_xirr = (old_cppr << 24) | val; + *out_xirr = cpu_to_be32((old_cppr << 24) | val); /* If we are polling, that's it */ if (just_poll) @@ -3539,9 +3551,9 @@ static int64_t opal_xive_get_xirr(uint32_t *out_xirr, bool just_poll) skip: log_add(xs, LOG_TYPE_XIRR2, 5, xs->cppr, xs->pending, - *out_xirr, xs->eqptr, xs->eqgen); + be32_to_cpu(*out_xirr), xs->eqptr, xs->eqgen); xive_cpu_vdbg(c, " returning XIRR=%08x, pending=0x%x\n", - *out_xirr, xs->pending); + be32_to_cpu(*out_xirr), xs->pending); unlock(&xs->lock); @@ -3615,11 +3627,11 @@ static uint64_t xive_convert_irq_flags(uint64_t iflags) } static int64_t opal_xive_get_irq_info(uint32_t girq, - uint64_t *out_flags, - uint64_t *out_eoi_page, - uint64_t *out_trig_page, - uint32_t *out_esb_shift, - uint32_t *out_src_chip) + __be64 *out_flags, + __be64 *out_eoi_page, + __be64 *out_trig_page, + __be32 *out_esb_shift, + __be32 *out_src_chip) { struct irq_source *is = irq_find_source(girq); struct xive_src *s = container_of(is, struct xive_src, is); @@ -3634,12 +3646,12 @@ static int64_t opal_xive_get_irq_info(uint32_t girq, assert(is->ops == &xive_irq_source_ops); if (out_flags) - *out_flags = xive_convert_irq_flags(s->flags); + *out_flags = cpu_to_be64(xive_convert_irq_flags(s->flags)); idx = girq - s->esb_base; if (out_esb_shift) - *out_esb_shift = s->esb_shift; + *out_esb_shift = cpu_to_be32(s->esb_shift); mm_base = (uint64_t)s->esb_mmio + (1ull << s->esb_shift) * idx; @@ -3655,27 +3667,31 @@ static int64_t opal_xive_get_irq_info(uint32_t girq, trig_page = mm_base; if (out_eoi_page) - *out_eoi_page = eoi_page; + *out_eoi_page = cpu_to_be64(eoi_page); if (out_trig_page) - *out_trig_page = trig_page; + *out_trig_page = cpu_to_be64(trig_page); if (out_src_chip) - *out_src_chip = GIRQ_TO_CHIP(girq); + *out_src_chip = cpu_to_be32(GIRQ_TO_CHIP(girq)); return OPAL_SUCCESS; } static int64_t opal_xive_get_irq_config(uint32_t girq, - uint64_t *out_vp, + __be64 *out_vp, uint8_t *out_prio, - uint32_t *out_lirq) + __be32 *out_lirq) { uint32_t vp; + uint32_t lirq; + uint8_t prio; if (xive_mode != XIVE_MODE_EXPL) return OPAL_WRONG_STATE; - if (xive_get_irq_targetting(girq, &vp, out_prio, out_lirq)) { - *out_vp = vp; + if (xive_get_irq_targetting(girq, &vp, &prio, &lirq)) { + *out_vp = cpu_to_be64(vp); + *out_prio = prio; + *out_lirq = cpu_to_be32(lirq); return OPAL_SUCCESS; } else return OPAL_PARAMETER; @@ -3706,11 +3722,11 @@ static int64_t opal_xive_set_irq_config(uint32_t girq, } static int64_t opal_xive_get_queue_info(uint64_t vp, uint32_t prio, - uint64_t *out_qpage, - uint64_t *out_qsize, - uint64_t *out_qeoi_page, - uint32_t *out_escalate_irq, - uint64_t *out_qflags) + __be64 *out_qpage, + __be64 *out_qsize, + __be64 *out_qeoi_page, + __be32 *out_escalate_irq, + __be64 *out_qflags) { uint32_t blk, idx; struct xive *x; @@ -3736,16 +3752,17 @@ static int64_t opal_xive_get_queue_info(uint64_t vp, uint32_t prio, /* If escalations are routed to a single queue, fix up * the escalation interrupt number here. */ - if (eq->w0 & EQ_W0_UNCOND_ESCALATE) + if (xive_get_field32(EQ_W0_UNCOND_ESCALATE, eq->w0)) esc_idx |= XIVE_ESCALATION_PRIO; + *out_escalate_irq = - MAKE_ESCALATION_GIRQ(blk, esc_idx); + cpu_to_be32(MAKE_ESCALATION_GIRQ(blk, esc_idx)); } /* If this is a single-escalation gather queue, that's all * there is to return */ - if (eq->w0 & EQ_W0_SILENT_ESCALATE) { + if (xive_get_field32(EQ_W0_SILENT_ESCALATE, eq->w0)) { if (out_qflags) *out_qflags = 0; if (out_qpage) @@ -3758,30 +3775,29 @@ static int64_t opal_xive_get_queue_info(uint64_t vp, uint32_t prio, } if (out_qpage) { - if (eq->w0 & EQ_W0_ENQUEUE) - *out_qpage = - (((uint64_t)(eq->w2 & EQ_W2_OP_DESC_HI)) << 32) | eq->w3; + if (xive_get_field32(EQ_W0_ENQUEUE, eq->w0)) + *out_qpage = cpu_to_be64(((uint64_t)xive_get_field32(EQ_W2_OP_DESC_HI, eq->w2) << 32) | be32_to_cpu(eq->w3)); else *out_qpage = 0; } if (out_qsize) { - if (eq->w0 & EQ_W0_ENQUEUE) - *out_qsize = GETFIELD(EQ_W0_QSIZE, eq->w0) + 12; + if (xive_get_field32(EQ_W0_ENQUEUE, eq->w0)) + *out_qsize = cpu_to_be64(xive_get_field32(EQ_W0_QSIZE, eq->w0) + 12); else *out_qsize = 0; } if (out_qeoi_page) { *out_qeoi_page = - (uint64_t)x->eq_mmio + idx * 0x20000; + cpu_to_be64((uint64_t)x->eq_mmio + idx * 0x20000); } if (out_qflags) { *out_qflags = 0; - if (eq->w0 & EQ_W0_VALID) - *out_qflags |= OPAL_XIVE_EQ_ENABLED; - if (eq->w0 & EQ_W0_UCOND_NOTIFY) - *out_qflags |= OPAL_XIVE_EQ_ALWAYS_NOTIFY; - if (eq->w0 & EQ_W0_ESCALATE_CTL) - *out_qflags |= OPAL_XIVE_EQ_ESCALATE; + if (xive_get_field32(EQ_W0_VALID, eq->w0)) + *out_qflags |= cpu_to_be64(OPAL_XIVE_EQ_ENABLED); + if (xive_get_field32(EQ_W0_UCOND_NOTIFY, eq->w0)) + *out_qflags |= cpu_to_be64(OPAL_XIVE_EQ_ALWAYS_NOTIFY); + if (xive_get_field32(EQ_W0_ESCALATE_CTL, eq->w0)) + *out_qflags |= cpu_to_be64(OPAL_XIVE_EQ_ESCALATE); } return OPAL_SUCCESS; @@ -3789,8 +3805,8 @@ static int64_t opal_xive_get_queue_info(uint64_t vp, uint32_t prio, static void xive_cleanup_eq(struct xive_eq *eq) { - eq->w0 = eq->w0 & EQ_W0_FIRMWARE; - eq->w1 = EQ_W1_ESe_Q | EQ_W1_ESn_Q; + eq->w0 = xive_set_field32(EQ_W0_FIRMWARE, 0, xive_get_field32(EQ_W0_FIRMWARE, eq->w0)); + eq->w1 = cpu_to_be32(EQ_W1_ESe_Q | EQ_W1_ESn_Q); eq->w2 = eq->w3 = eq->w4 = eq->w5 = eq->w6 = eq->w7 = 0; } @@ -3823,7 +3839,7 @@ static int64_t opal_xive_set_queue_info(uint64_t vp, uint32_t prio, /* If this is a silent escalation queue, it cannot be * configured directly */ - if (old_eq->w0 & EQ_W0_SILENT_ESCALATE) + if (xive_get_field32(EQ_W0_SILENT_ESCALATE, old_eq->w0)) return OPAL_PARAMETER; /* This shouldn't fail or xive_eq_for_target would have @@ -3845,14 +3861,14 @@ static int64_t opal_xive_set_queue_info(uint64_t vp, uint32_t prio, case 16: case 21: case 24: - eq.w3 = ((uint64_t)qpage) & EQ_W3_OP_DESC_LO; - eq.w2 = (((uint64_t)qpage) >> 32) & EQ_W2_OP_DESC_HI; - eq.w0 |= EQ_W0_ENQUEUE; - eq.w0 = SETFIELD(EQ_W0_QSIZE, eq.w0, qsize - 12); + eq.w3 = cpu_to_be32(((uint64_t)qpage) & EQ_W3_OP_DESC_LO); + eq.w2 = cpu_to_be32((((uint64_t)qpage) >> 32) & EQ_W2_OP_DESC_HI); + eq.w0 = xive_set_field32(EQ_W0_ENQUEUE, eq.w0, 1); + eq.w0 = xive_set_field32(EQ_W0_QSIZE, eq.w0, qsize - 12); break; case 0: eq.w2 = eq.w3 = 0; - eq.w0 &= ~EQ_W0_ENQUEUE; + eq.w0 = xive_set_field32(EQ_W0_ENQUEUE, eq.w0, 0); break; default: return OPAL_PARAMETER; @@ -3861,34 +3877,34 @@ static int64_t opal_xive_set_queue_info(uint64_t vp, uint32_t prio, /* Ensure the priority and target are correctly set (they will * not be right after allocation */ - eq.w6 = SETFIELD(EQ_W6_NVT_BLOCK, 0ul, vp_blk) | - SETFIELD(EQ_W6_NVT_INDEX, 0ul, vp_idx); - eq.w7 = SETFIELD(EQ_W7_F0_PRIORITY, 0ul, prio); + eq.w6 = xive_set_field32(EQ_W6_NVT_BLOCK, 0, vp_blk) | + xive_set_field32(EQ_W6_NVT_INDEX, 0, vp_idx); + eq.w7 = xive_set_field32(EQ_W7_F0_PRIORITY, 0, prio); /* XXX Handle group i bit when needed */ /* Always notify flag */ if (qflags & OPAL_XIVE_EQ_ALWAYS_NOTIFY) - eq.w0 |= EQ_W0_UCOND_NOTIFY; + eq.w0 = xive_set_field32(EQ_W0_UCOND_NOTIFY, eq.w0, 1); else - eq.w0 &= ~EQ_W0_UCOND_NOTIFY; + eq.w0 = xive_set_field32(EQ_W0_UCOND_NOTIFY, eq.w0, 0); /* Escalation flag */ if (qflags & OPAL_XIVE_EQ_ESCALATE) - eq.w0 |= EQ_W0_ESCALATE_CTL; + eq.w0 = xive_set_field32(EQ_W0_ESCALATE_CTL, eq.w0, 1); else - eq.w0 &= ~EQ_W0_ESCALATE_CTL; + eq.w0 = xive_set_field32(EQ_W0_ESCALATE_CTL, eq.w0, 0); /* Unconditionally clear the current queue pointer, set * generation to 1 and disable escalation interrupts. */ - eq.w1 = EQ_W1_GENERATION | - (old_eq->w1 & (EQ_W1_ESe_P | EQ_W1_ESe_Q | - EQ_W1_ESn_P | EQ_W1_ESn_Q)); + eq.w1 = xive_set_field32(EQ_W1_GENERATION, 0, 1) | + xive_set_field32(EQ_W1_ES, 0, xive_get_field32(EQ_W1_ES, old_eq->w1)); /* Enable. We always enable backlog for an enabled queue * otherwise escalations won't work. */ - eq.w0 |= EQ_W0_VALID | EQ_W0_BACKLOG; + eq.w0 = xive_set_field32(EQ_W0_VALID, eq.w0, 1); + eq.w0 = xive_set_field32(EQ_W0_BACKLOG, eq.w0, 1); } else xive_cleanup_eq(&eq); @@ -3901,8 +3917,8 @@ static int64_t opal_xive_set_queue_info(uint64_t vp, uint32_t prio, } static int64_t opal_xive_get_queue_state(uint64_t vp, uint32_t prio, - uint32_t *out_qtoggle, - uint32_t *out_qindex) + __be32 *out_qtoggle, + __be32 *out_qindex) { uint32_t blk, idx; struct xive *x; @@ -3932,11 +3948,11 @@ static int64_t opal_xive_get_queue_state(uint64_t vp, uint32_t prio, return rc; /* We don't do disable queues */ - if (!(eq->w0 & EQ_W0_VALID)) + if (!xive_get_field32(EQ_W0_VALID, eq->w0)) return OPAL_WRONG_STATE; - *out_qtoggle = GETFIELD(EQ_W1_GENERATION, eq->w1); - *out_qindex = GETFIELD(EQ_W1_PAGE_OFF, eq->w1); + *out_qtoggle = cpu_to_be32(xive_get_field32(EQ_W1_GENERATION, eq->w1)); + *out_qindex = cpu_to_be32(xive_get_field32(EQ_W1_PAGE_OFF, eq->w1)); return OPAL_SUCCESS; } @@ -3964,13 +3980,13 @@ static int64_t opal_xive_set_queue_state(uint64_t vp, uint32_t prio, return OPAL_PARAMETER; /* We don't do disable queues */ - if (!(eq->w0 & EQ_W0_VALID)) + if (!xive_get_field32(EQ_W0_VALID, eq->w0)) return OPAL_WRONG_STATE; new_eq = *eq; - new_eq.w1 = SETFIELD(EQ_W1_GENERATION, new_eq.w1, qtoggle); - new_eq.w1 = SETFIELD(EQ_W1_PAGE_OFF, new_eq.w1, qindex); + new_eq.w1 = xive_set_field32(EQ_W1_GENERATION, new_eq.w1, qtoggle); + new_eq.w1 = xive_set_field32(EQ_W1_PAGE_OFF, new_eq.w1, qindex); lock(&x->lock); rc = xive_eqc_cache_update(x, blk, idx, &new_eq, false); @@ -4002,10 +4018,10 @@ static int64_t opal_xive_donate_page(uint32_t chip_id, uint64_t addr) } static int64_t opal_xive_get_vp_info(uint64_t vp_id, - uint64_t *out_flags, - uint64_t *out_cam_value, - uint64_t *out_report_cl_pair, - uint32_t *out_chip_id) + __be64 *out_flags, + __be64 *out_cam_value, + __be64 *out_report_cl_pair, + __be32 *out_chip_id) { struct xive *x; struct xive_vp *vp; @@ -4048,22 +4064,22 @@ static int64_t opal_xive_get_vp_info(uint64_t vp_id, eq = xive_get_eq(x, eq_idx); if (!eq) return OPAL_PARAMETER; - if (vp->w0 & VP_W0_VALID) - *out_flags |= OPAL_XIVE_VP_ENABLED; - if (eq->w0 & EQ_W0_SILENT_ESCALATE) - *out_flags |= OPAL_XIVE_VP_SINGLE_ESCALATION; + if (xive_get_field32(VP_W0_VALID, vp->w0)) + *out_flags |= cpu_to_be64(OPAL_XIVE_VP_ENABLED); + if (xive_get_field32(EQ_W0_SILENT_ESCALATE, eq->w0)) + *out_flags |= cpu_to_be64(OPAL_XIVE_VP_SINGLE_ESCALATION); } if (out_cam_value) - *out_cam_value = (blk << NVT_SHIFT) | idx; + *out_cam_value = cpu_to_be64((blk << NVT_SHIFT) | idx); if (out_report_cl_pair) { - *out_report_cl_pair = ((uint64_t)(vp->w6 & 0x0fffffff)) << 32; - *out_report_cl_pair |= vp->w7 & 0xffffff00; + *out_report_cl_pair = cpu_to_be64(((uint64_t)(be32_to_cpu(vp->w6) & 0x0fffffff)) << 32); + *out_report_cl_pair |= cpu_to_be64(be32_to_cpu(vp->w7) & 0xffffff00); } if (out_chip_id) - *out_chip_id = xive_block_to_chip[blk]; + *out_chip_id = cpu_to_be32(xive_block_to_chip[blk]); return OPAL_SUCCESS; } @@ -4091,8 +4107,8 @@ static int64_t xive_setup_silent_gather(uint64_t vp_id, bool enable) /* If trying to enable silent gather, make sure prio 7 is not * already enabled as a normal queue */ - if (enable && (eq_orig->w0 & EQ_W0_VALID) && - !(eq_orig->w0 & EQ_W0_SILENT_ESCALATE)) { + if (enable && xive_get_field32(EQ_W0_VALID, eq_orig->w0) && + !xive_get_field32(EQ_W0_SILENT_ESCALATE, eq_orig->w0)) { xive_dbg(x, "Attempt at enabling silent gather but" " prio 7 queue already in use\n"); return OPAL_PARAMETER; @@ -4102,15 +4118,17 @@ static int64_t xive_setup_silent_gather(uint64_t vp_id, bool enable) if (enable) { /* W0: Enabled and "s" set, no other bit */ - eq.w0 &= EQ_W0_FIRMWARE; - eq.w0 |= EQ_W0_VALID | EQ_W0_SILENT_ESCALATE | - EQ_W0_ESCALATE_CTL | EQ_W0_BACKLOG; + eq.w0 = xive_set_field32(EQ_W0_FIRMWARE, 0, xive_get_field32(EQ_W0_FIRMWARE, eq.w0)) | + xive_set_field32(EQ_W0_VALID, 0, 1) | + xive_set_field32(EQ_W0_SILENT_ESCALATE, 0, 1) | + xive_set_field32(EQ_W0_ESCALATE_CTL, 0, 1) | + xive_set_field32(EQ_W0_BACKLOG, 0, 1); /* W1: Mark ESn as 01, ESe as 00 */ - eq.w1 &= ~EQ_W1_ESn_P; - eq.w1 |= EQ_W1_ESn_Q; - eq.w1 &= ~(EQ_W1_ESe); - } else if (eq.w0 & EQ_W0_SILENT_ESCALATE) + eq.w1 = xive_set_field32(EQ_W1_ESn_P, eq.w1, 0); + eq.w1 = xive_set_field32(EQ_W1_ESn_Q, eq.w1, 1); + eq.w1 = xive_set_field32(EQ_W1_ESe, eq.w1, 0); + } else if (xive_get_field32(EQ_W0_SILENT_ESCALATE, eq.w0)) xive_cleanup_eq(&eq); if (!memcmp(eq_orig, &eq, sizeof(eq))) @@ -4132,19 +4150,17 @@ static int64_t xive_setup_silent_gather(uint64_t vp_id, bool enable) eq = *eq_orig; if (enable) { /* Set new "u" bit */ - eq.w0 |= EQ_W0_UNCOND_ESCALATE; + eq.w0 = xive_set_field32(EQ_W0_UNCOND_ESCALATE, eq.w0, 1); /* Re-route escalation interrupt (previous * route is lost !) to the gather queue */ - eq.w4 = SETFIELD(EQ_W4_ESC_EQ_BLOCK, - eq.w4, blk); - eq.w4 = SETFIELD(EQ_W4_ESC_EQ_INDEX, - eq.w4, idx + XIVE_ESCALATION_PRIO); - } else if (eq.w0 & EQ_W0_UNCOND_ESCALATE) { + eq.w4 = xive_set_field32(EQ_W4_ESC_EQ_BLOCK, eq.w4, blk); + eq.w4 = xive_set_field32(EQ_W4_ESC_EQ_INDEX, eq.w4, idx + XIVE_ESCALATION_PRIO); + } else if (xive_get_field32(EQ_W0_UNCOND_ESCALATE, eq.w0)) { /* Clear the "u" bit, disable escalations if it was set */ - eq.w0 &= ~EQ_W0_UNCOND_ESCALATE; - eq.w0 &= ~EQ_W0_ESCALATE_CTL; + eq.w0 = xive_set_field32(EQ_W0_UNCOND_ESCALATE, eq.w0, 0); + eq.w0 = xive_set_field32(EQ_W0_ESCALATE_CTL, eq.w0, 0); } if (!memcmp(eq_orig, &eq, sizeof(eq))) continue; @@ -4184,9 +4200,9 @@ static int64_t opal_xive_set_vp_info(uint64_t vp_id, vp_new = *vp; if (flags & OPAL_XIVE_VP_ENABLED) { - vp_new.w0 |= VP_W0_VALID; - vp_new.w6 = report_cl_pair >> 32; - vp_new.w7 = report_cl_pair & 0xffffffff; + vp_new.w0 = xive_set_field32(VP_W0_VALID, vp_new.w0, 1); + vp_new.w6 = cpu_to_be32(report_cl_pair >> 32); + vp_new.w7 = cpu_to_be32(report_cl_pair & 0xffffffff); if (flags & OPAL_XIVE_VP_SINGLE_ESCALATION) rc = xive_setup_silent_gather(vp_id, true); @@ -4218,7 +4234,7 @@ bail: return rc; } -static int64_t opal_xive_get_vp_state(uint64_t vp_id, uint64_t *out_state) +static int64_t opal_xive_get_vp_state(uint64_t vp_id, __be64 *out_state) { struct xive *x; struct xive_vp *vp; @@ -4244,14 +4260,14 @@ static int64_t opal_xive_get_vp_state(uint64_t vp_id, uint64_t *out_state) if (rc) return rc; - if (!(vp->w0 & VP_W0_VALID)) + if (!xive_get_field32(VP_W0_VALID, vp->w0)) return OPAL_WRONG_STATE; /* * Return word4 and word5 which contain the saved HW thread * context. The IPB register is all we care for now on P9. */ - *out_state = (((uint64_t)vp->w4) << 32) | vp->w5; + *out_state = cpu_to_be64((((uint64_t)be32_to_cpu(vp->w4)) << 32) | be32_to_cpu(vp->w5)); return OPAL_SUCCESS; } @@ -4340,7 +4356,7 @@ static void xive_cleanup_vp_ind(struct xive *x) xive_dbg(x, "Cleaning up %d VP ind entries...\n", x->vp_ind_count); for (i = 0; i < x->vp_ind_count; i++) { - if (x->vp_ind_base[i] & VSD_FIRMWARE) { + if (be64_to_cpu(x->vp_ind_base[i]) & VSD_FIRMWARE) { xive_dbg(x, " %04x ... skip (firmware)\n", i); continue; } @@ -4358,7 +4374,7 @@ static void xive_cleanup_eq_ind(struct xive *x) xive_dbg(x, "Cleaning up %d EQ ind entries...\n", x->eq_ind_count); for (i = 0; i < x->eq_ind_count; i++) { - if (x->eq_ind_base[i] & VSD_FIRMWARE) { + if (be64_to_cpu(x->eq_ind_base[i]) & VSD_FIRMWARE) { xive_dbg(x, " %04x ... skip (firmware)\n", i); continue; } @@ -4413,15 +4429,15 @@ static void xive_reset_one(struct xive *x) * we will incorrectly free the EQs that are reserved * for the physical CPUs */ - if (eq->w0 & EQ_W0_VALID) { - if (!(eq->w0 & EQ_W0_FIRMWARE)) + if (xive_get_field32(EQ_W0_VALID, eq->w0)) { + if (!xive_get_field32(EQ_W0_FIRMWARE, eq->w0)) xive_dbg(x, "EQ 0x%x:0x%x is valid at reset: %08x %08x\n", - x->block_id, idx, eq->w0, eq->w1); + x->block_id, idx, be32_to_cpu(eq->w0), be32_to_cpu(eq->w1)); eq0 = *eq; xive_cleanup_eq(&eq0); xive_eqc_cache_update(x, x->block_id, idx, &eq0, true); } - if (eq->w0 & EQ_W0_FIRMWARE) + if (xive_get_field32(EQ_W0_FIRMWARE, eq->w0)) eq_firmware = true; } if (!eq_firmware) @@ -4452,7 +4468,7 @@ static void xive_reset_one(struct xive *x) /* Is the VP valid ? */ vp = xive_get_vp(x, i); - if (!vp || !(vp->w0 & VP_W0_VALID)) + if (!vp || !xive_get_field32(VP_W0_VALID, vp->w0)) continue; /* Clear it */ @@ -4621,7 +4637,7 @@ static int64_t opal_xive_free_vp_block(uint64_t vp_base) } /* VP must be disabled */ - if (vp->w0 & VP_W0_VALID) { + if (xive_get_field32(VP_W0_VALID, vp->w0)) { prlog(PR_ERR, "XIVE: freeing active VP %d\n", vp_id); return OPAL_XIVE_FREE_ACTIVE; } @@ -4629,8 +4645,8 @@ static int64_t opal_xive_free_vp_block(uint64_t vp_base) /* Not populated */ if (vp->w1 == 0) continue; - eq_blk = vp->w1 >> 28; - eq_idx = vp->w1 & 0x0fffffff; + eq_blk = be32_to_cpu(vp->w1) >> 28; + eq_idx = be32_to_cpu(vp->w1) & 0x0fffffff; lock(&x->lock); @@ -4641,7 +4657,7 @@ static int64_t opal_xive_free_vp_block(uint64_t vp_base) struct xive *eq_x = xive_from_vc_blk(eq_blk); struct xive_eq eq, *orig_eq = xive_get_eq(eq_x, eq_idx + j); - if (!(orig_eq->w0 & EQ_W0_VALID)) + if (!xive_get_field32(EQ_W0_VALID, orig_eq->w0)) continue; prlog(PR_WARNING, "XIVE: freeing VP %d with queue %d active\n", @@ -4729,7 +4745,7 @@ static int64_t opal_xive_alloc_vp_block(uint32_t alloc_order) * it out of the cache. */ memset(vp, 0, sizeof(*vp)); - vp->w1 = (blk << 28) | eqs; + vp->w1 = cpu_to_be32((blk << 28) | eqs); } return vp_base; fail: @@ -4766,7 +4782,9 @@ static int64_t xive_try_allocate_irq(struct xive *x) unlock(&x->lock); return OPAL_PARAMETER; } - ive->w = IVE_VALID | IVE_MASKED | SETFIELD(IVE_EQ_DATA, 0ul, girq); + ive->w = xive_set_field64(IVE_VALID, 0ul, 1) | + xive_set_field64(IVE_MASKED, 0ul, 1) | + xive_set_field64(IVE_EQ_DATA, 0ul, girq); unlock(&x->lock); return girq; @@ -4835,7 +4853,8 @@ static int64_t opal_xive_free_irq(uint32_t girq) xive_update_irq_mask(s, girq - s->esb_base, true); /* Mark the IVE masked and invalid */ - ive->w = IVE_MASKED | IVE_VALID; + ive->w = xive_set_field64(IVE_VALID, 0ul, 1) | + xive_set_field64(IVE_MASKED, 0ul, 1); xive_ivc_scrub(x, x->block_id, idx); /* Free it */ @@ -4975,7 +4994,7 @@ static int64_t __opal_xive_dump_emu(struct xive_cpu_state *xs, uint32_t pir) false, false); eq = xive_get_eq(xs->xive, xs->eq_idx + XIVE_EMULATION_PRIO); prlog(PR_INFO, "CPU[%04x]: EQ @%p W0=%08x W1=%08x qbuf @%p\n", - pir, eq, eq->w0, eq->w1, xs->eqbuf); + pir, eq, be32_to_cpu(eq->w0), be32_to_cpu(eq->w1), xs->eqbuf); return OPAL_SUCCESS; } diff --git a/include/xive-p9-regs.h b/include/xive-p9-regs.h index f6b7c20b3..126ab525a 100644 --- a/include/xive-p9-regs.h +++ b/include/xive-p9-regs.h @@ -310,7 +310,7 @@ struct xive_ive { /* Use a single 64-bit definition to make it easier to * perform atomic updates */ - uint64_t w; + __be64 w; #define IVE_VALID PPC_BIT(0) #define IVE_EQ_BLOCK PPC_BITMASK(4,7) /* Destination EQ block# */ #define IVE_EQ_INDEX PPC_BITMASK(8,31) /* Destination EQ index */ @@ -320,7 +320,7 @@ struct xive_ive { /* EQ */ struct xive_eq { - uint32_t w0; + __be32 w0; #define EQ_W0_VALID PPC_BIT32(0) /* "v" bit */ #define EQ_W0_ENQUEUE PPC_BIT32(1) /* "q" bit */ #define EQ_W0_UCOND_NOTIFY PPC_BIT32(2) /* "n" bit */ @@ -335,30 +335,31 @@ struct xive_eq { #define EQ_QSIZE_4K 0 #define EQ_QSIZE_64K 4 #define EQ_W0_HWDEP PPC_BITMASK32(24,31) - uint32_t w1; + __be32 w1; #define EQ_W1_ESn PPC_BITMASK32(0,1) #define EQ_W1_ESn_P PPC_BIT32(0) #define EQ_W1_ESn_Q PPC_BIT32(1) #define EQ_W1_ESe PPC_BITMASK32(2,3) #define EQ_W1_ESe_P PPC_BIT32(2) #define EQ_W1_ESe_Q PPC_BIT32(3) +#define EQ_W1_ES PPC_BITMASK32(0,3) #define EQ_W1_GENERATION PPC_BIT32(9) #define EQ_W1_PAGE_OFF PPC_BITMASK32(10,31) - uint32_t w2; + __be32 w2; #define EQ_W2_MIGRATION_REG PPC_BITMASK32(0,3) #define EQ_W2_OP_DESC_HI PPC_BITMASK32(4,31) - uint32_t w3; + __be32 w3; #define EQ_W3_OP_DESC_LO PPC_BITMASK32(0,31) - uint32_t w4; + __be32 w4; #define EQ_W4_ESC_EQ_BLOCK PPC_BITMASK32(4,7) #define EQ_W4_ESC_EQ_INDEX PPC_BITMASK32(8,31) - uint32_t w5; + __be32 w5; #define EQ_W5_ESC_EQ_DATA PPC_BITMASK32(1,31) - uint32_t w6; + __be32 w6; #define EQ_W6_FORMAT_BIT PPC_BIT32(8) #define EQ_W6_NVT_BLOCK PPC_BITMASK32(9,12) #define EQ_W6_NVT_INDEX PPC_BITMASK32(13,31) - uint32_t w7; + __be32 w7; #define EQ_W7_F0_IGNORE PPC_BIT32(0) #define EQ_W7_F0_BLK_GROUPING PPC_BIT32(1) #define EQ_W7_F0_PRIORITY PPC_BITMASK32(8,15) @@ -368,24 +369,24 @@ struct xive_eq { /* VP */ struct xive_vp { - uint32_t w0; + __be32 w0; #define VP_W0_VALID PPC_BIT32(0) - uint32_t w1; - uint32_t w2; - uint32_t w3; - uint32_t w4; - uint32_t w5; - uint32_t w6; - uint32_t w7; - uint32_t w8; + __be32 w1; + __be32 w2; + __be32 w3; + __be32 w4; + __be32 w5; + __be32 w6; + __be32 w7; + __be32 w8; #define VP_W8_GRP_VALID PPC_BIT32(0) - uint32_t w9; - uint32_t wa; - uint32_t wb; - uint32_t wc; - uint32_t wd; - uint32_t we; - uint32_t wf; + __be32 w9; + __be32 wa; + __be32 wb; + __be32 wc; + __be32 wd; + __be32 we; + __be32 wf; }; #endif /* XIVE_P9_REGS_H */ diff --git a/include/xive-regs.h b/include/xive-regs.h index a6a6ce35a..7f0054ef5 100644 --- a/include/xive-regs.h +++ b/include/xive-regs.h @@ -8,6 +8,32 @@ #ifndef XIVE_REGS_H #define XIVE_REGS_H +static inline uint64_t xive_get_field64(uint64_t mask, beint64_t word) +{ + return (be64_to_cpu(word) & mask) >> MASK_TO_LSH(mask); +} + +static inline beint64_t xive_set_field64(uint64_t mask, beint64_t word, + uint64_t value) +{ + uint64_t tmp = (be64_to_cpu(word) & ~mask) | + ((value << MASK_TO_LSH(mask)) & mask); + return cpu_to_be64(tmp); +} + +static inline uint32_t xive_get_field32(uint32_t mask, beint32_t word) +{ + return (be32_to_cpu(word) & mask) >> MASK_TO_LSH(mask); +} + +static inline beint32_t xive_set_field32(uint32_t mask, beint32_t word, + uint32_t value) +{ + uint32_t tmp = (be32_to_cpu(word) & ~mask) | + ((value << MASK_TO_LSH(mask)) & mask); + return cpu_to_be32(tmp); +} + /* * TM registers are special, see below */ diff --git a/include/xive.h b/include/xive.h index 5706d275a..592a6dc09 100644 --- a/include/xive.h +++ b/include/xive.h @@ -27,7 +27,7 @@ uint32_t xive_alloc_ipi_irqs(uint32_t chip_id, uint32_t count, uint32_t align); #define XIVE_HW_SRC_PSI 8 uint64_t xive_get_notify_port(uint32_t chip_id, uint32_t ent); -uint32_t xive_get_notify_base(uint32_t girq); +__attrconst uint32_t xive_get_notify_base(uint32_t girq); /* XIVE feature flag to de/activate store EOI */ #define XIVE_STORE_EOI_ENABLED 0 From patchwork Thu Nov 28 06:24:27 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Nicholas Piggin X-Patchwork-Id: 1201906 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 47NnpD6G95z9sPK for ; Thu, 28 Nov 2019 17:31:00 +1100 (AEDT) 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="ngDAJbTH"; 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 47NnpD1msczDr1f for ; Thu, 28 Nov 2019 17:31:00 +1100 (AEDT) X-Original-To: skiboot@lists.ozlabs.org Delivered-To: skiboot@lists.ozlabs.org Authentication-Results: lists.ozlabs.org; spf=pass (sender SPF authorized) smtp.mailfrom=gmail.com (client-ip=2607:f8b0:4864:20::631; helo=mail-pl1-x631.google.com; envelope-from=npiggin@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="ngDAJbTH"; dkim-atps=neutral Received: from mail-pl1-x631.google.com (mail-pl1-x631.google.com [IPv6:2607:f8b0:4864:20::631]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (2048 bits) server-digest SHA256) (No client certificate requested) by lists.ozlabs.org (Postfix) with ESMTPS id 47Nnhk3jL8zDqCc for ; Thu, 28 Nov 2019 17:26:14 +1100 (AEDT) Received: by mail-pl1-x631.google.com with SMTP id q16so6959791plr.10 for ; Wed, 27 Nov 2019 22:26:14 -0800 (PST) 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 :mime-version:content-transfer-encoding; bh=jybWwqSpF2iI257h29Abmf8ec2XBEM0JtYtwBWKBuTg=; b=ngDAJbTHRN5tSZxcYsHloqfAP9SWCkeFAE3NqET46ehd/Pnte7LABrqez6LL3E9th9 fR3nxKAzEKVgRowdDnNjcpOwTV0CfugKlwV2ynM7ZaWJHZ7Q8dRAhqvx5UfqA19v8qDq ELBvBxIGdw0S2TyeiZLL6nG8CAyAP/fKT9oYDX8tLr9AlorooMw6UqANn7H3HnVtpP/J A62IrqLKrFx1C/n4SAgDeJGQot1K4trhGfD1ZdmNZhdyo9g2+ef9SBCRKUHoXcGzbH3Z tYp8qJz6SoDIURh7Avu2WnA9pHbYo9bU8/8MkSYamRC4f0VxntAZnBeXUO+GhzrDaNKp AMVA== 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:mime-version:content-transfer-encoding; bh=jybWwqSpF2iI257h29Abmf8ec2XBEM0JtYtwBWKBuTg=; b=bg/+d4fuSLPgVXccGrpCVssEVud//xDcskJv9bl/htzdFpXlOqc2lGz72ABk+vSdbV DGLzmqhNfKcD5Y1yLjcHk9EPgcftSOb1hEpwkU2kMYFwUgn9hbsmpKfKGmuvzL3cg9gX xmxG9V9JVN99VPIvCuf0hmBZlym5Y6isX1seHK1X95m3v+k3ne5PaQKuVSwHxDg9yBfQ Yi2YJ3og+C7wBMj+5NX4XMj+nZmCAirPGFTKmPoaSsYLoJKHYI/n3booQt0pBWEEeYjF TgMK+Xy7elrUOJQuJi1gfOTo+hHsVivwNAtYJUtKFj5C5GQkBzfenamN3TG10rOYwF+6 pubA== X-Gm-Message-State: APjAAAWMlVGHH1oqR/abwEQLljBZOVgXWgHZ966xrX1gqDAJ7TSvtUmo QwQs6R6FOyOK5dtrI9R45eo5kaTaShI= X-Google-Smtp-Source: APXvYqyIPuzg+DVVKbDu/6BbH+uvUbw+lfRlezDznFu2tUq9k9CHOgvk1RS7P86NkiDMlAy4x44KJw== X-Received: by 2002:a17:902:567:: with SMTP id 94mr8115086plf.174.1574922371174; Wed, 27 Nov 2019 22:26:11 -0800 (PST) Received: from bobo.local0.net ([203.194.47.34]) by smtp.gmail.com with ESMTPSA id e5sm8463196pjv.29.2019.11.27.22.26.08 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 27 Nov 2019 22:26:10 -0800 (PST) From: Nicholas Piggin To: skiboot@lists.ozlabs.org Date: Thu, 28 Nov 2019 16:24:27 +1000 Message-Id: <20191128062442.20690-14-npiggin@gmail.com> X-Mailer: git-send-email 2.23.0 In-Reply-To: <20191128062442.20690-1-npiggin@gmail.com> References: <20191128062442.20690-1-npiggin@gmail.com> MIME-Version: 1.0 Subject: [Skiboot] [PATCH v8 13/28] phb4: make endian-clean X-BeenThere: skiboot@lists.ozlabs.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: Mailing list for skiboot development List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: skiboot-bounces+incoming=patchwork.ozlabs.org@lists.ozlabs.org Sender: "Skiboot" Convert phb4 dt construction and in-memory hardware tables to use explicit endian conversions. Signed-off-by: Nicholas Piggin --- hw/phb4.c | 342 +++++++++++++++++++++++++------------------------ include/phb4.h | 2 +- 2 files changed, 177 insertions(+), 167 deletions(-) diff --git a/hw/phb4.c b/hw/phb4.c index 4177589b4..9ef912e47 100644 --- a/hw/phb4.c +++ b/hw/phb4.c @@ -273,7 +273,7 @@ static int64_t phb4_pcicfg_check(struct phb4 *p, uint32_t bdfn, return OPAL_HARDWARE; /* Fetch the PE# from cache */ - *pe = p->tbl_rtt[bdfn]; + *pe = be16_to_cpu(p->tbl_rtt[bdfn]); return OPAL_SUCCESS; } @@ -913,7 +913,7 @@ static void phb4_init_ioda_cache(struct phb4 *p) * and this occurs before PEs have been assigned. */ for (i = 0; i < RTT_TABLE_ENTRIES; i++) - p->tbl_rtt[i] = PHB4_RESERVED_PE_NUM(p); + p->tbl_rtt[i] = cpu_to_be16(PHB4_RESERVED_PE_NUM(p)); memset(p->tbl_peltv, 0x0, p->tbl_peltv_size); memset(p->tve_cache, 0x0, sizeof(p->tve_cache)); @@ -1738,126 +1738,139 @@ static void phb4_err_clear(struct phb4 *p) static void phb4_read_phb_status(struct phb4 *p, struct OpalIoPhb4ErrorData *stat) { - uint16_t val = 0; uint32_t i; - uint64_t *pPEST; + __be64 *pPEST; + uint16_t __16; + uint32_t __32; + uint64_t __64; memset(stat, 0, sizeof(struct OpalIoPhb4ErrorData)); /* Error data common part */ - stat->common.version = OPAL_PHB_ERROR_DATA_VERSION_1; - stat->common.ioType = OPAL_PHB_ERROR_DATA_TYPE_PHB4; - stat->common.len = sizeof(struct OpalIoPhb4ErrorData); + stat->common.version = cpu_to_be32(OPAL_PHB_ERROR_DATA_VERSION_1); + stat->common.ioType = cpu_to_be32(OPAL_PHB_ERROR_DATA_TYPE_PHB4); + stat->common.len = cpu_to_be32(sizeof(struct OpalIoPhb4ErrorData)); /* Use ASB for config space if the PHB is fenced */ if (p->flags & PHB4_AIB_FENCED) p->flags |= PHB4_CFG_USE_ASB; /* Grab RC bridge control, make it 32-bit */ - phb4_pcicfg_read16(&p->phb, 0, PCI_CFG_BRCTL, &val); - stat->brdgCtl = val; + phb4_pcicfg_read16(&p->phb, 0, PCI_CFG_BRCTL, &__16); + stat->brdgCtl = cpu_to_be32(__16); /* * Grab various RC PCIe capability registers. All device, slot * and link status are 16-bit, so we grab the pair control+status * for each of them */ - phb4_pcicfg_read32(&p->phb, 0, p->ecap + PCICAP_EXP_DEVCTL, - &stat->deviceStatus); - phb4_pcicfg_read32(&p->phb, 0, p->ecap + PCICAP_EXP_SLOTCTL, - &stat->slotStatus); - phb4_pcicfg_read32(&p->phb, 0, p->ecap + PCICAP_EXP_LCTL, - &stat->linkStatus); + phb4_pcicfg_read32(&p->phb, 0, p->ecap + PCICAP_EXP_DEVCTL, &__32); + stat->deviceStatus = cpu_to_be32(__32); + phb4_pcicfg_read32(&p->phb, 0, p->ecap + PCICAP_EXP_SLOTCTL, &__32); + stat->slotStatus = cpu_to_be32(__32); + phb4_pcicfg_read32(&p->phb, 0, p->ecap + PCICAP_EXP_LCTL, &__32); + stat->linkStatus = cpu_to_be32(__32); /* * I assume those are the standard config space header, cmd & status * together makes 32-bit. Secondary status is 16-bit so I'll clear * the top on that one */ - phb4_pcicfg_read32(&p->phb, 0, PCI_CFG_CMD, &stat->devCmdStatus); - phb4_pcicfg_read16(&p->phb, 0, PCI_CFG_SECONDARY_STATUS, &val); - stat->devSecStatus = val; + phb4_pcicfg_read32(&p->phb, 0, PCI_CFG_CMD, &__32); + stat->devCmdStatus = cpu_to_be32(__32); + phb4_pcicfg_read16(&p->phb, 0, PCI_CFG_SECONDARY_STATUS, &__16); + stat->devSecStatus = cpu_to_be32(__32); /* Grab a bunch of AER regs */ - phb4_pcicfg_read32(&p->phb, 0, p->aercap + PCIECAP_AER_RERR_STA, - &stat->rootErrorStatus); - phb4_pcicfg_read32(&p->phb, 0, p->aercap + PCIECAP_AER_UE_STATUS, - &stat->uncorrErrorStatus); - phb4_pcicfg_read32(&p->phb, 0, p->aercap + PCIECAP_AER_CE_STATUS, - &stat->corrErrorStatus); - phb4_pcicfg_read32(&p->phb, 0, p->aercap + PCIECAP_AER_HDR_LOG0, - &stat->tlpHdr1); - phb4_pcicfg_read32(&p->phb, 0, p->aercap + PCIECAP_AER_HDR_LOG1, - &stat->tlpHdr2); - phb4_pcicfg_read32(&p->phb, 0, p->aercap + PCIECAP_AER_HDR_LOG2, - &stat->tlpHdr3); - phb4_pcicfg_read32(&p->phb, 0, p->aercap + PCIECAP_AER_HDR_LOG3, - &stat->tlpHdr4); - phb4_pcicfg_read32(&p->phb, 0, p->aercap + PCIECAP_AER_SRCID, - &stat->sourceId); + phb4_pcicfg_read32(&p->phb, 0, p->aercap + PCIECAP_AER_RERR_STA, &__32); + stat->rootErrorStatus = cpu_to_be32(__32); + phb4_pcicfg_read32(&p->phb, 0, p->aercap + PCIECAP_AER_UE_STATUS, &__32); + stat->uncorrErrorStatus = cpu_to_be32(__32); + + phb4_pcicfg_read32(&p->phb, 0, p->aercap + PCIECAP_AER_CE_STATUS, &__32); + stat->corrErrorStatus = cpu_to_be32(__32); + + phb4_pcicfg_read32(&p->phb, 0, p->aercap + PCIECAP_AER_HDR_LOG0, &__32); + stat->tlpHdr1 = cpu_to_be32(__32); + + phb4_pcicfg_read32(&p->phb, 0, p->aercap + PCIECAP_AER_HDR_LOG1, &__32); + stat->tlpHdr2 = cpu_to_be32(__32); + + phb4_pcicfg_read32(&p->phb, 0, p->aercap + PCIECAP_AER_HDR_LOG2, &__32); + stat->tlpHdr3 = cpu_to_be32(__32); + + phb4_pcicfg_read32(&p->phb, 0, p->aercap + PCIECAP_AER_HDR_LOG3, &__32); + stat->tlpHdr4 = cpu_to_be32(__32); + + phb4_pcicfg_read32(&p->phb, 0, p->aercap + PCIECAP_AER_SRCID, &__32); + stat->sourceId = cpu_to_be32(__32); + /* PEC NFIR, same as P8/PHB3 */ - xscom_read(p->chip_id, p->pe_stk_xscom + 0x0, &stat->nFir); - xscom_read(p->chip_id, p->pe_stk_xscom + 0x3, &stat->nFirMask); - xscom_read(p->chip_id, p->pe_stk_xscom + 0x8, &stat->nFirWOF); + xscom_read(p->chip_id, p->pe_stk_xscom + 0x0, &__64); + stat->nFir = cpu_to_be64(__64); + xscom_read(p->chip_id, p->pe_stk_xscom + 0x3, &__64); + stat->nFirMask = cpu_to_be64(__64); + xscom_read(p->chip_id, p->pe_stk_xscom + 0x8, &__64); + stat->nFirWOF = cpu_to_be64(__64); /* PHB4 inbound and outbound error Regs */ - stat->phbPlssr = phb4_read_reg_asb(p, PHB_CPU_LOADSTORE_STATUS); - stat->phbCsr = phb4_read_reg_asb(p, PHB_DMA_CHAN_STATUS); - stat->lemFir = phb4_read_reg_asb(p, PHB_LEM_FIR_ACCUM); - stat->lemErrorMask = phb4_read_reg_asb(p, PHB_LEM_ERROR_MASK); - stat->lemWOF = phb4_read_reg_asb(p, PHB_LEM_WOF); - stat->phbErrorStatus = phb4_read_reg_asb(p, PHB_ERR_STATUS); - stat->phbFirstErrorStatus = phb4_read_reg_asb(p, PHB_ERR1_STATUS); - stat->phbErrorLog0 = phb4_read_reg_asb(p, PHB_ERR_LOG_0); - stat->phbErrorLog1 = phb4_read_reg_asb(p, PHB_ERR_LOG_1); - stat->phbTxeErrorStatus = phb4_read_reg_asb(p, PHB_TXE_ERR_STATUS); - stat->phbTxeFirstErrorStatus = phb4_read_reg_asb(p, PHB_TXE_ERR1_STATUS); - stat->phbTxeErrorLog0 = phb4_read_reg_asb(p, PHB_TXE_ERR_LOG_0); - stat->phbTxeErrorLog1 = phb4_read_reg_asb(p, PHB_TXE_ERR_LOG_1); - stat->phbRxeArbErrorStatus = phb4_read_reg_asb(p, PHB_RXE_ARB_ERR_STATUS); - stat->phbRxeArbFirstErrorStatus = phb4_read_reg_asb(p, PHB_RXE_ARB_ERR1_STATUS); - stat->phbRxeArbErrorLog0 = phb4_read_reg_asb(p, PHB_RXE_ARB_ERR_LOG_0); - stat->phbRxeArbErrorLog1 = phb4_read_reg_asb(p, PHB_RXE_ARB_ERR_LOG_1); - stat->phbRxeMrgErrorStatus = phb4_read_reg_asb(p, PHB_RXE_MRG_ERR_STATUS); - stat->phbRxeMrgFirstErrorStatus = phb4_read_reg_asb(p, PHB_RXE_MRG_ERR1_STATUS); - stat->phbRxeMrgErrorLog0 = phb4_read_reg_asb(p, PHB_RXE_MRG_ERR_LOG_0); - stat->phbRxeMrgErrorLog1 = phb4_read_reg_asb(p, PHB_RXE_MRG_ERR_LOG_1); - stat->phbRxeTceErrorStatus = phb4_read_reg_asb(p, PHB_RXE_TCE_ERR_STATUS); - stat->phbRxeTceFirstErrorStatus = phb4_read_reg_asb(p, PHB_RXE_TCE_ERR1_STATUS); - stat->phbRxeTceErrorLog0 = phb4_read_reg_asb(p, PHB_RXE_TCE_ERR_LOG_0); - stat->phbRxeTceErrorLog1 = phb4_read_reg_asb(p, PHB_RXE_TCE_ERR_LOG_1); + stat->phbPlssr = cpu_to_be64(phb4_read_reg_asb(p, PHB_CPU_LOADSTORE_STATUS)); + stat->phbCsr = cpu_to_be64(phb4_read_reg_asb(p, PHB_DMA_CHAN_STATUS)); + stat->lemFir = cpu_to_be64(phb4_read_reg_asb(p, PHB_LEM_FIR_ACCUM)); + stat->lemErrorMask = cpu_to_be64(phb4_read_reg_asb(p, PHB_LEM_ERROR_MASK)); + stat->lemWOF = cpu_to_be64(phb4_read_reg_asb(p, PHB_LEM_WOF)); + stat->phbErrorStatus = cpu_to_be64(phb4_read_reg_asb(p, PHB_ERR_STATUS)); + stat->phbFirstErrorStatus = cpu_to_be64(phb4_read_reg_asb(p, PHB_ERR1_STATUS)); + stat->phbErrorLog0 = cpu_to_be64(phb4_read_reg_asb(p, PHB_ERR_LOG_0)); + stat->phbErrorLog1 = cpu_to_be64(phb4_read_reg_asb(p, PHB_ERR_LOG_1)); + stat->phbTxeErrorStatus = cpu_to_be64(phb4_read_reg_asb(p, PHB_TXE_ERR_STATUS)); + stat->phbTxeFirstErrorStatus = cpu_to_be64(phb4_read_reg_asb(p, PHB_TXE_ERR1_STATUS)); + stat->phbTxeErrorLog0 = cpu_to_be64(phb4_read_reg_asb(p, PHB_TXE_ERR_LOG_0)); + stat->phbTxeErrorLog1 = cpu_to_be64(phb4_read_reg_asb(p, PHB_TXE_ERR_LOG_1)); + stat->phbRxeArbErrorStatus = cpu_to_be64(phb4_read_reg_asb(p, PHB_RXE_ARB_ERR_STATUS)); + stat->phbRxeArbFirstErrorStatus = cpu_to_be64(phb4_read_reg_asb(p, PHB_RXE_ARB_ERR1_STATUS)); + stat->phbRxeArbErrorLog0 = cpu_to_be64(phb4_read_reg_asb(p, PHB_RXE_ARB_ERR_LOG_0)); + stat->phbRxeArbErrorLog1 = cpu_to_be64(phb4_read_reg_asb(p, PHB_RXE_ARB_ERR_LOG_1)); + stat->phbRxeMrgErrorStatus = cpu_to_be64(phb4_read_reg_asb(p, PHB_RXE_MRG_ERR_STATUS)); + stat->phbRxeMrgFirstErrorStatus = cpu_to_be64(phb4_read_reg_asb(p, PHB_RXE_MRG_ERR1_STATUS)); + stat->phbRxeMrgErrorLog0 = cpu_to_be64(phb4_read_reg_asb(p, PHB_RXE_MRG_ERR_LOG_0)); + stat->phbRxeMrgErrorLog1 = cpu_to_be64(phb4_read_reg_asb(p, PHB_RXE_MRG_ERR_LOG_1)); + stat->phbRxeTceErrorStatus = cpu_to_be64(phb4_read_reg_asb(p, PHB_RXE_TCE_ERR_STATUS)); + stat->phbRxeTceFirstErrorStatus = cpu_to_be64(phb4_read_reg_asb(p, PHB_RXE_TCE_ERR1_STATUS)); + stat->phbRxeTceErrorLog0 = cpu_to_be64(phb4_read_reg_asb(p, PHB_RXE_TCE_ERR_LOG_0)); + stat->phbRxeTceErrorLog1 = cpu_to_be64(phb4_read_reg_asb(p, PHB_RXE_TCE_ERR_LOG_1)); /* PHB4 REGB error registers */ - stat->phbPblErrorStatus = phb4_read_reg_asb(p, PHB_PBL_ERR_STATUS); - stat->phbPblFirstErrorStatus = phb4_read_reg_asb(p, PHB_PBL_ERR1_STATUS); - stat->phbPblErrorLog0 = phb4_read_reg_asb(p, PHB_PBL_ERR_LOG_0); - stat->phbPblErrorLog1 = phb4_read_reg_asb(p, PHB_PBL_ERR_LOG_1); + stat->phbPblErrorStatus = cpu_to_be64(phb4_read_reg_asb(p, PHB_PBL_ERR_STATUS)); + stat->phbPblFirstErrorStatus = cpu_to_be64(phb4_read_reg_asb(p, PHB_PBL_ERR1_STATUS)); + stat->phbPblErrorLog0 = cpu_to_be64(phb4_read_reg_asb(p, PHB_PBL_ERR_LOG_0)); + stat->phbPblErrorLog1 = cpu_to_be64(phb4_read_reg_asb(p, PHB_PBL_ERR_LOG_1)); - stat->phbPcieDlpErrorStatus = phb4_read_reg_asb(p, PHB_PCIE_DLP_ERR_STATUS); - stat->phbPcieDlpErrorLog1 = phb4_read_reg_asb(p, PHB_PCIE_DLP_ERRLOG1); - stat->phbPcieDlpErrorLog2 = phb4_read_reg_asb(p, PHB_PCIE_DLP_ERRLOG2); + stat->phbPcieDlpErrorStatus = cpu_to_be64(phb4_read_reg_asb(p, PHB_PCIE_DLP_ERR_STATUS)); + stat->phbPcieDlpErrorLog1 = cpu_to_be64(phb4_read_reg_asb(p, PHB_PCIE_DLP_ERRLOG1)); + stat->phbPcieDlpErrorLog2 = cpu_to_be64(phb4_read_reg_asb(p, PHB_PCIE_DLP_ERRLOG2)); - stat->phbRegbErrorStatus = phb4_read_reg_asb(p, PHB_REGB_ERR_STATUS); - stat->phbRegbFirstErrorStatus = phb4_read_reg_asb(p, PHB_REGB_ERR1_STATUS); - stat->phbRegbErrorLog0 = phb4_read_reg_asb(p, PHB_REGB_ERR_LOG_0); - stat->phbRegbErrorLog1 = phb4_read_reg_asb(p, PHB_REGB_ERR_LOG_1); + stat->phbRegbErrorStatus = cpu_to_be64(phb4_read_reg_asb(p, PHB_REGB_ERR_STATUS)); + stat->phbRegbFirstErrorStatus = cpu_to_be64(phb4_read_reg_asb(p, PHB_REGB_ERR1_STATUS)); + stat->phbRegbErrorLog0 = cpu_to_be64(phb4_read_reg_asb(p, PHB_REGB_ERR_LOG_0)); + stat->phbRegbErrorLog1 = cpu_to_be64(phb4_read_reg_asb(p, PHB_REGB_ERR_LOG_1)); /* * Grab PESTA & B content. The error bit (bit#0) should * be fetched from IODA and the left content from memory * resident tables. */ - pPEST = (uint64_t *)p->tbl_pest; + pPEST = (__be64 *)p->tbl_pest; phb4_ioda_sel(p, IODA3_TBL_PESTA, 0, true); for (i = 0; i < p->max_num_pes; i++) { - stat->pestA[i] = phb4_read_reg_asb(p, PHB_IODA_DATA0); + stat->pestA[i] = cpu_to_be64(phb4_read_reg_asb(p, PHB_IODA_DATA0)); stat->pestA[i] |= pPEST[2 * i]; } phb4_ioda_sel(p, IODA3_TBL_PESTB, 0, true); for (i = 0; i < p->max_num_pes; i++) { - stat->pestB[i] = phb4_read_reg_asb(p, PHB_IODA_DATA0); + stat->pestB[i] = cpu_to_be64(phb4_read_reg_asb(p, PHB_IODA_DATA0)); stat->pestB[i] |= pPEST[2 * i + 1]; } } @@ -2007,17 +2020,17 @@ static void phb4_eeh_dump_regs(struct phb4 *p) } phb4_read_phb_status(p, s); - PHBERR(p, " brdgCtl = %08x\n", s->brdgCtl); + PHBERR(p, " brdgCtl = %08x\n", be32_to_cpu(s->brdgCtl)); /* PHB4 cfg regs */ - PHBERR(p, " deviceStatus = %08x\n", s->deviceStatus); - PHBERR(p, " slotStatus = %08x\n", s->slotStatus); - PHBERR(p, " linkStatus = %08x\n", s->linkStatus); - PHBERR(p, " devCmdStatus = %08x\n", s->devCmdStatus); - PHBERR(p, " devSecStatus = %08x\n", s->devSecStatus); - PHBERR(p, " rootErrorStatus = %08x\n", s->rootErrorStatus); - PHBERR(p, " corrErrorStatus = %08x\n", s->corrErrorStatus); - PHBERR(p, " uncorrErrorStatus = %08x\n", s->uncorrErrorStatus); + PHBERR(p, " deviceStatus = %08x\n", be32_to_cpu(s->deviceStatus)); + PHBERR(p, " slotStatus = %08x\n", be32_to_cpu(s->slotStatus)); + PHBERR(p, " linkStatus = %08x\n", be32_to_cpu(s->linkStatus)); + PHBERR(p, " devCmdStatus = %08x\n", be32_to_cpu(s->devCmdStatus)); + PHBERR(p, " devSecStatus = %08x\n", be32_to_cpu(s->devSecStatus)); + PHBERR(p, " rootErrorStatus = %08x\n", be32_to_cpu(s->rootErrorStatus)); + PHBERR(p, " corrErrorStatus = %08x\n", be32_to_cpu(s->corrErrorStatus)); + PHBERR(p, " uncorrErrorStatus = %08x\n", be32_to_cpu(s->uncorrErrorStatus)); /* Two non OPAL API registers that are useful */ phb4_pcicfg_read16(&p->phb, 0, p->ecap + PCICAP_EXP_DEVCTL, ®); @@ -2027,57 +2040,57 @@ static void phb4_eeh_dump_regs(struct phb4 *p) PHBERR(p, " devStat = %08x\n", reg); /* Byte swap TLP headers so they are the same as the PCIe spec */ - PHBERR(p, " tlpHdr1 = %08x\n", bswap_32(s->tlpHdr1)); - PHBERR(p, " tlpHdr2 = %08x\n", bswap_32(s->tlpHdr2)); - PHBERR(p, " tlpHdr3 = %08x\n", bswap_32(s->tlpHdr3)); - PHBERR(p, " tlpHdr4 = %08x\n", bswap_32(s->tlpHdr4)); - PHBERR(p, " sourceId = %08x\n", s->sourceId); - PHBERR(p, " nFir = %016llx\n", s->nFir); - PHBERR(p, " nFirMask = %016llx\n", s->nFirMask); - PHBERR(p, " nFirWOF = %016llx\n", s->nFirWOF); - PHBERR(p, " phbPlssr = %016llx\n", s->phbPlssr); - PHBERR(p, " phbCsr = %016llx\n", s->phbCsr); - PHBERR(p, " lemFir = %016llx\n", s->lemFir); - PHBERR(p, " lemErrorMask = %016llx\n", s->lemErrorMask); - PHBERR(p, " lemWOF = %016llx\n", s->lemWOF); - PHBERR(p, " phbErrorStatus = %016llx\n", s->phbErrorStatus); - PHBERR(p, " phbFirstErrorStatus = %016llx\n", s->phbFirstErrorStatus); - PHBERR(p, " phbErrorLog0 = %016llx\n", s->phbErrorLog0); - PHBERR(p, " phbErrorLog1 = %016llx\n", s->phbErrorLog1); - PHBERR(p, " phbTxeErrorStatus = %016llx\n", s->phbTxeErrorStatus); - PHBERR(p, " phbTxeFirstErrorStatus = %016llx\n", s->phbTxeFirstErrorStatus); - PHBERR(p, " phbTxeErrorLog0 = %016llx\n", s->phbTxeErrorLog0); - PHBERR(p, " phbTxeErrorLog1 = %016llx\n", s->phbTxeErrorLog1); - PHBERR(p, " phbRxeArbErrorStatus = %016llx\n", s->phbRxeArbErrorStatus); - PHBERR(p, "phbRxeArbFrstErrorStatus = %016llx\n", s->phbRxeArbFirstErrorStatus); - PHBERR(p, " phbRxeArbErrorLog0 = %016llx\n", s->phbRxeArbErrorLog0); - PHBERR(p, " phbRxeArbErrorLog1 = %016llx\n", s->phbRxeArbErrorLog1); - PHBERR(p, " phbRxeMrgErrorStatus = %016llx\n", s->phbRxeMrgErrorStatus); - PHBERR(p, "phbRxeMrgFrstErrorStatus = %016llx\n", s->phbRxeMrgFirstErrorStatus); - PHBERR(p, " phbRxeMrgErrorLog0 = %016llx\n", s->phbRxeMrgErrorLog0); - PHBERR(p, " phbRxeMrgErrorLog1 = %016llx\n", s->phbRxeMrgErrorLog1); - PHBERR(p, " phbRxeTceErrorStatus = %016llx\n", s->phbRxeTceErrorStatus); - PHBERR(p, "phbRxeTceFrstErrorStatus = %016llx\n", s->phbRxeTceFirstErrorStatus); - PHBERR(p, " phbRxeTceErrorLog0 = %016llx\n", s->phbRxeTceErrorLog0); - PHBERR(p, " phbRxeTceErrorLog1 = %016llx\n", s->phbRxeTceErrorLog1); - PHBERR(p, " phbPblErrorStatus = %016llx\n", s->phbPblErrorStatus); - PHBERR(p, " phbPblFirstErrorStatus = %016llx\n", s->phbPblFirstErrorStatus); - PHBERR(p, " phbPblErrorLog0 = %016llx\n", s->phbPblErrorLog0); - PHBERR(p, " phbPblErrorLog1 = %016llx\n", s->phbPblErrorLog1); - PHBERR(p, " phbPcieDlpErrorLog1 = %016llx\n", s->phbPcieDlpErrorLog1); - PHBERR(p, " phbPcieDlpErrorLog2 = %016llx\n", s->phbPcieDlpErrorLog2); - PHBERR(p, " phbPcieDlpErrorStatus = %016llx\n", s->phbPcieDlpErrorStatus); - - PHBERR(p, " phbRegbErrorStatus = %016llx\n", s->phbRegbErrorStatus); - PHBERR(p, " phbRegbFirstErrorStatus = %016llx\n", s->phbRegbFirstErrorStatus); - PHBERR(p, " phbRegbErrorLog0 = %016llx\n", s->phbRegbErrorLog0); - PHBERR(p, " phbRegbErrorLog1 = %016llx\n", s->phbRegbErrorLog1); + PHBERR(p, " tlpHdr1 = %08x\n", cpu_to_le32(be32_to_cpu(s->tlpHdr1))); + PHBERR(p, " tlpHdr2 = %08x\n", cpu_to_le32(be32_to_cpu(s->tlpHdr2))); + PHBERR(p, " tlpHdr3 = %08x\n", cpu_to_le32(be32_to_cpu(s->tlpHdr3))); + PHBERR(p, " tlpHdr4 = %08x\n", cpu_to_le32(be32_to_cpu(s->tlpHdr4))); + PHBERR(p, " sourceId = %08x\n", be32_to_cpu(s->sourceId)); + PHBERR(p, " nFir = %016llx\n", be64_to_cpu(s->nFir)); + PHBERR(p, " nFirMask = %016llx\n", be64_to_cpu(s->nFirMask)); + PHBERR(p, " nFirWOF = %016llx\n", be64_to_cpu(s->nFirWOF)); + PHBERR(p, " phbPlssr = %016llx\n", be64_to_cpu(s->phbPlssr)); + PHBERR(p, " phbCsr = %016llx\n", be64_to_cpu(s->phbCsr)); + PHBERR(p, " lemFir = %016llx\n", be64_to_cpu(s->lemFir)); + PHBERR(p, " lemErrorMask = %016llx\n", be64_to_cpu(s->lemErrorMask)); + PHBERR(p, " lemWOF = %016llx\n", be64_to_cpu(s->lemWOF)); + PHBERR(p, " phbErrorStatus = %016llx\n", be64_to_cpu(s->phbErrorStatus)); + PHBERR(p, " phbFirstErrorStatus = %016llx\n", be64_to_cpu(s->phbFirstErrorStatus)); + PHBERR(p, " phbErrorLog0 = %016llx\n", be64_to_cpu(s->phbErrorLog0)); + PHBERR(p, " phbErrorLog1 = %016llx\n", be64_to_cpu(s->phbErrorLog1)); + PHBERR(p, " phbTxeErrorStatus = %016llx\n", be64_to_cpu(s->phbTxeErrorStatus)); + PHBERR(p, " phbTxeFirstErrorStatus = %016llx\n", be64_to_cpu(s->phbTxeFirstErrorStatus)); + PHBERR(p, " phbTxeErrorLog0 = %016llx\n", be64_to_cpu(s->phbTxeErrorLog0)); + PHBERR(p, " phbTxeErrorLog1 = %016llx\n", be64_to_cpu(s->phbTxeErrorLog1)); + PHBERR(p, " phbRxeArbErrorStatus = %016llx\n", be64_to_cpu(s->phbRxeArbErrorStatus)); + PHBERR(p, "phbRxeArbFrstErrorStatus = %016llx\n", be64_to_cpu(s->phbRxeArbFirstErrorStatus)); + PHBERR(p, " phbRxeArbErrorLog0 = %016llx\n", be64_to_cpu(s->phbRxeArbErrorLog0)); + PHBERR(p, " phbRxeArbErrorLog1 = %016llx\n", be64_to_cpu(s->phbRxeArbErrorLog1)); + PHBERR(p, " phbRxeMrgErrorStatus = %016llx\n", be64_to_cpu(s->phbRxeMrgErrorStatus)); + PHBERR(p, "phbRxeMrgFrstErrorStatus = %016llx\n", be64_to_cpu(s->phbRxeMrgFirstErrorStatus)); + PHBERR(p, " phbRxeMrgErrorLog0 = %016llx\n", be64_to_cpu(s->phbRxeMrgErrorLog0)); + PHBERR(p, " phbRxeMrgErrorLog1 = %016llx\n", be64_to_cpu(s->phbRxeMrgErrorLog1)); + PHBERR(p, " phbRxeTceErrorStatus = %016llx\n", be64_to_cpu(s->phbRxeTceErrorStatus)); + PHBERR(p, "phbRxeTceFrstErrorStatus = %016llx\n", be64_to_cpu(s->phbRxeTceFirstErrorStatus)); + PHBERR(p, " phbRxeTceErrorLog0 = %016llx\n", be64_to_cpu(s->phbRxeTceErrorLog0)); + PHBERR(p, " phbRxeTceErrorLog1 = %016llx\n", be64_to_cpu(s->phbRxeTceErrorLog1)); + PHBERR(p, " phbPblErrorStatus = %016llx\n", be64_to_cpu(s->phbPblErrorStatus)); + PHBERR(p, " phbPblFirstErrorStatus = %016llx\n", be64_to_cpu(s->phbPblFirstErrorStatus)); + PHBERR(p, " phbPblErrorLog0 = %016llx\n", be64_to_cpu(s->phbPblErrorLog0)); + PHBERR(p, " phbPblErrorLog1 = %016llx\n", be64_to_cpu(s->phbPblErrorLog1)); + PHBERR(p, " phbPcieDlpErrorLog1 = %016llx\n", be64_to_cpu(s->phbPcieDlpErrorLog1)); + PHBERR(p, " phbPcieDlpErrorLog2 = %016llx\n", be64_to_cpu(s->phbPcieDlpErrorLog2)); + PHBERR(p, " phbPcieDlpErrorStatus = %016llx\n", be64_to_cpu(s->phbPcieDlpErrorStatus)); + + PHBERR(p, " phbRegbErrorStatus = %016llx\n", be64_to_cpu(s->phbRegbErrorStatus)); + PHBERR(p, " phbRegbFirstErrorStatus = %016llx\n", be64_to_cpu(s->phbRegbFirstErrorStatus)); + PHBERR(p, " phbRegbErrorLog0 = %016llx\n", be64_to_cpu(s->phbRegbErrorLog0)); + PHBERR(p, " phbRegbErrorLog1 = %016llx\n", be64_to_cpu(s->phbRegbErrorLog1)); for (i = 0; i < p->max_num_pes; i++) { if (!s->pestA[i] && !s->pestB[i]) continue; PHBERR(p, " PEST[%03x] = %016llx %016llx\n", - i, s->pestA[i], s->pestB[i]); + i, be64_to_cpu(s->pestA[i]), be64_to_cpu(s->pestB[i])); } free(s); } @@ -2121,7 +2134,7 @@ static int64_t phb4_set_pe(struct phb *phb, /* Map or unmap the RTT range */ for (idx = 0; idx < RTT_TABLE_ENTRIES; idx++) if ((idx & mask) == (bdfn & mask)) - p->tbl_rtt[idx] = pe_number; + p->tbl_rtt[idx] = cpu_to_be16(pe_number); /* Invalidate the RID Translation Cache (RTC) inside the PHB */ out_be64(p->regs + PHB_RTC_INVALIDATE, PHB_RTC_INVALIDATE_ALL); @@ -3433,14 +3446,15 @@ static struct pci_slot *phb4_slot_create(struct phb *phb) static uint64_t phb4_get_pesta(struct phb4 *p, uint64_t pe_number) { - uint64_t pesta, *pPEST; + uint64_t pesta; + __be64 *pPEST; - pPEST = (uint64_t *)p->tbl_pest; + pPEST = (__be64 *)p->tbl_pest; phb4_ioda_sel(p, IODA3_TBL_PESTA, pe_number, false); pesta = phb4_read_reg(p, PHB_IODA_DATA0); if (pesta & IODA3_PESTA_MMIO_FROZEN) - pesta |= pPEST[2*pe_number]; + pesta |= be64_to_cpu(pPEST[2*pe_number]); return pesta; } @@ -3798,13 +3812,13 @@ static int64_t phb4_err_inject_cfg(struct phb4 *phb, uint64_t pe_number, ctrl = PHB_PAPR_ERR_INJ_CTL_CFG; for (bdfn = 0; bdfn < RTT_TABLE_ENTRIES; bdfn++) { - if (phb->tbl_rtt[bdfn] != pe_number) + if (be16_to_cpu(phb->tbl_rtt[bdfn]) != pe_number) continue; /* The PE can be associated with PCI bus or device */ is_bus_pe = false; if ((bdfn + 8) < RTT_TABLE_ENTRIES && - phb->tbl_rtt[bdfn + 8] == pe_number) + be16_to_cpu(phb->tbl_rtt[bdfn + 8]) == pe_number) is_bus_pe = true; /* Figure out the PCI config address */ @@ -5333,7 +5347,7 @@ static void phb4_allocate_tables(struct phb4 *p) p->tbl_rtt = local_alloc(p->chip_id, RTT_TABLE_SIZE, RTT_TABLE_SIZE); assert(p->tbl_rtt); for (i = 0; i < RTT_TABLE_ENTRIES; i++) - p->tbl_rtt[i] = PHB4_RESERVED_PE_NUM(p); + p->tbl_rtt[i] = cpu_to_be16(PHB4_RESERVED_PE_NUM(p)); p->tbl_peltv = local_alloc(p->chip_id, p->tbl_peltv_size, p->tbl_peltv_size); assert(p->tbl_peltv); @@ -5471,11 +5485,11 @@ static bool phb4_calculate_windows(struct phb4 *p) "ibm,mmio-windows", -1); assert(prop->len >= (2 * sizeof(uint64_t))); - p->mm0_base = ((const uint64_t *)prop->prop)[0]; - p->mm0_size = ((const uint64_t *)prop->prop)[1]; + p->mm0_base = be64_to_cpu(((__be64 *)prop->prop)[0]); + p->mm0_size = be64_to_cpu(((__be64 *)prop->prop)[1]); if (prop->len > 16) { - p->mm1_base = ((const uint64_t *)prop->prop)[2]; - p->mm1_size = ((const uint64_t *)prop->prop)[3]; + p->mm1_base = be64_to_cpu(((__be64 *)prop->prop)[2]); + p->mm1_size = be64_to_cpu(((__be64 *)prop->prop)[3]); } /* Sort them so that 0 is big and 1 is small */ @@ -5547,16 +5561,12 @@ static const struct irq_source_ops phb4_lsi_ops = { .attributes = phb4_lsi_attributes, }; -#ifdef HAVE_BIG_ENDIAN -static u64 lane_eq_default[8] = { - 0x5454545454545454UL, 0x5454545454545454UL, - 0x5454545454545454UL, 0x5454545454545454UL, - 0x7777777777777777UL, 0x7777777777777777UL, - 0x7777777777777777UL, 0x7777777777777777UL +static __be64 lane_eq_default[8] = { + CPU_TO_BE64(0x5454545454545454UL), CPU_TO_BE64(0x5454545454545454UL), + CPU_TO_BE64(0x5454545454545454UL), CPU_TO_BE64(0x5454545454545454UL), + CPU_TO_BE64(0x7777777777777777UL), CPU_TO_BE64(0x7777777777777777UL), + CPU_TO_BE64(0x7777777777777777UL), CPU_TO_BE64(0x7777777777777777UL), }; -#else -#error lane_eq_default needs to be big endian (device tree property) -#endif static void phb4_create(struct dt_node *np) { @@ -5591,11 +5601,11 @@ static void phb4_create(struct dt_node *np) /* Get the various XSCOM register bases from the device-tree */ prop = dt_require_property(np, "ibm,xscom-bases", 5 * sizeof(uint32_t)); - p->pe_xscom = ((const uint32_t *)prop->prop)[0]; - p->pe_stk_xscom = ((const uint32_t *)prop->prop)[1]; - p->pci_xscom = ((const uint32_t *)prop->prop)[2]; - p->pci_stk_xscom = ((const uint32_t *)prop->prop)[3]; - p->etu_xscom = ((const uint32_t *)prop->prop)[4]; + p->pe_xscom = be32_to_cpu(((__be32 *)prop->prop)[0]); + p->pe_stk_xscom = be32_to_cpu(((__be32 *)prop->prop)[1]); + p->pci_xscom = be32_to_cpu(((__be32 *)prop->prop)[2]); + p->pci_stk_xscom = be32_to_cpu(((__be32 *)prop->prop)[3]); + p->etu_xscom = be32_to_cpu(((__be32 *)prop->prop)[4]); /* * We skip the initial PERST assertion requested by the generic code @@ -5758,7 +5768,7 @@ static void phb4_probe_stack(struct dt_node *stk_node, uint32_t pec_index, uint64_t mmio1_bar = 0, mmio1_bmask, mmio1_sz; uint64_t reg[4]; void *foo; - uint64_t mmio_win[4]; + __be64 mmio_win[4]; unsigned int mmio_win_sz; struct dt_node *np; char *path; @@ -5818,13 +5828,13 @@ static void phb4_probe_stack(struct dt_node *stk_node, uint32_t pec_index, /* Build MMIO windows list */ mmio_win_sz = 0; if (mmio0_bar) { - mmio_win[mmio_win_sz++] = mmio0_bar; - mmio_win[mmio_win_sz++] = mmio0_sz; + mmio_win[mmio_win_sz++] = cpu_to_be64(mmio0_bar); + mmio_win[mmio_win_sz++] = cpu_to_be64(mmio0_sz); bar_en |= XPEC_NEST_STK_BAR_EN_MMIO0; } if (mmio1_bar) { - mmio_win[mmio_win_sz++] = mmio1_bar; - mmio_win[mmio_win_sz++] = mmio1_sz; + mmio_win[mmio_win_sz++] = cpu_to_be64(mmio1_bar); + mmio_win[mmio_win_sz++] = cpu_to_be64(mmio1_sz); bar_en |= XPEC_NEST_STK_BAR_EN_MMIO1; } @@ -5854,12 +5864,12 @@ static void phb4_probe_stack(struct dt_node *stk_node, uint32_t pec_index, prlog_once(PR_DEBUG, "Version reg: 0x%016llx\n", in_be64(foo)); /* Create PHB node */ - reg[0] = phb_bar; - reg[1] = 0x1000; - reg[2] = irq_bar; - reg[3] = 0x10000000; + reg[0] = cpu_to_be64(phb_bar); + reg[1] = cpu_to_be64(0x1000); + reg[2] = cpu_to_be64(irq_bar); + reg[3] = cpu_to_be64(0x10000000); - np = dt_new_addr(dt_root, "pciex", reg[0]); + np = dt_new_addr(dt_root, "pciex", phb_bar); if (!np) return; diff --git a/include/phb4.h b/include/phb4.h index 1c68ec2e2..ca701a311 100644 --- a/include/phb4.h +++ b/include/phb4.h @@ -183,7 +183,7 @@ struct phb4 { uint64_t creset_start_time; /* SkiBoot owned in-memory tables */ - uint16_t *tbl_rtt; + __be16 *tbl_rtt; uint8_t *tbl_peltv; uint64_t tbl_peltv_size; uint64_t tbl_pest; From patchwork Thu Nov 28 06:24:28 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Nicholas Piggin X-Patchwork-Id: 1201909 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.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 47Nnpg4Z6Wz9s7T for ; Thu, 28 Nov 2019 17:31:23 +1100 (AEDT) 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="Lm37IUzW"; 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 47Nnpg2RS5zDr1G for ; Thu, 28 Nov 2019 17:31:23 +1100 (AEDT) X-Original-To: skiboot@lists.ozlabs.org Delivered-To: skiboot@lists.ozlabs.org Authentication-Results: lists.ozlabs.org; spf=pass (sender SPF authorized) smtp.mailfrom=gmail.com (client-ip=2607:f8b0:4864:20::1044; helo=mail-pj1-x1044.google.com; envelope-from=npiggin@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="Lm37IUzW"; dkim-atps=neutral Received: from mail-pj1-x1044.google.com (mail-pj1-x1044.google.com [IPv6:2607:f8b0:4864:20::1044]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (2048 bits) server-digest SHA256) (No client certificate requested) by lists.ozlabs.org (Postfix) with ESMTPS id 47Nnhm2TBvzDqM2 for ; Thu, 28 Nov 2019 17:26:16 +1100 (AEDT) Received: by mail-pj1-x1044.google.com with SMTP id r11so3556351pjp.12 for ; Wed, 27 Nov 2019 22:26:16 -0800 (PST) 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 :mime-version:content-transfer-encoding; bh=YEVfbfcSRah22waPQpQZLDYDOLktEOqpgRSnMvJ+dwU=; b=Lm37IUzWhZ6C/l+bkvFdKiYv37AsWHf4/yibVsDiqxyNmZvMrlgBUrbyDzrmcMBSqQ YeUCVtGo4G9zvPOI3HdrxY0LXbMY0wNGvDQUULGWmJUAXsp7e6KWZzPlI2hJtzSlfvnO OIhxBIAXQg8XNKMelHZXD7cCX1FXCk6PzJvSpmomHHnnbaL93bv1CZzaUGZA2XSUyKz4 hsrZOjjAxkBkGYqtckGcA3k85o+36sQU64ldmVgekbMV3HKadbl4NatAqJvz30C5dO0W SW7d4+tLJhxUlSWINrtDnxB3Q21VvYufcegpe7qsbI3r3z4/hrIfL7ttDPijg7PtRakZ 4pGw== 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:mime-version:content-transfer-encoding; bh=YEVfbfcSRah22waPQpQZLDYDOLktEOqpgRSnMvJ+dwU=; b=SmfBB9fq+qfBtJKHhjaIvj6ispPq6omKmxZZMyMrYWOCfZbm1dbwEBXUhKXmsXWcHZ ZizckOK4pbpwd87Oe1nNI6VgWpvC0TxnegYWQsgnXciuXiximI77lQTeuGkBsVfkfrtv cJ1PyhKHCoa9twKYfVva9GMavARX4r+ni0eKnL4R/ORYzq68aBlqqGgNINLG5C/yNg/G S0mbM1R7pLCaGBlAnWMLoEg+NeWCQ7phXEFiApBnxGyG9Bb+WfYCJcKtPGV/n8FzIxDz STchf186ZQBUPKinJA3rz44G7N5UYQJBYqM915Oj71+m33PugoH6Zig1dwqoFuvmxQeD 7Oaw== X-Gm-Message-State: APjAAAXQJlNPZdaX4aPr0JQgJotpYEtzSkS17CybC3TRK+DrzY8NllXy 6N+h/QXEtHyqVezoaWAhTyDy4GrkIaA= X-Google-Smtp-Source: APXvYqwAxQVYGPmc7FkyeCUlMDsakFkO/fOeTwM/3zynZdZmdPMkgtq/LAHGCpabqRTmwEECtGqdnA== X-Received: by 2002:a17:90a:fb4f:: with SMTP id iq15mr145620pjb.86.1574922374031; Wed, 27 Nov 2019 22:26:14 -0800 (PST) Received: from bobo.local0.net ([203.194.47.34]) by smtp.gmail.com with ESMTPSA id e5sm8463196pjv.29.2019.11.27.22.26.11 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 27 Nov 2019 22:26:13 -0800 (PST) From: Nicholas Piggin To: skiboot@lists.ozlabs.org Date: Thu, 28 Nov 2019 16:24:28 +1000 Message-Id: <20191128062442.20690-15-npiggin@gmail.com> X-Mailer: git-send-email 2.23.0 In-Reply-To: <20191128062442.20690-1-npiggin@gmail.com> References: <20191128062442.20690-1-npiggin@gmail.com> MIME-Version: 1.0 Subject: [Skiboot] [PATCH v8 14/28] occ sensors: make endian-clean X-BeenThere: skiboot@lists.ozlabs.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: Mailing list for skiboot development List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: skiboot-bounces+incoming=patchwork.ozlabs.org@lists.ozlabs.org Sender: "Skiboot" Convert occ sensors dt construction and in-memory hardware tables to use explicit endian conversions. Signed-off-by: Nicholas Piggin --- hw/occ-sensor.c | 100 ++++++++++++++++++++++++++---------------------- hw/occ.c | 46 +++++++++++----------- include/occ.h | 50 ++++++++++++------------ 3 files changed, 103 insertions(+), 93 deletions(-) diff --git a/hw/occ-sensor.c b/hw/occ-sensor.c index da846bd92..e9ac5df4b 100644 --- a/hw/occ-sensor.c +++ b/hw/occ-sensor.c @@ -116,7 +116,7 @@ struct occ_sensor_data_header *get_sensor_header_block(int occ_num) static inline struct occ_sensor_name *get_names_block(struct occ_sensor_data_header *hb) { - return ((struct occ_sensor_name *)((u64)hb + hb->names_offset)); + return ((struct occ_sensor_name *)((u64)hb + be32_to_cpu(hb->names_offset))); } static inline u32 sensor_handler(int occ_num, int sensor_id, int attr) @@ -131,11 +131,11 @@ static inline u32 sensor_handler(int occ_num, int sensor_id, int attr) */ static void scale_sensor(struct occ_sensor_name *md, u64 *sensor) { - u32 factor = md->scale_factor; + u32 factor = be32_to_cpu(md->scale_factor); int i; s8 exp; - if (md->type == OCC_SENSOR_TYPE_CURRENT) + if (be16_to_cpu(md->type) == OCC_SENSOR_TYPE_CURRENT) *sensor *= 1000; //convert to mA *sensor *= factor >> 8; @@ -152,7 +152,7 @@ static void scale_sensor(struct occ_sensor_name *md, u64 *sensor) static void scale_energy(struct occ_sensor_name *md, u64 *sensor) { - u32 factor = md->freq; + u32 factor = be32_to_cpu(md->freq); int i; s8 exp; @@ -174,17 +174,17 @@ static u64 read_sensor(struct occ_sensor_record *sensor, int attr) { switch (attr) { case SENSOR_SAMPLE: - return sensor->sample; + return be16_to_cpu(sensor->sample); case SENSOR_SAMPLE_MIN: - return sensor->sample_min; + return be16_to_cpu(sensor->sample_min); case SENSOR_SAMPLE_MAX: - return sensor->sample_max; + return be16_to_cpu(sensor->sample_max); case SENSOR_CSM_MIN: - return sensor->csm_min; + return be16_to_cpu(sensor->csm_min); case SENSOR_CSM_MAX: - return sensor->csm_max; + return be16_to_cpu(sensor->csm_max); case SENSOR_ACCUMULATOR: - return sensor->accumulator; + return be64_to_cpu(sensor->accumulator); default: break; } @@ -197,14 +197,16 @@ static void *select_sensor_buffer(struct occ_sensor_data_header *hb, int id) struct occ_sensor_name *md; u8 *ping, *pong; void *buffer = NULL; + u32 reading_offset; if (!hb) return NULL; md = get_names_block(hb); - ping = (u8 *)((u64)hb + hb->reading_ping_offset); - pong = (u8 *)((u64)hb + hb->reading_pong_offset); + ping = (u8 *)((u64)hb + be32_to_cpu(hb->reading_ping_offset)); + pong = (u8 *)((u64)hb + be32_to_cpu(hb->reading_pong_offset)); + reading_offset = be32_to_cpu(md[id].reading_offset); /* Check which buffer is valid and read the data from that. * Ping Pong Action @@ -216,11 +218,11 @@ static void *select_sensor_buffer(struct occ_sensor_data_header *hb, int id) if (*ping && *pong) { u64 tping, tpong; - u64 ping_buf = (u64)ping + md[id].reading_offset; - u64 pong_buf = (u64)pong + md[id].reading_offset; + u64 ping_buf = (u64)ping + reading_offset; + u64 pong_buf = (u64)pong + reading_offset; - tping = ((struct occ_sensor_record *)ping_buf)->timestamp; - tpong = ((struct occ_sensor_record *)pong_buf)->timestamp; + tping = be64_to_cpu(((struct occ_sensor_record *)ping_buf)->timestamp); + tpong = be64_to_cpu(((struct occ_sensor_record *)pong_buf)->timestamp); if (tping > tpong) buffer = ping; @@ -236,7 +238,7 @@ static void *select_sensor_buffer(struct occ_sensor_data_header *hb, int id) } assert(buffer); - buffer = (void *)((u64)buffer + md[id].reading_offset); + buffer = (void *)((u64)buffer + reading_offset); return buffer; } @@ -265,7 +267,7 @@ int occ_sensor_read(u32 handle, __be64 *data) if (hb->valid != 1) return OPAL_HARDWARE; - if (id > hb->nr_sensors) + if (id > be16_to_cpu(hb->nr_sensors)) return OPAL_PARAMETER; buff = select_sensor_buffer(hb, id); @@ -277,7 +279,7 @@ int occ_sensor_read(u32 handle, __be64 *data) return OPAL_SUCCESS; md = get_names_block(hb); - if (md[id].type == OCC_SENSOR_TYPE_POWER && attr == SENSOR_ACCUMULATOR) + if (be16_to_cpu(md[id].type) == OCC_SENSOR_TYPE_POWER && attr == SENSOR_ACCUMULATOR) scale_energy(&md[id], &d); else scale_sensor(&md[id], &d); @@ -323,7 +325,8 @@ static bool occ_sensor_sanity(struct occ_sensor_data_header *hb, int chipid) return false; } - if (!hb->names_offset || !hb->reading_ping_offset || + if (!hb->names_offset || + !hb->reading_ping_offset || !hb->reading_pong_offset) { prerror("OCC: Chip %d Invalid sensor buffer pointers\n", chipid); @@ -360,9 +363,10 @@ static void add_sensor_label(struct dt_node *node, struct occ_sensor_name *md, { char sname[30] = ""; char prefix[30] = ""; + uint16_t location = be16_to_cpu(md->location); int i; - if (md->location != OCC_SENSOR_LOC_SYSTEM) + if (location != OCC_SENSOR_LOC_SYSTEM) snprintf(prefix, sizeof(prefix), "%s %d ", "Chip", chipid); for (i = 0; i < ARRAY_SIZE(str_maps); i++) @@ -371,7 +375,7 @@ static void add_sensor_label(struct dt_node *node, struct occ_sensor_name *md, char *end; int num = -1; - if (md->location != OCC_SENSOR_LOC_CORE) + if (location != OCC_SENSOR_LOC_CORE) num = parse_entity(md->name, &end); if (num != -1) { @@ -387,7 +391,7 @@ static void add_sensor_label(struct dt_node *node, struct occ_sensor_name *md, } /* Fallback to OCC literal if mapping is not found */ - if (md->location == OCC_SENSOR_LOC_SYSTEM) { + if (location == OCC_SENSOR_LOC_SYSTEM) { dt_add_property_string(node, "label", md->name); } else { snprintf(sname, sizeof(sname), "%s%s", prefix, md->name); @@ -447,15 +451,15 @@ static bool check_sensor_sample(struct occ_sensor_data_header *hb, u32 offset) { struct occ_sensor_record *ping, *pong; - ping = (struct occ_sensor_record *)((u64)hb + hb->reading_ping_offset - + offset); - pong = (struct occ_sensor_record *)((u64)hb + hb->reading_pong_offset - + offset); + ping = (struct occ_sensor_record *)((u64)hb + + be32_to_cpu(hb->reading_ping_offset) + offset); + pong = (struct occ_sensor_record *)((u64)hb + + be32_to_cpu(hb->reading_pong_offset) + offset); return ping->sample || pong->sample; } static void add_sensor_node(const char *loc, const char *type, int i, int attr, - struct occ_sensor_name *md, u32 *phandle, u32 *ptype, + struct occ_sensor_name *md, __be32 *phandle, u32 *ptype, u32 pir, u32 occ_num, u32 chipid) { char name[30]; @@ -471,10 +475,10 @@ static void add_sensor_node(const char *loc, const char *type, int i, int attr, dt_add_property_string(node, "occ_label", md->name); add_sensor_label(node, md, chipid); - if (md->location == OCC_SENSOR_LOC_CORE) + if (be16_to_cpu(md->location) == OCC_SENSOR_LOC_CORE) dt_add_property_cells(node, "ibm,pir", pir); - *ptype = md->type; + *ptype = be16_to_cpu(md->type); if (attr == SENSOR_SAMPLE) { handler = sensor_handler(occ_num, i, SENSOR_CSM_MAX); @@ -485,7 +489,7 @@ static void add_sensor_node(const char *loc, const char *type, int i, int attr, } dt_add_property_string(node, "compatible", "ibm,opal-sensor"); - *phandle = node->phandle; + *phandle = cpu_to_be32(node->phandle); } bool occ_sensors_init(void) @@ -523,7 +527,9 @@ bool occ_sensors_init(void) for_each_chip(chip) { struct occ_sensor_data_header *hb; struct occ_sensor_name *md; - u32 *phandles, *ptype, phcount = 0; + __be32 *phandles; + u32 *ptype, phcount = 0; + unsigned int nr_sensors; hb = get_sensor_header_block(occ_num); md = get_names_block(hb); @@ -532,30 +538,34 @@ bool occ_sensors_init(void) if (!occ_sensor_sanity(hb, chip->id)) continue; - phandles = malloc(hb->nr_sensors * sizeof(u32)); + nr_sensors = be16_to_cpu(hb->nr_sensors); + + phandles = malloc(nr_sensors * sizeof(__be32)); assert(phandles); - ptype = malloc(hb->nr_sensors * sizeof(u32)); + ptype = malloc(nr_sensors * sizeof(u32)); assert(ptype); - for (i = 0; i < hb->nr_sensors; i++) { - const char *type, *loc; + for (i = 0; i < nr_sensors; i++) { + const char *type_name, *loc; struct cpu_thread *c = NULL; uint32_t pir = 0; + uint16_t type = be16_to_cpu(md[i].type); + uint16_t location = be16_to_cpu(md[i].location); if (md[i].structure_type != OCC_SENSOR_READING_FULL) continue; - if (!(md[i].type & HWMON_SENSORS_MASK)) + if (!(type & HWMON_SENSORS_MASK)) continue; - if (md[i].location == OCC_SENSOR_LOC_GPU && !has_gpu) + if (location == OCC_SENSOR_LOC_GPU && !has_gpu) continue; - if (md[i].type == OCC_SENSOR_TYPE_POWER && - !check_sensor_sample(hb, md[i].reading_offset)) + if (type == OCC_SENSOR_TYPE_POWER && + !check_sensor_sample(hb, be32_to_cpu(md[i].reading_offset))) continue; - if (md[i].location == OCC_SENSOR_LOC_CORE) { + if (location == OCC_SENSOR_LOC_CORE) { int num = parse_entity(md[i].name, NULL); for_each_available_core_in_chip(c, chip->id) @@ -566,16 +576,16 @@ bool occ_sensors_init(void) pir = c->pir; } - type = get_sensor_type_string(md[i].type); - loc = get_sensor_loc_string(md[i].location); + type_name = get_sensor_type_string(type); + loc = get_sensor_loc_string(location); - add_sensor_node(loc, type, i, SENSOR_SAMPLE, &md[i], + add_sensor_node(loc, type_name, i, SENSOR_SAMPLE, &md[i], &phandles[phcount], &ptype[phcount], pir, occ_num, chip->id); phcount++; /* Add energy sensors */ - if (md[i].type == OCC_SENSOR_TYPE_POWER && + if (type == OCC_SENSOR_TYPE_POWER && md[i].structure_type == OCC_SENSOR_READING_FULL) { add_sensor_node(loc, "energy", i, SENSOR_ACCUMULATOR, &md[i], diff --git a/hw/occ.c b/hw/occ.c index 2c989a616..251eb239f 100644 --- a/hw/occ.c +++ b/hw/occ.c @@ -97,7 +97,7 @@ struct occ_pstate_table { u8 flags; u8 vdd; u8 vcs; - u32 freq_khz; + __be32 freq_khz; } pstates[MAX_PSTATES]; s8 core_max[MAX_P8_CORES]; u8 pad[100]; @@ -115,7 +115,7 @@ struct occ_pstate_table { u8 id; u8 flags; u16 reserved; - u32 freq_khz; + __be32 freq_khz; } pstates[MAX_PSTATES]; u8 core_max[MAX_P9_CORES]; u8 pad[56]; @@ -375,7 +375,7 @@ static bool wait_for_all_occ_init(void) chip->occ_functional = true; prlog(PR_DEBUG, "OCC: Chip %02x Data (%016llx) = %016llx\n", - chip->id, (uint64_t)occ_data, *(uint64_t *)occ_data); + chip->id, (uint64_t)occ_data, be64_to_cpu(*(__be64 *)occ_data)); } end_time = mftb(); prlog(PR_NOTICE, "OCC: All Chip Rdy after %lu ms\n", @@ -398,8 +398,8 @@ static bool wait_for_all_occ_init(void) * the list and break from the loop as this is the last valid * element in the pstate table. */ -static void parse_pstates_v2(struct occ_pstate_table *data, u32 *dt_id, - u32 *dt_freq, int nr_pstates, int pmax, int pmin) +static void parse_pstates_v2(struct occ_pstate_table *data, __be32 *dt_id, + __be32 *dt_freq, int nr_pstates, int pmax, int pmin) { int i, j; @@ -407,8 +407,8 @@ static void parse_pstates_v2(struct occ_pstate_table *data, u32 *dt_id, if (cmp_pstates(data->v2.pstates[i].id, pmax) > 0) continue; - dt_id[j] = data->v2.pstates[i].id; - dt_freq[j] = data->v2.pstates[i].freq_khz / 1000; + dt_id[j] = cpu_to_be32(data->v2.pstates[i].id); + dt_freq[j] = cpu_to_be32(be32_to_cpu(data->v2.pstates[i].freq_khz) / 1000); j++; if (data->v2.pstates[i].id == pmin) @@ -420,8 +420,8 @@ static void parse_pstates_v2(struct occ_pstate_table *data, u32 *dt_id, nr_pstates, j); } -static void parse_pstates_v9(struct occ_pstate_table *data, u32 *dt_id, - u32 *dt_freq, int nr_pstates, int pmax, int pmin) +static void parse_pstates_v9(struct occ_pstate_table *data, __be32 *dt_id, + __be32 *dt_freq, int nr_pstates, int pmax, int pmin) { int i, j; @@ -429,8 +429,8 @@ static void parse_pstates_v9(struct occ_pstate_table *data, u32 *dt_id, if (cmp_pstates(data->v9.pstates[i].id, pmax) > 0) continue; - dt_id[j] = data->v9.pstates[i].id; - dt_freq[j] = data->v9.pstates[i].freq_khz / 1000; + dt_id[j] = cpu_to_be32(data->v9.pstates[i].id); + dt_freq[j] = cpu_to_be32(be32_to_cpu(data->v9.pstates[i].freq_khz) / 1000); j++; if (data->v9.pstates[i].id == pmin) @@ -482,7 +482,7 @@ static bool add_cpu_pstate_properties(struct dt_node *power_mgt, uint64_t occ_data_area; struct occ_pstate_table *occ_data; /* Arrays for device tree */ - u32 *dt_id, *dt_freq; + __be32 *dt_id, *dt_freq; int pmax, pmin, pnom; u8 nr_pstates; bool ultra_turbo_supported; @@ -500,8 +500,8 @@ static bool add_cpu_pstate_properties(struct dt_node *power_mgt, occ_data_area = (uint64_t)occ_data; prlog(PR_DEBUG, "OCC: Data (%16llx) = %16llx %16llx\n", occ_data_area, - *(uint64_t *)occ_data_area, - *(uint64_t *)(occ_data_area + 8)); + be64_to_cpu(*(__be64 *)occ_data_area), + be64_to_cpu(*(__be64 *)(occ_data_area + 8))); if (!occ_data->valid) { /** @@ -629,9 +629,9 @@ static bool add_cpu_pstate_properties(struct dt_node *power_mgt, return false; } - dt_id = malloc(nr_pstates * sizeof(u32)); + dt_id = malloc(nr_pstates * sizeof(__be32)); assert(dt_id); - dt_freq = malloc(nr_pstates * sizeof(u32)); + dt_freq = malloc(nr_pstates * sizeof(__be32)); assert(dt_freq); switch (major) { @@ -649,9 +649,9 @@ static bool add_cpu_pstate_properties(struct dt_node *power_mgt, /* Add the device-tree entries */ dt_add_property(power_mgt, "ibm,pstate-ids", dt_id, - nr_pstates * sizeof(u32)); + nr_pstates * sizeof(__be32)); dt_add_property(power_mgt, "ibm,pstate-frequencies-mhz", dt_freq, - nr_pstates * sizeof(u32)); + nr_pstates * sizeof(__be32)); dt_add_property_cells(power_mgt, "ibm,pstate-min", pmin); dt_add_property_cells(power_mgt, "ibm,pstate-nominal", pnom); dt_add_property_cells(power_mgt, "ibm,pstate-max", pmax); @@ -667,7 +667,7 @@ static bool add_cpu_pstate_properties(struct dt_node *power_mgt, if (ultra_turbo_supported) { int pturbo, pultra_turbo; u8 nr_cores = get_available_nr_cores_in_chip(chip->id); - u32 *dt_cmax; + __be32 *dt_cmax; dt_cmax = malloc(nr_cores * sizeof(u32)); assert(dt_cmax); @@ -676,13 +676,13 @@ static bool add_cpu_pstate_properties(struct dt_node *power_mgt, pturbo = occ_data->v2.pstate_turbo; pultra_turbo = occ_data->v2.pstate_ultra_turbo; for (i = 0; i < nr_cores; i++) - dt_cmax[i] = occ_data->v2.core_max[i]; + dt_cmax[i] = cpu_to_be32(occ_data->v2.core_max[i]); break; case 0x9: pturbo = occ_data->v9.pstate_turbo; pultra_turbo = occ_data->v9.pstate_ultra_turbo; for (i = 0; i < nr_cores; i++) - dt_cmax[i] = occ_data->v9.core_max[i]; + dt_cmax[i] = cpu_to_be32(occ_data->v9.core_max[i]); break; default: return false; @@ -1600,7 +1600,7 @@ int occ_sensor_group_enable(u32 group_hndl, int token, bool enable) return opal_occ_command(&chips[i], token, &sensor_mask_data); } -void occ_add_sensor_groups(struct dt_node *sg, u32 *phandles, u32 *ptype, +void occ_add_sensor_groups(struct dt_node *sg, __be32 *phandles, u32 *ptype, int nr_phandles, int chipid) { struct group_info { @@ -1687,7 +1687,7 @@ void occ_add_sensor_groups(struct dt_node *sg, u32 *phandles, u32 *ptype, dt_add_property_cells(node, "ibm,chip-id", chipid); dt_add_property_cells(node, "reg", handle); if (groups[j].ops == OPAL_SENSOR_GROUP_ENABLE) { - u32 *_phandles; + __be32 *_phandles; int k, pcount = 0; _phandles = malloc(sizeof(u32) * nr_phandles); diff --git a/include/occ.h b/include/occ.h index ab45e9e46..967c3fd18 100644 --- a/include/occ.h +++ b/include/occ.h @@ -34,7 +34,7 @@ bool occ_get_gpu_presence(struct proc_chip *chip, int gpu_num); extern bool occ_sensors_init(void); extern int occ_sensor_read(u32 handle, __be64 *data); extern int occ_sensor_group_clear(u32 group_hndl, int token); -extern void occ_add_sensor_groups(struct dt_node *sg, u32 *phandles, +extern void occ_add_sensor_groups(struct dt_node *sg, __be32 *phandles, u32 *ptype, int nr_phandles, int chipid); extern int occ_sensor_group_enable(u32 group_hndl, int token, bool enable); @@ -186,15 +186,15 @@ enum sensor_struct_type { struct occ_sensor_data_header { u8 valid; u8 version; - u16 nr_sensors; + __be16 nr_sensors; u8 reading_version; u8 pad[3]; - u32 names_offset; + __be32 names_offset; u8 names_version; u8 name_length; u16 reserved; - u32 reading_ping_offset; - u32 reading_pong_offset; + __be32 reading_ping_offset; + __be32 reading_pong_offset; } __attribute__((__packed__)); /** @@ -220,13 +220,13 @@ struct occ_sensor_data_header { struct occ_sensor_name { char name[MAX_CHARS_SENSOR_NAME]; char units[MAX_CHARS_SENSOR_UNIT]; - u16 gsid; - u32 freq; - u32 scale_factor; - u16 type; - u16 location; + __be16 gsid; + __be32 freq; + __be32 scale_factor; + __be16 type; + __be16 location; u8 structure_type; - u32 reading_offset; + __be32 reading_offset; u8 sensor_data; u8 pad[8]; } __attribute__((__packed__)); @@ -258,18 +258,18 @@ struct occ_sensor_name { */ struct occ_sensor_record { u16 gsid; - u64 timestamp; - u16 sample; - u16 sample_min; - u16 sample_max; - u16 csm_min; - u16 csm_max; - u16 profiler_min; - u16 profiler_max; - u16 job_scheduler_min; - u16 job_scheduler_max; - u64 accumulator; - u32 update_tag; + __be64 timestamp; + __be16 sample; + __be16 sample_min; + __be16 sample_max; + __be16 csm_min; + __be16 csm_max; + __be16 profiler_min; + __be16 profiler_max; + __be16 job_scheduler_min; + __be16 job_scheduler_max; + __be64 accumulator; + __be32 update_tag; u8 pad[8]; } __attribute__((__packed__)); @@ -284,8 +284,8 @@ struct occ_sensor_record { */ struct occ_sensor_counter { u16 gsid; - u64 timestamp; - u64 accumulator; + __be64 timestamp; + __be64 accumulator; u8 sample; u8 pad[5]; } __attribute__((__packed__)); From patchwork Thu Nov 28 06:24:29 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Nicholas Piggin X-Patchwork-Id: 1201910 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 47Nnq16j2Yz9sPJ for ; Thu, 28 Nov 2019 17:31:41 +1100 (AEDT) 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="s8obeLEX"; 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 47Nnq15dkxzDr2d for ; Thu, 28 Nov 2019 17:31:41 +1100 (AEDT) X-Original-To: skiboot@lists.ozlabs.org Delivered-To: skiboot@lists.ozlabs.org Authentication-Results: lists.ozlabs.org; spf=pass (sender SPF authorized) smtp.mailfrom=gmail.com (client-ip=2607:f8b0:4864:20::1041; helo=mail-pj1-x1041.google.com; envelope-from=npiggin@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="s8obeLEX"; dkim-atps=neutral Received: from mail-pj1-x1041.google.com (mail-pj1-x1041.google.com [IPv6:2607:f8b0:4864:20::1041]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (2048 bits) server-digest SHA256) (No client certificate requested) by lists.ozlabs.org (Postfix) with ESMTPS id 47Nnhr4s0gzDqKZ for ; Thu, 28 Nov 2019 17:26:20 +1100 (AEDT) Received: by mail-pj1-x1041.google.com with SMTP id w8so11387882pjh.11 for ; Wed, 27 Nov 2019 22:26:20 -0800 (PST) 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 :mime-version:content-transfer-encoding; bh=4qsvAWxQ08PPClwaCFxZ+xx8g/KwW8Dd6NSXErvNgT4=; b=s8obeLEX7d47jYveZoz8Vfql3YNU+AD+CUsApa1bVqV4uGEL2k53nFRWB06rZkU3d7 FJW8duiKk4AhQYCw75T54BzPx79BC5zkgu3hN385ciGwOy12ceJR6mXkDInqZD//7zXl tB8rxFr7x2OLCr5m/U1mvjUC6rEDXRjwl2lOChZ8v8EXSENePSdyPPEgqXLncw/M24D9 Eu6PcU7qKXPbqfRRWIJtkefjqciT+u9aGIi1VTjG9xpxzS9nOiN1LfdbSTrCMsiY6eA6 qDGc0YR9ZwhxkxnioOcba5DZ20ow+pF51E2NSIqtgm2qPsjIVILPWsEOJXv8EczlLEgM jmrg== 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:mime-version:content-transfer-encoding; bh=4qsvAWxQ08PPClwaCFxZ+xx8g/KwW8Dd6NSXErvNgT4=; b=hTt55UU+vHm29QW5oMAmahs22HA6tInnyV9ZJSjyx7p7optjA5dImEioSL0BR1osrc mSt9MG/p8APXPfw4zSjR9wocOzC+XDdj69f71bQ900e7NNGuKU/33zHtW8yLJFciQhqP EQCLNPpeR/xdNatoFefxld57pPUkQPGEORD6Y5iDmJZ1GU52uvqCHeAZH/rt9UQlHdOd /x1Msj19lsaj02D509qZenPAy8xV1f2/1vGTvKr9ljQKjaAftjZmX4+aSahNJn8Wb6+d 6495KslfkXGsnlByFY8E/u3Xnnii/yDD2Iiwa+OioPouL8Puc/OMbXmOj37ZOeNstEQV UsQw== X-Gm-Message-State: APjAAAX7meZsuDZ7Gb1ZgLBhDYkWxdh6MQeF2ezjRyKvXe6M5fOnvnqs K+XuRNdPzjB6cC5+ea8dMuOmfjpU5fM= X-Google-Smtp-Source: APXvYqwOZrh6i3LxjucxUjXx296dyg8iYoc1uksym/kVYYDNOCoJjaCAR5K8Ub81ZD5AHNyBHluwgg== X-Received: by 2002:a17:90a:330f:: with SMTP id m15mr10668326pjb.24.1574922376252; Wed, 27 Nov 2019 22:26:16 -0800 (PST) Received: from bobo.local0.net ([203.194.47.34]) by smtp.gmail.com with ESMTPSA id e5sm8463196pjv.29.2019.11.27.22.26.14 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 27 Nov 2019 22:26:15 -0800 (PST) From: Nicholas Piggin To: skiboot@lists.ozlabs.org Date: Thu, 28 Nov 2019 16:24:29 +1000 Message-Id: <20191128062442.20690-16-npiggin@gmail.com> X-Mailer: git-send-email 2.23.0 In-Reply-To: <20191128062442.20690-1-npiggin@gmail.com> References: <20191128062442.20690-1-npiggin@gmail.com> MIME-Version: 1.0 Subject: [Skiboot] [PATCH v8 15/28] memconsole: make endian-clean X-BeenThere: skiboot@lists.ozlabs.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: Mailing list for skiboot development List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: skiboot-bounces+incoming=patchwork.ozlabs.org@lists.ozlabs.org Sender: "Skiboot" Convert memconsole dt construction and in-memory tables to use explicit endian conversions. Signed-off-by: Nicholas Piggin --- core/console.c | 22 +++++++++++----------- include/console.h | 16 ++++++++-------- platforms/ibm-fsp/common.c | 4 ++-- platforms/ibm-fsp/hostservices.c | 12 ++++++------ 4 files changed, 27 insertions(+), 27 deletions(-) diff --git a/core/console.c b/core/console.c index ac88f0c71..030c1d918 100644 --- a/core/console.c +++ b/core/console.c @@ -30,11 +30,11 @@ static struct lock con_lock = LOCK_UNLOCKED; /* This is mapped via TCEs so we keep it alone in a page */ struct memcons memcons __section(".data.memcons") = { - .magic = MEMCONS_MAGIC, - .obuf_phys = INMEM_CON_START, - .ibuf_phys = INMEM_CON_START + INMEM_CON_OUT_LEN, - .obuf_size = INMEM_CON_OUT_LEN, - .ibuf_size = INMEM_CON_IN_LEN, + .magic = CPU_TO_BE64(MEMCONS_MAGIC), + .obuf_phys = CPU_TO_BE64(INMEM_CON_START), + .ibuf_phys = CPU_TO_BE64(INMEM_CON_START + INMEM_CON_OUT_LEN), + .obuf_size = CPU_TO_BE32(INMEM_CON_OUT_LEN), + .ibuf_size = CPU_TO_BE32(INMEM_CON_IN_LEN), }; static bool dummy_console_enabled(void) @@ -197,7 +197,7 @@ static void inmem_write(char c) if (con_wrapped) opos |= MEMCONS_OUT_POS_WRAP; lwsync(); - memcons.out_pos = opos; + memcons.out_pos = cpu_to_be32(opos); /* If head reaches tail, push tail around & drop chars */ if (con_in == con_out) @@ -207,12 +207,12 @@ static void inmem_write(char c) static size_t inmem_read(char *buf, size_t req) { size_t read = 0; - char *ibuf = (char *)memcons.ibuf_phys; + char *ibuf = (char *)be64_to_cpu(memcons.ibuf_phys); - while (req && memcons.in_prod != memcons.in_cons) { - *(buf++) = ibuf[memcons.in_cons]; + while (req && be32_to_cpu(memcons.in_prod) != be32_to_cpu(memcons.in_cons)) { + *(buf++) = ibuf[be32_to_cpu(memcons.in_cons)]; lwsync(); - memcons.in_cons = (memcons.in_cons + 1) % INMEM_CON_IN_LEN; + memcons.in_cons = cpu_to_be32((be32_to_cpu(memcons.in_cons) + 1) % INMEM_CON_IN_LEN); req--; read++; } @@ -428,7 +428,7 @@ void dummy_console_add_nodes(void) { struct dt_property *p; - add_opal_console_node(0, "raw", memcons.obuf_size); + add_opal_console_node(0, "raw", be32_to_cpu(memcons.obuf_size)); /* Mambo might have left a crap one, clear it */ p = __dt_find_property(dt_chosen, "linux,stdout-path"); diff --git a/include/console.h b/include/console.h index 230b825b0..61448e28e 100644 --- a/include/console.h +++ b/include/console.h @@ -14,17 +14,17 @@ * (This is v3 of the format, the previous one sucked) */ struct memcons { - uint64_t magic; + __be64 magic; #define MEMCONS_MAGIC 0x6630696567726173LL - uint64_t obuf_phys; - uint64_t ibuf_phys; - uint32_t obuf_size; - uint32_t ibuf_size; - uint32_t out_pos; + __be64 obuf_phys; + __be64 ibuf_phys; + __be32 obuf_size; + __be32 ibuf_size; + __be32 out_pos; #define MEMCONS_OUT_POS_WRAP 0x80000000u #define MEMCONS_OUT_POS_MASK 0x00ffffffu - uint32_t in_prod; - uint32_t in_cons; + __be32 in_prod; + __be32 in_cons; }; extern struct memcons memcons; diff --git a/platforms/ibm-fsp/common.c b/platforms/ibm-fsp/common.c index 1ad221053..48b9fd884 100644 --- a/platforms/ibm-fsp/common.c +++ b/platforms/ibm-fsp/common.c @@ -25,9 +25,9 @@ static void map_debug_areas(void) fsp_tce_map(PSI_DMA_LOG_BUF, (void*)INMEM_CON_START, INMEM_CON_LEN); debug_descriptor.memcons_tce = PSI_DMA_MEMCONS; - t = memcons.obuf_phys - INMEM_CON_START + PSI_DMA_LOG_BUF; + t = be64_to_cpu(memcons.obuf_phys) - INMEM_CON_START + PSI_DMA_LOG_BUF; debug_descriptor.memcons_obuf_tce = t; - t = memcons.ibuf_phys - INMEM_CON_START + PSI_DMA_LOG_BUF; + t = be64_to_cpu(memcons.ibuf_phys) - INMEM_CON_START + PSI_DMA_LOG_BUF; debug_descriptor.memcons_ibuf_tce = t; t = PSI_DMA_TRACE_BASE; diff --git a/platforms/ibm-fsp/hostservices.c b/platforms/ibm-fsp/hostservices.c index 19a87e4cb..ab4c90016 100644 --- a/platforms/ibm-fsp/hostservices.c +++ b/platforms/ibm-fsp/hostservices.c @@ -178,11 +178,11 @@ static bool hbrt_con_wrapped; #define HBRT_CON_OUT_LEN (HBRT_CON_LEN - HBRT_CON_IN_LEN) static struct memcons hbrt_memcons __section(".data.memcons") = { - .magic = MEMCONS_MAGIC, - .obuf_phys = HBRT_CON_START, - .ibuf_phys = HBRT_CON_START + HBRT_CON_OUT_LEN, - .obuf_size = HBRT_CON_OUT_LEN, - .ibuf_size = HBRT_CON_IN_LEN, + .magic = CPU_TO_BE64(MEMCONS_MAGIC), + .obuf_phys = CPU_TO_BE64(HBRT_CON_START), + .ibuf_phys = CPU_TO_BE64(HBRT_CON_START + HBRT_CON_OUT_LEN), + .obuf_size = CPU_TO_BE32(HBRT_CON_OUT_LEN), + .ibuf_size = CPU_TO_BE32(HBRT_CON_IN_LEN), }; static void hservice_putc(char c) @@ -206,7 +206,7 @@ static void hservice_putc(char c) if (hbrt_con_wrapped) opos |= MEMCONS_OUT_POS_WRAP; lwsync(); - hbrt_memcons.out_pos = opos; + hbrt_memcons.out_pos = cpu_to_be32(opos); } static void hservice_puts(const char *str) From patchwork Thu Nov 28 06:24:30 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Nicholas Piggin X-Patchwork-Id: 1201911 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 47NnqN0nHsz9s7T for ; Thu, 28 Nov 2019 17:32:00 +1100 (AEDT) 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="oDT1/GY4"; 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 47NnqM5xr6zDr0V for ; Thu, 28 Nov 2019 17:31:59 +1100 (AEDT) X-Original-To: skiboot@lists.ozlabs.org Delivered-To: skiboot@lists.ozlabs.org Authentication-Results: lists.ozlabs.org; spf=pass (sender SPF authorized) smtp.mailfrom=gmail.com (client-ip=2607:f8b0:4864:20::643; helo=mail-pl1-x643.google.com; envelope-from=npiggin@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="oDT1/GY4"; dkim-atps=neutral Received: from mail-pl1-x643.google.com (mail-pl1-x643.google.com [IPv6:2607:f8b0:4864:20::643]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (2048 bits) server-digest SHA256) (No client certificate requested) by lists.ozlabs.org (Postfix) with ESMTPS id 47Nnhs0ppBzDqM2 for ; Thu, 28 Nov 2019 17:26:21 +1100 (AEDT) Received: by mail-pl1-x643.google.com with SMTP id g6so2777813plp.7 for ; Wed, 27 Nov 2019 22:26:21 -0800 (PST) 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 :mime-version:content-transfer-encoding; bh=jLXzw/48+W+uprecFQbReM9HUd/uhyWydF7p1MP/DII=; b=oDT1/GY45sGdUy+lVfcJyTUUUc9x4pTMiNm5z4WuDVQeYg6sBwrd3zwOJSntFMiIgY sByWFwSy23MAZobHbG6IiTI4ZfyWowbdfAbMJ34vFz9TzZ9v84KlJVuAGCLZkCOSHmQx MRGWGQpmOVtKPbF7DUDtlfE3D7HDLnPmbeWh6c0FpicDxVn2Xic3mMW+JrDfJVa7FzYo Ku1gD69lwg0BGYPVwTJ9C6iT9qEUI8DIT+LdtXOuLjMwwL60cKxBsUpW/vQ2ek3RxZ8R fKMEf4K8I2JF8F6LBe7cSnSYsU1Uz9UwmEbGmB6fCbN0wfj1kqVgWRyFOCJDFc5TK/OQ sydQ== 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:mime-version:content-transfer-encoding; bh=jLXzw/48+W+uprecFQbReM9HUd/uhyWydF7p1MP/DII=; b=tGEsoepiN0vQdoJmBaQ5p3FsNZlTwN7n43R+ODWJuVEDBtmCAwCpbinbvntRfzKBR8 JxqaNrU9I2sAHRPf7cPBzJ9JcZ9wr2t04W9LJEIkFgFJSbZZrm2HBtSH3Xu+SVVGUgNq raSx/5NKUkCl8VJIQHK1fzVemDPy4/RF7ldZys1QuT1aT5Wi+7mBREupfFfALg2dcsog XzlsCrcaXV/iBArOgbXnLosoWdbqBYkIk07fQGiACyNFsYGCMvno9qzxKxeeIZXbkflR 3YCcjWUQVy6bCtG3U8iZfjtoiJ0sQZJ2Y02w6bsC8pV78JRSwAR+c+t3iJ3WYLDH4j8z vILw== X-Gm-Message-State: APjAAAWVs9Q0ua2LIJVVYJdFsvHh1/GaJhj7KCt7bfU3/ivBNo65+i6/ 3FzlKDjrtF2O6irZyXaf3tPuXZPs2mw= X-Google-Smtp-Source: APXvYqzPh+DS+vWPHUmfbC7+Ey2/Mr6GAH4GZ3VFrbkKh/a7mug1RgMUvLV3qiLGWJWAxGp2fKZK8w== X-Received: by 2002:a17:90a:8903:: with SMTP id u3mr10825869pjn.137.1574922378590; Wed, 27 Nov 2019 22:26:18 -0800 (PST) Received: from bobo.local0.net ([203.194.47.34]) by smtp.gmail.com with ESMTPSA id e5sm8463196pjv.29.2019.11.27.22.26.16 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 27 Nov 2019 22:26:18 -0800 (PST) From: Nicholas Piggin To: skiboot@lists.ozlabs.org Date: Thu, 28 Nov 2019 16:24:30 +1000 Message-Id: <20191128062442.20690-17-npiggin@gmail.com> X-Mailer: git-send-email 2.23.0 In-Reply-To: <20191128062442.20690-1-npiggin@gmail.com> References: <20191128062442.20690-1-npiggin@gmail.com> MIME-Version: 1.0 Subject: [Skiboot] [PATCH v8 16/28] debug descriptor: make endian-clean X-BeenThere: skiboot@lists.ozlabs.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: Mailing list for skiboot development List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: skiboot-bounces+incoming=patchwork.ozlabs.org@lists.ozlabs.org Sender: "Skiboot" Signed-off-by: Nicholas Piggin --- core/init.c | 9 +++++++-- core/trace.c | 22 +++++++++++----------- include/debug_descriptor.h | 26 +++++++++++++------------- platforms/ibm-fsp/common.c | 19 ++++++++++--------- 4 files changed, 41 insertions(+), 35 deletions(-) diff --git a/core/init.c b/core/init.c index d90695c16..b7bf2e50c 100644 --- a/core/init.c +++ b/core/init.c @@ -72,9 +72,9 @@ void skiboot_gcov_done(void); struct debug_descriptor debug_descriptor = { .eye_catcher = "OPALdbug", - .version = DEBUG_DESC_VERSION, + .version = CPU_TO_BE32(DEBUG_DESC_VERSION), .state_flags = 0, - .memcons_phys = (uint64_t)&memcons, + .memcons_phys = 0, /* cpu_to_be64(&memcons) can't init constant */ .trace_mask = 0, /* All traces disabled by default */ /* console log level: * high 4 bits in memory, low 4 bits driver (e.g. uart). */ @@ -1008,6 +1008,11 @@ void __noreturn __nomcount main_cpu_entry(const void *fdt) */ pre_init_boot_cpu(); + /* + * Point to our mem console + */ + debug_descriptor.memcons_phys = cpu_to_be64((uint64_t)&memcons); + /* * Before first printk, ensure console buffer is clear or * reading tools might think it has wrapped diff --git a/core/trace.c b/core/trace.c index 5388972f3..5c71370fd 100644 --- a/core/trace.c +++ b/core/trace.c @@ -121,7 +121,7 @@ void trace_add(union trace *trace, u8 type, u16 len) #endif /* Skip traces not enabled in the debug descriptor */ if (trace->hdr.type < (8 * sizeof(debug_descriptor.trace_mask)) && - !((1ul << trace->hdr.type) & debug_descriptor.trace_mask)) + !((1ul << trace->hdr.type) & be64_to_cpu(debug_descriptor.trace_mask))) return; trace->hdr.timestamp = cpu_to_be64(mftb()); @@ -171,12 +171,12 @@ static void trace_add_dt_props(void) if (!exports) return; - prop = malloc(sizeof(u64) * 2 * debug_descriptor.num_traces); + prop = malloc(sizeof(u64) * 2 * be32_to_cpu(debug_descriptor.num_traces)); - for (i = 0; i < debug_descriptor.num_traces; i++) { - uint64_t addr = debug_descriptor.trace_phys[i]; - uint64_t size = debug_descriptor.trace_size[i]; - uint32_t pir = debug_descriptor.trace_pir[i]; + for (i = 0; i < be32_to_cpu(debug_descriptor.num_traces); i++) { + uint64_t addr = be64_to_cpu(debug_descriptor.trace_phys[i]); + uint64_t size = be32_to_cpu(debug_descriptor.trace_size[i]); + uint32_t pir = be16_to_cpu(debug_descriptor.trace_pir[i]); prop[i * 2] = cpu_to_fdt64(addr); prop[i * 2 + 1] = cpu_to_fdt64(size); @@ -199,18 +199,18 @@ static void trace_add_dt_props(void) static void trace_add_desc(struct trace_info *t, uint64_t size, uint16_t pir) { - unsigned int i = debug_descriptor.num_traces; + unsigned int i = be32_to_cpu(debug_descriptor.num_traces); if (i >= DEBUG_DESC_MAX_TRACES) { prerror("TRACE: Debug descriptor trace list full !\n"); return; } - debug_descriptor.num_traces++; - debug_descriptor.trace_phys[i] = (uint64_t)t; + debug_descriptor.num_traces = cpu_to_be32(i + 1); + debug_descriptor.trace_phys[i] = cpu_to_be64((uint64_t)t); debug_descriptor.trace_tce[i] = 0; /* populated later */ - debug_descriptor.trace_size[i] = size; - debug_descriptor.trace_pir[i] = pir; + debug_descriptor.trace_size[i] = cpu_to_be32(size); + debug_descriptor.trace_pir[i] = cpu_to_be16(pir); } /* Allocate trace buffers once we know memory topology */ diff --git a/include/debug_descriptor.h b/include/debug_descriptor.h index 774c3607d..cbe9293e3 100644 --- a/include/debug_descriptor.h +++ b/include/debug_descriptor.h @@ -11,27 +11,27 @@ struct debug_descriptor { u8 eye_catcher[8]; /* "OPALdbug" */ #define DEBUG_DESC_VERSION 1 - u32 version; + __be32 version; u8 console_log_levels; /* high 4 bits in memory, * low 4 bits driver (e.g. uart). */ u8 state_flags; /* various state flags - OPAL_BOOT_COMPLETE etc */ - u16 reserved2; - u32 reserved[2]; + __be16 reserved2; + __be32 reserved[2]; /* Memory console */ - u64 memcons_phys; - u32 memcons_tce; - u32 memcons_obuf_tce; - u32 memcons_ibuf_tce; + __be64 memcons_phys; + __be32 memcons_tce; + __be32 memcons_obuf_tce; + __be32 memcons_ibuf_tce; /* Traces */ - u64 trace_mask; - u32 num_traces; + __be64 trace_mask; + __be32 num_traces; #define DEBUG_DESC_MAX_TRACES 256 - u64 trace_phys[DEBUG_DESC_MAX_TRACES]; - u32 trace_size[DEBUG_DESC_MAX_TRACES]; - u32 trace_tce[DEBUG_DESC_MAX_TRACES]; - u16 trace_pir[DEBUG_DESC_MAX_TRACES]; + __be64 trace_phys[DEBUG_DESC_MAX_TRACES]; + __be32 trace_size[DEBUG_DESC_MAX_TRACES]; + __be32 trace_tce[DEBUG_DESC_MAX_TRACES]; + __be16 trace_pir[DEBUG_DESC_MAX_TRACES]; }; extern struct debug_descriptor debug_descriptor; diff --git a/platforms/ibm-fsp/common.c b/platforms/ibm-fsp/common.c index 48b9fd884..c288bff36 100644 --- a/platforms/ibm-fsp/common.c +++ b/platforms/ibm-fsp/common.c @@ -24,14 +24,14 @@ static void map_debug_areas(void) fsp_tce_map(PSI_DMA_MEMCONS, &memcons, 0x1000); fsp_tce_map(PSI_DMA_LOG_BUF, (void*)INMEM_CON_START, INMEM_CON_LEN); - debug_descriptor.memcons_tce = PSI_DMA_MEMCONS; + debug_descriptor.memcons_tce = cpu_to_be32(PSI_DMA_MEMCONS); t = be64_to_cpu(memcons.obuf_phys) - INMEM_CON_START + PSI_DMA_LOG_BUF; - debug_descriptor.memcons_obuf_tce = t; + debug_descriptor.memcons_obuf_tce = cpu_to_be32(t); t = be64_to_cpu(memcons.ibuf_phys) - INMEM_CON_START + PSI_DMA_LOG_BUF; - debug_descriptor.memcons_ibuf_tce = t; + debug_descriptor.memcons_ibuf_tce = cpu_to_be32(t); t = PSI_DMA_TRACE_BASE; - for (i = 0; i < debug_descriptor.num_traces; i++) { + for (i = 0; i < be32_to_cpu(debug_descriptor.num_traces); i++) { /* * Trace buffers are misaligned by 0x10 due to the lock * in the trace structure, and their size is also not @@ -46,15 +46,16 @@ static void map_debug_areas(void) * Note: Maybe we should map them read-only... */ uint64_t tstart, tend, toff, tsize; + uint64_t trace_phys = be64_to_cpu(debug_descriptor.trace_phys[i]); + uint32_t trace_size = be32_to_cpu(debug_descriptor.trace_size[i]); - tstart = ALIGN_DOWN(debug_descriptor.trace_phys[i], 0x1000); - tend = ALIGN_UP(debug_descriptor.trace_phys[i] + - debug_descriptor.trace_size[i], 0x1000); - toff = debug_descriptor.trace_phys[i] - tstart; + tstart = ALIGN_DOWN(trace_phys, 0x1000); + tend = ALIGN_UP(trace_phys + trace_size, 0x1000); + toff = trace_phys - tstart; tsize = tend - tstart; fsp_tce_map(t, (void *)tstart, tsize); - debug_descriptor.trace_tce[i] = t + toff; + debug_descriptor.trace_tce[i] = cpu_to_be32(t + toff); t += tsize; } } From patchwork Thu Nov 28 06:24:31 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Nicholas Piggin X-Patchwork-Id: 1201912 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 47Nnqf50WBz9sPJ for ; Thu, 28 Nov 2019 17:32:14 +1100 (AEDT) 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="isijqx5P"; 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 47Nnqf3SV6zDr1x for ; Thu, 28 Nov 2019 17:32:14 +1100 (AEDT) X-Original-To: skiboot@lists.ozlabs.org Delivered-To: skiboot@lists.ozlabs.org Authentication-Results: lists.ozlabs.org; spf=pass (sender SPF authorized) smtp.mailfrom=gmail.com (client-ip=2607:f8b0:4864:20::443; helo=mail-pf1-x443.google.com; envelope-from=npiggin@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="isijqx5P"; dkim-atps=neutral Received: from mail-pf1-x443.google.com (mail-pf1-x443.google.com [IPv6:2607:f8b0:4864:20::443]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (2048 bits) server-digest SHA256) (No client certificate requested) by lists.ozlabs.org (Postfix) with ESMTPS id 47Nnht6JhwzDq7j for ; Thu, 28 Nov 2019 17:26:22 +1100 (AEDT) Received: by mail-pf1-x443.google.com with SMTP id s18so4051491pfd.8 for ; Wed, 27 Nov 2019 22:26:22 -0800 (PST) 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 :mime-version:content-transfer-encoding; bh=J1b64ZrCVYYN5IQciwy3T4P+u5Vo5knQOQcgykjqJBs=; b=isijqx5PUUzMEhip7IeTkkxxgoH9ns1zylttH6ECcoaL84LzJzwM/5/t23vTkN8YWu b00WCi30WRuV7+0EOMbBA4DB61RGKaZTZMSS6+05I+RHTSKsajCn8l6B9/qYRxTC/8bH XsBUJTDlhzGelBUP+EdfDEvZxD/OATAam/SYwciW/wtA+mmix7oKVFq4pTjJV0k6tja4 Ms9KbqsTKbR8LPvHQOWZN0WeJzaXhQa0EevK/BPeRYnY7TCLnU6PC/5SavC+yEu1XnHr nNviZmgCyh5hbQ719zdZyvUUb4oF6Ri5whX4nUDP25R3HmDKCVsRd8WTns42XqDBPkB7 13EA== 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:mime-version:content-transfer-encoding; bh=J1b64ZrCVYYN5IQciwy3T4P+u5Vo5knQOQcgykjqJBs=; b=UBNJnuIvYUB80eS5RvEV5SrXN4Rz+AXbAV2GVgTmdtaXVYYCi26iuarp2vbAxFzQa+ xcI+EUwTE6esCQXS3HNS4g6JqpdjNqHzYD+CEbdeZpBDaVuilb1EvMJN77vnEZJCDHQg 5LFtup1/UjI7dV6PoA004N2U9Fo+N/wqlW2sfgpHYt8TyuNAEVppHJLvBz7Z3tp7O+2r QwzmvQooEXXKKpnIblpjhB4seajImukuu7eHvsX8H3tBtda5GY4Gd0BZAoNAI5nQ2iHf eb960ZuGWGcR+uY6AapPoodggOij2b7vtJuEWbSlwmP20MqH/R4cj1dMyWVjwaWifOd+ ttWg== X-Gm-Message-State: APjAAAXKOirdStapep/k67gopYjxqbngLIdBbQxjynmttiqSKWuxF4SF qExGfBA0EJi0DsU1U9zDhd16L19lugY= X-Google-Smtp-Source: APXvYqwsvZO/UyvkQ1TATSQmT5VHwDYPqabXLwMbfnzTZt9+zPmP7KXM3qt4N9Ow2ECd8rAYnHJN6w== X-Received: by 2002:a63:a357:: with SMTP id v23mr9559040pgn.223.1574922380927; Wed, 27 Nov 2019 22:26:20 -0800 (PST) Received: from bobo.local0.net ([203.194.47.34]) by smtp.gmail.com with ESMTPSA id e5sm8463196pjv.29.2019.11.27.22.26.18 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 27 Nov 2019 22:26:20 -0800 (PST) From: Nicholas Piggin To: skiboot@lists.ozlabs.org Date: Thu, 28 Nov 2019 16:24:31 +1000 Message-Id: <20191128062442.20690-18-npiggin@gmail.com> X-Mailer: git-send-email 2.23.0 In-Reply-To: <20191128062442.20690-1-npiggin@gmail.com> References: <20191128062442.20690-1-npiggin@gmail.com> MIME-Version: 1.0 Subject: [Skiboot] [PATCH v8 17/28] ipmi: endian conversion X-BeenThere: skiboot@lists.ozlabs.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: Mailing list for skiboot development List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: skiboot-bounces+incoming=patchwork.ozlabs.org@lists.ozlabs.org Sender: "Skiboot" Signed-off-by: Nicholas Piggin --- hw/ipmi/ipmi-sel.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/hw/ipmi/ipmi-sel.c b/hw/ipmi/ipmi-sel.c index 794aa3801..a774fb401 100644 --- a/hw/ipmi/ipmi-sel.c +++ b/hw/ipmi/ipmi-sel.c @@ -192,7 +192,7 @@ static void ipmi_init_esel_record(void) { memset(&sel_record, 0, sizeof(struct sel_record)); sel_record.record_type = SEL_REC_TYPE_AMI_ESEL; - sel_record.generator_id = SEL_GENERATOR_ID_AMI; + sel_record.generator_id = cpu_to_le16(SEL_GENERATOR_ID_AMI); sel_record.evm_ver = SEL_EVM_VER_2; sel_record.sensor_type = SENSOR_TYPE_SYS_EVENT; sel_record.sensor_number = From patchwork Thu Nov 28 06:24:32 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Nicholas Piggin X-Patchwork-Id: 1201913 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.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 47Nnr13xRxz9s7T for ; Thu, 28 Nov 2019 17:32:33 +1100 (AEDT) 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="E07ewBI0"; 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 47Nnr12Q5LzDr1S for ; Thu, 28 Nov 2019 17:32:33 +1100 (AEDT) X-Original-To: skiboot@lists.ozlabs.org Delivered-To: skiboot@lists.ozlabs.org Authentication-Results: lists.ozlabs.org; spf=pass (sender SPF authorized) smtp.mailfrom=gmail.com (client-ip=2607:f8b0:4864:20::442; helo=mail-pf1-x442.google.com; envelope-from=npiggin@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="E07ewBI0"; dkim-atps=neutral Received: from mail-pf1-x442.google.com (mail-pf1-x442.google.com [IPv6:2607:f8b0:4864:20::442]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (2048 bits) server-digest SHA256) (No client certificate requested) by lists.ozlabs.org (Postfix) with ESMTPS id 47Nnhx60bMzDqS4 for ; Thu, 28 Nov 2019 17:26:25 +1100 (AEDT) Received: by mail-pf1-x442.google.com with SMTP id d199so7974107pfd.11 for ; Wed, 27 Nov 2019 22:26:25 -0800 (PST) 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 :mime-version:content-transfer-encoding; bh=+uDHoa+iUfIc/4ifeukUPt9IIop+htGPot4N7QjYmSk=; b=E07ewBI0UTPBatcDsWOW3eNVOhmvNzPJ4TZ5LoPHnH5O/ymoX/1ZOOGIIL78g8SO8e R6ZbggLOKmiWUzkqCdslMoBvFH2GOlG9Qh0pnLvrGL7UE/I1Xze2g6DjdLHzSTeBp94B QRD6+o9IZ4iU1E1ObHXab7IotFL66Xnl5SYekzn/YfhsmWtxzhJc6spPxIXlIB3ldPu1 ffZ5udSj+L9CU394rvWvugaxPgBYu3lOIQcP+kziH4HCltlBghua99ijicACOliFxBYI yYPpKoCcpTf7bsSQLz7WpYZPVCr8UAbsdAvB+I/sNEiY6JEexguxcmbrHzmB/RHpkL9N si+A== 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:mime-version:content-transfer-encoding; bh=+uDHoa+iUfIc/4ifeukUPt9IIop+htGPot4N7QjYmSk=; b=MS8BPQPpqHN2dm96cV58rvqD0JbqsfMwMJeF1Xfdon2b/HluU0H+Kntr2R0cWBla4p NHSo+UBtCATk2eWVafNklBnYUq13+ZbZuGEwM1QF7SukZSu9jlmp8n4L8RkTZAQV/RCF +/RSkNesbRw0d4s9MqXJWLY7fhP6nQeNJX5Pz6WXr4PGaJXgVHuyQ5XM/NsdjdwEX0y4 kl3BZW79lQqpDZzuowIsZjSiT5/X4gzIm830lO+QGyzh/qE2QdBV3KFsVj388M2oH41W fxAVx6jAhE8JxNH5Or3zdumFvs1uLVnaN5jFIZPpNdx4JJJp6Imwr+NZpr/PucaUFDYx kjTw== X-Gm-Message-State: APjAAAVRnPQ4G4kSbStHJgbyxknwCcZRnymZtTqMsDbeKbtmcKEjuab8 EgqbuzTQLhivR3qjS0NW0jmYdsmhA98= X-Google-Smtp-Source: APXvYqwNAGk8gGjpgqOW9j4OBG/kL+6MXyGBZaFSZrRRSq/SAUhojWYUyleGUD1KH7fdTWvADPZ/bw== X-Received: by 2002:a65:5608:: with SMTP id l8mr9361087pgs.135.1574922383721; Wed, 27 Nov 2019 22:26:23 -0800 (PST) Received: from bobo.local0.net ([203.194.47.34]) by smtp.gmail.com with ESMTPSA id e5sm8463196pjv.29.2019.11.27.22.26.21 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 27 Nov 2019 22:26:23 -0800 (PST) From: Nicholas Piggin To: skiboot@lists.ozlabs.org Date: Thu, 28 Nov 2019 16:24:32 +1000 Message-Id: <20191128062442.20690-19-npiggin@gmail.com> X-Mailer: git-send-email 2.23.0 In-Reply-To: <20191128062442.20690-1-npiggin@gmail.com> References: <20191128062442.20690-1-npiggin@gmail.com> MIME-Version: 1.0 Subject: [Skiboot] [PATCH v8 18/28] sbe-p9: endian conversion X-BeenThere: skiboot@lists.ozlabs.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: Mailing list for skiboot development List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: skiboot-bounces+incoming=patchwork.ozlabs.org@lists.ozlabs.org Sender: "Skiboot" Reviewed-by: Vasant Hegde Signed-off-by: Nicholas Piggin --- hw/sbe-p9.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/hw/sbe-p9.c b/hw/sbe-p9.c index 1b5f29ec1..53f378e18 100644 --- a/hw/sbe-p9.c +++ b/hw/sbe-p9.c @@ -123,7 +123,7 @@ static u64 p9_sbe_rreg(u32 chip_id, u64 reg) return 0xffffffff; } - return be64_to_cpu(data); + return data; } static void p9_sbe_reg_dump(u32 chip_id) From patchwork Thu Nov 28 06:24:33 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Nicholas Piggin X-Patchwork-Id: 1201914 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.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 47NnrN26ztz9sPJ for ; Thu, 28 Nov 2019 17:32:52 +1100 (AEDT) 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="H5XBkmke"; 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 47NnrN0tDpzDr0x for ; Thu, 28 Nov 2019 17:32:52 +1100 (AEDT) X-Original-To: skiboot@lists.ozlabs.org Delivered-To: skiboot@lists.ozlabs.org Authentication-Results: lists.ozlabs.org; spf=pass (sender SPF authorized) smtp.mailfrom=gmail.com (client-ip=2607:f8b0:4864:20::630; helo=mail-pl1-x630.google.com; envelope-from=npiggin@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="H5XBkmke"; dkim-atps=neutral Received: from mail-pl1-x630.google.com (mail-pl1-x630.google.com [IPv6:2607:f8b0:4864:20::630]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (2048 bits) server-digest SHA256) (No client certificate requested) by lists.ozlabs.org (Postfix) with ESMTPS id 47Nnj52ZPdzDqFh for ; Thu, 28 Nov 2019 17:26:33 +1100 (AEDT) Received: by mail-pl1-x630.google.com with SMTP id o8so6796081pls.5 for ; Wed, 27 Nov 2019 22:26:33 -0800 (PST) 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 :mime-version:content-transfer-encoding; bh=/BD4yOcmm2IW4cV84COegpJ7nugaSMRe3Whj89Ev3+Q=; b=H5XBkmkey/bAa1oGMkErufw8RnebnilL/lHVfTcKPMVbDhPh9/NFTtSmlJgPi+vueb WRXD9rPBT+BR4cu/DAomR8ZrLv6rq7WO7Q9acMyCQ1V6bhtwadB0r1+G1fYCfcRlF170 stZvTX1HGrZ+b4Z45ZAzKc5CISHQPNLLdjynGzTp3QzqZz4J0hJhC2j7D48YVbjwsky1 d2IPTB6UzYaMAukOr51MVPyPwU67POCZULsVcsoRGOzJKZAp7TM8cnzxp0eA2XH66+OM Y8rUwpJTkY1JHvB6vM/SLfJ+XcSR6MOKXzsLGe3ZwK40ipP03ILx5uw/mNeAiXEf5nZO bfow== 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:mime-version:content-transfer-encoding; bh=/BD4yOcmm2IW4cV84COegpJ7nugaSMRe3Whj89Ev3+Q=; b=EIOYlC7tspeJ0UDBdv1tFmc3mebnB7NQu4fj2x3KaddTthUpW4AnYC9kR5JjF3+tz4 xgrzLkWLaShlt4mGrtJG18XoqG5IToA7dr+h5ViXe/YniU9rQLc1yfAwlpFEyjCqlqnI kevb4VhB4XPzV0cMreDKsf/NpDR82tA8JOQbF0hB15iGjZensYfTbxeT5fy/wQCHUDRs j37kYddOWgBpjEbKttVg6PFQCzV//40D5wCPVqiSGJ/AT+gimNKJQKMikOUVzbPEdu/u esPzjo2H2xYImIH1bic2VEQLQtSq0eoujYST8zEHUeO+s4TSoDLALQkuGgQg8raZvM15 90+Q== X-Gm-Message-State: APjAAAWzWW9qLBF+0OZpiK/bQvvX9z7VnVN7ef1U5Ocgr8Fdq9tVwKl2 5rCDCTMCzDISFPhMN2mQMINVDEOUv6M= X-Google-Smtp-Source: APXvYqwFtqJf4/Q5Ef4D9UpSBOMGoLyDz8g4PWUh/TT7gFGYVYfBeU1SKgo288d4yUu9LI/NWHxolg== X-Received: by 2002:a17:90a:e981:: with SMTP id v1mr10807893pjy.93.1574922388343; Wed, 27 Nov 2019 22:26:28 -0800 (PST) Received: from bobo.local0.net ([203.194.47.34]) by smtp.gmail.com with ESMTPSA id e5sm8463196pjv.29.2019.11.27.22.26.24 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 27 Nov 2019 22:26:27 -0800 (PST) From: Nicholas Piggin To: skiboot@lists.ozlabs.org Date: Thu, 28 Nov 2019 16:24:33 +1000 Message-Id: <20191128062442.20690-20-npiggin@gmail.com> X-Mailer: git-send-email 2.23.0 In-Reply-To: <20191128062442.20690-1-npiggin@gmail.com> References: <20191128062442.20690-1-npiggin@gmail.com> MIME-Version: 1.0 Subject: [Skiboot] [PATCH v8 19/28] fsp: endian conversions X-BeenThere: skiboot@lists.ozlabs.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: Mailing list for skiboot development List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: skiboot-bounces+incoming=patchwork.ozlabs.org@lists.ozlabs.org Sender: "Skiboot" Reviewed-by: Vasant Hegde Signed-off-by: Nicholas Piggin --- hw/fsp/fsp-attn.c | 4 +- hw/fsp/fsp-codeupdate.c | 48 +++++++------- hw/fsp/fsp-codeupdate.h | 86 ++++++++++++------------- hw/fsp/fsp-console.c | 75 +++++++++++----------- hw/fsp/fsp-diag.c | 2 +- hw/fsp/fsp-dpo.c | 4 +- hw/fsp/fsp-dump.c | 33 +++++----- hw/fsp/fsp-elog-read.c | 18 +++--- hw/fsp/fsp-elog-write.c | 11 ++-- hw/fsp/fsp-epow.c | 12 ++-- hw/fsp/fsp-ipmi.c | 8 +-- hw/fsp/fsp-leds.c | 107 ++++++++++++++++--------------- hw/fsp/fsp-mem-err.c | 6 +- hw/fsp/fsp-nvram.c | 14 ++-- hw/fsp/fsp-occ.c | 8 +-- hw/fsp/fsp-op-panel.c | 22 +++---- hw/fsp/fsp-rtc.c | 17 +++-- hw/fsp/fsp-sensor.c | 37 ++++++----- hw/fsp/fsp-surveillance.c | 1 + hw/fsp/fsp-sysdump.c | 2 +- hw/fsp/fsp-sysparam.c | 26 ++++---- hw/fsp/fsp.c | 42 ++++++------ hw/lpc.c | 2 +- include/fsp-attn.h | 2 +- include/fsp-elog.h | 4 +- include/fsp-leds.h | 24 +++---- include/fsp.h | 12 +++- include/spcn.h | 18 +++--- platforms/ibm-fsp/common.c | 2 +- platforms/ibm-fsp/firenze-pci.c | 89 +++++++++++++------------ platforms/ibm-fsp/hostservices.c | 4 +- platforms/ibm-fsp/lxvpd.c | 6 +- platforms/ibm-fsp/lxvpd.h | 44 ++++++++++++- 33 files changed, 431 insertions(+), 359 deletions(-) diff --git a/hw/fsp/fsp-attn.c b/hw/fsp/fsp-attn.c index 2c0260cde..e121d8ada 100644 --- a/hw/fsp/fsp-attn.c +++ b/hw/fsp/fsp-attn.c @@ -106,8 +106,8 @@ static void update_sp_attn_area(const char *msg) backtrace_print(bt_buf, &metadata, ti_attn->msg.bt_buf, &len, false); snprintf(ti_attn->msg.file_info, FILE_INFO_LEN, "%s", msg); - ti_attn->msg_len = VERSION_LEN + BT_FRAME_LEN + - strlen(ti_attn->msg.file_info); + ti_attn->msg_len = cpu_to_be32(VERSION_LEN + BT_FRAME_LEN + + strlen(ti_attn->msg.file_info)); } void __attribute__((noreturn)) ibm_fsp_terminate(const char *msg) diff --git a/hw/fsp/fsp-codeupdate.c b/hw/fsp/fsp-codeupdate.c index 67732a739..13aa357e1 100644 --- a/hw/fsp/fsp-codeupdate.c +++ b/hw/fsp/fsp-codeupdate.c @@ -148,9 +148,11 @@ static void got_code_update_policy(uint32_t param_id __unused, int err_len, if (err_len != 4) { log_simple_error(&e_info(OPAL_RC_CU_INIT), "CUPD: Error " "retrieving code update policy: %d\n", err_len); - } else + } else { + update_policy = be32_to_cpu((__be32)update_policy); prlog(PR_NOTICE, "CUPD: Code update policy from FSP: %d\n", update_policy); + } dec_in_flight_param(); } @@ -175,9 +177,11 @@ static void got_platform_hmc_managed(uint32_t param_id __unused, int err_len, if (err_len != 4) { log_simple_error(&e_info(OPAL_RC_CU_INIT), "CUPD: Error " "retrieving hmc managed status: %d\n", err_len); - } else + } else { + hmc_managed = be32_to_cpu((__be32)hmc_managed); prlog(PR_NOTICE, "CUPD: HMC managed status from FSP: %d\n", hmc_managed); + } dec_in_flight_param(); } @@ -198,9 +202,9 @@ static void get_platform_hmc_managed(void) static bool fw_ipl_side_update_notify(struct fsp_msg *msg) { - u32 param_id = msg->data.words[0]; - int dlen = msg->data.words[1] & 0xffff; - uint32_t state = msg->data.words[2]; + u32 param_id = fsp_msg_get_data_word(msg, 0); + int dlen = fsp_msg_get_data_word(msg, 1) & 0xffff; + uint32_t state = fsp_msg_get_data_word(msg, 2); if (param_id != SYS_PARAM_FW_IPL_SIDE) return false; @@ -322,15 +326,15 @@ static void fetch_lid_data_complete(struct fsp_msg *msg) int rc; status = (msg->resp->word1 >> 8) & 0xff; - flags = (msg->data.words[0] >> 16) & 0xff; - id = msg->data.words[0] & 0xffff; - lid_id = msg->data.words[1]; - offset = msg->resp->data.words[1]; - length = msg->resp->data.words[2]; + flags = (fsp_msg_get_data_word(msg, 0) >> 16) & 0xff; + id = fsp_msg_get_data_word(msg, 0) & 0xffff; + lid_id = fsp_msg_get_data_word(msg, 1); + offset = fsp_msg_get_data_word(msg->resp, 1); + length = fsp_msg_get_data_word(msg->resp, 2); prlog(PR_NOTICE, "CUPD: Marker LID id : size : status = " "0x%x : 0x%x : 0x%x\n", - msg->data.words[1], msg->resp->data.words[2], status); + fsp_msg_get_data_word(msg, 1), fsp_msg_get_data_word(msg->resp, 2), status); fsp_freemsg(msg); @@ -783,7 +787,7 @@ static int validate_candidate_image(uint64_t buffer, memcpy(validate_buf, (void *)buffer, VALIDATE_BUF_SIZE); header = (struct update_image_header *)validate_buf; - if (validate_magic_num(be32_to_cpu(header->magic)) != 0) { + if (validate_magic_num(be16_to_cpu(header->magic)) != 0) { *result = VALIDATE_INVALID_IMG; rc = OPAL_SUCCESS; goto out; @@ -936,14 +940,15 @@ static int validate_ipl_side(void) } static int64_t fsp_opal_validate_flash(uint64_t buffer, - uint32_t *size, uint32_t *result) + __be32 *size, __be32 *result) { int64_t rc = 0; int offset; + uint32_t r; lock(&flash_lock); - rc = validate_candidate_image(buffer, *size, result); + rc = validate_candidate_image(buffer, be32_to_cpu(*size), &r); /* Fill output buffer * * Format: @@ -952,16 +957,15 @@ static int64_t fsp_opal_validate_flash(uint64_t buffer, * MLcurrent-T-imagecurrent-P-image<0x0A> * MLnew-T-imagenew-P-image<0x0A> */ - if (!rc && (*result != VALIDATE_FLASH_AUTH && - *result != VALIDATE_INVALID_IMG)) { + if (!rc && (r != VALIDATE_FLASH_AUTH && r != VALIDATE_INVALID_IMG)) { /* Clear output buffer */ memset((void *)buffer, 0, VALIDATE_BUF_SIZE); - offset = validate_out_buf_mi_data((void *)buffer, 0, *result); - offset += validate_out_buf_ml_data((void *)buffer, - offset, *result); - *size = offset; + offset = validate_out_buf_mi_data((void *)buffer, 0, r); + offset += validate_out_buf_ml_data((void *)buffer, offset, r); + *size = cpu_to_be32(offset); } + *result = cpu_to_be32(r); unlock(&flash_lock); return rc; @@ -1125,7 +1129,7 @@ static int64_t validate_sglist(struct opal_sg_list *list) return OPAL_PARAMETER; /* All non-terminal entries size must be aligned */ - if (prev_entry && (prev_entry->length & 0xfff)) + if (prev_entry && (be64_to_cpu(prev_entry->length) & 0xfff)) return OPAL_PARAMETER; prev_entry = entry; @@ -1200,7 +1204,7 @@ static bool code_update_notify(uint32_t cmd_sub_mod, struct fsp_msg *msg) case FSP_CMD_FLASH_CACHE: cmd = FSP_CMD_FLASH_CACHE_RSP; prlog(PR_NOTICE, "CUPD: Update LID cache event [data = 0x%x]\n", - msg->data.words[0]); + fsp_msg_get_data_word(msg, 0)); break; case FSP_CMD_FLASH_OUTC: case FSP_CMD_FLASH_OUTR: diff --git a/hw/fsp/fsp-codeupdate.h b/hw/fsp/fsp-codeupdate.h index 237043c8e..0262c69ce 100644 --- a/hw/fsp/fsp-codeupdate.h +++ b/hw/fsp/fsp-codeupdate.h @@ -76,17 +76,17 @@ struct fw_image_vpd { struct master_lid_header { char key[3]; /* "MLH" */ uint8_t version; /* 0x02 */ - uint16_t header_size; - uint16_t entry_size; + __be16 header_size; + __be16 entry_size; uint8_t reserved[56]; }; /* LID index entry */ struct lid_index_entry { - uint32_t id; - uint32_t size; - uint32_t offset; - uint32_t crc; + __be32 id; + __be32 size; + __be32 offset; + __be32 crc; }; /* SP flags */ @@ -99,7 +99,7 @@ struct lid_index_entry { * sp_flag addr = header->data + header->ext_fw_id_size */ struct update_image_ga_date { - uint32_t sp_flag; + __be32 sp_flag; char sp_ga_date[8]; /* YYYYMMDD */ }; @@ -108,39 +108,39 @@ struct update_image_ga_date { /* Image header structure */ struct update_image_header { - uint16_t magic; - uint16_t version; - uint32_t package_size; - uint32_t crc; - uint16_t lid_index_offset; - uint16_t number_lids; - uint16_t package_flags; - uint16_t mi_keyword_size; + __be16 magic; + __be16 version; + __be32 package_size; + __be32 crc; + __be16 lid_index_offset; + __be16 number_lids; + __be16 package_flags; + __be16 mi_keyword_size; char mi_keyword_data[40]; - uint16_t ext_fw_id_size; + __be16 ext_fw_id_size; /* Rest of the image data including ext fw id, sp flags */ char data[]; }; /* FipS header */ struct fips_header { - uint16_t magic; - uint16_t version; - uint32_t lid_id; - uint32_t lid_date; /* YYYYMMDD */ - uint16_t lid_time; /* HHMM */ - uint16_t lid_class; - uint32_t crc; - uint32_t lid_size; /* Number of bytes below header */ - uint32_t header_size; + __be16 magic; + __be16 version; + __be32 lid_id; + __be32 lid_date; /* YYYYMMDD */ + __be16 lid_time; /* HHMM */ + __be16 lid_class; + __be32 crc; + __be32 lid_size; /* Number of bytes below header */ + __be32 header_size; uint8_t mtd_number; uint8_t valid; /* 1 = valid, 0 = invalid */ uint8_t reserved; uint8_t lid_info_size; char lid_info[64]; /* code level */ - uint32_t update_date; /* YYYYMMDD */ - uint16_t update_time; /* HHMM */ - uint16_t phylum_len; + __be32 update_date; /* YYYYMMDD */ + __be16 update_time; /* HHMM */ + __be16 phylum_len; uint8_t lid_phylum[]; }; @@ -165,30 +165,30 @@ struct fips_header { * not all ADF sections in common marker LID. */ struct com_marker_header { - uint32_t version; - uint32_t MI_offset; /* Offset to MI section */ - uint32_t iseries_offset; + __be32 version; + __be32 MI_offset; /* Offset to MI section */ + __be32 iseries_offset; }; /* MI Keyword section */ struct com_marker_mi_section { - uint32_t MI_size; + __be32 MI_size; char mi_keyword[40]; /* MI Keyword */ char lst_disrupt_fix_lvl[3]; char skip[21]; /* Skip not interested fields */ - uint32_t adf_offset; /* Offset to ADF section */ + __be32 adf_offset; /* Offset to ADF section */ }; /* Additional Data Fields */ struct com_marker_adf_sec { - uint32_t adf_cnt; /* ADF count */ + __be32 adf_cnt; /* ADF count */ char adf_data[]; /* ADF data */ }; /* ADF common header */ struct com_marker_adf_header { - uint32_t size; /* Section size */ - uint32_t name; /* Section name */ + __be32 size; /* Section size */ + __be32 name; /* Section name */ }; /* @@ -200,9 +200,9 @@ struct com_marker_adf_header { struct com_marker_adf_sp { struct com_marker_adf_header header; - uint32_t sp_name_offset; /* Offset from start of ADF */ - uint32_t sp_name_size; - uint32_t skip[4]; /* Skip rest of fields */ + __be32 sp_name_offset; /* Offset from start of ADF */ + __be32 sp_name_size; + __be32 skip[4]; /* Skip rest of fields */ }; /* @@ -213,10 +213,10 @@ struct com_marker_adf_sp #define ADF_NAME_FW_IP 0x46495050 /* FIPP */ struct com_marker_fw_ip { struct com_marker_adf_header header; - uint32_t sp_flag_offset; /* Offset from start of ADF */ - uint32_t sp_flag_size; - uint32_t sp_ga_offset; /* Offset from start of ADF*/ - uint32_t sp_ga_size; + __be32 sp_flag_offset; /* Offset from start of ADF */ + __be32 sp_flag_size; + __be32 sp_ga_offset; /* Offset from start of ADF*/ + __be32 sp_ga_size; }; #endif /* __CODEUPDATE_H */ diff --git a/hw/fsp/fsp-console.c b/hw/fsp/fsp-console.c index 624efb469..05feb71fc 100644 --- a/hw/fsp/fsp-console.c +++ b/hw/fsp/fsp-console.c @@ -22,16 +22,16 @@ DEFINE_LOG_ENTRY(OPAL_RC_CONSOLE_HANG, OPAL_PLATFORM_ERR_EVT, OPAL_CONSOLE, OPAL_PREDICTIVE_ERR_GENERAL, OPAL_NA); struct fsp_serbuf_hdr { - u16 partition_id; + __be16 partition_id; u8 session_id; u8 hmc_id; - u16 data_offset; - u16 last_valid; - u16 ovf_count; - u16 next_in; + __be16 data_offset; + __be16 last_valid; + __be16 ovf_count; + __be16 next_in; u8 flags; u8 reserved; - u16 next_out; + __be16 next_out; u8 data[]; }; #define SER_BUF_DATA_SIZE (0x10000 - sizeof(struct fsp_serbuf_hdr)) @@ -158,13 +158,13 @@ static size_t fsp_write_vserial(struct fsp_serial *fs, const char *buf, size_t len) { struct fsp_serbuf_hdr *sb = fs->out_buf; - u16 old_nin = sb->next_in; + u16 old_nin = be16_to_cpu(sb->next_in); u16 space, chunk; if (!fs->open) return 0; - space = (sb->next_out + SER_BUF_DATA_SIZE - old_nin - 1) + space = (be16_to_cpu(sb->next_out) + SER_BUF_DATA_SIZE - old_nin - 1) % SER_BUF_DATA_SIZE; if (space < len) len = space; @@ -178,10 +178,10 @@ static size_t fsp_write_vserial(struct fsp_serial *fs, const char *buf, if (chunk < len) memcpy(&sb->data[0], buf + chunk, len - chunk); lwsync(); - sb->next_in = (old_nin + len) % SER_BUF_DATA_SIZE; + sb->next_in = cpu_to_be16((old_nin + len) % SER_BUF_DATA_SIZE); sync(); - if (sb->next_out == old_nin && fs->poke_msg) { + if (be16_to_cpu(sb->next_out) == old_nin && fs->poke_msg) { if (fs->poke_msg->state == fsp_msg_unused) { if (fsp_queue_msg(fs->poke_msg, fsp_pokemsg_reclaim)) prerror("FSPCON: poke msg queuing failed\n"); @@ -229,8 +229,8 @@ static void fsp_open_vserial(struct fsp_msg *msg) { struct fsp_msg *resp; - u16 part_id = msg->data.words[0] & 0xffff; - u16 sess_id = msg->data.words[1] & 0xffff; + u16 part_id = fsp_msg_get_data_word(msg, 0) & 0xffff; + u16 sess_id = fsp_msg_get_data_word(msg, 1) & 0xffff; u8 hmc_sess = msg->data.bytes[0]; u8 hmc_indx = msg->data.bytes[1]; u8 authority = msg->data.bytes[4]; @@ -285,8 +285,8 @@ static void fsp_open_vserial(struct fsp_msg *msg) } fs->poke_msg = fsp_mkmsg(FSP_CMD_VSERIAL_OUT, 2, - msg->data.words[0], - msg->data.words[1] & 0xffff); + fsp_msg_get_data_word(msg, 0), + fsp_msg_get_data_word(msg, 1) & 0xffff); if (fs->poke_msg == NULL) { prerror("FSPCON: Failed to allocate poke_msg\n"); unlock(&fsp_con_lock); @@ -296,13 +296,13 @@ static void fsp_open_vserial(struct fsp_msg *msg) fs->open = true; fs->poke_msg->user_data = fs; - fs->in_buf->partition_id = fs->out_buf->partition_id = part_id; + fs->in_buf->partition_id = fs->out_buf->partition_id = cpu_to_be16(part_id); fs->in_buf->session_id = fs->out_buf->session_id = sess_id; fs->in_buf->hmc_id = fs->out_buf->hmc_id = hmc_indx; fs->in_buf->data_offset = fs->out_buf->data_offset = - sizeof(struct fsp_serbuf_hdr); + cpu_to_be16(sizeof(struct fsp_serbuf_hdr)); fs->in_buf->last_valid = fs->out_buf->last_valid = - SER_BUF_DATA_SIZE - 1; + cpu_to_be16(SER_BUF_DATA_SIZE - 1); fs->in_buf->ovf_count = fs->out_buf->ovf_count = 0; fs->in_buf->next_in = fs->out_buf->next_in = 0; fs->in_buf->flags = fs->out_buf->flags = 0; @@ -313,8 +313,8 @@ static void fsp_open_vserial(struct fsp_msg *msg) unlock(&fsp_con_lock); already_open: - resp = fsp_mkmsg(FSP_RSP_OPEN_VSERIAL, 6, msg->data.words[0], - msg->data.words[1] & 0xffff, 0, tce_in, 0, tce_out); + resp = fsp_mkmsg(FSP_RSP_OPEN_VSERIAL, 6, fsp_msg_get_data_word(msg, 0), + fsp_msg_get_data_word(msg, 1) & 0xffff, 0, tce_in, 0, tce_out); if (!resp) { prerror("FSPCON: Failed to allocate open msg response\n"); return; @@ -347,8 +347,8 @@ static void fsp_open_vserial(struct fsp_msg *msg) static void fsp_close_vserial(struct fsp_msg *msg) { - u16 part_id = msg->data.words[0] & 0xffff; - u16 sess_id = msg->data.words[1] & 0xffff; + u16 part_id = fsp_msg_get_data_word(msg, 0) & 0xffff; + u16 sess_id = fsp_msg_get_data_word(msg, 1) & 0xffff; u8 hmc_sess = msg->data.bytes[0]; u8 hmc_indx = msg->data.bytes[1]; u8 authority = msg->data.bytes[4]; @@ -399,8 +399,8 @@ static void fsp_close_vserial(struct fsp_msg *msg) } unlock(&fsp_con_lock); skip_close: - resp = fsp_mkmsg(FSP_RSP_CLOSE_VSERIAL, 2, msg->data.words[0], - msg->data.words[1] & 0xffff); + resp = fsp_mkmsg(FSP_RSP_CLOSE_VSERIAL, 2, fsp_msg_get_data_word(msg, 0), + fsp_msg_get_data_word(msg, 1) & 0xffff); if (!resp) { prerror("FSPCON: Failed to allocate close msg response\n"); return; @@ -437,7 +437,7 @@ static bool fsp_con_msg_hmc(u32 cmd_sub_mod, struct fsp_msg *msg) prlog(PR_DEBUG, "FSPCON: Got HMC interface query\n"); got_intf_query = true; resp = fsp_mkmsg(FSP_RSP_HMC_INTF_QUERY, 1, - msg->data.words[0] & 0x00ffffff); + fsp_msg_get_data_word(msg, 0) & 0x00ffffff); if (!resp) { prerror("FSPCON: Failed to allocate hmc intf response\n"); return true; @@ -453,7 +453,7 @@ static bool fsp_con_msg_hmc(u32 cmd_sub_mod, struct fsp_msg *msg) static bool fsp_con_msg_vt(u32 cmd_sub_mod, struct fsp_msg *msg) { - u16 sess_id = msg->data.words[1] & 0xffff; + u16 sess_id = fsp_msg_get_data_word(msg, 1) & 0xffff; if (cmd_sub_mod == FSP_CMD_VSERIAL_IN && sess_id < MAX_SERIAL) { struct fsp_serial *fs = &fsp_serials[sess_id]; @@ -610,7 +610,8 @@ static int64_t fsp_console_write(int64_t term_number, __be64 *__length, #ifdef OPAL_DEBUG_CONSOLE_IO prlog(PR_TRACE, "OPAL: console write req=%ld written=%ld" " ni=%d no=%d\n", - requested, written, fs->out_buf->next_in, fs->out_buf->next_out); + requested, written, be16_to_cpu(fs->out_buf->next_in), + be16_to_cpu(fs->out_buf->next_out)); prlog(PR_TRACE, " %02x %02x %02x %02x " "%02x \'%c\' %02x \'%c\' %02x \'%c\'.%02x \'%c\'..\n", buffer[0], buffer[1], buffer[2], buffer[3], @@ -646,7 +647,8 @@ static int64_t fsp_console_write_buffer_space(int64_t term_number, return OPAL_CLOSED; } sb = fs->out_buf; - length = (sb->next_out + SER_BUF_DATA_SIZE - sb->next_in - 1) + length = (be16_to_cpu(sb->next_out) + SER_BUF_DATA_SIZE + - be16_to_cpu(sb->next_in) - 1) % SER_BUF_DATA_SIZE; unlock(&fsp_con_lock); @@ -712,9 +714,9 @@ static int64_t fsp_console_read(int64_t term_number, __be64 *__length, if (fs->waiting) fs->waiting = 0; sb = fs->in_buf; - old_nin = sb->next_in; + old_nin = be16_to_cpu(sb->next_in); lwsync(); - n = (old_nin + SER_BUF_DATA_SIZE - sb->next_out) + n = (old_nin + SER_BUF_DATA_SIZE - be16_to_cpu(sb->next_out)) % SER_BUF_DATA_SIZE; if (n > req) { pending = true; @@ -722,17 +724,17 @@ static int64_t fsp_console_read(int64_t term_number, __be64 *__length, } *__length = cpu_to_be64(n); - chunk = SER_BUF_DATA_SIZE - sb->next_out; + chunk = SER_BUF_DATA_SIZE - be16_to_cpu(sb->next_out); if (chunk > n) chunk = n; - memcpy(buffer, &sb->data[sb->next_out], chunk); + memcpy(buffer, &sb->data[be16_to_cpu(sb->next_out)], chunk); if (chunk < n) memcpy(buffer + chunk, &sb->data[0], n - chunk); - sb->next_out = (sb->next_out + n) % SER_BUF_DATA_SIZE; + sb->next_out = cpu_to_be16(((be16_to_cpu(sb->next_out)) + n) % SER_BUF_DATA_SIZE); #ifdef OPAL_DEBUG_CONSOLE_IO prlog(PR_TRACE, "OPAL: console read req=%d read=%d ni=%d no=%d\n", - req, n, sb->next_in, sb->next_out); + req, n, be16_to_cpu(sb->next_in), be16_to_cpu(sb->next_out)); prlog(PR_TRACE, " %02x %02x %02x %02x %02x %02x %02x %02x ...\n", buffer[0], buffer[1], buffer[2], buffer[3], buffer[4], buffer[5], buffer[6], buffer[7]); @@ -809,7 +811,8 @@ void fsp_console_poll(void *data __unused) if (debug < 5) { prlog(PR_DEBUG,"OPAL: %d still pending" " ni=%d no=%d\n", - i, sb->next_in, sb->next_out); + i, be16_to_cpu(sb->next_in), + be16_to_cpu(sb->next_out)); debug++; } #endif /* OPAL_DEBUG_CONSOLE_POLL */ @@ -918,8 +921,8 @@ static bool send_all_hvsi_close(void) /* Do we have room ? Wait a bit if not */ while(timeout--) { - space = (sb->next_out + SER_BUF_DATA_SIZE - - sb->next_in - 1) % SER_BUF_DATA_SIZE; + space = (be16_to_cpu(sb->next_out) + SER_BUF_DATA_SIZE - + be16_to_cpu(sb->next_in) - 1) % SER_BUF_DATA_SIZE; if (space >= 6) break; time_wait_ms(500); diff --git a/hw/fsp/fsp-diag.c b/hw/fsp/fsp-diag.c index 0ee8975a8..9d1a35017 100644 --- a/hw/fsp/fsp-diag.c +++ b/hw/fsp/fsp-diag.c @@ -29,7 +29,7 @@ static bool fsp_diag_msg(u32 cmd_sub_mod, struct fsp_msg *msg) } printf("BUG: High Level ACK timeout (FSP_MCLASS_DIAG) for 0x%x\n", - msg->data.words[0] & 0xffff0000); + fsp_msg_get_data_word(msg, 0) & 0xffff0000); return true; } diff --git a/hw/fsp/fsp-dpo.c b/hw/fsp/fsp-dpo.c index 0796d9ae9..8f0861ed4 100644 --- a/hw/fsp/fsp-dpo.c +++ b/hw/fsp/fsp-dpo.c @@ -28,14 +28,14 @@ static unsigned long fsp_dpo_init_tb; * of seconds remaining for a forced system shutdown. This will enable * the host to schedule for shutdown voluntarily before timeout occurs. */ -static int64_t fsp_opal_get_dpo_status(int64_t *dpo_timeout) +static int64_t fsp_opal_get_dpo_status(__be64 *dpo_timeout) { if (!fsp_dpo_pending) { *dpo_timeout = 0; return OPAL_WRONG_STATE; } - *dpo_timeout = DPO_TIMEOUT - tb_to_secs(mftb() - fsp_dpo_init_tb); + *dpo_timeout = cpu_to_be64(DPO_TIMEOUT - tb_to_secs(mftb() - fsp_dpo_init_tb)); return OPAL_SUCCESS; } diff --git a/hw/fsp/fsp-dump.c b/hw/fsp/fsp-dump.c index 37efa9d5b..bf72438ea 100644 --- a/hw/fsp/fsp-dump.c +++ b/hw/fsp/fsp-dump.c @@ -356,8 +356,8 @@ static int64_t fsp_opal_dump_init(uint8_t dump_type) /* * OPAL interface to send dump information to Linux. */ -static int64_t fsp_opal_dump_info2(uint32_t *dump_id, uint32_t *dump_size, - uint32_t *dump_type) +static int64_t fsp_opal_dump_info2(__be32 *dump_id, __be32 *dump_size, + __be32 *dump_type) { struct dump_record *record; int rc = OPAL_SUCCESS; @@ -373,18 +373,18 @@ static int64_t fsp_opal_dump_info2(uint32_t *dump_id, uint32_t *dump_size, rc = OPAL_INTERNAL_ERROR; goto out; } - *dump_id = record->id; - *dump_size = record->size; - *dump_type = record->type; + *dump_id = cpu_to_be32(record->id); + *dump_size = cpu_to_be32(record->size); + *dump_type = cpu_to_be32(record->type); out: unlock(&dump_lock); return rc; } -static int64_t fsp_opal_dump_info(uint32_t *dump_id, uint32_t *dump_size) +static int64_t fsp_opal_dump_info(__be32 *dump_id, __be32 *dump_size) { - uint32_t dump_type; + __be32 dump_type; return fsp_opal_dump_info2(dump_id, dump_size, &dump_type); } @@ -505,11 +505,11 @@ static void dump_read_complete(struct fsp_msg *msg) bool compl = false; status = (msg->resp->word1 >> 8) & 0xff; - flags = (msg->data.words[0] >> 16) & 0xff; - id = msg->data.words[0] & 0xffff; - dump_id = msg->data.words[1]; - offset = msg->resp->data.words[1]; - length = msg->resp->data.words[2]; + flags = (fsp_msg_get_data_word(msg, 0) >> 16) & 0xff; + id = fsp_msg_get_data_word(msg, 0) & 0xffff; + dump_id = fsp_msg_get_data_word(msg, 1); + offset = fsp_msg_get_data_word(msg->resp, 1); + length = fsp_msg_get_data_word(msg->resp, 2); fsp_freemsg(msg); @@ -654,9 +654,9 @@ static void dump_ack_complete(struct fsp_msg *msg) if (status) log_simple_error(&e_info(OPAL_RC_DUMP_ACK), "DUMP: ACK failed for ID: 0x%x\n", - msg->data.words[0]); + fsp_msg_get_data_word(msg, 0)); else - printf("DUMP: ACKed dump ID: 0x%x\n", msg->data.words[0]); + printf("DUMP: ACKed dump ID: 0x%x\n", fsp_msg_get_data_word(msg, 0)); fsp_freemsg(msg); } @@ -807,10 +807,11 @@ static bool fsp_sys_dump_notify(uint32_t cmd_sub_mod, struct fsp_msg *msg) return false; printf("DUMP: Platform dump available. ID = 0x%x [size: %d bytes]\n", - msg->data.words[0], msg->data.words[1]); + fsp_msg_get_data_word(msg, 0), fsp_msg_get_data_word(msg, 1)); add_dump_id_to_list(DUMP_TYPE_SYS, - msg->data.words[0], msg->data.words[1]); + fsp_msg_get_data_word(msg, 0), + fsp_msg_get_data_word(msg, 1)); return true; } diff --git a/hw/fsp/fsp-elog-read.c b/hw/fsp/fsp-elog-read.c index 5b373aa80..139429ee8 100644 --- a/hw/fsp/fsp-elog-read.c +++ b/hw/fsp/fsp-elog-read.c @@ -265,8 +265,8 @@ static void fsp_elog_queue_fetch(void) } /* OPAL interface for PowerNV to read log size and log ID from Sapphire. */ -static int64_t fsp_opal_elog_info(uint64_t *opal_elog_id, - uint64_t *opal_elog_size, uint64_t *elog_type) +static int64_t fsp_opal_elog_info(__be64 *opal_elog_id, + __be64 *opal_elog_size, __be64 *elog_type) { struct fsp_log_entry *log_data; @@ -298,15 +298,15 @@ static int64_t fsp_opal_elog_info(uint64_t *opal_elog_id, return OPAL_WRONG_STATE; } - *opal_elog_id = log_data->log_id; - *opal_elog_size = log_data->log_size; + *opal_elog_id = cpu_to_be64(log_data->log_id); + *opal_elog_size = cpu_to_be64(log_data->log_size); fsp_elog_set_head_state(ELOG_STATE_HOST_INFO); unlock(&elog_read_lock); return OPAL_SUCCESS; } /* OPAL interface for PowerNV to read log from Sapphire. */ -static int64_t fsp_opal_elog_read(uint64_t *buffer, uint64_t opal_elog_size, +static int64_t fsp_opal_elog_read(void *buffer, uint64_t opal_elog_size, uint64_t opal_elog_id) { int size = opal_elog_size; @@ -350,8 +350,8 @@ static int64_t fsp_opal_elog_read(uint64_t *buffer, uint64_t opal_elog_size, if (opal_elog_size > log_data->log_size) size = log_data->log_size; - memset((void *)buffer, 0, opal_elog_size); - memcpy((void *)buffer, elog_read_buffer, size); + memset(buffer, 0, opal_elog_size); + memcpy(buffer, elog_read_buffer, size); /* * Once log is read from linux move record from pending @@ -483,8 +483,8 @@ static bool fsp_elog_msg(uint32_t cmd_sub_mod, struct fsp_msg *msg) if (cmd_sub_mod != FSP_CMD_ERRLOG_NOTIFICATION) return false; - log_id = msg->data.words[0]; - log_size = msg->data.words[1]; + log_id = fsp_msg_get_data_word(msg, 0); + log_size = fsp_msg_get_data_word(msg, 1); prlog(PR_TRACE, "ELOG: Notified of log 0x%08x (size: %d)\n", log_id, log_size); diff --git a/hw/fsp/fsp-elog-write.c b/hw/fsp/fsp-elog-write.c index 6aa0c5909..1776c965d 100644 --- a/hw/fsp/fsp-elog-write.c +++ b/hw/fsp/fsp-elog-write.c @@ -122,7 +122,7 @@ static inline void fsp_elog_write_set_head_state(enum elog_head_state state) elog_write_to_host_head_state = state; } -bool opal_elog_info(uint64_t *opal_elog_id, uint64_t *opal_elog_size) +bool opal_elog_info(__be64 *opal_elog_id, __be64 *opal_elog_size) { struct errorlog *head; bool rc = false; @@ -143,8 +143,8 @@ bool opal_elog_info(uint64_t *opal_elog_id, uint64_t *opal_elog_size) __func__); fsp_elog_write_set_head_state(ELOG_STATE_NONE); } else { - *opal_elog_id = head->plid; - *opal_elog_size = head->log_size; + *opal_elog_id = cpu_to_be64(head->plid); + *opal_elog_size = cpu_to_be64(head->log_size); fsp_elog_write_set_head_state(ELOG_STATE_HOST_INFO); rc = true; } @@ -172,7 +172,7 @@ static void opal_commit_elog_in_host(void) unlock(&elog_write_to_host_lock); } -bool opal_elog_read(uint64_t *buffer, uint64_t opal_elog_size, +bool opal_elog_read(void *buffer, uint64_t opal_elog_size, uint64_t opal_elog_id) { struct errorlog *log_data; @@ -194,8 +194,7 @@ bool opal_elog_read(uint64_t *buffer, uint64_t opal_elog_size, return rc; } - memcpy((void *)buffer, elog_write_to_host_buffer, - opal_elog_size); + memcpy(buffer, elog_write_to_host_buffer, opal_elog_size); list_del(&log_data->link); list_add(&elog_write_to_host_processed, &log_data->link); fsp_elog_write_set_head_state(ELOG_STATE_NONE); diff --git a/hw/fsp/fsp-epow.c b/hw/fsp/fsp-epow.c index bac1d3df7..7c71b3e38 100644 --- a/hw/fsp/fsp-epow.c +++ b/hw/fsp/fsp-epow.c @@ -120,11 +120,11 @@ static void fsp_process_epow(struct fsp_msg *msg, int epow_type) * and then updates the length variable back to reflect the * number of EPOW sub classes it has updated the buffer with. */ -static int64_t fsp_opal_get_epow_status(int16_t *out_epow, - int16_t *length) +static int64_t fsp_opal_get_epow_status(__be16 *out_epow, __be16 *length) { int i; int n_epow_class; + int l = be16_to_cpu(*length); /* * There can be situations where the host and the Sapphire versions @@ -144,16 +144,16 @@ static int64_t fsp_opal_get_epow_status(int16_t *out_epow, * Sapphire sends out EPOW status for sub classes host knows about * and can interpret correctly. */ - if (*length >= OPAL_SYSEPOW_MAX) { + if (l >= OPAL_SYSEPOW_MAX) { n_epow_class = OPAL_SYSEPOW_MAX; - *length = OPAL_SYSEPOW_MAX; + l = OPAL_SYSEPOW_MAX; } else { - n_epow_class = *length; + n_epow_class = l; } /* Transfer EPOW Status */ for (i = 0; i < n_epow_class; i++) - out_epow[i] = epow_status[i]; + out_epow[i] = cpu_to_be16(epow_status[i]); return OPAL_SUCCESS; } diff --git a/hw/fsp/fsp-ipmi.c b/hw/fsp/fsp-ipmi.c index a04d9aa2c..fc4ed0964 100644 --- a/hw/fsp/fsp-ipmi.c +++ b/hw/fsp/fsp-ipmi.c @@ -81,7 +81,7 @@ static void fsp_ipmi_cmd_done(uint8_t cmd, uint8_t netfn, uint8_t cc) static void fsp_ipmi_req_complete(struct fsp_msg *msg) { uint8_t status = (msg->resp->word1 >> 8) & 0xff; - uint32_t length = msg->resp->data.words[0]; + uint32_t length = fsp_msg_get_data_word(msg->resp, 0); struct fsp_ipmi_msg *fsp_ipmi_msg = msg->user_data; struct ipmi_msg *ipmi_msg; @@ -275,8 +275,8 @@ static bool fsp_ipmi_send_response(uint32_t cmd) static bool fsp_ipmi_read_response(struct fsp_msg *msg) { uint8_t *resp_buf = fsp_ipmi.ipmi_resp_buf; - uint32_t status = msg->data.words[3]; - uint32_t length = msg->data.words[2]; + uint32_t status = fsp_msg_get_data_word(msg, 3); + uint32_t length = fsp_msg_get_data_word(msg, 2); struct ipmi_msg *ipmi_msg; uint8_t netfn, cmd, cc; @@ -284,7 +284,7 @@ static bool fsp_ipmi_read_response(struct fsp_msg *msg) ipmi_msg = &fsp_ipmi.cur_msg->ipmi_msg; /* Response TCE token */ - assert(msg->data.words[1] == PSI_DMA_PLAT_RESP_BUF); + assert(fsp_msg_get_data_word(msg, 1) == PSI_DMA_PLAT_RESP_BUF); if (status != FSP_STATUS_SUCCESS) { if(status == FSP_STATUS_DMA_ERROR) diff --git a/hw/fsp/fsp-leds.c b/hw/fsp/fsp-leds.c index 7d234a81c..c05e92bfa 100644 --- a/hw/fsp/fsp-leds.c +++ b/hw/fsp/fsp-leds.c @@ -306,7 +306,7 @@ static void fsp_get_sai_complete(struct fsp_msg *msg) prlog(PR_ERR, "Read real SAI cmd failed [rc = 0x%x].\n", rc); } else { /* Update SAI state */ lock(&sai_lock); - sai_data.state = msg->resp->data.words[0] & 0xff; + sai_data.state = fsp_msg_get_data_word(msg->resp, 0) & 0xff; unlock(&sai_lock); prlog(PR_TRACE, "SAI initial state = 0x%x\n", sai_data.state); @@ -344,25 +344,25 @@ static void fsp_get_sai(void) static bool sai_update_notification(struct fsp_msg *msg) { - uint32_t *state = &msg->data.words[2]; - uint32_t param_id = msg->data.words[0]; - int len = msg->data.words[1] & 0xffff; + uint32_t state = fsp_msg_get_data_word(msg, 2); + uint32_t param_id = fsp_msg_get_data_word(msg, 0); + int len = fsp_msg_get_data_word(msg, 1) & 0xffff; if (param_id != SYS_PARAM_REAL_SAI && param_id != SYS_PARAM_PLAT_SAI) return false; - if ( len != 4) + if (len != 4) return false; - if (*state != LED_STATE_ON && *state != LED_STATE_OFF) + if (state != LED_STATE_ON && state != LED_STATE_OFF) return false; /* Update SAI state */ lock(&sai_lock); - sai_data.state = *state; + sai_data.state = state; unlock(&sai_lock); - prlog(PR_TRACE, "SAI updated. New SAI state = 0x%x\n", *state); + prlog(PR_TRACE, "SAI updated. New SAI state = 0x%x\n", state); return true; } @@ -557,7 +557,7 @@ static int fsp_msg_set_led_state(struct led_set_cmd *spcn_cmd) */ spcn_cmd->ckpt_status = led->status; spcn_cmd->ckpt_excl_bit = led->excl_bit; - sled.state = led->status; + sled.state = cpu_to_be16(led->status); /* Update the exclussive LED bits */ if (is_enclosure_led(spcn_cmd->loc_code)) { @@ -579,24 +579,24 @@ static int fsp_msg_set_led_state(struct led_set_cmd *spcn_cmd) /* LED FAULT commad */ if (spcn_cmd->command == LED_COMMAND_FAULT) { if (spcn_cmd->state == LED_STATE_ON) - sled.state |= SPCN_LED_FAULT_MASK; + sled.state |= cpu_to_be16(SPCN_LED_FAULT_MASK); if (spcn_cmd->state == LED_STATE_OFF) - sled.state &= ~SPCN_LED_FAULT_MASK; + sled.state &= cpu_to_be16(~SPCN_LED_FAULT_MASK); } /* LED IDENTIFY command */ if (spcn_cmd->command == LED_COMMAND_IDENTIFY) { if (spcn_cmd->state == LED_STATE_ON) - sled.state |= SPCN_LED_IDENTIFY_MASK; + sled.state |= cpu_to_be16(SPCN_LED_IDENTIFY_MASK); if (spcn_cmd->state == LED_STATE_OFF) - sled.state &= ~SPCN_LED_IDENTIFY_MASK; + sled.state &= cpu_to_be16(~SPCN_LED_IDENTIFY_MASK); } /* Write into SPCN TCE buffer */ buf_write(buf, u8, sled.lc_len); /* Location code length */ memcpy(buf, sled.lc_code, sled.lc_len); /* Location code */ buf += sled.lc_len; - buf_write(buf, u16, sled.state); /* LED state */ + buf_write(buf, __be16, sled.state); /* LED state */ msg = fsp_mkmsg(FSP_CMD_SPCN_PASSTHRU, 4, SPCN_ADDR_MODE_CEC_NODE, cmd_hdr, 0, PSI_DMA_LED_BUF); @@ -610,7 +610,7 @@ static int fsp_msg_set_led_state(struct led_set_cmd *spcn_cmd) * Update the local lists based on the attempted SPCN command to * set/reset an individual led (CEC or ENCL). */ - update_led_list(spcn_cmd->loc_code, sled.state, led->excl_bit); + update_led_list(spcn_cmd->loc_code, be16_to_cpu(sled.state), led->excl_bit); msg->user_data = spcn_cmd; rc = fsp_queue_msg(msg, fsp_spcn_set_led_completion); @@ -773,20 +773,20 @@ static u32 fsp_push_data_to_tce(struct fsp_led_data *led, u8 *out_data, lcode.fld_sz = sizeof(lcode.loc_code); /* Rest of the structure */ - lcode.size = sizeof(lcode); + lcode.size = cpu_to_be16(sizeof(lcode)); lcode.status &= 0x0f; /* * Check for outbound buffer overflow. If there are still * more LEDs to be sent across to FSP, don't send, ignore. */ - if ((total_size + lcode.size) > PSI_DMA_LOC_COD_BUF_SZ) + if ((total_size + be16_to_cpu(lcode.size)) > PSI_DMA_LOC_COD_BUF_SZ) return 0; /* Copy over to the buffer */ memcpy(out_data, &lcode, sizeof(lcode)); - return lcode.size; + return be16_to_cpu(lcode.size); } /* @@ -902,7 +902,7 @@ static void fsp_ret_loc_code_list(u16 req_type, char *loc_code) static void fsp_get_led_list(struct fsp_msg *msg) { struct fsp_loc_code_req req; - u32 tce_token = msg->data.words[1]; + u32 tce_token = fsp_msg_get_data_word(msg, 1); void *buf; /* Parse inbound buffer */ @@ -927,9 +927,9 @@ static void fsp_get_led_list(struct fsp_msg *msg) memcpy(&req, buf, sizeof(req)); prlog(PR_TRACE, "Request for loc code list type 0x%04x LC=%s\n", - req.req_type, req.loc_code); + be16_to_cpu(req.req_type), req.loc_code); - fsp_ret_loc_code_list(req.req_type, req.loc_code); + fsp_ret_loc_code_list(be16_to_cpu(req.req_type), req.loc_code); } /* @@ -942,7 +942,7 @@ static void fsp_get_led_list(struct fsp_msg *msg) */ static void fsp_free_led_list_buf(struct fsp_msg *msg) { - u32 tce_token = msg->data.words[1]; + u32 tce_token = fsp_msg_get_data_word(msg, 1); u32 cmd = FSP_RSP_RET_LED_BUFFER; struct fsp_msg *resp; @@ -1037,7 +1037,7 @@ static void fsp_ret_led_state(char *loc_code) static void fsp_get_led_state(struct fsp_msg *msg) { struct fsp_get_ind_state_req req; - u32 tce_token = msg->data.words[1]; + u32 tce_token = fsp_msg_get_data_word(msg, 1); void *buf; /* Parse the inbound buffer */ @@ -1089,7 +1089,7 @@ static void fsp_set_led_state(struct fsp_msg *msg) { struct fsp_set_ind_state_req req; struct fsp_led_data *led, *next; - u32 tce_token = msg->data.words[1]; + u32 tce_token = fsp_msg_get_data_word(msg, 1); bool command, state; void *buf; int rc; @@ -1105,8 +1105,8 @@ static void fsp_set_led_state(struct fsp_msg *msg) prlog(PR_TRACE, "%s: tce=0x%08x buf=%p rq.sz=%d rq.typ=0x%04x" " rq.lc_len=%d rq.fld_sz=%d LC: %02x %02x %02x %02x....\n", - __func__, tce_token, buf, req.size, req.lc_len, req.fld_sz, - req.req_type, + __func__, tce_token, buf, be16_to_cpu(req.size), req.lc_len, req.fld_sz, + be16_to_cpu(req.req_type), req.loc_code[0], req.loc_code[1], req.loc_code[2], req.loc_code[3]); @@ -1127,7 +1127,7 @@ static void fsp_set_led_state(struct fsp_msg *msg) LED_STATE_ON : LED_STATE_OFF; /* Handle requests */ - switch (req.req_type) { + switch (be16_to_cpu(req.req_type)) { case SET_IND_ENCLOSURE: list_for_each_safe(&cec_ledq, led, next, link) { /* Only descendants of the same enclosure */ @@ -1259,12 +1259,11 @@ static struct fsp_client fsp_indicator_client = { }; -static int fsp_opal_get_sai(u64 *led_mask, u64 *led_value) +static int fsp_opal_get_sai(__be64 *led_mask, __be64 *led_value) { - *led_mask |= OPAL_SLOT_LED_STATE_ON << OPAL_SLOT_LED_TYPE_ATTN; + *led_mask |= cpu_to_be64(OPAL_SLOT_LED_STATE_ON << OPAL_SLOT_LED_TYPE_ATTN); if (sai_data.state & OPAL_SLOT_LED_STATE_ON) - *led_value |= - OPAL_SLOT_LED_STATE_ON << OPAL_SLOT_LED_TYPE_ATTN; + *led_value |= cpu_to_be64(OPAL_SLOT_LED_STATE_ON << OPAL_SLOT_LED_TYPE_ATTN); return OPAL_SUCCESS; } @@ -1307,8 +1306,8 @@ static int fsp_opal_set_sai(uint64_t async_token, char *loc_code, * number of LED type it understands and updates 'led_mask', 'led_value' * based on that maximum value of LED types. */ -static int64_t fsp_opal_leds_get_ind(char *loc_code, u64 *led_mask, - u64 *led_value, u64 *max_led_type) +static int64_t fsp_opal_leds_get_ind(char *loc_code, __be64 *led_mask, + __be64 *led_value, __be64 *max_led_type) { bool supported = true; int64_t max; @@ -1323,14 +1322,16 @@ static int64_t fsp_opal_leds_get_ind(char *loc_code, u64 *led_mask, if (led_support != LED_STATE_PRESENT) return OPAL_HARDWARE; + max = be64_to_cpu(*max_led_type); + /* Adjust max LED type */ - if (*max_led_type > OPAL_SLOT_LED_TYPE_MAX) { + if (max > OPAL_SLOT_LED_TYPE_MAX) { supported = false; - *max_led_type = OPAL_SLOT_LED_TYPE_MAX; + max = OPAL_SLOT_LED_TYPE_MAX; + *max_led_type = cpu_to_be64(max); } /* Invalid parameter */ - max = *max_led_type; if (max <= 0) return OPAL_PARAMETER; @@ -1350,20 +1351,18 @@ static int64_t fsp_opal_leds_get_ind(char *loc_code, u64 *led_mask, /* Identify LED */ --max; - *led_mask |= OPAL_SLOT_LED_STATE_ON << OPAL_SLOT_LED_TYPE_ID; + *led_mask |= cpu_to_be64(OPAL_SLOT_LED_STATE_ON << OPAL_SLOT_LED_TYPE_ID); if (led->status & SPCN_LED_IDENTIFY_MASK) - *led_value |= - OPAL_SLOT_LED_STATE_ON << OPAL_SLOT_LED_TYPE_ID; + *led_value |= cpu_to_be64(OPAL_SLOT_LED_STATE_ON << OPAL_SLOT_LED_TYPE_ID); /* Fault LED */ if (!max) return OPAL_SUCCESS; --max; - *led_mask |= OPAL_SLOT_LED_STATE_ON << OPAL_SLOT_LED_TYPE_FAULT; + *led_mask |= cpu_to_be64(OPAL_SLOT_LED_STATE_ON << OPAL_SLOT_LED_TYPE_FAULT); if (led->status & SPCN_LED_FAULT_MASK) - *led_value |= - OPAL_SLOT_LED_STATE_ON << OPAL_SLOT_LED_TYPE_FAULT; + *led_value |= cpu_to_be64(OPAL_SLOT_LED_STATE_ON << OPAL_SLOT_LED_TYPE_FAULT); /* OPAL doesn't support all the LED type requested by payload */ if (!supported) @@ -1399,7 +1398,7 @@ static int64_t fsp_opal_leds_get_ind(char *loc_code, u64 *led_mask, */ static int64_t fsp_opal_leds_set_ind(uint64_t async_token, char *loc_code, const u64 led_mask, - const u64 led_value, u64 *max_led_type) + const u64 led_value, __be64 *max_led_type) { bool supported = true; int command, state, rc = OPAL_SUCCESS; @@ -1414,13 +1413,15 @@ static int64_t fsp_opal_leds_set_ind(uint64_t async_token, if (led_support != LED_STATE_PRESENT) return OPAL_HARDWARE; + max = be64_to_cpu(*max_led_type); + /* Adjust max LED type */ - if (*max_led_type > OPAL_SLOT_LED_TYPE_MAX) { + if (max > OPAL_SLOT_LED_TYPE_MAX) { supported = false; - *max_led_type = OPAL_SLOT_LED_TYPE_MAX; + max = OPAL_SLOT_LED_TYPE_MAX; + *max_led_type = cpu_to_be64(max); } - max = *max_led_type; /* Invalid parameter */ if (max <= 0) return OPAL_PARAMETER; @@ -1621,13 +1622,15 @@ static void fsp_process_leds_data(u16 len) buf = led_buffer; while (len) { size_t lc_len; + __be16 tmp; /* Prepare */ led_data = zalloc(sizeof(struct fsp_led_data)); assert(led_data); /* Resource ID */ - buf_read(buf, u16, &led_data->rid); + buf_read(buf, __be16, &tmp); + led_data->rid = be16_to_cpu(tmp); len -= sizeof(led_data->rid); /* Location code length */ @@ -1651,11 +1654,13 @@ static void fsp_process_leds_data(u16 len) len -= led_data->lc_len; /* Parameters */ - buf_read(buf, u16, &led_data->parms); + buf_read(buf, __be16, &tmp); + led_data->parms = be16_to_cpu(tmp); len -= sizeof(led_data->parms); /* Status */ - buf_read(buf, u16, &led_data->status); + buf_read(buf, __be16, &tmp); + led_data->status = be16_to_cpu(tmp); len -= sizeof(led_data->status); /* @@ -1742,8 +1747,8 @@ static void fsp_read_leds_data_complete(struct fsp_msg *msg) int rc = 0; u32 msg_status = resp->word1 & 0xff00; - u32 led_status = (resp->data.words[1] >> 24) & 0xff; - u16 data_len = (u16)(resp->data.words[1] & 0xffff); + u32 led_status = (fsp_msg_get_data_word(resp, 1) >> 24) & 0xff; + u16 data_len = (u16)(fsp_msg_get_data_word(resp, 1) & 0xffff); if (msg_status != FSP_STATUS_SUCCESS) { log_simple_error(&e_info(OPAL_RC_LED_SUPPORT), diff --git a/hw/fsp/fsp-mem-err.c b/hw/fsp/fsp-mem-err.c index ffafb96b9..e923177b6 100644 --- a/hw/fsp/fsp-mem-err.c +++ b/hw/fsp/fsp-mem-err.c @@ -344,13 +344,13 @@ static bool fsp_mem_err_msg(u32 cmd_sub_mod, struct fsp_msg *msg) * correctable/Uncorrectable/scrub UE errors with real * address of 4K memory page in which the error occurred. */ - paddr_start = be64_to_cpu(*((__be64 *)&msg->data.words[0])); + paddr_start = be64_to_cpu(*((__be64 *)&msg->data.bytes[0])); printf("Got memory resilience error message for " "paddr=0x%016llux\n", paddr_start); return handle_memory_resilience(cmd_sub_mod, paddr_start); case FSP_CMD_MEM_DYN_DEALLOC: - paddr_start = be64_to_cpu(*((__be64 *)&msg->data.words[0])); - paddr_end = be64_to_cpu(*((__be64 *)&msg->data.words[2])); + paddr_start = be64_to_cpu(*((__be64 *)&msg->data.bytes[0])); + paddr_end = be64_to_cpu(*((__be64 *)&msg->data.bytes[8])); printf("Got dynamic memory deallocation message: " "paddr_start=0x%016llux, paddr_end=0x%016llux\n", paddr_start, paddr_end); diff --git a/hw/fsp/fsp-nvram.c b/hw/fsp/fsp-nvram.c index 159a956f0..f5c6d665e 100644 --- a/hw/fsp/fsp-nvram.c +++ b/hw/fsp/fsp-nvram.c @@ -45,9 +45,9 @@ #define NVRAM_BLKSIZE 0x1000 struct nvram_triplet { - uint64_t dma_addr; - uint32_t blk_offset; - uint32_t blk_count; + __be64 dma_addr; + __be32 blk_offset; + __be32 blk_count; } __packed; #define NVRAM_FLAG_CLEAR_WPEND 0x80000000 @@ -147,9 +147,9 @@ static void fsp_nvram_send_write(void) if (start > end || fsp_nvram_state != NVRAM_STATE_OPEN) return; count = (end - start) / NVRAM_BLKSIZE + 1; - fsp_nvram_triplet.dma_addr = PSI_DMA_NVRAM_BODY + start; - fsp_nvram_triplet.blk_offset = start / NVRAM_BLKSIZE; - fsp_nvram_triplet.blk_count = count; + fsp_nvram_triplet.dma_addr = cpu_to_be64(PSI_DMA_NVRAM_BODY + start); + fsp_nvram_triplet.blk_offset = cpu_to_be32(start / NVRAM_BLKSIZE); + fsp_nvram_triplet.blk_count = cpu_to_be32(count); fsp_nvram_msg = fsp_mkmsg(FSP_CMD_WRITE_VNVRAM, 6, 0, PSI_DMA_NVRAM_TRIPL, 1, NVRAM_FLAG_CLEAR_WPEND, 0, 0); @@ -269,7 +269,7 @@ static bool fsp_nvram_get_size(uint32_t *out_size) assert(msg); rc = fsp_sync_msg(msg, false); - size = msg->resp ? msg->resp->data.words[0] : 0; + size = msg->resp ? fsp_msg_get_data_word(msg->resp, 0) : 0; fsp_freemsg(msg); if (rc || size == 0) { log_simple_error(&e_info(OPAL_RC_NVRAM_SIZE), diff --git a/hw/fsp/fsp-occ.c b/hw/fsp/fsp-occ.c index 8164129e9..03ddc2c96 100644 --- a/hw/fsp/fsp-occ.c +++ b/hw/fsp/fsp-occ.c @@ -381,8 +381,8 @@ static bool fsp_occ_msg(u32 cmd_sub_mod, struct fsp_msg *msg) * be nice and respond to OCC. */ scope = msg->data.bytes[3]; - dbob_id = msg->data.words[1]; - seq_id = msg->data.words[2]; + dbob_id = fsp_msg_get_data_word(msg, 1); + seq_id = fsp_msg_get_data_word(msg, 2); prlog(PR_INFO, "OCC: Got OCC Load message, scope=0x%x" " dbob=0x%x seq=0x%x\n", scope, dbob_id, seq_id); occ_do_load(scope, dbob_id, seq_id); @@ -394,8 +394,8 @@ static bool fsp_occ_msg(u32 cmd_sub_mod, struct fsp_msg *msg) * to reply something sensible or the FSP will get upset */ scope = msg->data.bytes[3]; - dbob_id = msg->data.words[1]; - seq_id = msg->data.words[2]; + dbob_id = fsp_msg_get_data_word(msg, 1); + seq_id = fsp_msg_get_data_word(msg, 2); prlog(PR_INFO, "OCC: Got OCC Reset message, scope=0x%x" " dbob=0x%x seq=0x%x\n", scope, dbob_id, seq_id); occ_do_reset(scope, dbob_id, seq_id); diff --git a/hw/fsp/fsp-op-panel.c b/hw/fsp/fsp-op-panel.c index 320da241f..16e4e8481 100644 --- a/hw/fsp/fsp-op-panel.c +++ b/hw/fsp/fsp-op-panel.c @@ -119,16 +119,16 @@ struct op_src { uint8_t flags; uint8_t reserved; uint8_t hex_word_cnt; - uint16_t reserved2; - uint16_t total_size; - uint32_t word2; /* SRC format in low byte */ - uint32_t word3; - uint32_t word4; - uint32_t word5; - uint32_t word6; - uint32_t word7; - uint32_t word8; - uint32_t word9; + __be16 reserved2; + __be16 total_size; + __be32 word2; /* SRC format in low byte */ + __be32 word3; + __be32 word4; + __be32 word5; + __be32 word6; + __be32 word7; + __be32 word8; + __be32 word9; uint8_t ascii[OP_PANEL_NUM_LINES * OP_PANEL_LINE_LEN]; /* Word 11 */ } __packed __align(4); @@ -193,7 +193,7 @@ static int64_t __opal_write_oppanel(oppanel_line_t *lines, uint64_t num_lines, op_src.reserved = 0; op_src.hex_word_cnt = 1; /* header word only */ op_src.reserved2 = 0; - op_src.total_size = sizeof(op_src); + op_src.total_size = cpu_to_be16(sizeof(op_src)); op_src.word2 = 0; /* should be unneeded */ for (i = 0; i < num_lines; i++) { diff --git a/hw/fsp/fsp-rtc.c b/hw/fsp/fsp-rtc.c index e68836e66..4cec19cb7 100644 --- a/hw/fsp/fsp-rtc.c +++ b/hw/fsp/fsp-rtc.c @@ -81,8 +81,8 @@ static bool rtc_tod_cache_dirty = false; struct opal_tpo_data { uint64_t tpo_async_token; - uint32_t *year_month_day; - uint32_t *hour_min; + __be32 *year_month_day; + __be32 *hour_min; }; /* Timebase value when we last initiated a RTC read request */ @@ -125,10 +125,9 @@ static void fsp_tpo_req_complete(struct fsp_msg *read_resp) case FSP_STATUS_SUCCESS: /* Save the read TPO value in our cache */ if (attr->year_month_day) - *(attr->year_month_day) = - read_resp->resp->data.words[0]; + *attr->year_month_day = cpu_to_be32(fsp_msg_get_data_word(read_resp->resp, 0)); if (attr->hour_min) - *(attr->hour_min) = read_resp->resp->data.words[1]; + *attr->hour_min = cpu_to_be32(fsp_msg_get_data_word(read_resp->resp, 1)); rc = OPAL_SUCCESS; break; @@ -169,8 +168,8 @@ static void fsp_rtc_process_read(struct fsp_msg *read_resp) case FSP_STATUS_SUCCESS: /* Save the read RTC value in our cache */ rtc_tod_state = RTC_TOD_VALID; - datetime_to_tm(read_resp->data.words[0], - (u64) read_resp->data.words[1] << 32, &tm); + datetime_to_tm(fsp_msg_get_data_word(read_resp, 0), + (u64)fsp_msg_get_data_word(read_resp, 1) << 32, &tm); rtc_cache_update(&tm); prlog(PR_TRACE, "FSP-RTC Got time: %d-%d-%d %d:%d:%d\n", tm.tm_year, tm.tm_mon, tm.tm_mday, @@ -441,8 +440,8 @@ static int64_t fsp_opal_tpo_write(uint64_t async_token, uint32_t y_m_d, } /* Read Timed power on (TPO) from FSP */ -static int64_t fsp_opal_tpo_read(uint64_t async_token, uint32_t *y_m_d, - uint32_t *hr_min) +static int64_t fsp_opal_tpo_read(uint64_t async_token, __be32 *y_m_d, + __be32 *hr_min) { static struct opal_tpo_data *attr; struct fsp_msg *msg; diff --git a/hw/fsp/fsp-sensor.c b/hw/fsp/fsp-sensor.c index 74deac7a7..94db34404 100644 --- a/hw/fsp/fsp-sensor.c +++ b/hw/fsp/fsp-sensor.c @@ -191,7 +191,7 @@ static uint32_t sensor_power_process_data(uint16_t rid, prlog(PR_TRACE, "Power[%d]: %d mW\n", i, power->supplies[i].milliwatts); if (rid == normalize_power_rid(power->supplies[i].rid)) - return power->supplies[i].milliwatts / 1000; + return be32_to_cpu(power->supplies[i].milliwatts) / 1000; } return 0; @@ -206,7 +206,7 @@ static void fsp_sensor_process_data(struct opal_sensor_data *attr) { uint8_t *sensor_buf_ptr = (uint8_t *)sensor_buffer; uint32_t sensor_data = INVALID_DATA; - uint16_t sensor_mod_data[8]; + __be16 sensor_mod_data[8]; int count; for (count = 0; count < spcn_mod_data[attr->mod_index].entry_count; @@ -220,18 +220,18 @@ static void fsp_sensor_process_data(struct opal_sensor_data *attr) sensor_data = sensor_power_process_data(attr->rid, (struct sensor_power *) sensor_buf_ptr); break; - } else if (sensor_mod_data[0] == attr->frc && - sensor_mod_data[1] == attr->rid) { + } else if (be16_to_cpu(sensor_mod_data[0]) == attr->frc && + be16_to_cpu(sensor_mod_data[1]) == attr->rid) { switch (attr->spcn_attr) { case SENSOR_STATUS: sensor_data = - convert_status_to_fault(sensor_mod_data[3]); + convert_status_to_fault(be16_to_cpu(sensor_mod_data[3])); break; case SENSOR_THRS: - sensor_data = sensor_mod_data[6]; + sensor_data = be16_to_cpu(sensor_mod_data[6]); break; case SENSOR_DATA: - sensor_data = sensor_mod_data[2]; + sensor_data = be16_to_cpu(sensor_mod_data[2]); break; default: break; @@ -259,7 +259,7 @@ static int fsp_sensor_process_read(struct fsp_msg *resp_msg) switch (mbx_rsp_status) { case SP_RSP_STATUS_VALID_DATA: sensor_state = SENSOR_VALID_DATA; - size = resp_msg->data.words[1] & 0xffff; + size = fsp_msg_get_data_word(resp_msg, 1) & 0xffff; break; case SP_RSP_STATUS_INVALID_DATA: log_simple_error(&e_info(OPAL_RC_SENSOR_READ), @@ -307,7 +307,7 @@ static void fsp_sensor_read_complete(struct fsp_msg *msg) prlog(PR_INSANE, "%s()\n", __func__); - status = (msg->resp->data.words[1] >> 24) & 0xff; + status = (fsp_msg_get_data_word(msg->resp, 1) >> 24) & 0xff; size = fsp_sensor_process_read(msg->resp); fsp_freemsg(msg); @@ -575,8 +575,7 @@ static struct dt_node *sensor_get_node(struct dt_node *sensors, * Just use the resource class name and resource id. This * should be obvious enough for a node name. */ - snprintf(name, sizeof(name), "%s#%d-%s", frc_names[header->frc], - header->rid, attrname); + snprintf(name, sizeof(name), "%s#%d-%s", frc_names[be16_to_cpu(header->frc)], be16_to_cpu(header->rid), attrname); /* * The same resources are reported by the different PRS @@ -591,7 +590,7 @@ static struct dt_node *sensor_get_node(struct dt_node *sensors, node = dt_new(sensors, name); snprintf(name, sizeof(name), "ibm,opal-sensor-%s", - frc_names[header->frc]); + frc_names[be16_to_cpu(header->frc)]); dt_add_property_string(node, "compatible", name); } else { /** @@ -607,7 +606,7 @@ static struct dt_node *sensor_get_node(struct dt_node *sensors, } #define sensor_handler(header, attr_num) \ - sensor_make_handler(SENSOR_FSP, (header).frc, (header).rid, attr_num) + sensor_make_handler(SENSOR_FSP, be16_to_cpu((header).frc), be16_to_cpu((header).rid), attr_num) static int add_sensor_prs(struct dt_node *sensors, struct sensor_prs *prs) { @@ -654,7 +653,7 @@ static int add_sensor_data(struct dt_node *sensors, * Some resource, like fans, get their status attribute from * three different commands ... */ - if (data->header.frc == SENSOR_FRC_AMB_TEMP) { + if (be16_to_cpu(data->header.frc) == SENSOR_FRC_AMB_TEMP) { node = sensor_get_node(sensors, &data->header, "faulted"); if (!node) return -1; @@ -676,15 +675,15 @@ static int add_sensor_power(struct dt_node *sensors, struct sensor_power *power) for (i = 0; i < sensor_power_count(power); i++) { struct sensor_header header = { - SENSOR_FRC_POWER_SUPPLY, - normalize_power_rid(power->supplies[i].rid) + cpu_to_be16(SENSOR_FRC_POWER_SUPPLY), + cpu_to_be16(normalize_power_rid(power->supplies[i].rid)) }; node = sensor_get_node(sensors, &header, "data"); prlog(PR_TRACE, "SENSOR: Power[%d] : %d mW\n", power->supplies[i].rid, - power->supplies[i].milliwatts); + be32_to_cpu(power->supplies[i].milliwatts)); dt_add_property_cells(node, "sensor-id", sensor_handler(header, SENSOR_DATA)); @@ -714,7 +713,7 @@ static void add_sensor_ids(struct dt_node *sensors) struct sensor_header *header = (struct sensor_header *) sensor_buf_ptr; - if (!sensor_frc_is_valid(header->frc)) + if (!sensor_frc_is_valid(be16_to_cpu(header->frc))) goto out_sensor; switch (smod->mod) { @@ -820,7 +819,7 @@ void fsp_init_sensor(void) rc = fsp_sync_msg(&msg, false); if (rc >= 0) { - status = (resp.data.words[1] >> 24) & 0xff; + status = (fsp_msg_get_data_word(&resp, 1) >> 24) & 0xff; size = fsp_sensor_process_read(&resp); psi_dma_offset += size; spcn_mod_data[index].entry_count += (size / diff --git a/hw/fsp/fsp-surveillance.c b/hw/fsp/fsp-surveillance.c index d774bea1e..0b7cc21d0 100644 --- a/hw/fsp/fsp-surveillance.c +++ b/hw/fsp/fsp-surveillance.c @@ -145,6 +145,7 @@ static void fsp_surv_got_param(uint32_t param_id __unused, int err_len, return; } + surv_state_param = be32_to_cpu((__be32)surv_state_param); if (!(surv_state_param & 0x01)) { prlog(PR_NOTICE, "SURV: Status from FSP: disabled\n"); return; diff --git a/hw/fsp/fsp-sysdump.c b/hw/fsp/fsp-sysdump.c index fd915f402..f2777befe 100644 --- a/hw/fsp/fsp-sysdump.c +++ b/hw/fsp/fsp-sysdump.c @@ -231,7 +231,7 @@ static int __dump_region_add_entry(uint32_t id, uint64_t addr, uint32_t size) } /* Add entry to dump memory region table */ - dump_mem_region[cur_mdst_entry].data_region = (u8)cpu_to_be32(id); + dump_mem_region[cur_mdst_entry].data_region = (u8)id; dump_mem_region[cur_mdst_entry].addr = cpu_to_be64(addr); dump_mem_region[cur_mdst_entry].size = cpu_to_be32(size); diff --git a/hw/fsp/fsp-sysparam.c b/hw/fsp/fsp-sysparam.c index 0e1e8181f..788fd2380 100644 --- a/hw/fsp/fsp-sysparam.c +++ b/hw/fsp/fsp-sysparam.c @@ -69,18 +69,18 @@ static int fsp_sysparam_process(struct sysparam_req *r) if (r->msg.state != fsp_msg_done) { prerror("FSP: Request for sysparam 0x%x got FSP failure!\n", - r->msg.data.words[0]); + fsp_msg_get_data_word(&r->msg, 0)); stlen = -1; /* XXX Find saner error codes */ goto complete; } - param_id = r->resp.data.words[0]; - len = r->resp.data.words[1] & 0xffff; + param_id = fsp_msg_get_data_word(&r->resp, 0); + len = fsp_msg_get_data_word(&r->resp, 1) & 0xffff; /* Check params validity */ - if (param_id != r->msg.data.words[0]) { + if (param_id != fsp_msg_get_data_word(&r->msg, 0)) { prerror("FSP: Request for sysparam 0x%x got resp. for 0x%x!\n", - r->msg.data.words[0], param_id); + fsp_msg_get_data_word(&r->msg, 0), param_id); stlen = -2; /* XXX Sane error codes */ goto complete; } @@ -95,7 +95,7 @@ static int fsp_sysparam_process(struct sysparam_req *r) switch(fstat) { case 0x00: /* XXX Is that even possible ? */ case 0x11: /* Data in request */ - memcpy(r->ubuf, &r->resp.data.words[2], len); + memcpy(r->ubuf, &r->resp.data.bytes[8], len); /* fallthrough */ case 0x12: /* Data in TCE */ stlen = len; @@ -106,7 +106,7 @@ static int fsp_sysparam_process(struct sysparam_req *r) complete: /* Call completion if any */ if (comp) - comp(r->msg.data.words[0], stlen, cdata); + comp(fsp_msg_get_data_word(&r->msg, 0), stlen, cdata); free(r); @@ -207,15 +207,15 @@ static void fsp_opal_setparam_complete(struct fsp_msg *msg) if (msg->state != fsp_msg_done) { prerror("FSP: Request for set sysparam 0x%x got FSP failure!\n", - msg->data.words[0]); + fsp_msg_get_data_word(msg, 0)); rc = OPAL_INTERNAL_ERROR; goto out; } - param_id = msg->resp->data.words[0]; - if (param_id != msg->data.words[0]) { + param_id = fsp_msg_get_data_word(msg->resp, 0); + if (param_id != fsp_msg_get_data_word(msg, 0)) { prerror("FSP: Request for set sysparam 0x%x got resp. for 0x%x!" - "\n", msg->data.words[0], param_id); + "\n", fsp_msg_get_data_word(msg, 0), param_id); rc = OPAL_INTERNAL_ERROR; goto out; } @@ -397,7 +397,7 @@ static bool fsp_sysparam_msg(u32 cmd_sub_mod, struct fsp_msg *msg) case FSP_CMD_SP_SPARM_UPD_0: case FSP_CMD_SP_SPARM_UPD_1: printf("FSP: Got sysparam update, param ID 0x%x\n", - msg->data.words[0]); + fsp_msg_get_data_word(msg, 0)); sysparam_run_update_notifier(msg); @@ -422,7 +422,7 @@ static void add_opal_sysparam_node(void) { struct dt_node *sysparams; char *names, *s; - uint32_t *ids, *lens; + __be32 *ids, *lens; uint8_t *perms; unsigned int i, count, size = 0; diff --git a/hw/fsp/fsp.c b/hw/fsp/fsp.c index 2b2c5379a..1112fb74b 100644 --- a/hw/fsp/fsp.c +++ b/hw/fsp/fsp.c @@ -91,7 +91,7 @@ static enum ipl_state ipl_state = ipl_initial; static struct fsp *first_fsp; static struct fsp *active_fsp; static u16 fsp_curseq = 0x8000; -static u64 *fsp_tce_table; +static __be64 *fsp_tce_table; #define FSP_INBOUND_SIZE 0x00100000UL static void *fsp_inbound_buf = NULL; @@ -181,8 +181,8 @@ static void fsp_trace_msg(struct fsp_msg *msg, u8 dir __unused) size_t len = offsetof(struct trace_fsp_msg, data[msg->dlen]); fsp.fsp_msg.dlen = msg->dlen; - fsp.fsp_msg.word0 = msg->word0; - fsp.fsp_msg.word1 = msg->word1; + fsp.fsp_msg.word0 = cpu_to_be32(msg->word0); + fsp.fsp_msg.word1 = cpu_to_be32(msg->word1); fsp.fsp_msg.dir = dir; memcpy(fsp.fsp_msg.data, msg->data.bytes, msg->dlen); trace_add(&fsp, TRACE_FSP_MSG, len); @@ -634,12 +634,12 @@ static void fsp_trace_event(struct fsp *fsp, u32 evt, #ifdef FSP_TRACE_EVENT size_t len = sizeof(struct trace_fsp_event); - tfsp.fsp_evt.event = evt; - tfsp.fsp_evt.fsp_state = fsp->state; - tfsp.fsp_evt.data[0] = data0; - tfsp.fsp_evt.data[1] = data1; - tfsp.fsp_evt.data[2] = data2; - tfsp.fsp_evt.data[3] = data3; + tfsp.fsp_evt.event = cpu_to_be16(evt); + tfsp.fsp_evt.fsp_state = cpu_to_be16(fsp->state); + tfsp.fsp_evt.data[0] = cpu_to_be32(data0); + tfsp.fsp_evt.data[1] = cpu_to_be32(data1); + tfsp.fsp_evt.data[2] = cpu_to_be32(data2); + tfsp.fsp_evt.data[3] = cpu_to_be32(data3); trace_add(&tfsp, TRACE_FSP_EVENT, len); #endif /* FSP_TRACE_EVENT */ } @@ -931,7 +931,7 @@ static bool fsp_post_msg(struct fsp *fsp, struct fsp_msg *msg) fsp_wreg(fsp, reg, msg->word1); reg += 4; wlen = (msg->dlen + 3) >> 2; for (i = 0; i < wlen; i++) { - fsp_wreg(fsp, reg, msg->data.words[i]); + fsp_wreg(fsp, reg, fsp_msg_get_data_word(msg, i)); reg += 4; } @@ -994,7 +994,7 @@ static void __fsp_fillmsg(struct fsp_msg *msg, u32 cmd_sub_mod, msg->dlen = add_words << 2; for (i = 0; i < add_words; i++) - msg->data.words[i] = va_arg(list, unsigned int); + fsp_msg_set_data_word(msg, i, va_arg(list, unsigned int)); va_end(list); } @@ -1141,8 +1141,8 @@ static void fsp_complete_send(struct fsp *fsp) static void fsp_alloc_inbound(struct fsp_msg *msg) { - u16 func_id = msg->data.words[0] & 0xffff; - u32 len = msg->data.words[1]; + u16 func_id = fsp_msg_get_data_word(msg, 0) & 0xffff; + u32 len = fsp_msg_get_data_word(msg, 1); u32 tce_token = 0, act_len = 0; u8 rc = 0; void *buf; @@ -1294,12 +1294,12 @@ static bool fsp_local_command(u32 cmd_sub_mod, struct fsp_msg *msg) return true; case FSP_CMD_SP_RELOAD_COMP: if (msg->data.bytes[3] & PPC_BIT8(0)) { - fsp_fips_dump_notify(msg->data.words[1], - msg->data.words[2]); + fsp_fips_dump_notify(fsp_msg_get_data_word(msg, 1), + fsp_msg_get_data_word(msg, 2)); if (msg->data.bytes[3] & PPC_BIT8(1)) prlog(PR_DEBUG, " PLID is %x\n", - msg->data.words[3]); + fsp_msg_get_data_word(msg, 3)); } if (msg->data.bytes[3] & PPC_BIT8(2)) { prlog(PR_INFO, "FSP: SP Reset/Reload was NOT done\n"); @@ -1407,7 +1407,7 @@ static void __fsp_fill_incoming(struct fsp *fsp, struct fsp_msg *msg, wlen = (dlen + 3) >> 2; reg = FSP_MBX1_FDATA_AREA + 8; for (i = 0; i < wlen; i++) { - msg->data.words[i] = fsp_rreg(fsp, reg); + fsp_msg_set_data_word(msg, i, fsp_rreg(fsp, reg)); reg += 4; } @@ -1842,7 +1842,7 @@ static int fsp_init_mbox(struct fsp *fsp) /* We use a single fixed TCE table for all PSI interfaces */ static void fsp_init_tce_table(void) { - fsp_tce_table = (u64 *)PSI_TCE_TABLE_BASE; + fsp_tce_table = (__be64 *)PSI_TCE_TABLE_BASE; memset(fsp_tce_table, 0, PSI_TCE_TABLE_SIZE); } @@ -1859,7 +1859,7 @@ void fsp_tce_map(u32 offset, void *addr, u32 size) offset >>= TCE_SHIFT; while(size--) { - fsp_tce_table[offset++] = raddr | 0x3; + fsp_tce_table[offset++] = cpu_to_be64(raddr | 0x3); raddr += TCE_PSIZE; } } @@ -2397,8 +2397,8 @@ static void fsp_fetch_lid_complete(struct fsp_msg *msg) last = list_top(&fsp_fetch_lid_queue, struct fsp_fetch_lid_item, link); fsp_tce_unmap(PSI_DMA_FETCH, last->bsize); - woffset = msg->resp->data.words[1]; - wlen = msg->resp->data.words[2]; + woffset = fsp_msg_get_data_word(msg->resp, 1); + wlen = fsp_msg_get_data_word(msg->resp, 2); rc = (msg->resp->word1 >> 8) & 0xff; /* Fall back to a PHYP LID for kernel loads */ diff --git a/hw/lpc.c b/hw/lpc.c index 3411f036f..ef5cb8063 100644 --- a/hw/lpc.c +++ b/hw/lpc.c @@ -673,7 +673,7 @@ int64_t lpc_probe_read(enum OpalLPCAddressType addr_type, uint32_t addr, * existing Linux expectations */ static int64_t opal_lpc_read(uint32_t chip_id, enum OpalLPCAddressType addr_type, - uint32_t addr, uint32_t *data, uint32_t sz) + uint32_t addr, __be32 *data, uint32_t sz) { struct proc_chip *chip; int64_t rc; diff --git a/include/fsp-attn.h b/include/fsp-attn.h index 4399ead35..b2f007b55 100644 --- a/include/fsp-attn.h +++ b/include/fsp-attn.h @@ -84,7 +84,7 @@ struct ti_attn { __be32 src_word[SRC_WORD_COUNT]; /* ASCII data */ char src[SRC_LEN]; - uint32_t msg_len; + __be32 msg_len; /* User data: Debug details */ struct user_data msg; } __packed __align(ATTN_AREA_SZ); diff --git a/include/fsp-elog.h b/include/fsp-elog.h index f24251df6..2de1a04dd 100644 --- a/include/fsp-elog.h +++ b/include/fsp-elog.h @@ -29,9 +29,9 @@ enum elog_head_state { int elog_fsp_commit(struct errorlog *buf) __warn_unused_result; -bool opal_elog_info(uint64_t *opal_elog_id, uint64_t *opal_elog_size) __warn_unused_result; +bool opal_elog_info(__be64 *opal_elog_id, __be64 *opal_elog_size) __warn_unused_result; -bool opal_elog_read(uint64_t *buffer, uint64_t opal_elog_size, +bool opal_elog_read(void *buffer, uint64_t opal_elog_size, uint64_t opal_elog_id) __warn_unused_result; bool opal_elog_ack(uint64_t ack_id) __warn_unused_result; diff --git a/include/fsp-leds.h b/include/fsp-leds.h index 57b3d1f85..d62505fa2 100644 --- a/include/fsp-leds.h +++ b/include/fsp-leds.h @@ -34,9 +34,9 @@ enum spcn_cmd_src { /* SPCN set LED */ struct spcn_led_data { u8 lc_len; - u16 state; + __be16 state; char lc_code[LOC_CODE_SIZE]; -}; +} __packed; /* LED data */ struct fsp_led_data { @@ -51,17 +51,17 @@ struct fsp_led_data { /* FSP location code request */ struct fsp_loc_code_req { - u16 len; - u16 req_type; + __be16 len; + __be16 req_type; u8 raw_len; u8 lc_sz; char loc_code[LOC_CODE_SIZE]; -}; +} __packed; /* FSP location code data */ struct fsp_loc_code_data { - u16 size; - u32 ccin; + __be16 size; + __be32 ccin; u8 status; u8 ind_state; u8 raw_len; @@ -81,22 +81,22 @@ struct fsp_loc_code_data { /* Get indicator state request */ struct fsp_get_ind_state_req { - u16 size; + __be16 size; u8 lc_len; u8 fld_sz; char loc_code[LOC_CODE_SIZE]; -}; +} __packed; /* Set indicator state request */ struct fsp_set_ind_state_req { - u16 size; - u16 req_type; + __be16 size; + __be16 req_type; u8 reserved[3]; u8 ind_state; u8 lc_len; u8 fld_sz; char loc_code[LOC_CODE_SIZE]; -}; +} __packed; /* LED set SPCN command */ struct led_set_cmd { diff --git a/include/fsp.h b/include/fsp.h index b2827b327..92f5459a5 100644 --- a/include/fsp.h +++ b/include/fsp.h @@ -604,7 +604,7 @@ struct fsp_msg { u32 word0; /* seq << 16 | cmd */ u32 word1; /* mod << 8 | sub */ union { - u32 words[14]; + __be32 words[14]; u8 bytes[56]; } data; @@ -629,6 +629,16 @@ struct fsp_msg { struct list_node link; }; +static inline u32 fsp_msg_get_data_word(struct fsp_msg *msg, unsigned long i) +{ + return be32_to_cpu(msg->data.words[i]); +} + +static inline void fsp_msg_set_data_word(struct fsp_msg *msg, unsigned long i, u32 w) +{ + msg->data.words[i] = cpu_to_be32(w); +} + /* This checks if a message is still "in progress" in the FSP driver */ static inline bool fsp_msg_busy(struct fsp_msg *msg) { diff --git a/include/spcn.h b/include/spcn.h index bec71341e..3a99eac05 100644 --- a/include/spcn.h +++ b/include/spcn.h @@ -78,8 +78,8 @@ enum { * Common to all PRS modifiers (subcommands) */ struct sensor_header { - uint16_t frc; /* Frame resource class */ - uint16_t rid; /* Resource ID */ + __be16 frc; /* Frame resource class */ + __be16 rid; /* Resource ID */ } __packed; /* @@ -87,8 +87,8 @@ struct sensor_header { */ struct sensor_prs { struct sensor_header header; - uint16_t src; /* unused */ - uint16_t status; + __be16 src; /* unused */ + __be16 status; } __packed; #define PRS_STATUS_ON_SUPPORTED 0x0010 @@ -104,8 +104,8 @@ struct sensor_param { struct sensor_header header; char location[4]; char __reserved[4]; - uint16_t threshold; - uint16_t status; + __be16 threshold; + __be16 status; } __packed; /* @@ -113,8 +113,8 @@ struct sensor_param { */ struct sensor_data { struct sensor_header header; - uint16_t data; - uint16_t status; + __be16 data; + __be16 status; } __packed; #define SENSOR_STATUS_EM_ALERT 0x0004 @@ -156,7 +156,7 @@ struct sensor_data { struct sensor_power_supply { uint8_t rid; /* Power supply ID */ - uint32_t milliwatts; + __be32 milliwatts; } __packed; struct sensor_power { diff --git a/platforms/ibm-fsp/common.c b/platforms/ibm-fsp/common.c index c288bff36..b58b07337 100644 --- a/platforms/ibm-fsp/common.c +++ b/platforms/ibm-fsp/common.c @@ -238,7 +238,7 @@ int64_t ibm_fsp_cec_power_down(uint64_t request) } int64_t ibm_fsp_sensor_read(uint32_t sensor_hndl, int token, - uint64_t *sensor_data) + __be64 *sensor_data) { return fsp_opal_read_sensor(sensor_hndl, token, sensor_data); } diff --git a/platforms/ibm-fsp/firenze-pci.c b/platforms/ibm-fsp/firenze-pci.c index da496727a..6d5aab1e4 100644 --- a/platforms/ibm-fsp/firenze-pci.c +++ b/platforms/ibm-fsp/firenze-pci.c @@ -94,22 +94,22 @@ struct firenze_pci_slot_fixup_info { }; struct firenze_pci_inv { - uint32_t hw_proc_id; - uint16_t slot_idx; - uint16_t reserved; - uint16_t vendor_id; - uint16_t device_id; - uint16_t subsys_vendor_id; - uint16_t subsys_device_id; -}; + __be32 hw_proc_id; + __be16 slot_idx; + __be16 reserved; + __be16 vendor_id; + __be16 device_id; + __be16 subsys_vendor_id; + __be16 subsys_device_id; +} __packed; struct firenze_pci_inv_data { - uint32_t version; /* currently 1 */ - uint32_t num_entries; - uint32_t entry_size; - uint32_t entry_offset; + __be32 version; /* currently 1 */ + __be32 num_entries; + __be32 entry_size; + __be32 entry_offset; struct firenze_pci_inv entries[]; -}; +} __packed; /* * Note: According to Tuleta system workbook, I didn't figure @@ -159,6 +159,8 @@ static void firenze_pci_add_inventory(struct phb *phb, struct proc_chip *chip; size_t size; bool need_init = false; + u32 num_entries; + u16 tmp16; /* * Do we need to add that to the FSP inventory for power @@ -191,7 +193,7 @@ static void firenze_pci_add_inventory(struct phb *phb, /* Check if we need to do some (Re)allocation */ if (!firenze_inv_data || - firenze_inv_data->num_entries == firenze_inv_cnt) { + be32_to_cpu(firenze_inv_data->num_entries) == firenze_inv_cnt) { need_init = !firenze_inv_data; /* (Re)allocate the block to the new size */ @@ -203,16 +205,18 @@ static void firenze_pci_add_inventory(struct phb *phb, /* Initialize the header for a new inventory */ if (need_init) { - firenze_inv_data->version = 1; + firenze_inv_data->version = cpu_to_be32(1); firenze_inv_data->num_entries = 0; firenze_inv_data->entry_size = - sizeof(struct firenze_pci_inv); + cpu_to_be32(sizeof(struct firenze_pci_inv)); firenze_inv_data->entry_offset = - offsetof(struct firenze_pci_inv_data, entries); + cpu_to_be32(offsetof(struct firenze_pci_inv_data, entries)); } /* Append slot entry */ - entry = &firenze_inv_data->entries[firenze_inv_data->num_entries++]; + num_entries = be32_to_cpu(firenze_inv_data->num_entries); + firenze_inv_data->num_entries = cpu_to_be32(num_entries + 1); + entry = &firenze_inv_data->entries[num_entries]; chip = get_chip(dt_get_chip_id(phb->dt_node)); if (!chip) { /** @@ -227,36 +231,38 @@ static void firenze_pci_add_inventory(struct phb *phb, return; } - entry->hw_proc_id = chip->pcid; + entry->hw_proc_id = cpu_to_be32(chip->pcid); entry->reserved = 0; if (pd->parent && pd->parent->slot && pd->parent->slot->data) { lxvpd_slot = pd->parent->slot->data; - entry->slot_idx = lxvpd_slot->slot_index; + entry->slot_idx = cpu_to_be16(lxvpd_slot->slot_index); } - pci_cfg_read16(phb, pd->bdfn, PCI_CFG_VENDOR_ID, &entry->vendor_id); - pci_cfg_read16(phb, pd->bdfn, PCI_CFG_DEVICE_ID, &entry->device_id); + pci_cfg_read16(phb, pd->bdfn, PCI_CFG_VENDOR_ID, &tmp16); + entry->vendor_id = cpu_to_be16(tmp16); + pci_cfg_read16(phb, pd->bdfn, PCI_CFG_DEVICE_ID, &tmp16); + entry->device_id = cpu_to_be16(tmp16); if (pd->is_bridge) { int64_t ssvc = pci_find_cap(phb, pd->bdfn, PCI_CFG_CAP_ID_SUBSYS_VID); if (ssvc <= 0) { - entry->subsys_vendor_id = 0xffff; - entry->subsys_device_id = 0xffff; + entry->subsys_vendor_id = cpu_to_be16(0xffff); + entry->subsys_device_id = cpu_to_be16(0xffff); } else { pci_cfg_read16(phb, pd->bdfn, - ssvc + PCICAP_SUBSYS_VID_VENDOR, - &entry->subsys_vendor_id); + ssvc + PCICAP_SUBSYS_VID_VENDOR, &tmp16); + entry->subsys_vendor_id = cpu_to_be16(tmp16); pci_cfg_read16(phb, pd->bdfn, - ssvc + PCICAP_SUBSYS_VID_DEVICE, - &entry->subsys_device_id); + ssvc + PCICAP_SUBSYS_VID_DEVICE, &tmp16); + entry->subsys_device_id = cpu_to_be16(tmp16); } } else { - pci_cfg_read16(phb, pd->bdfn, PCI_CFG_SUBSYS_VENDOR_ID, - &entry->subsys_vendor_id); - pci_cfg_read16(phb, pd->bdfn, PCI_CFG_SUBSYS_ID, - &entry->subsys_device_id); + pci_cfg_read16(phb, pd->bdfn, PCI_CFG_SUBSYS_VENDOR_ID, &tmp16); + entry->subsys_vendor_id = cpu_to_be16(tmp16); + pci_cfg_read16(phb, pd->bdfn, PCI_CFG_SUBSYS_ID, &tmp16); + entry->subsys_device_id = cpu_to_be16(tmp16); } } @@ -272,13 +278,16 @@ static void firenze_dump_pci_inventory(void) prlog(PR_INFO, "Dumping Firenze PCI inventory\n"); prlog(PR_INFO, "HWP SLT VDID DVID SVID SDID\n"); prlog(PR_INFO, "---------------------------\n"); - for (i = 0; i < firenze_inv_data->num_entries; i++) { + for (i = 0; i < be32_to_cpu(firenze_inv_data->num_entries); i++) { e = &firenze_inv_data->entries[i]; prlog(PR_INFO, "%03d %03d %04x %04x %04x %04x\n", - e->hw_proc_id, e->slot_idx, - e->vendor_id, e->device_id, - e->subsys_vendor_id, e->subsys_device_id); + be32_to_cpu(e->hw_proc_id), + be16_to_cpu(e->slot_idx), + be16_to_cpu(e->vendor_id), + be16_to_cpu(e->device_id), + be16_to_cpu(e->subsys_vendor_id), + be16_to_cpu(e->subsys_device_id)); } #endif /* FIRENZE_PCI_INVENTORY_DUMP */ } @@ -293,14 +302,14 @@ void firenze_pci_send_inventory(void) /* Dump the inventory */ prlog(PR_INFO, "Sending %d inventory to FSP\n", - firenze_inv_data->num_entries); + be32_to_cpu(firenze_inv_data->num_entries)); firenze_dump_pci_inventory(); /* Memory location for inventory */ base = (uint64_t)firenze_inv_data; - end = base + - sizeof(struct firenze_pci_inv_data) + - firenze_inv_data->num_entries * firenze_inv_data->entry_size; + end = base + sizeof(struct firenze_pci_inv_data) + + be32_to_cpu(firenze_inv_data->num_entries) * + be32_to_cpu(firenze_inv_data->entry_size); abase = base & ~0xffful; aend = (end + 0xffful) & ~0xffful; offset = PSI_DMA_PCIE_INVENTORY + (base & 0xfff); diff --git a/platforms/ibm-fsp/hostservices.c b/platforms/ibm-fsp/hostservices.c index ab4c90016..d93c4f6e6 100644 --- a/platforms/ibm-fsp/hostservices.c +++ b/platforms/ibm-fsp/hostservices.c @@ -873,8 +873,8 @@ static bool hservice_hbrt_msg_notify(uint32_t cmd_sub_mod, struct fsp_msg *msg) prlog(PR_TRACE, "HBRT: FSP - HBRT message generated\n"); - tce_token = msg->data.words[1]; - len = msg->data.words[2]; + tce_token = fsp_msg_get_data_word(msg, 1); + len = fsp_msg_get_data_word(msg, 2); buf = fsp_inbound_buf_from_tce(tce_token); if (!buf) { prlog(PR_DEBUG, "HBRT: Invalid inbound data\n"); diff --git a/platforms/ibm-fsp/lxvpd.c b/platforms/ibm-fsp/lxvpd.c index bdebc44a7..81cb612ed 100644 --- a/platforms/ibm-fsp/lxvpd.c +++ b/platforms/ibm-fsp/lxvpd.c @@ -275,7 +275,7 @@ void lxvpd_process_slot_entries(struct phb *phb, const void *lxvpd; const uint8_t *pr_rec, *pr_end, *sm; size_t lxvpd_size, pr_size; - const uint16_t *mf = NULL; + const beint16_t *mf = NULL; char record[5] = "PR00"; uint8_t mf_sz, sm_sz; bool found = false; @@ -317,8 +317,8 @@ void lxvpd_process_slot_entries(struct phb *phb, return; } - prlog(PR_DEBUG, "Found 0x%04x map...\n", *mf); - switch (*mf) { + prlog(PR_DEBUG, "Found 0x%04x map...\n", be16_to_cpu(*mf)); + switch (be16_to_cpu(*mf)) { case 0x1004: lxvpd_parse_1004_map(phb, sm + 1, sm_sz - 1, slot_size); found = true; diff --git a/platforms/ibm-fsp/lxvpd.h b/platforms/ibm-fsp/lxvpd.h index bc9daf55c..46acf6748 100644 --- a/platforms/ibm-fsp/lxvpd.h +++ b/platforms/ibm-fsp/lxvpd.h @@ -14,32 +14,54 @@ struct slot_p0 { union { uint8_t byte; struct { +#if HAVE_BIG_ENDIAN uint8_t pluggable:1; uint8_t pluggable_location:3; uint8_t power_ctl:1; uint8_t rsvd_5:1; uint8_t upstream_port:1; uint8_t alt_load_source:1; +#else + uint8_t alt_load_source:1; + uint8_t upstream_port:1; + uint8_t rsvd_5:1; + uint8_t power_ctl:1; + uint8_t pluggable_location:3; + uint8_t pluggable:1; +#endif }; }; }; struct slot_p1 { +#if HAVE_BIG_ENDIAN uint8_t rsvd_0:1; uint8_t wired_lanes:3; uint8_t rsvd_4:4; +#else + uint8_t rsvd_4:4; + uint8_t wired_lanes:3; + uint8_t rsvd_0:1; +#endif }; struct slot_p2 { +#if HAVE_BIG_ENDIAN uint8_t rsvd_0:1; uint8_t bus_clock:3; uint8_t connector_type:4; +#else + uint8_t connector_type:4; + uint8_t bus_clock:3; + uint8_t rsvd_0:1; +#endif }; struct slot_p3 { union { uint8_t byte; struct { +#if HAVE_BIG_ENDIAN uint8_t height:1; uint8_t length:1; uint8_t left_mech:1; @@ -48,6 +70,16 @@ struct slot_p3 { uint8_t pow_led_fsp:1; uint8_t attn_led_kvm:1; uint8_t attn_led_fsp:1; +#else + uint8_t attn_led_fsp:1; + uint8_t attn_led_kvm:1; + uint8_t pow_led_fsp:1; + uint8_t pow_led_kvm:1; + uint8_t right_mech:1; + uint8_t left_mech:1; + uint8_t length:1; + uint8_t height:1; +#endif }; }; }; @@ -57,7 +89,7 @@ struct pci_slot_entry_1004 { uint8_t sba; uint8_t phb_or_slot_type; char label[3]; - uint16_t bis; + __be16 bis; struct slot_p0 p0; struct slot_p1 p1; struct slot_p2 p2; @@ -73,13 +105,23 @@ struct pci_slot_entry_1005 { union { uint8_t pba; struct { +#if HAVE_BIG_ENDIAN uint8_t switch_id:4; uint8_t vswitch_id:4; +#else + uint8_t vswitch_id:4; + uint8_t switch_id:4; +#endif }; }; uint8_t switch_device_id; +#if HAVE_BIG_ENDIAN uint8_t slot_type:4; uint8_t phb_id:4; +#else + uint8_t phb_id:4; + uint8_t slot_type:4; +#endif char label[8]; uint8_t rsvd_11[4]; struct slot_p0 p0; From patchwork Thu Nov 28 06:24:34 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Nicholas Piggin X-Patchwork-Id: 1201915 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 47Nnrh49GTz9sPJ for ; Thu, 28 Nov 2019 17:33:08 +1100 (AEDT) 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="JATbAKWY"; 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 47Nnrh35zTzDqPN for ; Thu, 28 Nov 2019 17:33:08 +1100 (AEDT) X-Original-To: skiboot@lists.ozlabs.org Delivered-To: skiboot@lists.ozlabs.org Authentication-Results: lists.ozlabs.org; spf=pass (sender SPF authorized) smtp.mailfrom=gmail.com (client-ip=2607:f8b0:4864:20::541; helo=mail-pg1-x541.google.com; envelope-from=npiggin@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="JATbAKWY"; dkim-atps=neutral Received: from mail-pg1-x541.google.com (mail-pg1-x541.google.com [IPv6:2607:f8b0:4864:20::541]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (2048 bits) server-digest SHA256) (No client certificate requested) by lists.ozlabs.org (Postfix) with ESMTPS id 47Nnj56RGdzDqPN for ; Thu, 28 Nov 2019 17:26:33 +1100 (AEDT) Received: by mail-pg1-x541.google.com with SMTP id z188so12381610pgb.1 for ; Wed, 27 Nov 2019 22:26:33 -0800 (PST) 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 :mime-version:content-transfer-encoding; bh=PTxw4ybDCrcvFqq9R1qIu91EA31/ELvggdq1ktW6Fqs=; b=JATbAKWYW3aVQO9pXfeRoQKGB+38NPTAHwyPoPSsfX/x4oMIfTYxn0whnxIGMaI/0u QtJQ2lp1ZEGZvmeXeGfevNNRJE0IY9kvVm42ZJ7WpW1JHPtEPB/BuaGn3UUgLjjdOZCa ZIaWxUeSk4S58qEyghggZcVJhehWsPV5oSZ3AtGf2JrPWK5F6rRUmvyjgONcLSxjP6fN zAIo5t1CG3ayO+fJg334i7YnI1iPD4/Xn8JhHdHGzYw6PFsKn7qhMYqeXX/QEyd3p0za TzrH3ZLIizjaKoKKQIJf4+1gwdvUsnGRv/f4f5mD5tVpQ8Q4Ytct0QA628h4hDh8k6Sb vINg== 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:mime-version:content-transfer-encoding; bh=PTxw4ybDCrcvFqq9R1qIu91EA31/ELvggdq1ktW6Fqs=; b=n0kqASu7PTgCf3tKSCfvTomogUsjMOqqNbk/qk3YZg2ShK2I7ry+Pfiy/fYtNDxe2v h4JkzfMk1C2Pchp2IaV4qdpBlw0JHBMDDCzwUESnY0AgdXG9k78NTRKo+etwVIb/nzF6 +U0sBdyFgStwwo09ckt59FNDxmLBGrmASV/mJK9Wh2iQ03s/UkTW9fDhABFhkOs2FhBC 725H2WufhA9K8k9vX/xskdNwDH+h5wiV67AMTKyXUcHsqrZQTT8/kwOdYpcUr5qzbdNl ASyGyRcaSh+W4n+1zZtQJ8vQh+eS2HCDGPfPnuzr9iu980AYNQGH5g6SBdYUtCpztqtW 9QAQ== X-Gm-Message-State: APjAAAVxuittywIsk2BAjtf1vnPGKRYXnsMEMnsmhbBrQX0FHxAIWm0o JqNGTbD7e0KP2SbZAyL3L/p5NBt4Zi8= X-Google-Smtp-Source: APXvYqx2NLwXkvJxh3MBd/9fZPY98Hvi3gjhpTLIruIFVeDXsmF/JeC6WN3UODMEtIeTZ0Xk+l2f9A== X-Received: by 2002:a63:154d:: with SMTP id 13mr328174pgv.248.1574922390815; Wed, 27 Nov 2019 22:26:30 -0800 (PST) Received: from bobo.local0.net ([203.194.47.34]) by smtp.gmail.com with ESMTPSA id e5sm8463196pjv.29.2019.11.27.22.26.28 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 27 Nov 2019 22:26:30 -0800 (PST) From: Nicholas Piggin To: skiboot@lists.ozlabs.org Date: Thu, 28 Nov 2019 16:24:34 +1000 Message-Id: <20191128062442.20690-21-npiggin@gmail.com> X-Mailer: git-send-email 2.23.0 In-Reply-To: <20191128062442.20690-1-npiggin@gmail.com> References: <20191128062442.20690-1-npiggin@gmail.com> MIME-Version: 1.0 Subject: [Skiboot] [PATCH v8 20/28] libflash: ecc endian conversions X-BeenThere: skiboot@lists.ozlabs.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: Mailing list for skiboot development List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: skiboot-bounces+incoming=patchwork.ozlabs.org@lists.ozlabs.org Sender: "Skiboot" Signed-off-by: Nicholas Piggin --- libflash/ecc.c | 36 ++++++++++++++++++++---------------- libflash/ecc.h | 8 ++++---- 2 files changed, 24 insertions(+), 20 deletions(-) diff --git a/libflash/ecc.c b/libflash/ecc.c index 0b85fb3ea..8e76e7cf3 100644 --- a/libflash/ecc.c +++ b/libflash/ecc.c @@ -142,30 +142,34 @@ static inline uint64_t eccflipbit(uint64_t data, uint8_t bit) return data ^ (1ul << (63 - bit)); } -static int eccbyte(uint64_t *dst, struct ecc64 *src) +static int eccbyte(beint64_t *dst, struct ecc64 *src) { uint8_t ecc, badbit; uint64_t data; - data = src->data; + data = be64_to_cpu(src->data); ecc = src->ecc; - badbit = eccverify(be64_to_cpu(data), ecc); + badbit = eccverify(data, ecc); if (badbit == UE) { - FL_ERR("ECC: uncorrectable error: %016lx %02x\n", - (long unsigned int)be64_to_cpu(data), ecc); + FL_ERR("ECC: uncorrectable error: %016llx %02x\n", (unsigned long long int)data, ecc); return badbit; } - *dst = data; if (badbit <= UE) FL_INF("ECC: correctable error: %i\n", badbit); if (badbit < 64) - *dst = (uint64_t)be64_to_cpu(eccflipbit(be64_to_cpu(data), - badbit)); + *dst = cpu_to_be64(eccflipbit(data, badbit)); + else + *dst = cpu_to_be64(data); return 0; } +static beint64_t *inc_beint64_by(const void *p, uint64_t i) +{ + return (beint64_t *)(((char *)p) + i); +} + static uint64_t *inc_uint64_by(const void *p, uint64_t i) { return (uint64_t *)(((char *)p) + i); @@ -200,7 +204,7 @@ static uint64_t whole_ecc_structs(uint64_t i) * @retval: 0 - success * @retfal: other - fail */ -int memcpy_from_ecc(uint64_t *dst, struct ecc64 *src, uint64_t len) +int memcpy_from_ecc(beint64_t *dst, struct ecc64 *src, uint64_t len) { uint32_t i; @@ -256,7 +260,7 @@ int memcpy_from_ecc(uint64_t *dst, struct ecc64 *src, uint64_t len) * @retval: 0 - success * @retfal: other - fail */ -int memcpy_from_ecc_unaligned(uint64_t *dst, struct ecc64 *src, +int memcpy_from_ecc_unaligned(beint64_t *dst, struct ecc64 *src, uint64_t len, uint8_t alignment) { char data[BYTES_PER_ECC]; @@ -273,14 +277,14 @@ int memcpy_from_ecc_unaligned(uint64_t *dst, struct ecc64 *src, * required - otherwise jump straight to memcpy_from_ecc() */ if (alignment) { - rc = eccbyte((uint64_t *)data, src); + rc = eccbyte((beint64_t *)data, src); if (rc) return rc; memcpy(dst, &data[alignment], bytes_wanted); src = inc_ecc64_by(src, sizeof(struct ecc64)); - dst = inc_uint64_by(dst, bytes_wanted); + dst = inc_beint64_by(dst, bytes_wanted); len -= bytes_wanted; } @@ -299,7 +303,7 @@ int memcpy_from_ecc_unaligned(uint64_t *dst, struct ecc64 *src, } if (len) { - rc = eccbyte((uint64_t *)data, src); + rc = eccbyte((beint64_t *)data, src); if (rc) return rc; @@ -323,7 +327,7 @@ int memcpy_from_ecc_unaligned(uint64_t *dst, struct ecc64 *src, * @retval: 0 - success * @retfal: other - fail */ -int memcpy_to_ecc(struct ecc64 *dst, const uint64_t *src, uint64_t len) +int memcpy_to_ecc(struct ecc64 *dst, const beint64_t *src, uint64_t len) { struct ecc64 ecc_word; uint64_t i; @@ -390,7 +394,7 @@ int memcpy_to_ecc(struct ecc64 *dst, const uint64_t *src, uint64_t len) * @retfal: other - fail */ -int memcpy_to_ecc_unaligned(struct ecc64 *dst, const uint64_t *src, +int memcpy_to_ecc_unaligned(struct ecc64 *dst, const beint64_t *src, uint64_t len, uint8_t alignment) { struct ecc64 ecc_word; @@ -412,7 +416,7 @@ int memcpy_to_ecc_unaligned(struct ecc64 *dst, const uint64_t *src, sizeof(struct ecc64) - alignment); dst = inc_ecc64_by(dst, sizeof(struct ecc64) - alignment); - src = inc_uint64_by(src, bytes_wanted); + src = inc_beint64_by(src, bytes_wanted); len -= bytes_wanted; } diff --git a/libflash/ecc.h b/libflash/ecc.h index 608d50008..75c3adf22 100644 --- a/libflash/ecc.h +++ b/libflash/ecc.h @@ -16,12 +16,12 @@ struct ecc64 { uint8_t ecc; } __attribute__((__packed__)); -extern int memcpy_from_ecc(uint64_t *dst, struct ecc64 *src, uint64_t len); -extern int memcpy_from_ecc_unaligned(uint64_t *dst, struct ecc64 *src, uint64_t len, +extern int memcpy_from_ecc(beint64_t *dst, struct ecc64 *src, uint64_t len); +extern int memcpy_from_ecc_unaligned(beint64_t *dst, struct ecc64 *src, uint64_t len, uint8_t alignment); -extern int memcpy_to_ecc(struct ecc64 *dst, const uint64_t *src, uint64_t len); -extern int memcpy_to_ecc_unaligned(struct ecc64 *dst, const uint64_t *src, uint64_t len, +extern int memcpy_to_ecc(struct ecc64 *dst, const beint64_t *src, uint64_t len); +extern int memcpy_to_ecc_unaligned(struct ecc64 *dst, const beint64_t *src, uint64_t len, uint8_t alignment); /* From patchwork Thu Nov 28 06:24:35 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Nicholas Piggin X-Patchwork-Id: 1201916 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.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 47Nns16svLz9sPJ for ; Thu, 28 Nov 2019 17:33:25 +1100 (AEDT) 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="qOXf3ORg"; 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 47Nns14mK6zDr1f for ; Thu, 28 Nov 2019 17:33:25 +1100 (AEDT) X-Original-To: skiboot@lists.ozlabs.org Delivered-To: skiboot@lists.ozlabs.org Authentication-Results: lists.ozlabs.org; spf=pass (sender SPF authorized) smtp.mailfrom=gmail.com (client-ip=2607:f8b0:4864:20::642; helo=mail-pl1-x642.google.com; envelope-from=npiggin@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="qOXf3ORg"; dkim-atps=neutral Received: from mail-pl1-x642.google.com (mail-pl1-x642.google.com [IPv6:2607:f8b0:4864:20::642]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (2048 bits) server-digest SHA256) (No client certificate requested) by lists.ozlabs.org (Postfix) with ESMTPS id 47Nnj74dF1zDqFh for ; Thu, 28 Nov 2019 17:26:35 +1100 (AEDT) Received: by mail-pl1-x642.google.com with SMTP id w7so11118869plz.12 for ; Wed, 27 Nov 2019 22:26:35 -0800 (PST) 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 :mime-version:content-transfer-encoding; bh=beUStmXfy8I0h3RbLcj+hiifMdT3gj/VjN3TKkhv550=; b=qOXf3ORgoAvdSAyfikgcqlld8SqggTMpWItgKPfpAKb9Sunz5h4F/ifNbIkY/8Huld 0pf651gHGPFIxoS5CVlWXw+dSS/PLhv5/8f5H2AJU1qAZlqwDCowHAYF/Pk+pJIoLzCo hNzQeHW4Ky3Xyog54ovEcTn9oXCXRmToIZ9kerhvgYCPyvCjdlpEElfnCvSWEaXeMW02 E3OU4Z8X7dJN9awF2oM9xJeB6pmlxO6WMXAbs6YupatygqmmigzLJCxt4ycoJkhhA8ws fyBvHgC7j//t4rV3t8upsgS9TqaXj5TEfhcFrTLFHGwAKIFmq2m7QQ42kI73aXUsNStH z2TQ== 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:mime-version:content-transfer-encoding; bh=beUStmXfy8I0h3RbLcj+hiifMdT3gj/VjN3TKkhv550=; b=imn8f+9CzMZN6DxwvJ4c3P4cB+avBYA96eXJaI2CJBIjwe0ZFIbLzj13BFDJL/BYGl ugXa3mx7n3blwvrfqJ8lpDuLlQak7aQF7wFcd4wlPYTkqgLdgjqE4HEZ6OI9uzzfbB+a 9QC9hvt9+0uqs8eFgYQtoOwJiOlyYJ11j1YA0UTn0nkzGgaV9XSI93RQDcC3bX7uVIYX c/J2z1wttYDaestY6f3WMEGSBaXx5+CS58j+ajWsN4Ob+1jKizXHv+mkJSy+OXKORP2a wMwybKqt5hasB5VzgM1E7FK1dqwBvMLaa1AwzAIDfsRAyxZMQUCTGOnK9aUxaGpFw75c M6Lg== X-Gm-Message-State: APjAAAXVCIfAcUNAdgXq6Wwjcj3wWKNf2kzaD3kCsjzhfo0oc/VRRhNy 1JVifOdi1wMy1S0BHNtcErGeOxjt7s0= X-Google-Smtp-Source: APXvYqy0qCwS+vKiEtVmwODct1mif3WfZgmfze9ir4iZGQ5mSZfL+b0mWXfB3QnhpYQU7YZC852vrg== X-Received: by 2002:a17:902:8f81:: with SMTP id z1mr7881241plo.228.1574922393155; Wed, 27 Nov 2019 22:26:33 -0800 (PST) Received: from bobo.local0.net ([203.194.47.34]) by smtp.gmail.com with ESMTPSA id e5sm8463196pjv.29.2019.11.27.22.26.31 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 27 Nov 2019 22:26:32 -0800 (PST) From: Nicholas Piggin To: skiboot@lists.ozlabs.org Date: Thu, 28 Nov 2019 16:24:35 +1000 Message-Id: <20191128062442.20690-22-npiggin@gmail.com> X-Mailer: git-send-email 2.23.0 In-Reply-To: <20191128062442.20690-1-npiggin@gmail.com> References: <20191128062442.20690-1-npiggin@gmail.com> MIME-Version: 1.0 Subject: [Skiboot] [PATCH v8 21/28] prd: endian conversions X-BeenThere: skiboot@lists.ozlabs.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: Mailing list for skiboot development List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: skiboot-bounces+incoming=patchwork.ozlabs.org@lists.ozlabs.org Sender: "Skiboot" Signed-off-by: Nicholas Piggin --- hw/prd.c | 64 ++++++++++++++++++++++++++++---------------------------- 1 file changed, 32 insertions(+), 32 deletions(-) diff --git a/hw/prd.c b/hw/prd.c index 69cfbf9d5..2301dafd0 100644 --- a/hw/prd.c +++ b/hw/prd.c @@ -84,7 +84,7 @@ static void prd_msg_consumed(void *data, int status) lock(&events_lock); switch (msg->hdr.type) { case OPAL_PRD_MSG_TYPE_ATTN: - proc = msg->attn.proc; + proc = be64_to_cpu(msg->attn.proc); /* If other ipoll events have been received in the time * between prd_msg creation and consumption, we'll need to @@ -92,17 +92,17 @@ static void prd_msg_consumed(void *data, int status) * clear the event if we don't have any further ipoll_status * bits. */ - ipoll_status[proc] &= ~msg->attn.ipoll_status; + ipoll_status[proc] &= ~be64_to_cpu(msg->attn.ipoll_status); if (!ipoll_status[proc]) event = EVENT_ATTN; break; case OPAL_PRD_MSG_TYPE_OCC_ERROR: - proc = msg->occ_error.chip; + proc = be64_to_cpu(msg->occ_error.chip); event = EVENT_OCC_ERROR; break; case OPAL_PRD_MSG_TYPE_OCC_RESET: - proc = msg->occ_reset.chip; + proc = be64_to_cpu(msg->occ_reset.chip); event = EVENT_OCC_RESET; break; case OPAL_PRD_MSG_TYPE_FIRMWARE_RESPONSE: @@ -126,15 +126,15 @@ static void prd_msg_consumed(void *data, int status) platform.prd->msg_response(notify_status); break; case OPAL_PRD_MSG_TYPE_SBE_PASSTHROUGH: - proc = msg->sbe_passthrough.chip; + proc = be64_to_cpu(msg->sbe_passthrough.chip); event = EVENT_SBE_PASSTHROUGH; break; case OPAL_PRD_MSG_TYPE_FSP_OCC_RESET: - proc = msg->occ_reset.chip; + proc = be64_to_cpu(msg->occ_reset.chip); event = EVENT_FSP_OCC_RESET; break; case OPAL_PRD_MSG_TYPE_FSP_OCC_LOAD_START: - proc = msg->occ_reset.chip; + proc = be64_to_cpu(msg->occ_reset.chip); event = EVENT_FSP_OCC_LOAD_START; break; default: @@ -180,9 +180,9 @@ static int populate_ipoll_msg(struct opal_prd_msg *msg, uint32_t proc) return -1; } - msg->attn.proc = proc; - msg->attn.ipoll_status = ipoll_status[proc]; - msg->attn.ipoll_mask = ipoll_mask; + msg->attn.proc = cpu_to_be64(proc); + msg->attn.ipoll_status = cpu_to_be64(ipoll_status[proc]); + msg->attn.ipoll_mask = cpu_to_be64(ipoll_mask); return 0; } @@ -212,27 +212,27 @@ static void send_next_pending_event(void) return; prd_msg->token = 0; - prd_msg->hdr.size = sizeof(*prd_msg); + prd_msg->hdr.size = cpu_to_be16(sizeof(*prd_msg)); if (event & EVENT_ATTN) { prd_msg->hdr.type = OPAL_PRD_MSG_TYPE_ATTN; populate_ipoll_msg(prd_msg, proc); } else if (event & EVENT_OCC_ERROR) { prd_msg->hdr.type = OPAL_PRD_MSG_TYPE_OCC_ERROR; - prd_msg->occ_error.chip = proc; + prd_msg->occ_error.chip = cpu_to_be64(proc); } else if (event & EVENT_OCC_RESET) { prd_msg->hdr.type = OPAL_PRD_MSG_TYPE_OCC_RESET; - prd_msg->occ_reset.chip = proc; + prd_msg->occ_reset.chip = cpu_to_be64(proc); occ_msg_queue_occ_reset(); } else if (event & EVENT_SBE_PASSTHROUGH) { prd_msg->hdr.type = OPAL_PRD_MSG_TYPE_SBE_PASSTHROUGH; - prd_msg->sbe_passthrough.chip = proc; + prd_msg->sbe_passthrough.chip = cpu_to_be64(proc); } else if (event & EVENT_FSP_OCC_RESET) { prd_msg->hdr.type = OPAL_PRD_MSG_TYPE_FSP_OCC_RESET; - prd_msg->occ_reset.chip = proc; + prd_msg->occ_reset.chip = cpu_to_be64(proc); } else if (event & EVENT_FSP_OCC_LOAD_START) { prd_msg->hdr.type = OPAL_PRD_MSG_TYPE_FSP_OCC_LOAD_START; - prd_msg->occ_reset.chip = proc; + prd_msg->occ_reset.chip = cpu_to_be64(proc); } /* @@ -351,7 +351,7 @@ void prd_fw_resp_fsp_response(int status) fw_resp->type = cpu_to_be64(PRD_FW_MSG_TYPE_RESP_GENERIC); fw_resp->generic_resp.status = cpu_to_be64(status); - fw_resp_len_old = prd_msg_fsp_req->fw_resp.len; + fw_resp_len_old = be64_to_cpu(prd_msg_fsp_req->fw_resp.len); prd_msg_fsp_req->fw_resp.len = cpu_to_be64(PRD_FW_MSG_BASE_SIZE + sizeof(fw_resp->generic_resp)); @@ -430,8 +430,8 @@ static int prd_msg_handle_attn_ack(struct opal_prd_msg *msg) int rc; lock(&ipoll_lock); - rc = __ipoll_update_mask(msg->attn_ack.proc, false, - msg->attn_ack.ipoll_ack & prd_ipoll_mask); + rc = __ipoll_update_mask(be64_to_cpu(msg->attn_ack.proc), false, + be64_to_cpu(msg->attn_ack.ipoll_ack) & prd_ipoll_mask); unlock(&ipoll_lock); if (rc) @@ -447,7 +447,7 @@ static int prd_msg_handle_init(struct opal_prd_msg *msg) lock(&ipoll_lock); for_each_chip(chip) { __ipoll_update_mask(chip->id, false, - msg->init.ipoll & prd_ipoll_mask); + be64_to_cpu(msg->init.ipoll) & prd_ipoll_mask); } unlock(&ipoll_lock); @@ -497,7 +497,7 @@ static int prd_msg_handle_firmware_req(struct opal_prd_msg *msg) /* does the total (outer) PRD message len provide enough data for the * claimed (inner) FW message? */ - if (msg->hdr.size < fw_req_len + + if (be16_to_cpu(msg->hdr.size) < fw_req_len + offsetof(struct opal_prd_msg, fw_req.data)) return -EINVAL; @@ -524,8 +524,8 @@ static int prd_msg_handle_firmware_req(struct opal_prd_msg *msg) case PRD_FW_MSG_TYPE_ERROR_LOG: assert(platform.prd); assert(platform.prd->send_error_log); - rc = platform.prd->send_error_log(fw_req->errorlog.plid, - fw_req->errorlog.size, + rc = platform.prd->send_error_log(be32_to_cpu(fw_req->errorlog.plid), + be32_to_cpu(fw_req->errorlog.size), fw_req->errorlog.data); /* Return generic response to HBRT */ fw_resp->type = cpu_to_be64(PRD_FW_MSG_TYPE_RESP_GENERIC); @@ -581,7 +581,7 @@ static int prd_msg_handle_firmware_req(struct opal_prd_msg *msg) prd_msg_fsp_req->hdr.type = OPAL_PRD_MSG_TYPE_FIRMWARE_RESPONSE; prd_msg_fsp_req->hdr.size = cpu_to_be16(resp_msg_size); prd_msg_fsp_req->token = 0; - prd_msg_fsp_req->fw_resp.len = fw_req_len; + prd_msg_fsp_req->fw_resp.len = cpu_to_be64(fw_req_len); /* copy HBRT data to local memory */ fw_resp = (struct prd_fw_msg *)prd_msg_fsp_req->fw_resp.data; @@ -644,11 +644,11 @@ static int64_t opal_prd_msg(struct opal_prd_msg *msg) /* fini is a little special: the kernel (which may not have the entire * opal_prd_msg definition) can send a FINI message, so we don't check * the full size */ - if (msg->hdr.size >= sizeof(struct opal_prd_msg_header) && + if (be16_to_cpu(msg->hdr.size) >= sizeof(struct opal_prd_msg_header) && msg->hdr.type == OPAL_PRD_MSG_TYPE_FINI) return prd_msg_handle_fini(); - if (msg->hdr.size < sizeof(*msg)) + if (be16_to_cpu(msg->hdr.size) < sizeof(*msg)) return OPAL_PARAMETER; switch (msg->hdr.type) { @@ -668,21 +668,21 @@ static int64_t opal_prd_msg(struct opal_prd_msg *msg) assert(platform.prd); assert(platform.prd->fsp_occ_reset_status); rc = platform.prd->fsp_occ_reset_status( - msg->fsp_occ_reset_status.chip, - msg->fsp_occ_reset_status.status); + be64_to_cpu(msg->fsp_occ_reset_status.chip), + be64_to_cpu(msg->fsp_occ_reset_status.status)); break; case OPAL_PRD_MSG_TYPE_CORE_SPECIAL_WAKEUP: assert(platform.prd); assert(platform.prd->wakeup); - rc = platform.prd->wakeup(msg->spl_wakeup.core, - msg->spl_wakeup.mode); + rc = platform.prd->wakeup(be32_to_cpu(msg->spl_wakeup.core), + be32_to_cpu(msg->spl_wakeup.mode)); break; case OPAL_PRD_MSG_TYPE_FSP_OCC_LOAD_START_STATUS: assert(platform.prd); assert(platform.prd->fsp_occ_load_start_status); rc = platform.prd->fsp_occ_load_start_status( - msg->fsp_occ_reset_status.chip, - msg->fsp_occ_reset_status.status); + be64_to_cpu(msg->fsp_occ_reset_status.chip), + be64_to_cpu(msg->fsp_occ_reset_status.status)); break; default: prlog(PR_DEBUG, "PRD: Unsupported prd message type : 0x%x\n", From patchwork Thu Nov 28 06:24:36 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Nicholas Piggin X-Patchwork-Id: 1201917 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.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 47NnsN0nD4z9sPK for ; Thu, 28 Nov 2019 17:33:44 +1100 (AEDT) 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="CAM4u3lo"; 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 47NnsM25tLzDqZ2 for ; Thu, 28 Nov 2019 17:33:43 +1100 (AEDT) X-Original-To: skiboot@lists.ozlabs.org Delivered-To: skiboot@lists.ozlabs.org Authentication-Results: lists.ozlabs.org; spf=pass (sender SPF authorized) smtp.mailfrom=gmail.com (client-ip=2607:f8b0:4864:20::431; helo=mail-pf1-x431.google.com; envelope-from=npiggin@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="CAM4u3lo"; dkim-atps=neutral Received: from mail-pf1-x431.google.com (mail-pf1-x431.google.com [IPv6:2607:f8b0:4864:20::431]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (2048 bits) server-digest SHA256) (No client certificate requested) by lists.ozlabs.org (Postfix) with ESMTPS id 47NnjB34sFzDqT2 for ; Thu, 28 Nov 2019 17:26:38 +1100 (AEDT) Received: by mail-pf1-x431.google.com with SMTP id d199so7974335pfd.11 for ; Wed, 27 Nov 2019 22:26:38 -0800 (PST) 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 :mime-version:content-transfer-encoding; bh=XUQzQIPegdqLNs1qt7W6cXTEwenJSbY8ZcTvYN/6Pr4=; b=CAM4u3logqFrHMKWd938s8OGZFuPWX7Re7ZRI0qbBONZ2TqfjJXEa7MvmC+h+l42zN SQVZqJOm6Yf9I6UV9H8DXFw/oUakBeGuELP3UG4cwLV4rrNqil93AsCZbcXgQov7eUH+ Px5bn+X2JRsZGFAlkuPfdVaUKosnKLDNYY3TjEUaViH8+8/TfUhcfkKhM65xetLqzTvG q2gmdp8KAAUU/aYhi/Afw/Ob1IIcuALxA63r1shn7F6uIc8mRMViJZZgfuMST0KFMqTf peVSUEsxA1KwLwdkyHUfEcWJ/eqgrRTohrMyB9gvmHha1MkAjH+vNTz89ky6aaNl1cP4 Vlnw== 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:mime-version:content-transfer-encoding; bh=XUQzQIPegdqLNs1qt7W6cXTEwenJSbY8ZcTvYN/6Pr4=; b=c0k8cGCU+wyHlJ9FdMQdpml1T7v1e3u2WR4I0MaLX+YXthWMGdwZWoPkYhSSbCyYPX 1p77LHbVANUCQ90aeVsGSHeNu6VNk/72DyVi264zxpoFZTfRu2cWQMof0VMRu+kj0zaz HFaGfXrb2t043HNCfmovAi5voWkRKYDQzxGG2PWcDbE2GDQ/pxQi8HeP8HG0GGcapm8a Fnddizloa2JXeS5oD87EZXIdSHepvgfrZphTeDWSZwKetZ3eRAMiWn5oxL6H1qjxSTle 3Qybxd2qwQ+IKKDhpRpb7WUnB+XHPS2GW+tHBMSGFNWO+YWa+bEByxfdazFUPdZpqTz5 7ozA== X-Gm-Message-State: APjAAAWBMND3j1lwFDM2WXne+5B1lsvwCsItZxqS+r8hsm12qbPXFcM3 MDlI9n0pO5fwhC3XQwZPFJkxWiC/v40= X-Google-Smtp-Source: APXvYqzNUHqu/AURB6MQuFuVeqMhoMWwDkS1poeOU3DSd5P3iqS5HFS05bU7isikio47WkzDi3o6fg== X-Received: by 2002:aa7:93a5:: with SMTP id x5mr11466227pff.147.1574922395516; Wed, 27 Nov 2019 22:26:35 -0800 (PST) Received: from bobo.local0.net ([203.194.47.34]) by smtp.gmail.com with ESMTPSA id e5sm8463196pjv.29.2019.11.27.22.26.33 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 27 Nov 2019 22:26:35 -0800 (PST) From: Nicholas Piggin To: skiboot@lists.ozlabs.org Date: Thu, 28 Nov 2019 16:24:36 +1000 Message-Id: <20191128062442.20690-23-npiggin@gmail.com> X-Mailer: git-send-email 2.23.0 In-Reply-To: <20191128062442.20690-1-npiggin@gmail.com> References: <20191128062442.20690-1-npiggin@gmail.com> MIME-Version: 1.0 Subject: [Skiboot] [PATCH v8 22/28] opal-dump: MPIPL endan conversions X-BeenThere: skiboot@lists.ozlabs.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: Mailing list for skiboot development List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: skiboot-bounces+incoming=patchwork.ozlabs.org@lists.ozlabs.org Sender: "Skiboot" Signed-off-by: Nicholas Piggin --- core/opal-dump.c | 90 +++++++++++++++++++++++++--------------------- include/opal-api.h | 14 ++++---- 2 files changed, 56 insertions(+), 48 deletions(-) diff --git a/core/opal-dump.c b/core/opal-dump.c index 3bea1f105..256c9c949 100644 --- a/core/opal-dump.c +++ b/core/opal-dump.c @@ -68,18 +68,18 @@ static int opal_mpipl_max_tags = MAX_OPAL_MPIPL_TAGS; static int opal_mpipl_add_entry(u8 region, u64 src, u64 dest, u64 size) { - int i, max_cnt; + int i; + int mdst_cnt = be16_to_cpu(ntuple_mdst->act_cnt); + int mddt_cnt = be16_to_cpu(ntuple_mddt->act_cnt); struct mdst_table *mdst; struct mddt_table *mddt; - max_cnt = MDST_TABLE_SIZE / sizeof(struct mdst_table); - if (ntuple_mdst->act_cnt >= max_cnt) { + if (mdst_cnt >= MDST_TABLE_SIZE / sizeof(struct mdst_table)) { prlog(PR_DEBUG, "MDST table is full\n"); return OPAL_RESOURCE; } - max_cnt = MDDT_TABLE_SIZE / sizeof(struct mddt_table); - if (ntuple_mdst->act_cnt >= max_cnt) { + if (mddt_cnt >= MDDT_TABLE_SIZE / sizeof(struct mddt_table)) { prlog(PR_DEBUG, "MDDT table is full\n"); return OPAL_RESOURCE; } @@ -89,16 +89,16 @@ static int opal_mpipl_add_entry(u8 region, u64 src, u64 dest, u64 size) mddt = (void *)(MDDT_TABLE_BASE); /* Check for duplicate entry */ - for (i = 0; i < ntuple_mdst->act_cnt; i++) { - if (mdst->addr == (src | HRMOR_BIT)) { + for (i = 0; i < mdst_cnt; i++) { + if (be64_to_cpu(mdst->addr) == (src | HRMOR_BIT)) { prlog(PR_DEBUG, "Duplicate source address : 0x%llx", src); return OPAL_PARAMETER; } mdst++; } - for (i = 0; i < ntuple_mddt->act_cnt; i++) { - if (mddt->addr == (dest | HRMOR_BIT)) { + for (i = 0; i < mddt_cnt; i++) { + if (be64_to_cpu(mddt->addr) == (dest | HRMOR_BIT)) { prlog(PR_DEBUG, "Duplicate destination address : 0x%llx", dest); return OPAL_PARAMETER; @@ -107,16 +107,16 @@ static int opal_mpipl_add_entry(u8 region, u64 src, u64 dest, u64 size) } /* Add OPAL source address to MDST entry */ - mdst->addr = src | HRMOR_BIT; + mdst->addr = cpu_to_be64(src | HRMOR_BIT); mdst->data_region = region; - mdst->size = size; - ntuple_mdst->act_cnt++; + mdst->size = cpu_to_be32(size); + ntuple_mdst->act_cnt = cpu_to_be16(mdst_cnt + 1); /* Add OPAL destination address to MDDT entry */ - mddt->addr = dest | HRMOR_BIT; + mddt->addr = cpu_to_be64(dest | HRMOR_BIT); mddt->data_region = region; - mddt->size = size; - ntuple_mddt->act_cnt++; + mddt->size = cpu_to_be32(size); + ntuple_mddt->act_cnt = cpu_to_be16(mddt_cnt + 1); prlog(PR_TRACE, "Added new entry. src : 0x%llx, dest : 0x%llx," " size : 0x%llx\n", src, dest, size); @@ -128,17 +128,19 @@ static int opal_mpipl_remove_entry_mdst(bool remove_all, u8 region, u64 src) { bool found = false; int i, j; + int mdst_cnt = be16_to_cpu(ntuple_mdst->act_cnt); struct mdst_table *tmp_mdst; struct mdst_table *mdst = (void *)(MDST_TABLE_BASE); - for (i = 0; i < ntuple_mdst->act_cnt;) { + for (i = 0; i < mdst_cnt;) { if (mdst->data_region != region) { mdst++; i++; continue; } - if (remove_all != true && mdst->addr != (src | HRMOR_BIT)) { + if (remove_all != true && + be64_to_cpu(mdst->addr) != (src | HRMOR_BIT)) { mdst++; i++; continue; @@ -147,14 +149,14 @@ static int opal_mpipl_remove_entry_mdst(bool remove_all, u8 region, u64 src) tmp_mdst = mdst; memset(tmp_mdst, 0, sizeof(struct mdst_table)); - for (j = i; j < ntuple_mdst->act_cnt - 1; j++) { + for (j = i; j < mdst_cnt - 1; j++) { memcpy((void *)tmp_mdst, (void *)(tmp_mdst + 1), sizeof(struct mdst_table)); tmp_mdst++; memset(tmp_mdst, 0, sizeof(struct mdst_table)); } - ntuple_mdst->act_cnt--; + mdst_cnt--; if (remove_all == false) { found = true; @@ -162,6 +164,8 @@ static int opal_mpipl_remove_entry_mdst(bool remove_all, u8 region, u64 src) } } /* end - for loop */ + ntuple_mdst->act_cnt = cpu_to_be16((u16)mdst_cnt); + if (remove_all == false && found == false) { prlog(PR_DEBUG, "Source address [0x%llx] not found in MDST table\n", src); @@ -176,17 +180,19 @@ static int opal_mpipl_remove_entry_mddt(bool remove_all, u8 region, u64 dest) { bool found = false; int i, j; + int mddt_cnt = be16_to_cpu(ntuple_mddt->act_cnt); struct mddt_table *tmp_mddt; struct mddt_table *mddt = (void *)(MDDT_TABLE_BASE); - for (i = 0; i < ntuple_mddt->act_cnt;) { + for (i = 0; i < mddt_cnt;) { if (mddt->data_region != region) { mddt++; i++; continue; } - if (remove_all != true && mddt->addr != (dest | HRMOR_BIT)) { + if (remove_all != true && + be64_to_cpu(mddt->addr) != (dest | HRMOR_BIT)) { mddt++; i++; continue; @@ -195,14 +201,14 @@ static int opal_mpipl_remove_entry_mddt(bool remove_all, u8 region, u64 dest) tmp_mddt = mddt; memset(tmp_mddt, 0, sizeof(struct mddt_table)); - for (j = i; j < ntuple_mddt->act_cnt - 1; j++) { + for (j = i; j < mddt_cnt - 1; j++) { memcpy((void *)tmp_mddt, (void *)(tmp_mddt + 1), sizeof(struct mddt_table)); tmp_mddt++; memset(tmp_mddt, 0, sizeof(struct mddt_table)); } - ntuple_mddt->act_cnt--; + mddt_cnt--; if (remove_all == false) { found = true; @@ -210,6 +216,8 @@ static int opal_mpipl_remove_entry_mddt(bool remove_all, u8 region, u64 dest) } } /* end - for loop */ + ntuple_mddt->act_cnt = cpu_to_be16((u16)mddt_cnt); + if (remove_all == false && found == false) { prlog(PR_DEBUG, "Dest address [0x%llx] not found in MDDT table\n", dest); @@ -258,8 +266,8 @@ static void opal_mpipl_register(void) /* Reserve memory used to capture architected register state */ mem_reserve_fw("ibm,firmware-arch-registers", arch_regs_dest, arch_regs_size); - proc_dump->alloc_addr = arch_regs_dest | HRMOR_BIT; - proc_dump->alloc_size = arch_regs_size; + proc_dump->alloc_addr = cpu_to_be64(arch_regs_dest | HRMOR_BIT); + proc_dump->alloc_size = cpu_to_be32(arch_regs_size); prlog(PR_NOTICE, "Architected register dest addr : 0x%llx, " "size : 0x%llx\n", arch_regs_dest, arch_regs_size); } @@ -339,7 +347,7 @@ static int64_t opal_mpipl_update(enum opal_mpipl_ops ops, /* Clear MDRT table */ memset((void *)MDRT_TABLE_BASE, 0, MDRT_TABLE_SIZE); /* Set MDRT count to max allocated count */ - ntuple_mdrt->act_cnt = MDRT_TABLE_SIZE / sizeof(struct mdrt_table); + ntuple_mdrt->act_cnt = cpu_to_be16(MDRT_TABLE_SIZE / sizeof(struct mdrt_table)); rc = OPAL_SUCCESS; prlog(PR_NOTICE, "Payload Invalidated MPIPL\n"); break; @@ -380,8 +388,7 @@ static int64_t opal_mpipl_register_tag(enum opal_mpipl_tags tag, return rc; } -static uint64_t opal_mpipl_query_tag(enum opal_mpipl_tags tag, - uint64_t *tag_val) +static uint64_t opal_mpipl_query_tag(enum opal_mpipl_tags tag, __be64 *tag_val) { if (!opal_addr_valid(tag_val)) { prlog(PR_DEBUG, "Invalid tag address\n"); @@ -391,7 +398,7 @@ static uint64_t opal_mpipl_query_tag(enum opal_mpipl_tags tag, if (tag >= opal_mpipl_max_tags) return OPAL_PARAMETER; - *tag_val = opal_mpipl_tags[tag]; + *tag_val = cpu_to_be64(opal_mpipl_tags[tag]); return OPAL_SUCCESS; } @@ -426,13 +433,13 @@ static void post_mpipl_arch_regs_data(void) /* Fill CPU register details */ opal_mpipl_cpu_data->version = OPAL_MPIPL_VERSION; - opal_mpipl_cpu_data->cpu_data_version = proc_dump->version; + opal_mpipl_cpu_data->cpu_data_version = cpu_to_be32((u32)proc_dump->version); opal_mpipl_cpu_data->cpu_data_size = proc_dump->thread_size; opal_mpipl_cpu_data->region_cnt = cpu_to_be32(1); - opal_mpipl_cpu_data->region[0].src = proc_dump->dest_addr & ~(HRMOR_BIT); - opal_mpipl_cpu_data->region[0].dest = proc_dump->dest_addr & ~(HRMOR_BIT); - opal_mpipl_cpu_data->region[0].size = proc_dump->act_size; + opal_mpipl_cpu_data->region[0].src = proc_dump->dest_addr & ~(cpu_to_be64(HRMOR_BIT)); + opal_mpipl_cpu_data->region[0].dest = proc_dump->dest_addr & ~(cpu_to_be64(HRMOR_BIT)); + opal_mpipl_cpu_data->region[0].size = cpu_to_be64(be32_to_cpu(proc_dump->act_size)); /* Update tag */ opal_mpipl_tags[OPAL_MPIPL_TAG_CPU] = (u64)opal_mpipl_cpu_data; @@ -442,7 +449,7 @@ static void post_mpipl_get_opal_data(void) { struct mdrt_table *mdrt = (void *)(MDRT_TABLE_BASE); int i, j = 0, count = 0; - u32 mdrt_cnt = ntuple_mdrt->act_cnt; + int mdrt_cnt = be16_to_cpu(ntuple_mdrt->act_cnt); struct opal_mpipl_region *region; /* Count OPAL dump regions */ @@ -466,8 +473,8 @@ static void post_mpipl_get_opal_data(void) /* Fill OPAL dump details */ opal_mpipl_data->version = OPAL_MPIPL_VERSION; - opal_mpipl_data->crashing_pir = mpipl_metadata->crashing_pir; - opal_mpipl_data->region_cnt = count; + opal_mpipl_data->crashing_pir = cpu_to_be32(mpipl_metadata->crashing_pir); + opal_mpipl_data->region_cnt = cpu_to_be32(count); region = opal_mpipl_data->region; mdrt = (void *)(MDRT_TABLE_BASE); @@ -477,13 +484,14 @@ static void post_mpipl_get_opal_data(void) continue; } - region[j].src = mdrt->src_addr & ~(HRMOR_BIT); - region[j].dest = mdrt->dest_addr & ~(HRMOR_BIT); - region[j].size = mdrt->size; + region[j].src = mdrt->src_addr & ~(cpu_to_be64(HRMOR_BIT)); + region[j].dest = mdrt->dest_addr & ~(cpu_to_be64(HRMOR_BIT)); + region[j].size = cpu_to_be64(be32_to_cpu(mdrt->size)); prlog(PR_NOTICE, "OPAL reserved region %d - src : 0x%llx, " - "dest : 0x%llx, size : 0x%llx\n", j, region[j].src, - region[j].dest, region[j].size); + "dest : 0x%llx, size : 0x%llx\n", j, + be64_to_cpu(region[j].src), be64_to_cpu(region[j].dest), + be64_to_cpu(region[j].size)); mdrt++; j++; diff --git a/include/opal-api.h b/include/opal-api.h index b577952ea..b4a7474f4 100644 --- a/include/opal-api.h +++ b/include/opal-api.h @@ -1229,9 +1229,9 @@ enum opal_mpipl_tags { /* Preserved memory details */ struct opal_mpipl_region { - u64 src; - u64 dest; - u64 size; + __be64 src; + __be64 dest; + __be64 size; }; /* Structure version */ @@ -1240,10 +1240,10 @@ struct opal_mpipl_region { struct opal_mpipl_fadump { u8 version; u8 reserved[7]; - u32 crashing_pir; /* OPAL crashing CPU PIR */ - u32 cpu_data_version; - u32 cpu_data_size; - u32 region_cnt; + __be32 crashing_pir; /* OPAL crashing CPU PIR */ + __be32 cpu_data_version; + __be32 cpu_data_size; + __be32 region_cnt; struct opal_mpipl_region region[]; }; From patchwork Thu Nov 28 06:24:37 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Nicholas Piggin X-Patchwork-Id: 1201918 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.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 47Nnsl62twz9s7T for ; Thu, 28 Nov 2019 17:34:03 +1100 (AEDT) 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="kGBdlZUp"; 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 47Nnsl4TYczDqyc for ; Thu, 28 Nov 2019 17:34:03 +1100 (AEDT) X-Original-To: skiboot@lists.ozlabs.org Delivered-To: skiboot@lists.ozlabs.org Authentication-Results: lists.ozlabs.org; spf=pass (sender SPF authorized) smtp.mailfrom=gmail.com (client-ip=2607:f8b0:4864:20::543; helo=mail-pg1-x543.google.com; envelope-from=npiggin@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="kGBdlZUp"; dkim-atps=neutral Received: from mail-pg1-x543.google.com (mail-pg1-x543.google.com [IPv6:2607:f8b0:4864:20::543]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (2048 bits) server-digest SHA256) (No client certificate requested) by lists.ozlabs.org (Postfix) with ESMTPS id 47NnjF3JLGzDqJT for ; Thu, 28 Nov 2019 17:26:41 +1100 (AEDT) Received: by mail-pg1-x543.google.com with SMTP id b10so12380717pgd.4 for ; Wed, 27 Nov 2019 22:26:41 -0800 (PST) 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 :mime-version:content-transfer-encoding; bh=nbK3P51iV91Lhm+V6LgZgLT1Nyd+Sf5dGmmno7i0JiI=; b=kGBdlZUpVfpFuBH7voEB0Ul1bOWE+1AC/9HwGU8Fj0qiBRyZ6oSUkUzE8NtySQBsXm adlUbM7qtGKrwlTP+O5oIqJ/LybcKG6ucYE4DZUjc4krOPgDolqSkCbkdbhaMt/ock7j a6oE7QWwhilroEpg1kd77cg2Y6Xel/QpOBthbhcKX5XgpdqTWLEkRY7/DiajM+rMBY0/ NobgUtP0YOH2J4Az1DepmCl7PUst1Qr5GdG0LIYumBfFTgLvdRPZOJZbJE31vQMAUptM Nj48f+Y3Eh8k+0BxU5I5S6S6iOZClwJAQb+OzU7LMfkvf2zNHA51Ndi773pWxjUEYmRo puLQ== 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:mime-version:content-transfer-encoding; bh=nbK3P51iV91Lhm+V6LgZgLT1Nyd+Sf5dGmmno7i0JiI=; b=ANPm7DM0L6GMZ0YPgzIcvRPdjQpvK6HT0NbM6oA8bqOJciDuNmpRmviemWwqEmujRM ptloyvZi01NFtYcdiyvipnqUVVcX5FK7uBN5FUzyy2j/bnBn6xn48kN9U8kpU3OmAPa8 wKShpPDtb5Goj3OMVFPxJqlifrWWzs/22ixkrnqEyDuZ1JaBaFZzCClhDgI68kX6qWRA oL0eheh05wyPWSBHRCcCFLP/fKc7HaIFlXcupV4TjL+/dz995XiWbSp7MbSNlQ2A0ETr 8PKxL6ZmNH468sXeuVmopSdylKP0xAbc7EGl7sP/VkemiJ+78BVZs9lWZUcBupYlUTwr 3TdQ== X-Gm-Message-State: APjAAAUkId07a/D8mRYc2Nn1T115bwmDX4poCJweITx3q5qNgUM+Azwj F39tV4Ruyq5YM/n2qGGJU1kGCtXNBAM= X-Google-Smtp-Source: APXvYqxZVWXFiKcD4rLXI13rF8wMLruaZpufCAjhsz7lqRkMsNH59XYs28z0k6bNWNOTSpG0zWB4LA== X-Received: by 2002:a63:fb15:: with SMTP id o21mr9350019pgh.193.1574922397661; Wed, 27 Nov 2019 22:26:37 -0800 (PST) Received: from bobo.local0.net ([203.194.47.34]) by smtp.gmail.com with ESMTPSA id e5sm8463196pjv.29.2019.11.27.22.26.35 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 27 Nov 2019 22:26:37 -0800 (PST) From: Nicholas Piggin To: skiboot@lists.ozlabs.org Date: Thu, 28 Nov 2019 16:24:37 +1000 Message-Id: <20191128062442.20690-24-npiggin@gmail.com> X-Mailer: git-send-email 2.23.0 In-Reply-To: <20191128062442.20690-1-npiggin@gmail.com> References: <20191128062442.20690-1-npiggin@gmail.com> MIME-Version: 1.0 Subject: [Skiboot] [PATCH v8 23/28] sfc-ctrl: endian conversions X-BeenThere: skiboot@lists.ozlabs.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: Mailing list for skiboot development List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: skiboot-bounces+incoming=patchwork.ozlabs.org@lists.ozlabs.org Sender: "Skiboot" Signed-off-by: Nicholas Piggin --- hw/sfc-ctrl.c | 19 +++++++++---------- 1 file changed, 9 insertions(+), 10 deletions(-) diff --git a/hw/sfc-ctrl.c b/hw/sfc-ctrl.c index f17b8de29..d66be09eb 100644 --- a/hw/sfc-ctrl.c +++ b/hw/sfc-ctrl.c @@ -110,33 +110,32 @@ struct sfc_ctrl { /* Command register support */ static inline int sfc_reg_read(uint8_t reg, uint32_t *val) { - uint32_t tmp; int rc; *val = 0xffffffff; - rc = lpc_fw_read32(&tmp, SFC_CMDREG_OFFSET + reg); + rc = lpc_fw_read32(val, SFC_CMDREG_OFFSET + reg); if (rc) return rc; - *val = be32_to_cpu(tmp); return 0; } static inline int sfc_reg_write(uint8_t reg, uint32_t val) { - return lpc_fw_write32(cpu_to_be32(val), SFC_CMDREG_OFFSET + reg); + return lpc_fw_write32(val, SFC_CMDREG_OFFSET + reg); } static int sfc_buf_write(uint32_t len, const void *data) { - uint32_t tmp, off = 0; + __be32 tmp; + uint32_t off = 0; int rc; if (len > SFC_CMDBUF_SIZE) return FLASH_ERR_PARM_ERROR; while (len >= 4) { - tmp = *(const uint32_t *)data; - rc = lpc_fw_write32(tmp, SFC_CMDBUF_OFFSET + off); + tmp = cpu_to_be32(*(const uint32_t *)data); + rc = lpc_fw_write32((u32)tmp, SFC_CMDBUF_OFFSET + off); if (rc) return rc; off += 4; @@ -150,9 +149,9 @@ static int sfc_buf_write(uint32_t len, const void *data) * in memory with memcpy. The swap in the register on LE doesn't * matter, the result in memory will be in the right order. */ - tmp = -1; - memcpy(&tmp, data, len); - return lpc_fw_write32(tmp, SFC_CMDBUF_OFFSET + off); + tmp = cpu_to_be32(-1); + memcpy(&tmp, data, len); /* XXX: is this right? */ + return lpc_fw_write32((u32)tmp, SFC_CMDBUF_OFFSET + off); } static int sfc_buf_read(uint32_t len, void *data) From patchwork Thu Nov 28 06:24:38 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Nicholas Piggin X-Patchwork-Id: 1201919 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.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 47Nnt43HXXz9s7T for ; Thu, 28 Nov 2019 17:34:20 +1100 (AEDT) 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="vT8kUOpX"; 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 47Nnt40kdLzDr28 for ; Thu, 28 Nov 2019 17:34:20 +1100 (AEDT) X-Original-To: skiboot@lists.ozlabs.org Delivered-To: skiboot@lists.ozlabs.org Authentication-Results: lists.ozlabs.org; spf=pass (sender SPF authorized) smtp.mailfrom=gmail.com (client-ip=2607:f8b0:4864:20::643; helo=mail-pl1-x643.google.com; envelope-from=npiggin@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="vT8kUOpX"; dkim-atps=neutral Received: from mail-pl1-x643.google.com (mail-pl1-x643.google.com [IPv6:2607:f8b0:4864:20::643]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (2048 bits) server-digest SHA256) (No client certificate requested) by lists.ozlabs.org (Postfix) with ESMTPS id 47NnjG5FYYzDqCZ for ; Thu, 28 Nov 2019 17:26:42 +1100 (AEDT) Received: by mail-pl1-x643.google.com with SMTP id j12so11131758plt.9 for ; Wed, 27 Nov 2019 22:26:42 -0800 (PST) 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 :mime-version:content-transfer-encoding; bh=SL7UNLdugsPghYw05DJG1KDl3UGUGPux1AGljYGSNsg=; b=vT8kUOpXXUCfk9GkZ32/BVwKJV+shOql6x3PF6FVb7u7CaYV8l2w9gLqvHWZ9/RZSx yIcy061R4JGYnJ1JcfFbO8ULCyyO1HfpHAp0D7mChCRJO8JfMHwr2tskv87lcgnZd/Cq S9fOYkJzPzc4SSmsedCEwKJkxt1AiLZ0eUwu7JGa29ct2dhXpjMRAaDQlLXsNH6/5LVJ b63mE4Mbons7ZFXkGl7Kg6pRrHVFkB5IELbJUtFcQ8Rlg6baV+rVu3K2/KIPj5GTTQ4f BJJAtHtu0VrhmSakgXGjWAyDDJb9rtUbXSZ2aeNiowT4jKeQnFlf0jXiuaRHSZ6MsEH1 pFKw== 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:mime-version:content-transfer-encoding; bh=SL7UNLdugsPghYw05DJG1KDl3UGUGPux1AGljYGSNsg=; b=jovLPQVfbxiKhZZXykO/X04c2lCk4t10ARdreCcIsTdaHwoIIx6a7KWyScagQnzyKp OZFaDNI1ZqLOq6YVd3djTWdZgR9aXz049RTXTMCd1a83kRRluHnp2zMYzsojK4wuUVTS PB6hM9MmBzBR0MMXwy42p1DJc0YxsIDQhmyHmb1uqm5JDIvY3vkp2Wm9NYp0Gqy1bFNK v0vFSCc8TVY4SOW8rPJ2TtZc19fjnDqAVfyiXYDeu8VNr5mvNv93GTwPqWb1qNrF1/+K uxL3V5koArxe+4Jw3jiNiQvIKyXcQ0HcGrWHDgKjA2acR1KwKv/LvN0Vjb5qrRQGk3Qr 4HoA== X-Gm-Message-State: APjAAAV+J3L+bjOmr524HP8V0JcRDQ2tasYHkeBdIG8UlNjuDiohNQml mmjjt+ZP3L8uTer694YK3CaTFhqw/eA= X-Google-Smtp-Source: APXvYqw1qrYn1aHtqXPNhjint56pBoex+Si0YPcgNPFFS6XC4cKpj9hua6PBrSE5eyj8S2c+uP7+5w== X-Received: by 2002:a17:90a:d597:: with SMTP id v23mr10461137pju.112.1574922400491; Wed, 27 Nov 2019 22:26:40 -0800 (PST) Received: from bobo.local0.net ([203.194.47.34]) by smtp.gmail.com with ESMTPSA id e5sm8463196pjv.29.2019.11.27.22.26.38 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 27 Nov 2019 22:26:39 -0800 (PST) From: Nicholas Piggin To: skiboot@lists.ozlabs.org Date: Thu, 28 Nov 2019 16:24:38 +1000 Message-Id: <20191128062442.20690-25-npiggin@gmail.com> X-Mailer: git-send-email 2.23.0 In-Reply-To: <20191128062442.20690-1-npiggin@gmail.com> References: <20191128062442.20690-1-npiggin@gmail.com> MIME-Version: 1.0 Subject: [Skiboot] [PATCH v8 24/28] add little endian support X-BeenThere: skiboot@lists.ozlabs.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: Mailing list for skiboot development List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: skiboot-bounces+incoming=patchwork.ozlabs.org@lists.ozlabs.org Sender: "Skiboot" This adds support for building LE skiboot with LITTLE_ENDIAN=1. This is not complete, notably PHB3, NPU* and *CAPI*, but it is sufficient to build and boot on mambo and OpenPOWER POWER9 systems. LE/ELFv2 is a nicer calling convention, and results in smaller image and less stack usage. It also follows the rest of the Linux/OpenPOWER stack moving to LE. The OPALv3 call interface still requires an ugly transition through BE for compatibility, but that is all handled on the OPAL side. Signed-off-by: Nicholas Piggin --- Makefile.main | 38 ++++++++++++-- asm/head.S | 66 +++++++++++++++++------- core/cpu.c | 24 +++++++-- core/init.c | 1 + doc/stb.rst | 2 +- include/asm-utils.h | 22 ++++++-- include/cpu.h | 3 ++ libpore/p9_cpu_reg_restore_instruction.H | 23 +++++---- 8 files changed, 135 insertions(+), 44 deletions(-) diff --git a/Makefile.main b/Makefile.main index 4d7ebcec9..e26a9ab17 100644 --- a/Makefile.main +++ b/Makefile.main @@ -67,21 +67,35 @@ CPPFLAGS += -I$(SRC)/libfdt -I$(SRC)/libflash -I$(SRC)/libxz -I$(SRC)/libc/inclu CPPFLAGS += -I$(SRC)/libpore CPPFLAGS += -D__SKIBOOT__ -nostdinc CPPFLAGS += -isystem $(shell $(CC) -print-file-name=include) -CPPFLAGS += -DBITS_PER_LONG=64 -DHAVE_BIG_ENDIAN +CPPFLAGS += -DBITS_PER_LONG=64 + # We might want to remove our copy of stdint.h # but that means uint64_t becomes an ulong instead of an ullong # causing all our printf's to warn CPPFLAGS += -ffreestanding +ifeq ($(LITTLE_ENDIAN),1) +CPPFLAGS += -DHAVE_LITTLE_ENDIAN +else +CPPFLAGS += -DHAVE_BIG_ENDIAN +endif + ifeq ($(DEBUG),1) CPPFLAGS += -DDEBUG -DCCAN_LIST_DEBUG endif -CFLAGS := -fno-strict-aliasing -pie -fpie -fno-pic -mbig-endian -m64 -fno-asynchronous-unwind-tables +CFLAGS := -fno-strict-aliasing -pie -fpie -fno-pic -m64 -fno-asynchronous-unwind-tables CFLAGS += -mcpu=power8 CFLAGS += -Wl,--oformat,elf64-powerpc -ggdb CFLAGS += $(call try-cflag,$(CC),-ffixed-r13) CFLAGS += $(call try-cflag,$(CC),-std=gnu11) + +ifeq ($(LITTLE_ENDIAN),1) +CFLAGS += -mlittle-endian +else +CFLAGS += -mbig-endian +endif + ifeq ($(ELF_ABI_v2),1) CFLAGS += $(call try-cflag,$(CC),-mabi=elfv2) else @@ -139,8 +153,8 @@ LDFLAGS := -m64 -static -nostdlib -pie LDFLAGS += -Wl,-pie LDFLAGS += -Wl,-Ttext-segment,$(LD_TEXT) -Wl,-N -Wl,--build-id=none LDFLAGS += -Wl,--no-multi-toc -LDFLAGS += -mcpu=power8 -mbig-endian -Wl,--oformat,elf64-powerpc -LDFLAGS_FINAL = -EB -m elf64ppc --no-multi-toc -N --build-id=none --whole-archive +LDFLAGS += -mcpu=power8 -Wl,--oformat,elf64-powerpc +LDFLAGS_FINAL = -m elf64lppc --no-multi-toc -N --build-id=none --whole-archive LDFLAGS_FINAL += -static -nostdlib -pie -Ttext-segment=$(LD_TEXT) --oformat=elf64-powerpc LDFLAGS_FINAL += --orphan-handling=warn @@ -148,11 +162,25 @@ LDRFLAGS=-melf64ppc # Debug stuff #LDFLAGS += -Wl,-v -Wl,-Map,foomap +ifeq ($(LITTLE_ENDIAN),1) +LDFLAGS += -mlittle-endian +LDFLAGS_FINAL += -EL +else +LDFLAGS += -mbig-endian +LDFLAGS_FINAL += -EB +endif + ifeq ($(DEAD_CODE_ELIMINATION),1) LDFLAGS += -Wl,--gc-sections endif -AFLAGS := -D__ASSEMBLY__ -mbig-endian -m64 +AFLAGS := -D__ASSEMBLY__ -m64 +ifeq ($(LITTLE_ENDIAN),1) +AFLAGS += -mlittle-endian +else +AFLAGS += -mbig-endian +endif + ifeq ($(ELF_ABI_v2),1) AFLAGS += $(call try-cflag,$(CC),-mabi=elfv2) else diff --git a/asm/head.S b/asm/head.S index b38cc870b..b565f6c9c 100644 --- a/asm/head.S +++ b/asm/head.S @@ -43,6 +43,7 @@ __head: . = 0x10 .global fdt_entry fdt_entry: + FIXUP_ENDIAN mr %r27,%r3 b boot_entry @@ -89,6 +90,7 @@ hir_trigger: . = 0x100 sreset_vector: /* BML entry, load up r3 with device tree location */ + FIXUP_ENDIAN li %r3, 0 oris %r3, %r3, 0xa b fdt_entry /* hack for lab boot */ @@ -96,6 +98,7 @@ sreset_vector: /* Entry point set by the FSP */ .= 0x180 hdat_entry: + FIXUP_ENDIAN li %r27,0 b boot_entry @@ -364,7 +367,11 @@ boot_entry: add %r2,%r2,%r29 /* Fixup our MSR (remove TA) */ +#if HAVE_BIG_ENDIAN LOAD_IMM64(%r3, (MSR_HV | MSR_SF)) +#else + LOAD_IMM64(%r3, (MSR_HV | MSR_SF | MSR_LE)) +#endif mtmsrd %r3,0 /* Check our PIR, avoid threads */ @@ -702,14 +709,18 @@ init_shared_sprs: mtspr SPR_TSCR, %r3 /* HID0: Clear bit 13 (enable core recovery) - * Clear bit 19 (HILE) + * Set/clear bit 19 (HILE) depending on skiboot endian */ mfspr %r3,SPR_HID0 li %r0,1 sldi %r4,%r0,(63-13) - sldi %r5,%r0,(63-19) - or %r0,%r4,%r5 - andc %r3,%r3,%r0 + andc %r3,%r3,%r4 + sldi %r4,%r0,(63-19) +#if HAVE_BIG_ENDIAN + andc %r3,%r3,%r4 +#else + or %r3,%r3,%r4 +#endif sync mtspr SPR_HID0,%r3 mfspr %r3,SPR_HID0 @@ -736,17 +747,21 @@ init_shared_sprs: LOAD_IMM32(%r3,0x80287880) mtspr SPR_TSCR, %r3 /* HID0: Clear bit 5 (enable core recovery) - * Clear bit 4 (HILE) + * Set/clear bit 4 (HILE) depending on skiboot endian * Set bit 8 (radix) */ mfspr %r3,SPR_HID0 li %r0,1 - sldi %r4,%r0,(63-8) + sldi %r4,%r0,(63-4) +#if HAVE_BIG_ENDIAN + andc %r3,%r3,%r4 +#else or %r3,%r3,%r4 +#endif sldi %r4,%r0,(63-5) - sldi %r5,%r0,(63-4) - or %r0,%r4,%r5 - andc %r3,%r3,%r0 + andc %r3,%r3,%r4 + sldi %r4,%r0,(63-8) + or %r3,%r3,%r4 sync mtspr SPR_HID0,%r3 isync @@ -826,6 +841,8 @@ enter_nap: .balign 0x10 .global opal_entry opal_entry: + OPAL_ENTRY_TO_SKIBOOT_ENDIAN + /* Get our per CPU pointer in r12 to check for quiesce */ mfspr %r12,SPR_PIR GET_STACK(%r12,%r12) @@ -971,20 +988,33 @@ opal_entry: lwz %r11,CPUTHREAD_IN_OPAL_CALL(%r12) subi %r11,%r11,1 stw %r11,CPUTHREAD_IN_OPAL_CALL(%r12) +#if HAVE_BIG_ENDIAN /* * blr with BH=01b means it's not a function return, OPAL was entered * via (h)rfid not bl, so we don't have a corresponding link stack * prediction to return to here. */ bclr 20,0,1 +#else + mflr %r12 + mtspr SPR_HSRR0,%r12 + mfmsr %r11 + li %r12,MSR_LE + andc %r11,%r11,%r12 + mtspr SPR_HSRR1,%r11 + hrfid +#endif .global start_kernel start_kernel: + LOAD_IMM64(%r10,MSR_HV|MSR_SF) +__start_kernel: sync icbi 0,%r3 sync isync - mtctr %r3 + mtspr SPR_HSRR0,%r3 + mtspr SPR_HSRR1,%r10 mr %r3,%r4 LOAD_IMM64(%r8,SKIBOOT_BASE); LOAD_IMM32(%r10, opal_entry - __head) @@ -993,21 +1023,19 @@ start_kernel: addi %r7,%r5,1 li %r4,0 li %r5,0 - bctr + hrfid .global start_kernel32 start_kernel32: - mfmsr %r10 - clrldi %r10,%r10,1 - mtmsrd %r10,0 - sync - isync - b start_kernel + LOAD_IMM64(%r10,MSR_HV) + b __start_kernel .global start_kernel_secondary start_kernel_secondary: sync isync - mtctr %r3 + LOAD_IMM64(%r10,MSR_HV|MSR_SF) + mtspr SPR_HSRR0,%r3 + mtspr SPR_HSRR1,%r10 mfspr %r3,SPR_PIR - bctr + hrfid diff --git a/core/cpu.c b/core/cpu.c index 370bf4b03..d5b7d623b 100644 --- a/core/cpu.c +++ b/core/cpu.c @@ -42,7 +42,7 @@ static unsigned long hid0_attn; static bool sreset_enabled; static bool ipi_enabled; static bool pm_enabled; -static bool current_hile_mode; +static bool current_hile_mode = HAVE_LITTLE_ENDIAN; static bool current_radix_mode = true; static bool tm_suspend_enabled; @@ -1415,6 +1415,24 @@ static int64_t cpu_change_all_hid0(struct hid0_change_req *req) return OPAL_SUCCESS; } +void cpu_set_hile_mode(bool hile) +{ + struct hid0_change_req req; + + if (hile == current_hile_mode) + return; + + if (hile) { + req.clr_bits = 0; + req.set_bits = hid0_hile; + } else { + req.clr_bits = hid0_hile; + req.set_bits = 0; + } + cpu_change_all_hid0(&req); + current_hile_mode = hile; +} + static void cpu_cleanup_one(void *param __unused) { mtspr(SPR_AMR, 0); @@ -1453,8 +1471,8 @@ static int64_t cpu_cleanup_all(void) void cpu_fast_reboot_complete(void) { - /* Fast reboot will have cleared HID0:HILE */ - current_hile_mode = false; + /* Fast reboot will have set HID0:HILE to skiboot endian */ + current_hile_mode = HAVE_LITTLE_ENDIAN; /* and set HID0:RADIX */ current_radix_mode = true; diff --git a/core/init.c b/core/init.c index b7bf2e50c..16f4a4f53 100644 --- a/core/init.c +++ b/core/init.c @@ -632,6 +632,7 @@ void __noreturn load_and_boot_kernel(bool is_reboot) cpu_disable_ME_RI_all(); patch_traps(false); + cpu_set_hile_mode(false); /* Clear HILE on all CPUs */ checksum_romem(); diff --git a/doc/stb.rst b/doc/stb.rst index 6fc8f73da..84855ca55 100644 --- a/doc/stb.rst +++ b/doc/stb.rst @@ -92,7 +92,7 @@ CVC-verify Service .. code-block:: c int call_cvc_verify(void *buf, size_t size, const void *hw_key_hash, - size_t hw_key_hash_size, uint64_t *log) + size_t hw_key_hash_size, __be64 *log) This function wrapper calls into the *CVC-verify*, which verifies if the firmware code provided in ``@buf`` is properly signed with the keys trusted by diff --git a/include/asm-utils.h b/include/asm-utils.h index 2d26545e7..c3d8c09ea 100644 --- a/include/asm-utils.h +++ b/include/asm-utils.h @@ -28,17 +28,29 @@ /* Load an address via the TOC */ #define LOAD_ADDR_FROM_TOC(r, e) ld r,e@got(%r2) -#define FIXUP_ENDIAN \ - tdi 0,0,0x48; /* Reverse endian of b . + 8 */ \ - b 191f; /* Skip trampoline if endian is good */ \ +/* This must preserve LR, so can't use Linux kernel's FIXUP_ENDIAN */ +#define SWITCH_ENDIAN \ .long 0xa600607d; /* mfmsr r11 */ \ .long 0x01006b69; /* xori r11,r11,1 */ \ + .long 0xa64b7b7d; /* mthsrr1 r11 */ \ + .long 0xa602687d; /* mflr r11 */ \ .long 0x05009f42; /* bcl 20,31,$+4 */ \ .long 0xa602487d; /* mflr r10 */ \ .long 0x14004a39; /* addi r10,r10,20 */ \ .long 0xa64b5a7d; /* mthsrr0 r10 */ \ - .long 0xa64b7b7d; /* mthsrr1 r11 */ \ - .long 0x2402004c; /* hrfid */ \ + .long 0xa603687d; /* mtlr r11 */ \ + .long 0x2402004c /* hrfid */ + +#define FIXUP_ENDIAN \ + tdi 0,0,0x48; /* Reverse endian of b . + 8 */ \ + b 191f; /* Skip trampoline if endian is good */ \ + SWITCH_ENDIAN; /* Do the switch */ \ 191: +#if HAVE_BIG_ENDIAN +#define OPAL_ENTRY_TO_SKIBOOT_ENDIAN +#else +#define OPAL_ENTRY_TO_SKIBOOT_ENDIAN SWITCH_ENDIAN +#endif + #endif /* __ASM_UTILS_H */ diff --git a/include/cpu.h b/include/cpu.h index 7b1c1bcf3..686310d71 100644 --- a/include/cpu.h +++ b/include/cpu.h @@ -282,6 +282,9 @@ extern void cpu_process_local_jobs(void); /* Check if there's any job pending */ bool cpu_check_jobs(struct cpu_thread *cpu); +/* Set/clear HILE on all CPUs */ +void cpu_set_hile_mode(bool hile); + /* OPAL sreset vector in place at 0x100 */ void cpu_set_sreset_enable(bool sreset_enabled); diff --git a/libpore/p9_cpu_reg_restore_instruction.H b/libpore/p9_cpu_reg_restore_instruction.H index dd4358a82..cf00ff5e5 100644 --- a/libpore/p9_cpu_reg_restore_instruction.H +++ b/libpore/p9_cpu_reg_restore_instruction.H @@ -61,23 +61,24 @@ enum RLDICR_CONST = 1, MTSPR_CONST1 = 467, MTMSRD_CONST1 = 178, - MR_R0_TO_R10 = 0x7c0a0378, //mr r10, r0 - MR_R0_TO_R21 = 0x7c150378, //mr r21, r0 - MR_R0_TO_R9 = 0x7c090378, //mr r9, r0 - URMOR_CORRECTION = 0x7d397ba6, MFSPR_CONST = 339, - BLR_INST = 0x4e800020, - MTSPR_BASE_OPCODE = 0x7c0003a6, - ATTN_OPCODE = 0x00000200, OPCODE_18 = 18, SELF_SAVE_FUNC_ADD = 0x2300, SELF_SAVE_OFFSET = 0x180, - SKIP_SPR_REST_INST = 0x4800001c, //b . +0x01c - MFLR_R30 = 0x7fc802a6, - SKIP_SPR_SELF_SAVE = 0x3bff0020, //addi r31 r31, 0x20 - MTLR_INST = 0x7fc803a6 //mtlr r30 }; +#define MR_R0_TO_R10 0x7c0a0378UL //mr r10 r0 +#define MR_R0_TO_R21 0x7c150378UL //mr r21 r0 +#define MR_R0_TO_R9 0x7c090378UL //mr r9 r0 +#define URMOR_CORRECTION 0x7d397ba6UL +#define BLR_INST 0x4e800020UL +#define MTSPR_BASE_OPCODE 0x7c0003a6UL +#define ATTN_OPCODE 0x00000200UL +#define SKIP_SPR_REST_INST 0x4800001cUL //b . +0x01c +#define MFLR_R30 0x7fc802a6UL +#define SKIP_SPR_SELF_SAVE 0x3bff0020UL //addi r31 r31 0x20 +#define MTLR_INST 0x7fc803a6UL //mtlr r30 + #ifdef __cplusplus } // namespace stopImageSection ends From patchwork Thu Nov 28 06:24:39 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Nicholas Piggin X-Patchwork-Id: 1201920 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.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 47NntP4d52z9sPJ for ; Thu, 28 Nov 2019 17:34:37 +1100 (AEDT) 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="UuVMB1uV"; 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 47NntP2y9dzDr0m for ; Thu, 28 Nov 2019 17:34:37 +1100 (AEDT) X-Original-To: skiboot@lists.ozlabs.org Delivered-To: skiboot@lists.ozlabs.org Authentication-Results: lists.ozlabs.org; spf=pass (sender SPF authorized) smtp.mailfrom=gmail.com (client-ip=2607:f8b0:4864:20::1043; helo=mail-pj1-x1043.google.com; envelope-from=npiggin@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="UuVMB1uV"; dkim-atps=neutral Received: from mail-pj1-x1043.google.com (mail-pj1-x1043.google.com [IPv6:2607:f8b0:4864:20::1043]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (2048 bits) server-digest SHA256) (No client certificate requested) by lists.ozlabs.org (Postfix) with ESMTPS id 47NnjL6fWXzDqBP for ; Thu, 28 Nov 2019 17:26:46 +1100 (AEDT) Received: by mail-pj1-x1043.google.com with SMTP id y21so11401361pjn.9 for ; Wed, 27 Nov 2019 22:26:46 -0800 (PST) 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 :mime-version:content-transfer-encoding; bh=FNmmlL3hciatilLFYtBW/AOixy6dwiRLk4wuI6huKbw=; b=UuVMB1uVkXWt4uMqP/7yJexlKTUIuF6k8KTbcqAJ6RRkbgBoqDOppxuvCdrwMWXjdo 8x6UvKWyV3TSyOgZzW/zGGfcWDiLwVbShg4miDYh0VoQGKeLLEXLnUWxNnleorAGpx3r 5Vn7j4E+vA69UPcajBMKifo/9XSwO05DcX+bwtKffixW6bbf1DtvHHozF+Cx804/Jl95 ThjF3iwJ1a6+8PTVPaeiplNmsUb57f21uvsEZ2bx6mR6oZgo8BNi7TiXJ/cWG20XXaqh h7QBC91OKfaVodQbYYsXki3BIfNR6ronIBZLvXHjQLzB4fn8xkwQow1r2ZuciKpT+e9P w4Rw== 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:mime-version:content-transfer-encoding; bh=FNmmlL3hciatilLFYtBW/AOixy6dwiRLk4wuI6huKbw=; b=BAvjIDHaaqN8ymC90XaF4ZZ1yo7hRJcCL/6zU2q+pEUUeMhCQaitMdy3L5bbnJ97nB zk2aoKOFXKV5RhtdllIlSTZm19SQ/rU4yHJwhgHHFyv3/q3DrXseG3FIV+3AF0mZRFRW Mh2xKjIUpCUqxFKwcsD4NrR4Pxwix0SDRQyHSvDdIaxITmkZaabEsEEj3K2c/chSPTij FYdYZ1Clxluf1Tq2rL4nEWJZFcas14ZKZ58kkJK41bdZk1EMwbi2Rx4dLhtGNq54uakU BViWX8DxhEkJJ9NS9BApPqDr1b0X2QHQ3pkMkq1UKJtABjC2sUMx1ZFrY8VS/i40JjHN ZDcw== X-Gm-Message-State: APjAAAUq6zVDM5saZFRkBsk1l7HOSzal50SheXOVqB+zzbKHOjLZVa6w Y20JAgysvlzY2BziGOJq8d7BtC8oxfI= X-Google-Smtp-Source: APXvYqzHKPe/rEYRe4qR3c7jgHu5+q0ceSVNM+pkAEz0W5lbY8nBHTl7cy6ZQvxIITP1G3pm7SVgXQ== X-Received: by 2002:a17:902:8508:: with SMTP id bj8mr8022744plb.178.1574922402877; Wed, 27 Nov 2019 22:26:42 -0800 (PST) Received: from bobo.local0.net ([203.194.47.34]) by smtp.gmail.com with ESMTPSA id e5sm8463196pjv.29.2019.11.27.22.26.40 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 27 Nov 2019 22:26:42 -0800 (PST) From: Nicholas Piggin To: skiboot@lists.ozlabs.org Date: Thu, 28 Nov 2019 16:24:39 +1000 Message-Id: <20191128062442.20690-26-npiggin@gmail.com> X-Mailer: git-send-email 2.23.0 In-Reply-To: <20191128062442.20690-1-npiggin@gmail.com> References: <20191128062442.20690-1-npiggin@gmail.com> MIME-Version: 1.0 Subject: [Skiboot] [PATCH v8 25/28] dt: assorted cleanups X-BeenThere: skiboot@lists.ozlabs.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: Mailing list for skiboot development List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: skiboot-bounces+incoming=patchwork.ozlabs.org@lists.ozlabs.org Sender: "Skiboot" This replaces several instances dt accesses with higher level primitives throughout the tree. Signed-off-by: Nicholas Piggin --- core/device.c | 9 ++++++++- core/pci.c | 20 ++++++++------------ hdata/iohub.c | 21 +++++++-------------- hdata/memory.c | 7 ++----- hw/fsp/fsp.c | 2 +- hw/phb4.c | 28 ++++++++++++---------------- include/device.h | 1 + 7 files changed, 39 insertions(+), 49 deletions(-) diff --git a/core/device.c b/core/device.c index 0118d485f..f48a80159 100644 --- a/core/device.c +++ b/core/device.c @@ -593,11 +593,18 @@ u32 dt_property_get_cell(const struct dt_property *prop, u32 index) return fdt32_to_cpu(((const u32 *)prop->prop)[index]); } +u64 dt_property_get_u64(const struct dt_property *prop, u32 index) +{ + assert(prop->len >= (index+1)*sizeof(u64)); + /* Always aligned, so this works. */ + return fdt64_to_cpu(((const fdt64_t *)prop->prop)[index]); +} + void dt_property_set_cell(struct dt_property *prop, u32 index, u32 val) { assert(prop->len >= (index+1)*sizeof(u32)); /* Always aligned, so this works. */ - ((u32 *)prop->prop)[index] = cpu_to_fdt32(val); + ((fdt32_t *)prop->prop)[index] = cpu_to_fdt32(val); } /* First child of this node. */ diff --git a/core/pci.c b/core/pci.c index e497fd50c..f23ba1873 100644 --- a/core/pci.c +++ b/core/pci.c @@ -1524,16 +1524,8 @@ static void __noinline pci_add_one_device_node(struct phb *phb, char name[MAX_NAME]; char compat[MAX_NAME]; uint32_t rev_class; - __be32 reg[5]; uint8_t intpin; bool is_pcie; - const __be32 ranges_direct[] = { - /* 64-bit direct mapping. We know the bridges - * don't cover the entire address space so - * use 0xf00... as a good compromise. */ - cpu_to_be32(0x02000000), 0x0, 0x0, - cpu_to_be32(0x02000000), 0x0, 0x0, - cpu_to_be32(0xf0000000), 0x0}; pci_cfg_read32(phb, pd->bdfn, PCI_CFG_REV_ID, &rev_class); pci_cfg_read8(phb, pd->bdfn, PCI_CFG_INT_PIN, &intpin); @@ -1609,9 +1601,7 @@ static void __noinline pci_add_one_device_node(struct phb *phb, * entry in the "reg" property. That's enough for Linux and we might * even want to make this legit in future ePAPR */ - reg[0] = cpu_to_be32(pd->bdfn << 8); - reg[1] = reg[2] = reg[3] = reg[4] = 0; - dt_add_property(np, "reg", reg, sizeof(reg)); + dt_add_property_cells(np, "reg", pd->bdfn << 8, 0, 0, 0, 0); /* Print summary info about the device */ pci_print_summary_line(phb, pd, np, rev_class, cname); @@ -1646,7 +1636,13 @@ static void __noinline pci_add_one_device_node(struct phb *phb, * (ie. an empty ranges property). * Instead add a ranges property that explicitly translates 1:1. */ - dt_add_property(np, "ranges", ranges_direct, sizeof(ranges_direct)); + dt_add_property_cells(np, "ranges", + /* 64-bit direct mapping. We know the bridges + * don't cover the entire address space so + * use 0xf00... as a good compromise. */ + 0x02000000, 0x0, 0x0, + 0x02000000, 0x0, 0x0, + 0xf0000000, 0x0); } void __noinline pci_add_device_nodes(struct phb *phb, diff --git a/hdata/iohub.c b/hdata/iohub.c index 6647e6aac..35f4a74c9 100644 --- a/hdata/iohub.c +++ b/hdata/iohub.c @@ -95,7 +95,6 @@ static struct dt_node *io_add_phb3(const struct cechub_io_hub *hub, unsigned int spci_xscom) { struct dt_node *pbcq; - uint32_t reg[6]; unsigned int hdif_vers; /* Get HDIF version */ @@ -109,13 +108,10 @@ static struct dt_node *io_add_phb3(const struct cechub_io_hub *hub, /* "reg" property contains in order the PE, PCI and SPCI XSCOM * addresses */ - reg[0] = cpu_to_be32(pe_xscom); - reg[1] = cpu_to_be32(0x20); - reg[2] = cpu_to_be32(pci_xscom); - reg[3] = cpu_to_be32(0x05); - reg[4] = cpu_to_be32(spci_xscom); - reg[5] = cpu_to_be32(0x15); - dt_add_property(pbcq, "reg", reg, sizeof(reg)); + dt_add_property_cells(pbcq, "reg", + pe_xscom, 0x20, + pci_xscom, 0x05, + spci_xscom, 0x15); /* A couple more things ... */ dt_add_property_strings(pbcq, "compatible", "ibm,power8-pbcq"); @@ -202,7 +198,6 @@ static struct dt_node *io_add_phb4(const struct cechub_io_hub *hub, int phb_base) { struct dt_node *pbcq; - uint32_t reg[4]; uint8_t active_phb_mask = hub->fab_br0_pdt; uint32_t pe_xscom = 0x4010c00 + (pec_index * 0x0000400); uint32_t pci_xscom = 0xd010800 + (pec_index * 0x1000000); @@ -214,11 +209,9 @@ static struct dt_node *io_add_phb4(const struct cechub_io_hub *hub, return NULL; /* "reg" property contains (in order) the PE and PCI XSCOM addresses */ - reg[0] = cpu_to_be32(pe_xscom); - reg[1] = cpu_to_be32(0x100); - reg[2] = cpu_to_be32(pci_xscom); - reg[3] = cpu_to_be32(0x200); - dt_add_property(pbcq, "reg", reg, sizeof(reg)); + dt_add_property_cells(pbcq, "reg", + pe_xscom, 0x100, + pci_xscom, 0x200); /* The hubs themselves go under the stacks */ dt_add_property_strings(pbcq, "compatible", "ibm,power9-pbcq"); diff --git a/hdata/memory.c b/hdata/memory.c index 9e5e99b9c..7839dea3f 100644 --- a/hdata/memory.c +++ b/hdata/memory.c @@ -77,24 +77,21 @@ static void append_chip_id(struct dt_node *mem, u32 id) { struct dt_property *prop; size_t len, i; - be32 *p; prop = __dt_find_property(mem, "ibm,chip-id"); if (!prop) return; len = prop->len >> 2; - p = (be32*)prop->prop; /* Check if it exists already */ for (i = 0; i < len; i++) { - if (be32_to_cpu(p[i]) == id) + if (dt_property_get_cell(prop, i) == id) return; } /* Add it to the list */ dt_resize_property(&prop, (len + 1) << 2); - p = (be32 *)prop->prop; - p[len] = cpu_to_be32(id); + dt_property_set_cell(prop, len, id); } static void update_status(struct dt_node *mem, uint32_t status) diff --git a/hw/fsp/fsp.c b/hw/fsp/fsp.c index 1112fb74b..7592ee07b 100644 --- a/hw/fsp/fsp.c +++ b/hw/fsp/fsp.c @@ -1912,7 +1912,7 @@ static void fsp_init_links(struct dt_node *fsp_node) u64 reg; u32 link; - link = be32_to_cpu(((const __be32 *)linksprop->prop)[i]); + link = dt_property_get_cell(linksprop, i); fiop = &fsp->iopath[i]; fiop->psi = psi_find_link(link); if (fiop->psi == NULL) { diff --git a/hw/phb4.c b/hw/phb4.c index 9ef912e47..dbf6e9860 100644 --- a/hw/phb4.c +++ b/hw/phb4.c @@ -5485,11 +5485,11 @@ static bool phb4_calculate_windows(struct phb4 *p) "ibm,mmio-windows", -1); assert(prop->len >= (2 * sizeof(uint64_t))); - p->mm0_base = be64_to_cpu(((__be64 *)prop->prop)[0]); - p->mm0_size = be64_to_cpu(((__be64 *)prop->prop)[1]); + p->mm0_base = dt_property_get_u64(prop, 0); + p->mm0_size = dt_property_get_u64(prop, 1); if (prop->len > 16) { - p->mm1_base = be64_to_cpu(((__be64 *)prop->prop)[2]); - p->mm1_size = be64_to_cpu(((__be64 *)prop->prop)[3]); + p->mm1_base = dt_property_get_u64(prop, 2); + p->mm1_size = dt_property_get_u64(prop, 3); } /* Sort them so that 0 is big and 1 is small */ @@ -5601,11 +5601,11 @@ static void phb4_create(struct dt_node *np) /* Get the various XSCOM register bases from the device-tree */ prop = dt_require_property(np, "ibm,xscom-bases", 5 * sizeof(uint32_t)); - p->pe_xscom = be32_to_cpu(((__be32 *)prop->prop)[0]); - p->pe_stk_xscom = be32_to_cpu(((__be32 *)prop->prop)[1]); - p->pci_xscom = be32_to_cpu(((__be32 *)prop->prop)[2]); - p->pci_stk_xscom = be32_to_cpu(((__be32 *)prop->prop)[3]); - p->etu_xscom = be32_to_cpu(((__be32 *)prop->prop)[4]); + p->pe_xscom = dt_property_get_cell(prop, 0); + p->pe_stk_xscom = dt_property_get_cell(prop, 1); + p->pci_xscom = dt_property_get_cell(prop, 2); + p->pci_stk_xscom = dt_property_get_cell(prop, 3); + p->etu_xscom = dt_property_get_cell(prop, 4); /* * We skip the initial PERST assertion requested by the generic code @@ -5766,7 +5766,6 @@ static void phb4_probe_stack(struct dt_node *stk_node, uint32_t pec_index, uint64_t val, phb_bar = 0, irq_bar = 0, bar_en; uint64_t mmio0_bar = 0, mmio0_bmask, mmio0_sz; uint64_t mmio1_bar = 0, mmio1_bmask, mmio1_sz; - uint64_t reg[4]; void *foo; __be64 mmio_win[4]; unsigned int mmio_win_sz; @@ -5864,18 +5863,15 @@ static void phb4_probe_stack(struct dt_node *stk_node, uint32_t pec_index, prlog_once(PR_DEBUG, "Version reg: 0x%016llx\n", in_be64(foo)); /* Create PHB node */ - reg[0] = cpu_to_be64(phb_bar); - reg[1] = cpu_to_be64(0x1000); - reg[2] = cpu_to_be64(irq_bar); - reg[3] = cpu_to_be64(0x10000000); - np = dt_new_addr(dt_root, "pciex", phb_bar); if (!np) return; dt_add_property_strings(np, "compatible", "ibm,power9-pciex", "ibm,ioda3-phb"); dt_add_property_strings(np, "device_type", "pciex"); - dt_add_property(np, "reg", reg, sizeof(reg)); + dt_add_property_u64s(np, "reg", + phb_bar, 0x1000, + irq_bar, 0x10000000); /* Everything else is handled later by skiboot, we just * stick a few hints here diff --git a/include/device.h b/include/device.h index 25325ec07..4f7a0983f 100644 --- a/include/device.h +++ b/include/device.h @@ -130,6 +130,7 @@ void dt_resize_property(struct dt_property **prop, size_t len); void dt_property_set_cell(struct dt_property *prop, u32 index, u32 val); u32 dt_property_get_cell(const struct dt_property *prop, u32 index); +u64 dt_property_get_u64(const struct dt_property *prop, u32 index); /* First child of this node. */ struct dt_node *dt_first(const struct dt_node *root); From patchwork Thu Nov 28 06:24:40 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Nicholas Piggin X-Patchwork-Id: 1201921 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.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 47Nntm5hJxz9s7T for ; Thu, 28 Nov 2019 17:34:56 +1100 (AEDT) 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="KKHOyXNt"; 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 47Nntm41JszDr0T for ; Thu, 28 Nov 2019 17:34:56 +1100 (AEDT) X-Original-To: skiboot@lists.ozlabs.org Delivered-To: skiboot@lists.ozlabs.org Authentication-Results: lists.ozlabs.org; spf=pass (sender SPF authorized) smtp.mailfrom=gmail.com (client-ip=2607:f8b0:4864:20::444; helo=mail-pf1-x444.google.com; envelope-from=npiggin@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="KKHOyXNt"; dkim-atps=neutral Received: from mail-pf1-x444.google.com (mail-pf1-x444.google.com [IPv6:2607:f8b0:4864:20::444]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (2048 bits) server-digest SHA256) (No client certificate requested) by lists.ozlabs.org (Postfix) with ESMTPS id 47NnjP45H6zDqCc for ; Thu, 28 Nov 2019 17:26:49 +1100 (AEDT) Received: by mail-pf1-x444.google.com with SMTP id x28so12618862pfo.6 for ; Wed, 27 Nov 2019 22:26:49 -0800 (PST) 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 :mime-version:content-transfer-encoding; bh=1uGegR9Fogf8402fLROgWzyYmQ5Mt6tuEpEl7WsRHPY=; b=KKHOyXNtoOXKP0n6FGNH/fjf3+ty1wRV3ynrM2LtYu2ayQVJxqKsYtvpL4fItAJiN3 PlgW0aeNvIQsE4iWzAsSuPIf4FL96cOpt13Azth5ScquOvtvx0WPfiReJURl33NSVKqY Zlzs/g9NVTFbfzgxXJVKiLmIX1TP6JwVxvWwPuqGPCrRp1IsTTzN1Ib3l0DjRMvDFXNJ ClBGIukxZIrA3UD/MH15aI9N1RFtQ9N48yrYPKDgV/E9MIP/TuXkIMZ14tjcbe7F+zix HgWVqV0Q06PEwPDGvpkUiuQbl1SMfBjxfP74IGBouT3epz3tLGhPPgTKNEAe3fG+triC hAAg== 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:mime-version:content-transfer-encoding; bh=1uGegR9Fogf8402fLROgWzyYmQ5Mt6tuEpEl7WsRHPY=; b=ggKhqInocV1yQhENnywZQpJ9A9I3+G9FwjszNk3dhYrnBF7VL8kGZ7a7HgSnfIDw59 hWmCV/m7Ah3vXHGC8/ZVX0rDamzLK0yOqx0ydNp++RXXjsXGGHAPnHQf3ESsssXDJrwc olprtIrb4PToGBypVamljbMWh1M2uie8ozRtx51sUiJVhN3YIkpYe9DD9zBmZ3oDsk5g JGjb+40A8hJIiuR/Y30C7tIr0rtDQhs9UrZrz4Yskc9pf7XzurOxHl98A3EgdMLgY/qO cL/kUUyfK0uA2GD0uj0AoMkyJOo8WKrSNjDWKmI9D7p45F1dajMeRpKic6NCOw/ZbZkN qSFw== X-Gm-Message-State: APjAAAUlAg42V85cBTIAIfVFNmCqzecW/Zd09OQWpCbMmkrGNBgoHtio 83JM2s7NIICxE0uj71o6LaQKIB7T7P4= X-Google-Smtp-Source: APXvYqyo0ueOomlaa4wAc9mzSlVPY7rAvAAr7LwvVIBHz0FuJ5cckocaap3w5ZwPAegZaLLY48lFZg== X-Received: by 2002:a63:e145:: with SMTP id h5mr9131344pgk.387.1574922405391; Wed, 27 Nov 2019 22:26:45 -0800 (PST) Received: from bobo.local0.net ([203.194.47.34]) by smtp.gmail.com with ESMTPSA id e5sm8463196pjv.29.2019.11.27.22.26.43 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 27 Nov 2019 22:26:45 -0800 (PST) From: Nicholas Piggin To: skiboot@lists.ozlabs.org Date: Thu, 28 Nov 2019 16:24:40 +1000 Message-Id: <20191128062442.20690-27-npiggin@gmail.com> X-Mailer: git-send-email 2.23.0 In-Reply-To: <20191128062442.20690-1-npiggin@gmail.com> References: <20191128062442.20690-1-npiggin@gmail.com> MIME-Version: 1.0 Subject: [Skiboot] [PATCH v8 26/28] add more sparse endian annotations X-BeenThere: skiboot@lists.ozlabs.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: Mailing list for skiboot development List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: skiboot-bounces+incoming=patchwork.ozlabs.org@lists.ozlabs.org Sender: "Skiboot" This fixes quite a few sparse endian annotations across the tree. Signed-off-by: Nicholas Piggin --- core/device.c | 17 +++++++++-------- core/fdt.c | 2 +- core/interrupts.c | 3 ++- core/mem_region.c | 2 +- core/pci.c | 2 +- core/trace.c | 3 ++- hdata/fsp.c | 2 +- hdata/memory.c | 8 ++++---- hdata/spira.c | 2 +- hw/ast-bmc/ast-sf-ctrl.c | 5 +++-- hw/imc.c | 4 ++-- hw/psi.c | 2 +- hw/slw.c | 10 +++++----- include/ipmi.h | 2 +- include/opal-internal.h | 4 ++-- libflash/mbox-flash.c | 8 ++++---- libstb/secureboot.c | 2 +- platforms/astbmc/vesnin.c | 8 ++++---- 18 files changed, 45 insertions(+), 41 deletions(-) diff --git a/core/device.c b/core/device.c index f48a80159..6c7794677 100644 --- a/core/device.c +++ b/core/device.c @@ -514,12 +514,12 @@ struct dt_property *__dt_add_property_cells(struct dt_node *node, int count, ...) { struct dt_property *p; - u32 *val; + fdt32_t *val; unsigned int i; va_list args; p = new_property(node, name, count * sizeof(u32)); - val = (u32 *)p->prop; + val = (fdt32_t *)p->prop; va_start(args, count); for (i = 0; i < count; i++) val[i] = cpu_to_fdt32(va_arg(args, u32)); @@ -532,12 +532,12 @@ struct dt_property *__dt_add_property_u64s(struct dt_node *node, int count, ...) { struct dt_property *p; - u64 *val; + fdt64_t *val; unsigned int i; va_list args; p = new_property(node, name, count * sizeof(u64)); - val = (u64 *)p->prop; + val = (fdt64_t *)p->prop; va_start(args, count); for (i = 0; i < count; i++) val[i] = cpu_to_fdt64(va_arg(args, u64)); @@ -590,7 +590,7 @@ u32 dt_property_get_cell(const struct dt_property *prop, u32 index) { assert(prop->len >= (index+1)*sizeof(u32)); /* Always aligned, so this works. */ - return fdt32_to_cpu(((const u32 *)prop->prop)[index]); + return fdt32_to_cpu(((const fdt32_t *)prop->prop)[index]); } u64 dt_property_get_u64(const struct dt_property *prop, u32 index) @@ -918,7 +918,7 @@ void dt_expand(const void *fdt) u64 dt_get_number(const void *pdata, unsigned int cells) { - const u32 *p = pdata; + const __be32 *p = pdata; u64 ret = 0; while(cells--) @@ -1095,6 +1095,7 @@ void dt_adjust_subtree_phandle(struct dt_node *dev, struct dt_node *node; struct dt_property *prop; u32 phandle, max_phandle = 0, import_phandle = new_phandle(); + __be32 p; const char **name; dt_for_each_node(dev, node) { @@ -1117,8 +1118,8 @@ void dt_adjust_subtree_phandle(struct dt_node *dev, continue; phandle = dt_prop_get_u32(node, *name); phandle += import_phandle; - phandle = cpu_to_be32(phandle); - memcpy((char *)&prop->prop, &phandle, prop->len); + p = cpu_to_be32(phandle); + memcpy((char *)&prop->prop, &p, prop->len); } } diff --git a/core/fdt.c b/core/fdt.c index e093e8b54..92fdc5b03 100644 --- a/core/fdt.c +++ b/core/fdt.c @@ -136,7 +136,7 @@ static void flatten_dt_node(void *fdt, const struct dt_node *root, static void create_dtb_reservemap(void *fdt, const struct dt_node *root) { uint64_t base, size; - const uint64_t *ranges; + const __be64 *ranges; const struct dt_property *prop; int i; diff --git a/core/interrupts.c b/core/interrupts.c index d4a2c3124..681483209 100644 --- a/core/interrupts.c +++ b/core/interrupts.c @@ -194,7 +194,8 @@ void add_opal_interrupts(void) { struct irq_source *is; unsigned int i, ns, tns = 0, count = 0; - uint32_t *irqs = NULL, isn; + uint32_t isn; + __be32 *irqs = NULL; char *names = NULL; lock(&irq_lock); diff --git a/core/mem_region.c b/core/mem_region.c index 1bb87805c..eb48a1a11 100644 --- a/core/mem_region.c +++ b/core/mem_region.c @@ -1444,7 +1444,7 @@ void mem_region_add_dt_reserved(void) struct mem_region *region; void *names, *ranges; struct dt_node *node; - uint64_t *range; + fdt64_t *range; char *name; names_len = 0; diff --git a/core/pci.c b/core/pci.c index f23ba1873..4ac9346f1 100644 --- a/core/pci.c +++ b/core/pci.c @@ -1310,7 +1310,7 @@ void pci_std_swizzle_irq_map(struct dt_node *np, struct pci_lsi_state *lstate, uint8_t swizzle) { - uint32_t *map, *p; + __be32 *p, *map; int dev, irq, esize, edevcount; size_t map_size; diff --git a/core/trace.c b/core/trace.c index 5c71370fd..00d71cf58 100644 --- a/core/trace.c +++ b/core/trace.c @@ -160,7 +160,8 @@ static void trace_add_dt_props(void) uint64_t boot_buf_phys = (uint64_t) &boot_tracebuf.trace_info; struct dt_node *exports, *traces; unsigned int i; - u64 *prop, tmask; + fdt64_t *prop; + u64 tmask; char tname[256]; exports = dt_find_by_path(opal_node, "firmware/exports"); diff --git a/hdata/fsp.c b/hdata/fsp.c index fe36eef18..d351f5ac5 100644 --- a/hdata/fsp.c +++ b/hdata/fsp.c @@ -174,7 +174,7 @@ static uint32_t fsp_create_link(const struct spss_iopath *iopath, int index, static void fsp_create_links(const void *spss, int index, struct dt_node *fsp_node) { - uint32_t *links = NULL; + __be32 *links = NULL; unsigned int i, lp, lcount = 0; int count; diff --git a/hdata/memory.c b/hdata/memory.c index 7839dea3f..9c588ff61 100644 --- a/hdata/memory.c +++ b/hdata/memory.c @@ -329,8 +329,8 @@ static void vpd_add_ram_area(const struct HDIF_common_hdr *msarea) static void vpd_parse_spd(struct dt_node *dimm, const char *spd, u32 size) { - u16 *vendor; - u32 *sn; + __be16 *vendor; + __be32 *sn; /* SPD is too small */ if (size < 512) { @@ -355,14 +355,14 @@ static void vpd_parse_spd(struct dt_node *dimm, const char *spd, u32 size) dt_add_property_cells(dimm, "product-version", spd[0x15d]); /* Serial number */ - sn = (u32 *)&spd[0x145]; + sn = (__be32 *)&spd[0x145]; dt_add_property_cells(dimm, "serial-number", be32_to_cpu(*sn)); /* Part number */ dt_add_property_nstr(dimm, "part-number", &spd[0x149], 20); /* Module manufacturer ID */ - vendor = (u16 *)&spd[0x140]; + vendor = (__be16 *)&spd[0x140]; dt_add_property_cells(dimm, "manufacturer-id", be16_to_cpu(*vendor)); } diff --git a/hdata/spira.c b/hdata/spira.c index 7e19d3d5c..77c937b10 100644 --- a/hdata/spira.c +++ b/hdata/spira.c @@ -994,7 +994,7 @@ static void opal_dump_add_mpipl_boot(const struct iplparams_iplparams *p) static void add_opal_dump_node(void) { - u64 fw_load_area[4]; + __be64 fw_load_area[4]; struct dt_node *node; opal_node = dt_new_check(dt_root, "ibm,opal"); diff --git a/hw/ast-bmc/ast-sf-ctrl.c b/hw/ast-bmc/ast-sf-ctrl.c index ece847d6b..e97315067 100644 --- a/hw/ast-bmc/ast-sf-ctrl.c +++ b/hw/ast-bmc/ast-sf-ctrl.c @@ -169,12 +169,13 @@ static void ast_sf_end_cmd(struct ast_sf_ctrl *ct) static int ast_sf_send_addr(struct ast_sf_ctrl *ct, uint32_t addr) { const void *ap; + __be32 tmp; /* Layout address MSB first in memory */ - addr = cpu_to_be32(addr); + tmp = cpu_to_be32(addr); /* Send the right amount of bytes */ - ap = (char *)&addr; + ap = (char *)&tmp; if (ct->mode_4b) return ast_copy_to_ahb(ct->flash, ap, 4); diff --git a/hw/imc.c b/hw/imc.c index 16b060d39..36c2cf3a5 100644 --- a/hw/imc.c +++ b/hw/imc.c @@ -448,8 +448,8 @@ void imc_catalog_preload(void) static void imc_dt_update_nest_node(struct dt_node *dev) { struct proc_chip *chip; - uint64_t *base_addr = NULL; - uint32_t *chipids = NULL; + __be64 *base_addr = NULL; + __be32 *chipids = NULL; int i=0, nr_chip = nr_chips(); struct dt_node *node; const struct dt_property *type; diff --git a/hw/psi.c b/hw/psi.c index 30c2a6cbc..eede4e5b4 100644 --- a/hw/psi.c +++ b/hw/psi.c @@ -782,7 +782,7 @@ static void psi_activate_phb(struct psi *psi) static void psi_create_p9_int_map(struct psi *psi, struct dt_node *np) { - uint32_t map[P9_PSI_NUM_IRQS][4]; + __be32 map[P9_PSI_NUM_IRQS][4]; int i; for (i = 0; i < P9_PSI_NUM_IRQS; i++) { diff --git a/hw/slw.c b/hw/slw.c index 566a1128b..2f7619793 100644 --- a/hw/slw.c +++ b/hw/slw.c @@ -725,8 +725,8 @@ void add_cpu_idle_state_properties(void) bool has_stop_inst = false; u8 i; - u64 *pm_ctrl_reg_val_buf; - u64 *pm_ctrl_reg_mask_buf; + fdt64_t *pm_ctrl_reg_val_buf; + fdt64_t *pm_ctrl_reg_mask_buf; u32 supported_states_mask; u32 opal_disabled_states_mask = ~0xEC000000; /* all but stop11 */ const char* nvram_disable_str; @@ -739,9 +739,9 @@ void add_cpu_idle_state_properties(void) /* Buffers to hold idle state properties */ char *name_buf, *alloced_name_buf; - u32 *latency_ns_buf; - u32 *residency_ns_buf; - u32 *flags_buf; + fdt32_t *latency_ns_buf; + fdt32_t *residency_ns_buf; + fdt32_t *flags_buf; prlog(PR_DEBUG, "CPU idle state device tree init\n"); diff --git a/include/ipmi.h b/include/ipmi.h index 4f5134745..50deec01a 100644 --- a/include/ipmi.h +++ b/include/ipmi.h @@ -164,7 +164,7 @@ struct ipmi_msg { }; struct ipmi_backend { - __be64 opal_event_ipmi_recv; + uint64_t opal_event_ipmi_recv; struct ipmi_msg *(*alloc_msg)(size_t, size_t); void (*free_msg)(struct ipmi_msg *); int (*queue_msg)(struct ipmi_msg *); diff --git a/include/opal-internal.h b/include/opal-internal.h index fd2187f09..83bf77084 100644 --- a/include/opal-internal.h +++ b/include/opal-internal.h @@ -49,8 +49,8 @@ extern struct dt_node *opal_node; extern void opal_table_init(void); extern void opal_update_pending_evt(uint64_t evt_mask, uint64_t evt_values); -__be64 opal_dynamic_event_alloc(void); -void opal_dynamic_event_free(__be64 event); +uint64_t opal_dynamic_event_alloc(void); +void opal_dynamic_event_free(uint64_t event); extern void add_opal_node(void); #define opal_register(token, func, nargs) \ diff --git a/libflash/mbox-flash.c b/libflash/mbox-flash.c index 5df020f55..3fd2c057a 100644 --- a/libflash/mbox-flash.c +++ b/libflash/mbox-flash.c @@ -239,23 +239,23 @@ static void msg_put_u8(struct bmc_mbox_msg *msg, int i, uint8_t val) static uint16_t msg_get_u16(struct bmc_mbox_msg *msg, int i) { - return le16_to_cpu(*(uint16_t *)(&msg->args[i])); + return le16_to_cpu(*(__le16 *)(&msg->args[i])); } static void msg_put_u16(struct bmc_mbox_msg *msg, int i, uint16_t val) { - uint16_t tmp = cpu_to_le16(val); + __le16 tmp = cpu_to_le16(val); memcpy(&msg->args[i], &tmp, sizeof(val)); } static uint32_t msg_get_u32(struct bmc_mbox_msg *msg, int i) { - return le32_to_cpu(*(uint32_t *)(&msg->args[i])); + return le32_to_cpu(*(__le32 *)(&msg->args[i])); } static void msg_put_u32(struct bmc_mbox_msg *msg, int i, uint32_t val) { - uint32_t tmp = cpu_to_le32(val); + __le32 tmp = cpu_to_le32(val); memcpy(&msg->args[i], &tmp, sizeof(val)); } diff --git a/libstb/secureboot.c b/libstb/secureboot.c index bfc98f2ae..022e2aa09 100644 --- a/libstb/secureboot.c +++ b/libstb/secureboot.c @@ -163,7 +163,7 @@ void secureboot_init(void) int secureboot_verify(enum resource_id id, void *buf, size_t len) { const char *name; - uint64_t log; + __be64 log; int rc = -1; name = flash_map_resource_name(id); diff --git a/platforms/astbmc/vesnin.c b/platforms/astbmc/vesnin.c index bd412aa8d..b1d909e29 100644 --- a/platforms/astbmc/vesnin.c +++ b/platforms/astbmc/vesnin.c @@ -38,13 +38,13 @@ * All fields have Big Endian byte order. */ struct pciinv_device { - uint16_t domain_num; + beint16_t domain_num; uint8_t bus_num; uint8_t device_num; uint8_t func_num; - uint16_t vendor_id; - uint16_t device_id; - uint32_t class_code; + beint16_t vendor_id; + beint16_t device_id; + beint32_t class_code; uint8_t revision; } __packed; From patchwork Thu Nov 28 06:24:41 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Nicholas Piggin X-Patchwork-Id: 1201922 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 47Nnv46X9xz9s7T for ; Thu, 28 Nov 2019 17:35:12 +1100 (AEDT) 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="G9ugMhsa"; 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 47Nnv44fs5zDr2K for ; Thu, 28 Nov 2019 17:35:12 +1100 (AEDT) X-Original-To: skiboot@lists.ozlabs.org Delivered-To: skiboot@lists.ozlabs.org Authentication-Results: lists.ozlabs.org; spf=pass (sender SPF authorized) smtp.mailfrom=gmail.com (client-ip=2607:f8b0:4864:20::542; helo=mail-pg1-x542.google.com; envelope-from=npiggin@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="G9ugMhsa"; dkim-atps=neutral Received: from mail-pg1-x542.google.com (mail-pg1-x542.google.com [IPv6:2607:f8b0:4864:20::542]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (2048 bits) server-digest SHA256) (No client certificate requested) by lists.ozlabs.org (Postfix) with ESMTPS id 47NnjR1ZWYzDq7j for ; Thu, 28 Nov 2019 17:26:51 +1100 (AEDT) Received: by mail-pg1-x542.google.com with SMTP id z188so12382021pgb.1 for ; Wed, 27 Nov 2019 22:26:51 -0800 (PST) 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 :mime-version:content-transfer-encoding; bh=oKk+ZmctP+yg4dPCiDDfwpaNmjB/ByvQFoZCAXnX0ck=; b=G9ugMhsagofHZfaTQquGPw5MBHf4troyQZLoJdF4k2xWE104+9DATVfhGsg0wvSVyD 41BnsBAU6qa/oCe2kAvNu5vW5e0U5bAElxNoC7zVSk5PYnvaupEIzK3GDd4nfsQSiLka fphPxOuBDbp/8VaZCGvyW/nqMhU+ejJX48FeVfyyr0KiPoLJ8Vl4Z3GJVJg8SOQDs5u2 QeVPxJO1stZlADupNn0m9Z7sT1tsoNVpL3KnyIvZCjy5MBlud55Xd1wqjLidYEEz4HDk mxQlfLk0E/Tan/7I1NdqzSUces64qjotUpcZe7PyM4IA6awunb7QvzJ+XSvtdHkH8d80 ejYw== 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:mime-version:content-transfer-encoding; bh=oKk+ZmctP+yg4dPCiDDfwpaNmjB/ByvQFoZCAXnX0ck=; b=UPGPOg1PdWAT17kBNZmRymiPPGCywAqUnEsku15JMAIkZ5pkMWeRyuOW1o3ZOzKloJ Lx8I4ycpraU02CJ8IY5UdMloWejGdjn1dIA3C0rwg2tnTLeQhavNdfdBNUNlES+61I/A HD6KPmRmhVYmp+GRBZgDY4eXYUiQUozmZEaJy8dgHg6a0H2qQZkf1pZxioMJiAnM+nEy 64+bIEDv3EuS7wqBE8LJgT2oqHXxERdYCE00cJttW2HRkctvXbGIbJOyMbmTtkiSrq0J vVM/edIJOTBtRljtetcDhLP5Jk4tSU+VdnQ8KQcwNKy3mXQtY2XDHWwCSvYooRaf+zNz 0rvA== X-Gm-Message-State: APjAAAWzrfxf/v4R/ZQ1TE1U97T8NU6z0g+zIRWsHPVwPCcL+KtLW1PP aiQhYYtKBKNTdzrprrweg8kcMnF1vhs= X-Google-Smtp-Source: APXvYqypqEx/hPnlNxhtpNk3eGvQr/ib+L0Ww7ZekABs8M3E2Waznn8p0Cc9b8fHbYz3rprWuSvcSg== X-Received: by 2002:a63:4946:: with SMTP id y6mr319095pgk.377.1574922407887; Wed, 27 Nov 2019 22:26:47 -0800 (PST) Received: from bobo.local0.net ([203.194.47.34]) by smtp.gmail.com with ESMTPSA id e5sm8463196pjv.29.2019.11.27.22.26.45 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 27 Nov 2019 22:26:47 -0800 (PST) From: Nicholas Piggin To: skiboot@lists.ozlabs.org Date: Thu, 28 Nov 2019 16:24:41 +1000 Message-Id: <20191128062442.20690-28-npiggin@gmail.com> X-Mailer: git-send-email 2.23.0 In-Reply-To: <20191128062442.20690-1-npiggin@gmail.com> References: <20191128062442.20690-1-npiggin@gmail.com> MIME-Version: 1.0 Subject: [Skiboot] [PATCH v8 27/28] fix simple sparse warnings X-BeenThere: skiboot@lists.ozlabs.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: Mailing list for skiboot development List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: skiboot-bounces+incoming=patchwork.ozlabs.org@lists.ozlabs.org Sender: "Skiboot" Should be no real code change, these mostly update type declarations that sparse complains about. Signed-off-by: Nicholas Piggin --- core/init.c | 4 ++-- core/pci.c | 2 +- core/platform.c | 2 +- hdata/tpmrel.c | 2 +- hw/fsp/fsp-dpo.c | 2 +- hw/imc.c | 4 ++-- hw/vas.c | 2 +- include/device.h | 3 ++- include/skiboot.h | 2 +- libc/stdlib/labs.c | 2 +- platforms/astbmc/common.c | 4 ++-- platforms/astbmc/p8dtu.c | 2 +- platforms/astbmc/p9dsu.c | 2 +- platforms/astbmc/witherspoon.c | 6 +++--- 14 files changed, 20 insertions(+), 19 deletions(-) diff --git a/core/init.c b/core/init.c index 16f4a4f53..339462e5d 100644 --- a/core/init.c +++ b/core/init.c @@ -531,7 +531,7 @@ static int64_t cpu_disable_ME_RI_all(void) return OPAL_SUCCESS; } -void *fdt; +static void *fdt; void __noreturn load_and_boot_kernel(bool is_reboot) { @@ -828,7 +828,7 @@ static void setup_branch_null_catcher(void) * ABI v1 (ie. big endian). This will be broken if we ever * move to ABI v2 (ie little endian) */ - memcpy_null(0, bn, 16); + memcpy_null((void *)0, bn, 16); } #endif diff --git a/core/pci.c b/core/pci.c index 4ac9346f1..8b52fc108 100644 --- a/core/pci.c +++ b/core/pci.c @@ -1349,7 +1349,7 @@ void pci_std_swizzle_irq_map(struct dt_node *np, dt_add_property_cells(np, "interrupt-map-mask", 0xf800, 0, 0, 7); } - map_size = esize * edevcount * 4 * sizeof(uint32_t); + map_size = esize * edevcount * 4 * sizeof(u32); map = p = zalloc(map_size); if (!map) { prerror("Failed to allocate interrupt-map-mask !\n"); diff --git a/core/platform.c b/core/platform.c index 9f1873c90..2544f0ccf 100644 --- a/core/platform.c +++ b/core/platform.c @@ -184,7 +184,7 @@ static int generic_start_preload_resource(enum resource_id id, uint32_t subid, } /* These values will work for a ZZ booted using BML */ -const struct platform_ocapi generic_ocapi = { +static const struct platform_ocapi generic_ocapi = { .i2c_engine = 1, .i2c_port = 4, .i2c_reset_addr = 0x20, diff --git a/hdata/tpmrel.c b/hdata/tpmrel.c index 8bfc0f8fc..93a8b485e 100644 --- a/hdata/tpmrel.c +++ b/hdata/tpmrel.c @@ -118,7 +118,7 @@ static struct dt_node *get_hb_reserved_memory(const char *label) return NULL; } -struct { +static struct { uint32_t type; const char *compat; } cvc_services[] = { diff --git a/hw/fsp/fsp-dpo.c b/hw/fsp/fsp-dpo.c index 8f0861ed4..da83a93d8 100644 --- a/hw/fsp/fsp-dpo.c +++ b/hw/fsp/fsp-dpo.c @@ -18,7 +18,7 @@ #define DPO_CMD_SGN_BYTE1 0x20 /* Byte[1] signature */ #define DPO_TIMEOUT 2700 /* 45 minutes in seconds */ -bool fsp_dpo_pending; +static bool fsp_dpo_pending; static unsigned long fsp_dpo_init_tb; /* diff --git a/hw/imc.c b/hw/imc.c index 36c2cf3a5..3a5382c0c 100644 --- a/hw/imc.c +++ b/hw/imc.c @@ -455,8 +455,8 @@ static void imc_dt_update_nest_node(struct dt_node *dev) const struct dt_property *type; /* Add the base_addr and chip-id properties for the nest node */ - base_addr = malloc(sizeof(uint64_t) * nr_chip); - chipids = malloc(sizeof(uint32_t) * nr_chip); + base_addr = malloc(sizeof(u64) * nr_chip); + chipids = malloc(sizeof(u32) * nr_chip); for_each_chip(chip) { base_addr[i] = cpu_to_be64(chip->homer_base); chipids[i] = cpu_to_be32(chip->id); diff --git a/hw/vas.c b/hw/vas.c index b4af31d12..aebfebde9 100644 --- a/hw/vas.c +++ b/hw/vas.c @@ -494,7 +494,7 @@ static int init_vas_inst(struct dt_node *np, bool enable) } -void vas_init() +void vas_init(void) { bool enabled; struct dt_node *np; diff --git a/include/device.h b/include/device.h index 4f7a0983f..f17b089d8 100644 --- a/include/device.h +++ b/include/device.h @@ -118,7 +118,8 @@ struct dt_property *__dt_add_property_u64s(struct dt_node *node, static inline struct dt_property *dt_add_property_u64(struct dt_node *node, const char *name, u64 val) { - return dt_add_property_cells(node, name, (u32)(val >> 32), (u32)val); + return dt_add_property_cells(node, name, (u32)(val >> 32), + (u32)(val & 0xffffffffUL)); } void dt_del_property(struct dt_node *node, struct dt_property *prop); diff --git a/include/skiboot.h b/include/skiboot.h index e9d57decd..6946b8056 100644 --- a/include/skiboot.h +++ b/include/skiboot.h @@ -318,7 +318,7 @@ extern void fake_rtc_init(void); struct stack_frame; extern void exception_entry(struct stack_frame *stack); extern void exception_entry_pm_sreset(void); -extern void exception_entry_pm_mce(void); +extern void __noreturn exception_entry_pm_mce(void); /* Assembly in head.S */ extern void disable_machine_check(void); diff --git a/libc/stdlib/labs.c b/libc/stdlib/labs.c index 9b68bb275..8bd15eab9 100644 --- a/libc/stdlib/labs.c +++ b/libc/stdlib/labs.c @@ -19,7 +19,7 @@ * Returns the absolute value of the long integer argument */ -long int labs(long int n) +long int __attribute__((const)) labs(long int n) { return (n > 0) ? n : -n; } diff --git a/platforms/astbmc/common.c b/platforms/astbmc/common.c index 15ac231fb..de837f326 100644 --- a/platforms/astbmc/common.c +++ b/platforms/astbmc/common.c @@ -503,13 +503,13 @@ void astbmc_exit(void) ipmi_wdt_final_reset(); } -const struct bmc_sw_config bmc_sw_ami = { +static const struct bmc_sw_config bmc_sw_ami = { .ipmi_oem_partial_add_esel = IPMI_CODE(0x3a, 0xf0), .ipmi_oem_pnor_access_status = IPMI_CODE(0x3a, 0x07), .ipmi_oem_hiomap_cmd = IPMI_CODE(0x3a, 0x5a), }; -const struct bmc_sw_config bmc_sw_openbmc = { +static const struct bmc_sw_config bmc_sw_openbmc = { .ipmi_oem_partial_add_esel = IPMI_CODE(0x3a, 0xf0), .ipmi_oem_hiomap_cmd = IPMI_CODE(0x3a, 0x5a), }; diff --git a/platforms/astbmc/p8dtu.c b/platforms/astbmc/p8dtu.c index c62223b24..a9d8dc068 100644 --- a/platforms/astbmc/p8dtu.c +++ b/platforms/astbmc/p8dtu.c @@ -223,7 +223,7 @@ static const struct bmc_sw_config bmc_sw_smc = { }; /* Provided by Eric Chen (SMC) */ -const struct bmc_hw_config p8dtu_bmc_hw = { +static const struct bmc_hw_config p8dtu_bmc_hw = { .scu_revision_id = 0x02010303, .mcr_configuration = 0x00000577, .mcr_scu_mpll = 0x000050c0, diff --git a/platforms/astbmc/p9dsu.c b/platforms/astbmc/p9dsu.c index d49f7fe07..5c9756ec6 100644 --- a/platforms/astbmc/p9dsu.c +++ b/platforms/astbmc/p9dsu.c @@ -695,7 +695,7 @@ static const struct bmc_sw_config bmc_sw_smc = { }; /* Provided by Eric Chen (SMC) */ -const struct bmc_hw_config p9dsu_bmc_hw = { +static const struct bmc_hw_config p9dsu_bmc_hw = { .scu_revision_id = 0x04030303, .mcr_configuration = 0x11000756, .mcr_scu_mpll = 0x000071c1, diff --git a/platforms/astbmc/witherspoon.c b/platforms/astbmc/witherspoon.c index 8aaed975f..edf84fb89 100644 --- a/platforms/astbmc/witherspoon.c +++ b/platforms/astbmc/witherspoon.c @@ -325,7 +325,7 @@ i2c_failed: return; } -const struct platform_ocapi witherspoon_ocapi = { +static const struct platform_ocapi witherspoon_ocapi = { .i2c_engine = 1, .i2c_port = 4, .odl_phy_swap = false, @@ -370,8 +370,8 @@ static int gpu_slot_to_num(const char *slot) static void npu2_phb_nvlink_dt(struct phb *npuphb) { - struct dt_node *g[3] = { 0 }; /* Current maximum is 3 GPUs per 1 NPU */ - struct dt_node *n[6] = { 0 }; + struct dt_node *g[3] = { NULL }; /* Current maximum 3 GPUs per 1 NPU */ + struct dt_node *n[6] = { NULL }; int max_gpus, i, gpuid, first, last; struct npu2 *npu2_phb = phb_to_npu2_nvlink(npuphb); struct pci_device *npd; From patchwork Thu Nov 28 06:24:42 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Nicholas Piggin X-Patchwork-Id: 1201923 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.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 47NnvX1tvDz9s7T for ; Thu, 28 Nov 2019 17:35:36 +1100 (AEDT) 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="MjmrR+pS"; 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 47NnvW5D7nzDr0f for ; Thu, 28 Nov 2019 17:35:35 +1100 (AEDT) X-Original-To: skiboot@lists.ozlabs.org Delivered-To: skiboot@lists.ozlabs.org Authentication-Results: lists.ozlabs.org; spf=pass (sender SPF authorized) smtp.mailfrom=gmail.com (client-ip=2607:f8b0:4864:20::443; helo=mail-pf1-x443.google.com; envelope-from=npiggin@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="MjmrR+pS"; dkim-atps=neutral Received: from mail-pf1-x443.google.com (mail-pf1-x443.google.com [IPv6:2607:f8b0:4864:20::443]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (2048 bits) server-digest SHA256) (No client certificate requested) by lists.ozlabs.org (Postfix) with ESMTPS id 47NnjS3YFwzDqZ2 for ; Thu, 28 Nov 2019 17:26:52 +1100 (AEDT) Received: by mail-pf1-x443.google.com with SMTP id x28so12618964pfo.6 for ; Wed, 27 Nov 2019 22:26:52 -0800 (PST) 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 :mime-version:content-transfer-encoding; bh=0jfOwWndtRM4WkUUBqx/4oIughBUbwLkxds7UWNOfKc=; b=MjmrR+pSsCT21UeOOLo5fLGlZTY466+iJyKYGZWevrm6pB78B6BOF5SwL+ryHWiovP DGA4iz0oyPkr+zXcEjdzrjgeD/+PMTQPPGoYKXCaRWMd7bvBZJwnk3mAGBbM3Gmf18Gd HJIx4OJ//N5BqpcVFP+qmvZpcMTJHuJIFMkOFlP4Qvw0/dd0RQlqFCB2q73VC6l13gXl 4R94xcO9sqT5IQ48uD4ZB/klP31EhxYwU1c0xWSM06viZz9CAAnFNpkoDdKvpbgo/yzY O7Vx6WRNpdUjjEpX228b8NJrtkN0fzjx3kFY69tmXtQgHIyTRLk6lPi7056uPianSjU8 Z8sQ== 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:mime-version:content-transfer-encoding; bh=0jfOwWndtRM4WkUUBqx/4oIughBUbwLkxds7UWNOfKc=; b=aq+fiWCyVJNozWJ7Pfu65DxBr353vO329Q41U5JBtjCvGOBCbwdEYhJL4aoVadFSJo viBhQDZHpJUPnMb0+z1WtNxOJyzR2nlejOxX707WnANCc1lBlKU5kbe4ZD0mzyzP1vW2 hKK75tHeFCm+h2bS2SAwI677LiNE+i+UaIxntP7Fweziuh2HtoU5fSOmUejNXdxio1jD bqNG2Y1t6Ef0yjQjmpFApPex9qqLLwseY+AAbFp8Ukk0RDg+DHzUGnXJ73G3hgHna29U M3A/aKN1365TrI+6hDZZMWgZ++dofoXpfi8cKyYySqh2+GG1GA9SwyxN9Xv02xbw/ERk Vnpw== X-Gm-Message-State: APjAAAXcWvY4fi4Bc5xqsDEcIp6jowsKSFJdXI7ace5isqtQsknNrftO we2sqIeiSNzAFLlmU6iWN/QMvhKwHtA= X-Google-Smtp-Source: APXvYqwoo0WHyVl9ZHj5ddduoU0hRc4qcFvKAZ4bNQJiRG0PAGDrFdBx05qbGW1R3hvWJhN+Fq65Tw== X-Received: by 2002:a65:5608:: with SMTP id l8mr9362953pgs.135.1574922410579; Wed, 27 Nov 2019 22:26:50 -0800 (PST) Received: from bobo.local0.net ([203.194.47.34]) by smtp.gmail.com with ESMTPSA id e5sm8463196pjv.29.2019.11.27.22.26.48 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 27 Nov 2019 22:26:50 -0800 (PST) From: Nicholas Piggin To: skiboot@lists.ozlabs.org Date: Thu, 28 Nov 2019 16:24:42 +1000 Message-Id: <20191128062442.20690-29-npiggin@gmail.com> X-Mailer: git-send-email 2.23.0 In-Reply-To: <20191128062442.20690-1-npiggin@gmail.com> References: <20191128062442.20690-1-npiggin@gmail.com> MIME-Version: 1.0 Subject: [Skiboot] [PATCH v8 28/28] i2c: fix wild dereference X-BeenThere: skiboot@lists.ozlabs.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: Mailing list for skiboot development List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: skiboot-bounces+incoming=patchwork.ozlabs.org@lists.ozlabs.org Sender: "Skiboot" The contents of the buffer is not initialized in the case of a read, and not even necessarily at least 8 bytes long. It seems like the address is what's wanted. Signed-off-by: Nicholas Piggin --- core/i2c.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/core/i2c.c b/core/i2c.c index 6bae83b42..89231e5f9 100644 --- a/core/i2c.c +++ b/core/i2c.c @@ -173,10 +173,10 @@ int64_t i2c_request_sync(struct i2c_request *req) req->req_state = i2c_req_new; } - prlog(PR_DEBUG, "I2C: %s req op=%x offset=%x buf=%016llx buflen=%d " + prlog(PR_DEBUG, "I2C: %s req op=%x offset=%x buf=%p buflen=%d " "delay=%lu/%lld rc=%lld\n", (rc) ? "!!!!" : "----", req->op, req->offset, - *(uint64_t*) req->rw_buf, req->rw_len, tb_to_msecs(waited), req->timeout, rc); + req->rw_buf, req->rw_len, tb_to_msecs(waited), req->timeout, rc); return rc; }