From patchwork Sat May 2 11:19:05 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Nicholas Piggin X-Patchwork-Id: 1281599 Return-Path: X-Original-To: patchwork-incoming@ozlabs.org Delivered-To: patchwork-incoming@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 49DnG849qRz9sSk for ; Sat, 2 May 2020 21:39:28 +1000 (AEST) Authentication-Results: ozlabs.org; dmarc=pass (p=none dis=none) header.from=gmail.com Authentication-Results: ozlabs.org; dkim=pass (2048-bit key; unprotected) header.d=gmail.com header.i=@gmail.com header.a=rsa-sha256 header.s=20161025 header.b=OmHYqsOi; dkim-atps=neutral Received: from bilbo.ozlabs.org (lists.ozlabs.org [IPv6:2401:3900:2:1::3]) by lists.ozlabs.org (Postfix) with ESMTP id 49DnG83QFMzDqpR for ; Sat, 2 May 2020 21:39:28 +1000 (AEST) X-Original-To: linuxppc-dev@lists.ozlabs.org Delivered-To: linuxppc-dev@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.a=rsa-sha256 header.s=20161025 header.b=OmHYqsOi; 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 49Dmqf0Lh9zDr7D for ; Sat, 2 May 2020 21:19:57 +1000 (AEST) Received: by mail-pf1-x443.google.com with SMTP id v63so2879036pfb.10 for ; Sat, 02 May 2020 04:19:57 -0700 (PDT) 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=IQkeNeEnXCNQTTGVgT0Jtti91/uShgLOHBav68NJGnM=; b=OmHYqsOill6Zx1icteljeSlQBDLzvVx9hGVOk0t3qjRHLudqaAKYde4FLrR8RuOKnr yLTTgh0uyb0abpc9pbtCmqrr8kPRWKyY8pj6cAQ6cC8fI/+ImLolLwK5/QtyjJKq81mv kf43N9RoMuqaiqaqqcg3TBIOOfBMqclSywLUE3sggh46CRwEYz/vrPJ0DNsdbHwNLTRw riYnL+6FutcS9SVKge2zJaIQW98OKeX/nFSpMI65MNMeaMeYfo9MvmjmohVfbhVa8UqC KMBDJ4/oG7P27DvPsciiVP+Ax8dVMRIei10EYHXSMWatTrNTN/gpXjyeFC+JsQ3xrX2v wjbg== 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=IQkeNeEnXCNQTTGVgT0Jtti91/uShgLOHBav68NJGnM=; b=YSise/TCK6oZTdtbFkgBhp2y9T2kiZNzkrIkK3xDZLyZhGlvIWuNHfSBNIBgRW/dGL e6nLXpMGSDTbL7JgbxiwySYo8i8ELORrCOu09p+uNveAUhfjTbIQNjMK6tGD359B+RQs Be2D/Te9oqJlOVWaHAJcw0F9HOYEwyYYCBEBWuiroYxsWoYLPFSZbhGYZ3YbkM9575Wr i4mhznGO4FL5Q0QBxXl6lQrl1XisUbc7esX5nz9ardHXfQqCE+KDQWdZTnFhkqHkjzhF YXILOLXjDBzJG5C/KG8qmmKNFZr/0Y49mVqmkq6gXFKKkKGwnp8pbEyBKkEsplWus3jq +V/Q== X-Gm-Message-State: AGi0PuYkL0rVn75nV+tgBa5jpVdotzhdoZaOhB1g7cEcxMuKZvgZufcG fXkKRBwDdnMjU+S9YQo3yFnNMZjW X-Google-Smtp-Source: APiQypI1Wrvod1HOHTukTrZMCkn5QvEw1vJZhb9x+8lfobUcmlMGBC5mlVgmQ2hJq6RCr3KSEG8rIQ== X-Received: by 2002:a63:d30b:: with SMTP id b11mr8068320pgg.230.1588418393679; Sat, 02 May 2020 04:19:53 -0700 (PDT) Received: from bobo.ozlabs.ibm.com ([203.220.177.17]) by smtp.gmail.com with ESMTPSA id q15sm3862790pgj.52.2020.05.02.04.19.51 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Sat, 02 May 2020 04:19:53 -0700 (PDT) From: Nicholas Piggin To: linuxppc-dev@lists.ozlabs.org Subject: [RFC PATCH 01/10] kallsyms: architecture specific symbol lookups Date: Sat, 2 May 2020 21:19:05 +1000 Message-Id: <20200502111914.166578-2-npiggin@gmail.com> X-Mailer: git-send-email 2.23.0 In-Reply-To: <20200502111914.166578-1-npiggin@gmail.com> References: <20200502111914.166578-1-npiggin@gmail.com> MIME-Version: 1.0 X-BeenThere: linuxppc-dev@lists.ozlabs.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: Linux on PowerPC Developers Mail List List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: Nicholas Piggin Errors-To: linuxppc-dev-bounces+patchwork-incoming=ozlabs.org@lists.ozlabs.org Sender: "Linuxppc-dev" Provide CONFIG_ARCH_HAS_SYMBOL_LOOKUP which allows architectures to do their own symbol/address lookup if kernel and module lookups miss. powerpc will use this to deal with firmware symbols. Signed-off-by: Nicholas Piggin --- include/linux/kallsyms.h | 20 ++++++++++++++++++++ kernel/kallsyms.c | 13 ++++++++++++- lib/Kconfig | 3 +++ 3 files changed, 35 insertions(+), 1 deletion(-) diff --git a/include/linux/kallsyms.h b/include/linux/kallsyms.h index 657a83b943f0..e17c1e7c01c0 100644 --- a/include/linux/kallsyms.h +++ b/include/linux/kallsyms.h @@ -83,6 +83,26 @@ extern int kallsyms_lookup_size_offset(unsigned long addr, unsigned long *symbolsize, unsigned long *offset); +#ifdef CONFIG_ARCH_HAS_SYMBOL_LOOKUP +const char *arch_symbol_lookup_address(unsigned long addr, + unsigned long *symbolsize, + unsigned long *offset, + char **modname, char *namebuf); +unsigned long arch_symbol_lookup_name(const char *name); +#else +static inline const char *arch_symbol_lookup_address(unsigned long addr, + unsigned long *symbolsize, + unsigned long *offset, + char **modname, char *namebuf) +{ + return NULL; +} +static inline unsigned long arch_symbol_lookup_name(const char *name) +{ + return 0; +} +#endif + /* Lookup an address. modname is set to NULL if it's in the kernel. */ const char *kallsyms_lookup(unsigned long addr, unsigned long *symbolsize, diff --git a/kernel/kallsyms.c b/kernel/kallsyms.c index 16c8c605f4b0..1e403e616126 100644 --- a/kernel/kallsyms.c +++ b/kernel/kallsyms.c @@ -164,6 +164,7 @@ static unsigned long kallsyms_sym_address(int idx) unsigned long kallsyms_lookup_name(const char *name) { char namebuf[KSYM_NAME_LEN]; + unsigned long ret; unsigned long i; unsigned int off; @@ -173,7 +174,12 @@ unsigned long kallsyms_lookup_name(const char *name) if (strcmp(namebuf, name) == 0) return kallsyms_sym_address(i); } - return module_kallsyms_lookup_name(name); + + ret = module_kallsyms_lookup_name(name); + if (ret) + return ret; + + return arch_symbol_lookup_name(name); } int kallsyms_on_each_symbol(int (*fn)(void *, const char *, struct module *, @@ -309,6 +315,11 @@ const char *kallsyms_lookup(unsigned long addr, if (!ret) ret = ftrace_mod_address_lookup(addr, symbolsize, offset, modname, namebuf); + + if (!ret) + ret = arch_symbol_lookup_address(addr, symbolsize, + offset, modname, namebuf); + return ret; } diff --git a/lib/Kconfig b/lib/Kconfig index 5d53f9609c25..9f86f649a712 100644 --- a/lib/Kconfig +++ b/lib/Kconfig @@ -80,6 +80,9 @@ config ARCH_USE_CMPXCHG_LOCKREF config ARCH_HAS_FAST_MULTIPLIER bool +config ARCH_HAS_SYMBOL_LOOKUP + bool + config INDIRECT_PIO bool "Access I/O in non-MMIO mode" depends on ARM64 From patchwork Sat May 2 11:19:06 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Nicholas Piggin X-Patchwork-Id: 1281601 Return-Path: X-Original-To: patchwork-incoming@ozlabs.org Delivered-To: patchwork-incoming@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 49DnL10kmYz9sP7 for ; Sat, 2 May 2020 21:42:49 +1000 (AEST) Authentication-Results: ozlabs.org; dmarc=pass (p=none dis=none) header.from=gmail.com Authentication-Results: ozlabs.org; dkim=pass (2048-bit key; unprotected) header.d=gmail.com header.i=@gmail.com header.a=rsa-sha256 header.s=20161025 header.b=UoH6KiMP; dkim-atps=neutral Received: from bilbo.ozlabs.org (lists.ozlabs.org [IPv6:2401:3900:2:1::3]) by lists.ozlabs.org (Postfix) with ESMTP id 49DnL06lvbzDr0d for ; Sat, 2 May 2020 21:42:48 +1000 (AEST) X-Original-To: linuxppc-dev@lists.ozlabs.org Delivered-To: linuxppc-dev@lists.ozlabs.org Authentication-Results: lists.ozlabs.org; spf=pass (sender SPF authorized) smtp.mailfrom=gmail.com (client-ip=2607:f8b0:4864:20::544; helo=mail-pg1-x544.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.a=rsa-sha256 header.s=20161025 header.b=UoH6KiMP; dkim-atps=neutral Received: from mail-pg1-x544.google.com (mail-pg1-x544.google.com [IPv6:2607:f8b0:4864:20::544]) (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 49Dmqh1D7JzDr4r for ; Sat, 2 May 2020 21:19:59 +1000 (AEST) Received: by mail-pg1-x544.google.com with SMTP id l25so3545208pgc.5 for ; Sat, 02 May 2020 04:19:59 -0700 (PDT) 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=M6BLoEI0vXgQhm4LV6P7dwhEfUdtuqzK2lGdy4tmego=; b=UoH6KiMPW6x66W28P/Ud76jL9ADSibi4Azwaod1O6Tz0d+EjdOInSPlabXJzTjj1Ky pzT8w+GKdgNNZUNTSoePklCCErS9/feG+jw821pR4qG6u/0GB7N7ozbZWSiXAY2zYnSF m8u6PbuHrKxCDzIU2s7ukieHxR12gXOu+Sd7UOYtG/QD04j+vViBtQX8v7klP8LqKDfp SMVQcI5WecQRSx2mWqg0N5kbsmaRZ6LQC1TLh1Gs5jZwsOtUeCG8F1AlOKoxcsFVCtya yjfqfEmeaJlCkfuQLDr1CpmqlU8nuYHZEBu5hvuyFpOUYw+HhdzgLCZ/Vt/PIyDqMl/b MctA== 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=M6BLoEI0vXgQhm4LV6P7dwhEfUdtuqzK2lGdy4tmego=; b=ShSAO/sYNaa3XJ7tJqOYJI5LFJYxCDYXpOvAaAljJ41e9D9e9nL7QwIsdpha2oGkrB +kmKey3ttBkhYqKOKXnlBahmEBXIk+FhSwAeNUqcucoQGjzh2u/sLfT6pCWIx8sEqMcK kG6++CNmS2OJsS2DwDeunTxsRYB9jS89otPjqc44UJg/HEXB4KnjBUvYHjnJRA6RvOcY SMkjf0JCvK8TwWYMKZohS9KPscc8F98malKIk8eZSTm5OiJcX8Bbzn71ENQgVb0OhtBo 3DMzcRoYeijHJHmJgRzg3sN9/kydk/QXqA0kkQFRwqcKlp05euZqHPSv89vCPv3YmArl r7EQ== X-Gm-Message-State: AGi0PubibpRlHZ1D1wlsZ4U3XD7gPKUtAXD0hjceJ3ctIhx+AKFNDmeK 2zGr9pa3kywYwpxIMG2PJ7lITOUW X-Google-Smtp-Source: APiQypLZ8cNE96VM3qwaFx+i3n8B+624qt6LiF3OMliOEgBsmIj1+oxbVWNCT+PXdmExIlQKrRvDTg== X-Received: by 2002:a63:5413:: with SMTP id i19mr8860389pgb.213.1588418396658; Sat, 02 May 2020 04:19:56 -0700 (PDT) Received: from bobo.ozlabs.ibm.com ([203.220.177.17]) by smtp.gmail.com with ESMTPSA id q15sm3862790pgj.52.2020.05.02.04.19.54 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Sat, 02 May 2020 04:19:56 -0700 (PDT) From: Nicholas Piggin To: linuxppc-dev@lists.ozlabs.org Subject: [RFC PATCH 02/10] powerpc/powernv: Wire up OPAL address lookups Date: Sat, 2 May 2020 21:19:06 +1000 Message-Id: <20200502111914.166578-3-npiggin@gmail.com> X-Mailer: git-send-email 2.23.0 In-Reply-To: <20200502111914.166578-1-npiggin@gmail.com> References: <20200502111914.166578-1-npiggin@gmail.com> MIME-Version: 1.0 X-BeenThere: linuxppc-dev@lists.ozlabs.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: Linux on PowerPC Developers Mail List List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: Nicholas Piggin Errors-To: linuxppc-dev-bounces+patchwork-incoming=ozlabs.org@lists.ozlabs.org Sender: "Linuxppc-dev" Use ARCH_HAS_SYMBOL_LOOKUP to look up the opal symbol table. This allows crashes and xmon debugging to print firmware symbols. Oops: System Reset, sig: 6 [#1] LE PAGE_SIZE=64K MMU=Radix SMP NR_CPUS=2048 NUMA PowerNV Modules linked in: CPU: 0 PID: 0 Comm: swapper/0 Not tainted 5.6.0-rc2-dirty #903 NIP: 0000000030020434 LR: 000000003000378c CTR: 0000000030020414 REGS: c0000000fffc3d70 TRAP: 0100 Not tainted (5.6.0-rc2-dirty) MSR: 9000000002101002 CR: 28022284 XER: 20040000 CFAR: 0000000030003788 IRQMASK: 3 GPR00: 000000003000378c 0000000031c13c90 0000000030136200 c0000000012cfa10 GPR04: c0000000012cfa10 0000000000000010 0000000000000000 0000000031c10060 GPR08: c0000000012cfaaf 0000000030003640 0000000000000000 0000000000000001 GPR12: 00000000300e0000 c000000001490000 0000000000000000 c00000000139c588 GPR16: 0000000031c10000 c00000000125a900 0000000000000000 c0000000012076a8 GPR20: c0000000012a3950 0000000000000001 0000000031c10060 c0000000012cfaaf GPR24: 0000000000000019 0000000030003640 0000000000000000 0000000000000000 GPR28: 0000000000000010 c0000000012cfa10 0000000000000000 0000000000000000 NIP [0000000030020434] .dummy_console_write_buffer_space+0x20/0x64 [OPAL] LR [000000003000378c] opal_entry+0x14c/0x17c [OPAL] This won't unwind the firmware stack (or its Linux caller) properly if firmware and kernel endians don't match, but that problem could be solved in powerpc's unwinder. Signed-off-by: Nicholas Piggin --- arch/powerpc/Kconfig | 1 + arch/powerpc/include/asm/opal-api.h | 4 ++- arch/powerpc/include/asm/opal.h | 3 ++ arch/powerpc/platforms/powernv/opal-call.c | 2 ++ arch/powerpc/platforms/powernv/opal.c | 40 ++++++++++++++++++++++ 5 files changed, 49 insertions(+), 1 deletion(-) diff --git a/arch/powerpc/Kconfig b/arch/powerpc/Kconfig index 924c541a9260..0be717291e38 100644 --- a/arch/powerpc/Kconfig +++ b/arch/powerpc/Kconfig @@ -115,6 +115,7 @@ config PPC # Please keep this list sorted alphabetically. # select ARCH_32BIT_OFF_T if PPC32 + select ARCH_HAS_SYMBOL_LOOKUP if PPC_POWERNV select ARCH_HAS_DEBUG_VIRTUAL select ARCH_HAS_DEVMEM_IS_ALLOWED select ARCH_HAS_ELF_RANDOMIZE diff --git a/arch/powerpc/include/asm/opal-api.h b/arch/powerpc/include/asm/opal-api.h index 1dffa3cb16ba..8eb31b9aeb27 100644 --- a/arch/powerpc/include/asm/opal-api.h +++ b/arch/powerpc/include/asm/opal-api.h @@ -214,7 +214,9 @@ #define OPAL_SECVAR_GET 176 #define OPAL_SECVAR_GET_NEXT 177 #define OPAL_SECVAR_ENQUEUE_UPDATE 178 -#define OPAL_LAST 178 +#define OPAL_ADDR_TO_SYM 181 +#define OPAL_SYM_TO_ADDR 182 +#define OPAL_LAST 182 #define QUIESCE_HOLD 1 /* Spin all calls at entry */ #define QUIESCE_REJECT 2 /* Fail all calls with OPAL_BUSY */ diff --git a/arch/powerpc/include/asm/opal.h b/arch/powerpc/include/asm/opal.h index 9986ac34b8e2..56b6994aefb7 100644 --- a/arch/powerpc/include/asm/opal.h +++ b/arch/powerpc/include/asm/opal.h @@ -312,6 +312,9 @@ s64 opal_mpipl_query_tag(enum opal_mpipl_tags tag, u64 *addr); s64 opal_signal_system_reset(s32 cpu); s64 opal_quiesce(u64 shutdown_type, s32 cpu); +int64_t opal_addr_to_sym(uint64_t addr, __be64 *symaddr, __be64 *symsize, char *namebuf, uint64_t buflen); +int64_t opal_sym_to_addr(const char *name, __be64 *symaddr, __be64 *symsize); + /* Internal functions */ extern int early_init_dt_scan_opal(unsigned long node, const char *uname, int depth, void *data); diff --git a/arch/powerpc/platforms/powernv/opal-call.c b/arch/powerpc/platforms/powernv/opal-call.c index 5cd0f52d258f..2233a58924cb 100644 --- a/arch/powerpc/platforms/powernv/opal-call.c +++ b/arch/powerpc/platforms/powernv/opal-call.c @@ -293,3 +293,5 @@ OPAL_CALL(opal_mpipl_query_tag, OPAL_MPIPL_QUERY_TAG); OPAL_CALL(opal_secvar_get, OPAL_SECVAR_GET); OPAL_CALL(opal_secvar_get_next, OPAL_SECVAR_GET_NEXT); OPAL_CALL(opal_secvar_enqueue_update, OPAL_SECVAR_ENQUEUE_UPDATE); +OPAL_CALL(opal_addr_to_sym, OPAL_ADDR_TO_SYM); +OPAL_CALL(opal_sym_to_addr, OPAL_SYM_TO_ADDR); diff --git a/arch/powerpc/platforms/powernv/opal.c b/arch/powerpc/platforms/powernv/opal.c index 2b3dfd0b6cdd..1bf2e0b31ecf 100644 --- a/arch/powerpc/platforms/powernv/opal.c +++ b/arch/powerpc/platforms/powernv/opal.c @@ -107,6 +107,46 @@ void opal_configure_cores(void) cur_cpu_spec->cpu_restore(); } +const char *arch_symbol_lookup_address(unsigned long addr, + unsigned long *symbolsize, + unsigned long *offset, + char **modname, char *namebuf) +{ + __be64 symaddr; + __be64 symsize; + + if (!firmware_has_feature(FW_FEATURE_OPAL)) + return NULL; + + if (opal_addr_to_sym(addr, &symaddr, &symsize, namebuf, + cpu_to_be64(KSYM_NAME_LEN)) != OPAL_SUCCESS) + return NULL; + + *symbolsize = be64_to_cpu(symsize); + *offset = addr - be64_to_cpu(symaddr); + *modname = "OPAL"; + + return namebuf; +} + +unsigned long arch_symbol_lookup_name(const char *name) +{ + __be64 addr; + __be64 size; + + if (!firmware_has_feature(FW_FEATURE_OPAL)) + return 0; + + /* opal: prefix allows lookup of symbols that clash with kernel */ + if (!strncasecmp(name, "opal:", strlen("opal:"))) + name += strlen("opal:"); + + if (opal_sym_to_addr(name, &addr, &size) != OPAL_SUCCESS) + return 0; + + return be64_to_cpu(addr); +} + int __init early_init_dt_scan_opal(unsigned long node, const char *uname, int depth, void *data) { From patchwork Sat May 2 11:19:07 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Nicholas Piggin X-Patchwork-Id: 1281602 Return-Path: X-Original-To: patchwork-incoming@ozlabs.org Delivered-To: patchwork-incoming@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 49DnMg5GJRz9sP7 for ; Sat, 2 May 2020 21:44:15 +1000 (AEST) Authentication-Results: ozlabs.org; dmarc=pass (p=none dis=none) header.from=gmail.com Authentication-Results: ozlabs.org; dkim=pass (2048-bit key; unprotected) header.d=gmail.com header.i=@gmail.com header.a=rsa-sha256 header.s=20161025 header.b=DzXBTipT; dkim-atps=neutral Received: from bilbo.ozlabs.org (lists.ozlabs.org [IPv6:2401:3900:2:1::3]) by lists.ozlabs.org (Postfix) with ESMTP id 49DnMg4ZGvzDqdm for ; Sat, 2 May 2020 21:44:15 +1000 (AEST) X-Original-To: linuxppc-dev@lists.ozlabs.org Delivered-To: linuxppc-dev@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.a=rsa-sha256 header.s=20161025 header.b=DzXBTipT; 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 49Dmqk5CsjzDr7K for ; Sat, 2 May 2020 21:20:02 +1000 (AEST) Received: by mail-pg1-x541.google.com with SMTP id 207so252401pgc.6 for ; Sat, 02 May 2020 04:20:02 -0700 (PDT) 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=RGNzrwTjIMK1/vfI1lYVYwt1wjtTA/Pvo6Eyc0KS950=; b=DzXBTipTgudZ9DiQWipBQn4CBHaoaZVRK+WYG7cMuO9KsxQaR4tG2cwgImNuIvveRK p5kQXGOs+uSvzuge28hRRXoTn5f1F/iJshaS+RJcXsR/XK5gOZoaimM2wNqNFbuofb1J l6OgHBOSvQs4kY1ouLVOk03Fi2DgLnXDTBIw/SO6eTai8QQ+3DBqq2eZmH3WCazOGe6/ qztd3WDn0AvjshFZh26veBjoMN2IskLdn6fjbznG4gHcAzEKpWKPmQMealBPm/J699qt HmJkKtsMluEwsrIx3oyrBQJZlloQHvonMrxMNl9iDj4Y8L9Hbw3G6qnqCwjgG5OjPiXl lifQ== 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=RGNzrwTjIMK1/vfI1lYVYwt1wjtTA/Pvo6Eyc0KS950=; b=flVx6pkhj0rSp/FD7gIXtDvlCI257Fj9h866rvcwt/GNd0EFpZmZaYBbqydkf+MmI6 KPqFYhgyBu4XC+CrBidbAQe9H36C9KyU30EFi7vDndip7z/pvdtZRnEoIwIrFwcmyqQD +snhYmFtSpZF2U+SR4xok+wRmrEwkDOV/fSGBaZWOrzttkLUKyWmacL+gn6UC4YPDWUQ FJT7TuJQiRkOGuO4ztHGB2kIjNrVYZtIcywcdBnNTKU6XZQAq6JTil8BlToY9blKP2xl 9zmP28cZTriVmmh94FT8lDQlDedGwDuGfEG5Gk0x8TTEX0x8KQtlW4Wn2zgA65MzBfDz p4aw== X-Gm-Message-State: AGi0PuYJJzLyvTQ1Qj55rXVFbdb2sFzlcxW6yORVxnpM4NChurwQBPES fjQadg+yESUfHgKwTvK0t2QsZcjg X-Google-Smtp-Source: APiQypLYmTFprmFqQOriy9XGrNoELx7TcVD14sHDyRYwD8r6sKqdd+CluUYD1xSbJao1Igc9EyC7Qg== X-Received: by 2002:a63:5a5d:: with SMTP id k29mr8109539pgm.176.1588418399537; Sat, 02 May 2020 04:19:59 -0700 (PDT) Received: from bobo.ozlabs.ibm.com ([203.220.177.17]) by smtp.gmail.com with ESMTPSA id q15sm3862790pgj.52.2020.05.02.04.19.57 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Sat, 02 May 2020 04:19:59 -0700 (PDT) From: Nicholas Piggin To: linuxppc-dev@lists.ozlabs.org Subject: [RFC PATCH 03/10] powerpc/powernv: Use OPAL_REPORT_TRAP to cope with trap interrupts from OPAL Date: Sat, 2 May 2020 21:19:07 +1000 Message-Id: <20200502111914.166578-4-npiggin@gmail.com> X-Mailer: git-send-email 2.23.0 In-Reply-To: <20200502111914.166578-1-npiggin@gmail.com> References: <20200502111914.166578-1-npiggin@gmail.com> MIME-Version: 1.0 X-BeenThere: linuxppc-dev@lists.ozlabs.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: Linux on PowerPC Developers Mail List List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: Nicholas Piggin Errors-To: linuxppc-dev-bounces+patchwork-incoming=ozlabs.org@lists.ozlabs.org Sender: "Linuxppc-dev" This isn't used yet, because OPAL is nice enough not to cause unexpected program check interrupts to the OS. A future patch will allow OPAL to start using traps. Like so. [OPAL] < assert failed at core/opal.c:814 > [OPAL] . [OPAL] . [OPAL] . [OPAL] OO__) [OPAL] <"__/ [OPAL] ^ ^ cpu 0x0: Vector: 700 (Program Check) at [c000000080287770] pc: 000000003002f360: opal_poll_events+0x54/0x174 [OPAL] lr: 000000003002f344: opal_poll_events+0x38/0x174 [OPAL] sp: c000000080287a00 msr: 9000000000021033 current = 0xc0000000016fa100 paca = 0xc0000000012c0000^I irqmask: 0x03^I irq_happened: 0x01 pid = 19, comm = kopald Linux version 5.7.0-rc3-00053-g2d9c3c965178-dirty enter ? for help [c000000080287a80] 000000003002e6b8 opal_v4_le_entry+0x224/0x29c [OPAL] [c000000080287b50] c000000000096ce8 opal_call+0x1c8/0x580 [c000000080287c90] c000000000097448 opal_poll_events+0x28/0x40 [c000000080287d00] c0000000000a26e0 opal_handle_events+0x70/0x140 [c000000080287d50] c00000000009a198 kopald+0x98/0x140 [c000000080287db0] c00000000012139c kthread+0x18c/0x1a0 [c000000080287e20] c00000000000cc28 ret_from_kernel_thread+0x5c/0x74 Signed-off-by: Nicholas Piggin --- arch/powerpc/include/asm/opal-api.h | 7 +++- arch/powerpc/include/asm/opal.h | 2 ++ arch/powerpc/kernel/traps.c | 39 ++++++++++++++++------ arch/powerpc/platforms/powernv/opal-call.c | 1 + 4 files changed, 37 insertions(+), 12 deletions(-) diff --git a/arch/powerpc/include/asm/opal-api.h b/arch/powerpc/include/asm/opal-api.h index 8eb31b9aeb27..018d4734c323 100644 --- a/arch/powerpc/include/asm/opal-api.h +++ b/arch/powerpc/include/asm/opal-api.h @@ -216,7 +216,8 @@ #define OPAL_SECVAR_ENQUEUE_UPDATE 178 #define OPAL_ADDR_TO_SYM 181 #define OPAL_SYM_TO_ADDR 182 -#define OPAL_LAST 182 +#define OPAL_REPORT_TRAP 183 +#define OPAL_LAST 183 #define QUIESCE_HOLD 1 /* Spin all calls at entry */ #define QUIESCE_REJECT 2 /* Fail all calls with OPAL_BUSY */ @@ -1184,6 +1185,10 @@ struct opal_mpipl_fadump { struct opal_mpipl_region region[]; } __packed; +#define OPAL_TRAP_FATAL 1 +#define OPAL_TRAP_WARN 2 +#define OPAL_TRAP_PANIC 3 + #endif /* __ASSEMBLY__ */ #endif /* __OPAL_API_H */ diff --git a/arch/powerpc/include/asm/opal.h b/arch/powerpc/include/asm/opal.h index 56b6994aefb7..dc77c2d5e036 100644 --- a/arch/powerpc/include/asm/opal.h +++ b/arch/powerpc/include/asm/opal.h @@ -314,6 +314,8 @@ s64 opal_quiesce(u64 shutdown_type, s32 cpu); int64_t opal_addr_to_sym(uint64_t addr, __be64 *symaddr, __be64 *symsize, char *namebuf, uint64_t buflen); int64_t opal_sym_to_addr(const char *name, __be64 *symaddr, __be64 *symsize); +int64_t opal_report_trap(uint64_t nip); + /* Internal functions */ extern int early_init_dt_scan_opal(unsigned long node, const char *uname, diff --git a/arch/powerpc/kernel/traps.c b/arch/powerpc/kernel/traps.c index 3fca22276bb1..0274ae7b8a03 100644 --- a/arch/powerpc/kernel/traps.c +++ b/arch/powerpc/kernel/traps.c @@ -52,6 +52,7 @@ #endif #ifdef CONFIG_PPC64 #include +#include #include #include #endif @@ -1471,7 +1472,6 @@ void program_check_exception(struct pt_regs *regs) goto bail; } if (reason & REASON_TRAP) { - unsigned long bugaddr; /* Debugger is first in line to stop recursive faults in * rcu_lock, notify_die, or atomic_notifier_call_chain */ if (debugger_bpt(regs)) @@ -1485,18 +1485,35 @@ void program_check_exception(struct pt_regs *regs) == NOTIFY_STOP) goto bail; - bugaddr = regs->nip; - /* - * Fixup bugaddr for BUG_ON() in real mode - */ - if (!is_kernel_addr(bugaddr) && !(regs->msr & MSR_IR)) - bugaddr += PAGE_OFFSET; + if (!(regs->msr & MSR_PR)) { /* not user-mode */ + unsigned long bugaddr; + enum bug_trap_type t; + + /* + * Fixup bugaddr for BUG_ON() in real mode + */ + bugaddr = regs->nip; + if (!is_kernel_addr(bugaddr) && !(regs->msr & MSR_IR)) + bugaddr += PAGE_OFFSET; + t = report_bug(bugaddr, regs); + if (t == BUG_TRAP_TYPE_WARN) { + regs->nip += 4; + goto bail; + } + if (t == BUG_TRAP_TYPE_BUG) + goto bug; - if (!(regs->msr & MSR_PR) && /* not user-mode */ - report_bug(bugaddr, regs) == BUG_TRAP_TYPE_WARN) { - regs->nip += 4; - goto bail; + if (firmware_has_feature(FW_FEATURE_OPAL)) { + int64_t ret; + + ret = opal_report_trap(regs->nip); + if (ret == OPAL_TRAP_WARN) { + regs->nip += 4; + goto bail; + } + } } +bug: _exception(SIGTRAP, regs, TRAP_BRKPT, regs->nip); goto bail; } diff --git a/arch/powerpc/platforms/powernv/opal-call.c b/arch/powerpc/platforms/powernv/opal-call.c index 2233a58924cb..506b1798081a 100644 --- a/arch/powerpc/platforms/powernv/opal-call.c +++ b/arch/powerpc/platforms/powernv/opal-call.c @@ -295,3 +295,4 @@ OPAL_CALL(opal_secvar_get_next, OPAL_SECVAR_GET_NEXT); OPAL_CALL(opal_secvar_enqueue_update, OPAL_SECVAR_ENQUEUE_UPDATE); OPAL_CALL(opal_addr_to_sym, OPAL_ADDR_TO_SYM); OPAL_CALL(opal_sym_to_addr, OPAL_SYM_TO_ADDR); +OPAL_CALL(opal_report_trap, OPAL_REPORT_TRAP); From patchwork Sat May 2 11:19:08 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Nicholas Piggin X-Patchwork-Id: 1281603 Return-Path: X-Original-To: patchwork-incoming@ozlabs.org Delivered-To: patchwork-incoming@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 49DnPZ3cHdz9sP7 for ; Sat, 2 May 2020 21:45:54 +1000 (AEST) Authentication-Results: ozlabs.org; dmarc=pass (p=none dis=none) header.from=gmail.com Authentication-Results: ozlabs.org; dkim=pass (2048-bit key; unprotected) header.d=gmail.com header.i=@gmail.com header.a=rsa-sha256 header.s=20161025 header.b=hzSFxZm6; dkim-atps=neutral Received: from bilbo.ozlabs.org (lists.ozlabs.org [IPv6:2401:3900:2:1::3]) by lists.ozlabs.org (Postfix) with ESMTP id 49DnPZ2jm9zDqdm for ; Sat, 2 May 2020 21:45:54 +1000 (AEST) X-Original-To: linuxppc-dev@lists.ozlabs.org Delivered-To: linuxppc-dev@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.a=rsa-sha256 header.s=20161025 header.b=hzSFxZm6; 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 49Dmqn4XL4zDrBc for ; Sat, 2 May 2020 21:20:05 +1000 (AEST) Received: by mail-pl1-x644.google.com with SMTP id w3so4689368plz.5 for ; Sat, 02 May 2020 04:20:05 -0700 (PDT) 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=xFIEcWv4OxwP8HNyyHauKSUTNIdHQYF4oqYOfWG+scQ=; b=hzSFxZm6Ct+Sy2xteiKoQBwzPYGaiEfaPEkPOBy2zDCnFXOLESLYS3z6XbK37Z6Zbk PpW7Dt2ESfXv3BGI+jHttEFFfAEFZfaaRWu9u5vd4t+6z/06FRqUpriIKW+2hXkD5mcD AObQAErGOBzSvMzrS713zAOgqWISQpySfiyU/x5LSMt3u+kMRO8IbcfiLiFcj9m8GjvB cDoobtWiZYhkeb5YG+hvA3XgNyLVlmS6RzQ13N1G1H806BdIETwKa27O4h4drqLrmCDH 6NEwENLuzsUQrwf5Q0Jrpxe7+PzHrcMVeQnV9fewfNFUgFRqrvkDczoiYb3QWQSHSwe4 wg+Q== 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=xFIEcWv4OxwP8HNyyHauKSUTNIdHQYF4oqYOfWG+scQ=; b=k10YWOVe5Z2W1Qofo40qv/40q4+yDlx14CrC1IOiHTnUhdmrmF6uNHOdWS9lczo6P6 8S/0I82m89sA92AikpirjboMbcvZf2mF5fgJAgYok852x03PuT5mp6VN5vIlz14e0C+V CZC60eCpTXYJFiXg1VqKLY0H85YDz8YYpTMptoGc1obchovhmOx8ie8rJEi7xHm/MNm+ d70ONT8gcymiNGqMJUiobXkTmCj9xzyZVXMONj73hPyQU+RayUAL4Vp/oTfJTXM+C5wd bsso5jb1h9Ot8+UFkj8m+AF4dEt2M/H2jmu1bn3LjcHm9HfZIUXSUHQS6kOGAOvu7+Kr eG2g== X-Gm-Message-State: AGi0PuYg4UoJsR3b4TgsRSE7AQLIEhZPGUJwX5EArW3qc+P9a3wcpbGD nYvOS9N1GPb363GHJDgwbugxZeKG X-Google-Smtp-Source: APiQypI5Nc3qcM8cQ9+9T11cs+xUkSDojnqyTRTdEyHrVFLmdyS9dXk4REqfIlvReWcj09qpc9LKHQ== X-Received: by 2002:a17:90a:2450:: with SMTP id h74mr5192031pje.57.1588418402153; Sat, 02 May 2020 04:20:02 -0700 (PDT) Received: from bobo.ozlabs.ibm.com ([203.220.177.17]) by smtp.gmail.com with ESMTPSA id q15sm3862790pgj.52.2020.05.02.04.19.59 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Sat, 02 May 2020 04:20:01 -0700 (PDT) From: Nicholas Piggin To: linuxppc-dev@lists.ozlabs.org Subject: [RFC PATCH 04/10] powerpc/powernv: avoid polling in opal_get_chars Date: Sat, 2 May 2020 21:19:08 +1000 Message-Id: <20200502111914.166578-5-npiggin@gmail.com> X-Mailer: git-send-email 2.23.0 In-Reply-To: <20200502111914.166578-1-npiggin@gmail.com> References: <20200502111914.166578-1-npiggin@gmail.com> MIME-Version: 1.0 X-BeenThere: linuxppc-dev@lists.ozlabs.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: Linux on PowerPC Developers Mail List List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: Nicholas Piggin Errors-To: linuxppc-dev-bounces+patchwork-incoming=ozlabs.org@lists.ozlabs.org Sender: "Linuxppc-dev" OPAL console IO should avoid locks and complexity where possible, to maximise the chance of it working if there are crashes or bugs. This poll is not necessary, opal_console_read can handle no input. In a future patch, Linux will provide a console service to OPAL via the OPAL console, so it must avoid using any other OPAL calls in this path. Signed-off-by: Nicholas Piggin --- arch/powerpc/platforms/powernv/opal.c | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/arch/powerpc/platforms/powernv/opal.c b/arch/powerpc/platforms/powernv/opal.c index 1bf2e0b31ecf..e8eba210a92d 100644 --- a/arch/powerpc/platforms/powernv/opal.c +++ b/arch/powerpc/platforms/powernv/opal.c @@ -467,13 +467,10 @@ static int __init opal_message_init(struct device_node *opal_node) int opal_get_chars(uint32_t vtermno, char *buf, int count) { s64 rc; - __be64 evt, len; + __be64 len; if (!opal.entry) return -ENODEV; - opal_poll_events(&evt); - if ((be64_to_cpu(evt) & OPAL_EVENT_CONSOLE_INPUT) == 0) - return 0; len = cpu_to_be64(count); rc = opal_console_read(vtermno, &len, buf); if (rc == OPAL_SUCCESS) From patchwork Sat May 2 11:19:09 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Nicholas Piggin X-Patchwork-Id: 1281604 Return-Path: X-Original-To: patchwork-incoming@ozlabs.org Delivered-To: patchwork-incoming@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 49DnRz1zzWz9sP7 for ; Sat, 2 May 2020 21:47:59 +1000 (AEST) Authentication-Results: ozlabs.org; dmarc=pass (p=none dis=none) header.from=gmail.com Authentication-Results: ozlabs.org; dkim=pass (2048-bit key; unprotected) header.d=gmail.com header.i=@gmail.com header.a=rsa-sha256 header.s=20161025 header.b=QgrCEHP7; dkim-atps=neutral Received: from bilbo.ozlabs.org (lists.ozlabs.org [IPv6:2401:3900:2:1::3]) by lists.ozlabs.org (Postfix) with ESMTP id 49DnRy1LjXzDqRj for ; Sat, 2 May 2020 21:47:58 +1000 (AEST) X-Original-To: linuxppc-dev@lists.ozlabs.org Delivered-To: linuxppc-dev@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.a=rsa-sha256 header.s=20161025 header.b=QgrCEHP7; 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 49Dmqr24y3zDr8p for ; Sat, 2 May 2020 21:20:08 +1000 (AEST) Received: by mail-pl1-x641.google.com with SMTP id v2so4683633plp.9 for ; Sat, 02 May 2020 04:20:08 -0700 (PDT) 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=znM9/6PfPr4QtQILUnLe07YofG8wlv3mwxo9PdQ+ZP0=; b=QgrCEHP7XKVi5fCePRxprXW8UzutIGteJyQCrMaX6fR1pCVe3ZeeXZNX7JazEtB+3I KuT1Cc0soNLfq6J+rdxf9P8RRlAwPr7MsQzNW0KrICPF2QBGege7B4SNzms6ACCvXRM/ v5hcQZt3f2FDG9KHjryawGJyKHjpHDtuZNl9wnYYCaUno46liHGmTiJxVWh9VY6EgPxw l0XE9yT1Uf3wjdV+QG3/MTaZTUYkPMKtrecxEqOgzle153tJVIBK1NqJi77unaJeTeD+ bBgXamYCSTJ5DsFM03ZT+x8whtll7IdyoYcQQzU4nfrE3EY4e9iYNHsSOk4qh0y7f93F Zy+w== 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=znM9/6PfPr4QtQILUnLe07YofG8wlv3mwxo9PdQ+ZP0=; b=KNC5B8027KJrUN0LJal2zCaZ1ldgsKEcNtA989LfDJSkD67HXCVfYQHdoip2j3z85B gInuBwqJBF78jGtcHBVW/Pf2quibZaPf3MpjCGF7aAAovPkUjaNiZdi6aHhiQ07m8Fpt 7eOQ6/IAbOgGVVIoVNJrbB8uzD4n1COuU5HJf5KCaW+lEzFLjiFF2x1HtX/MiqLzpbLI hHYUWGrATEyIcpZK40qXDdQywaaWmq0750n9mGnOWRoS1rLIpc652a7s46T5FUiDEg+s tctXi5X8cBfMyZKxxgh82KcLkHlCI0tHCJMFUgF1YdRoVCUjUYxuTLo7q9PTCYL4xrrX thXA== X-Gm-Message-State: AGi0PuZKCEvZGaOq48CsSBahOWDRwsZXYGMzPgTAcpxoXEO3GJlT15G0 OnPZrrT1IQP6V9mqi750lJL7ZPno X-Google-Smtp-Source: APiQypKYat3d8qHnShrt+3ggzomYoEDODqQhGW4vdAEiiLP7IezV/Joo+NFfUf2xkab1q+cBXo6T0A== X-Received: by 2002:a17:902:26f:: with SMTP id 102mr2091383plc.209.1588418405275; Sat, 02 May 2020 04:20:05 -0700 (PDT) Received: from bobo.ozlabs.ibm.com ([203.220.177.17]) by smtp.gmail.com with ESMTPSA id q15sm3862790pgj.52.2020.05.02.04.20.02 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Sat, 02 May 2020 04:20:04 -0700 (PDT) From: Nicholas Piggin To: linuxppc-dev@lists.ozlabs.org Subject: [RFC PATCH 05/10] powerpc/powernv: Don't translate kernel addresses to real addresses for OPAL Date: Sat, 2 May 2020 21:19:09 +1000 Message-Id: <20200502111914.166578-6-npiggin@gmail.com> X-Mailer: git-send-email 2.23.0 In-Reply-To: <20200502111914.166578-1-npiggin@gmail.com> References: <20200502111914.166578-1-npiggin@gmail.com> MIME-Version: 1.0 X-BeenThere: linuxppc-dev@lists.ozlabs.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: Linux on PowerPC Developers Mail List List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: Nicholas Piggin Errors-To: linuxppc-dev-bounces+patchwork-incoming=ozlabs.org@lists.ozlabs.org Sender: "Linuxppc-dev" A random assortment of OPAL callers use __pa() on pointers (others don't). This is not required because __pa() behaves the same as __va() when translation is off. In order to run OPAL with translation on, the effective addresses have to be used. Signed-off-by: Nicholas Piggin --- arch/powerpc/perf/imc-pmu.c | 4 ++-- arch/powerpc/platforms/powernv/npu-dma.c | 2 +- arch/powerpc/platforms/powernv/opal-dump.c | 2 +- arch/powerpc/platforms/powernv/opal-elog.c | 4 ++-- arch/powerpc/platforms/powernv/opal-flash.c | 6 +++--- arch/powerpc/platforms/powernv/opal-hmi.c | 2 +- arch/powerpc/platforms/powernv/opal-nvram.c | 4 ++-- arch/powerpc/platforms/powernv/opal-powercap.c | 2 +- arch/powerpc/platforms/powernv/opal-psr.c | 2 +- arch/powerpc/platforms/powernv/opal-xscom.c | 2 +- arch/powerpc/platforms/powernv/opal.c | 6 +++--- arch/powerpc/platforms/powernv/pci-ioda.c | 2 +- arch/powerpc/sysdev/xive/native.c | 2 +- drivers/char/powernv-op-panel.c | 3 +-- drivers/i2c/busses/i2c-opal.c | 12 ++++++------ drivers/mtd/devices/powernv_flash.c | 4 ++-- 16 files changed, 29 insertions(+), 30 deletions(-) diff --git a/arch/powerpc/perf/imc-pmu.c b/arch/powerpc/perf/imc-pmu.c index eb82dda884e5..332c7a3398f3 100644 --- a/arch/powerpc/perf/imc-pmu.c +++ b/arch/powerpc/perf/imc-pmu.c @@ -610,7 +610,7 @@ static int core_imc_mem_init(int cpu, int size) mutex_init(&core_imc_refc[core_id].lock); rc = opal_imc_counters_init(OPAL_IMC_COUNTERS_CORE, - __pa((void *)mem_info->vbase), + (u64)mem_info->vbase, get_hard_smp_processor_id(cpu)); if (rc) { free_pages((u64)mem_info->vbase, get_order(size)); @@ -1209,7 +1209,7 @@ static int trace_imc_mem_alloc(int cpu_id, int size) per_cpu(trace_imc_mem, cpu_id) = local_mem; /* Initialise the counters for trace mode */ - rc = opal_imc_counters_init(OPAL_IMC_COUNTERS_TRACE, __pa((void *)local_mem), + rc = opal_imc_counters_init(OPAL_IMC_COUNTERS_TRACE, (u64)local_mem, get_hard_smp_processor_id(cpu_id)); if (rc) { pr_info("IMC:opal init failed for trace imc\n"); diff --git a/arch/powerpc/platforms/powernv/npu-dma.c b/arch/powerpc/platforms/powernv/npu-dma.c index b95b9e3c4c98..9d38a30cc27e 100644 --- a/arch/powerpc/platforms/powernv/npu-dma.c +++ b/arch/powerpc/platforms/powernv/npu-dma.c @@ -149,7 +149,7 @@ static long pnv_npu_set_window(struct iommu_table_group *table_group, int num, npe->pe_number, npe->pe_number, tbl->it_indirect_levels + 1, - __pa(tbl->it_base), + __pa(tbl->it_base), /* XXX? */ size << 3, IOMMU_PAGE_SIZE(tbl)); if (rc) { diff --git a/arch/powerpc/platforms/powernv/opal-dump.c b/arch/powerpc/platforms/powernv/opal-dump.c index 543c816fa99e..94d5fb716a32 100644 --- a/arch/powerpc/platforms/powernv/opal-dump.c +++ b/arch/powerpc/platforms/powernv/opal-dump.c @@ -256,7 +256,7 @@ static int64_t dump_read_data(struct dump_obj *dump) } /* First entry address */ - addr = __pa(list); + addr = (u64)list; /* Fetch data */ rc = OPAL_BUSY_EVENT; diff --git a/arch/powerpc/platforms/powernv/opal-elog.c b/arch/powerpc/platforms/powernv/opal-elog.c index 62ef7ad995da..6af5ff892195 100644 --- a/arch/powerpc/platforms/powernv/opal-elog.c +++ b/arch/powerpc/platforms/powernv/opal-elog.c @@ -163,7 +163,7 @@ static ssize_t raw_attr_read(struct file *filep, struct kobject *kobj, if (!elog->buffer) return -EIO; - opal_rc = opal_read_elog(__pa(elog->buffer), + opal_rc = opal_read_elog((u64)elog->buffer, elog->size, elog->id); if (opal_rc != OPAL_SUCCESS) { pr_err("ELOG: log read failed for log-id=%llx\n", @@ -206,7 +206,7 @@ static struct elog_obj *create_elog_obj(uint64_t id, size_t size, uint64_t type) elog->buffer = kzalloc(elog->size, GFP_KERNEL); if (elog->buffer) { - rc = opal_read_elog(__pa(elog->buffer), + rc = opal_read_elog((u64)elog->buffer, elog->size, elog->id); if (rc != OPAL_SUCCESS) { pr_err("ELOG: log read failed for log-id=%llx\n", diff --git a/arch/powerpc/platforms/powernv/opal-flash.c b/arch/powerpc/platforms/powernv/opal-flash.c index 7e7d38b17420..46f02279d36a 100644 --- a/arch/powerpc/platforms/powernv/opal-flash.c +++ b/arch/powerpc/platforms/powernv/opal-flash.c @@ -130,11 +130,11 @@ static DEFINE_MUTEX(image_data_mutex); static inline void opal_flash_validate(void) { long ret; - void *buf = validate_flash_data.buf; + u64 buf = (u64)validate_flash_data.buf; __be32 size = cpu_to_be32(validate_flash_data.buf_size); __be32 result; - ret = opal_validate_flash(__pa(buf), &size, &result); + ret = opal_validate_flash(buf, &size, &result); validate_flash_data.status = ret; validate_flash_data.buf_size = be32_to_cpu(size); @@ -290,7 +290,7 @@ static int opal_flash_update(int op) goto invalid_img; /* First entry address */ - addr = __pa(list); + addr = (u64)list; flash: rc = opal_update_flash(addr); diff --git a/arch/powerpc/platforms/powernv/opal-hmi.c b/arch/powerpc/platforms/powernv/opal-hmi.c index 3e1f064a18db..7c51baeb62ff 100644 --- a/arch/powerpc/platforms/powernv/opal-hmi.c +++ b/arch/powerpc/platforms/powernv/opal-hmi.c @@ -298,7 +298,7 @@ static void hmi_event_handler(struct work_struct *work) if (unrecoverable) { /* Pull all HMI events from OPAL before we panic. */ - while (opal_get_msg(__pa(&msg), sizeof(msg)) == OPAL_SUCCESS) { + while (opal_get_msg((u64)&msg, sizeof(msg)) == OPAL_SUCCESS) { u32 type; type = be32_to_cpu(msg.msg_type); diff --git a/arch/powerpc/platforms/powernv/opal-nvram.c b/arch/powerpc/platforms/powernv/opal-nvram.c index 380bc2d7ebbf..a7924dffee2b 100644 --- a/arch/powerpc/platforms/powernv/opal-nvram.c +++ b/arch/powerpc/platforms/powernv/opal-nvram.c @@ -33,7 +33,7 @@ static ssize_t opal_nvram_read(char *buf, size_t count, loff_t *index) off = *index; if ((off + count) > nvram_size) count = nvram_size - off; - rc = opal_read_nvram(__pa(buf), count, off); + rc = opal_read_nvram((unsigned long)buf, count, off); if (rc != OPAL_SUCCESS) return -EIO; *index += count; @@ -56,7 +56,7 @@ static ssize_t opal_nvram_write(char *buf, size_t count, loff_t *index) count = nvram_size - off; while (rc == OPAL_BUSY || rc == OPAL_BUSY_EVENT) { - rc = opal_write_nvram(__pa(buf), count, off); + rc = opal_write_nvram((unsigned long)buf, count, off); if (rc == OPAL_BUSY_EVENT) { if (in_interrupt() || irqs_disabled()) mdelay(OPAL_BUSY_DELAY_MS); diff --git a/arch/powerpc/platforms/powernv/opal-powercap.c b/arch/powerpc/platforms/powernv/opal-powercap.c index c16d44f6f1d1..a1167ecf9e43 100644 --- a/arch/powerpc/platforms/powernv/opal-powercap.c +++ b/arch/powerpc/platforms/powernv/opal-powercap.c @@ -46,7 +46,7 @@ static ssize_t powercap_show(struct kobject *kobj, struct kobj_attribute *attr, if (ret) goto out_token; - ret = opal_get_powercap(pcap_attr->handle, token, (u32 *)__pa(&pcap)); + ret = opal_get_powercap(pcap_attr->handle, token, &pcap); switch (ret) { case OPAL_ASYNC_COMPLETION: ret = opal_async_wait_response(token, &msg); diff --git a/arch/powerpc/platforms/powernv/opal-psr.c b/arch/powerpc/platforms/powernv/opal-psr.c index 69d7e75950d1..a3a68f53b1f8 100644 --- a/arch/powerpc/platforms/powernv/opal-psr.c +++ b/arch/powerpc/platforms/powernv/opal-psr.c @@ -40,7 +40,7 @@ static ssize_t psr_show(struct kobject *kobj, struct kobj_attribute *attr, goto out_token; ret = opal_get_power_shift_ratio(psr_attr->handle, token, - (u32 *)__pa(&psr)); + (u32 *)&psr); switch (ret) { case OPAL_ASYNC_COMPLETION: ret = opal_async_wait_response(token, &msg); diff --git a/arch/powerpc/platforms/powernv/opal-xscom.c b/arch/powerpc/platforms/powernv/opal-xscom.c index fd510d961b8c..aef596997ad4 100644 --- a/arch/powerpc/platforms/powernv/opal-xscom.c +++ b/arch/powerpc/platforms/powernv/opal-xscom.c @@ -58,7 +58,7 @@ static int opal_scom_read(uint32_t chip, uint64_t addr, u64 reg, u64 *value) __be64 v; reg = opal_scom_unmangle(addr + reg); - rc = opal_xscom_read(chip, reg, (__be64 *)__pa(&v)); + rc = opal_xscom_read(chip, reg, &v); if (rc) { *value = 0xfffffffffffffffful; return -EIO; diff --git a/arch/powerpc/platforms/powernv/opal.c b/arch/powerpc/platforms/powernv/opal.c index e8eba210a92d..a0e9808237b2 100644 --- a/arch/powerpc/platforms/powernv/opal.c +++ b/arch/powerpc/platforms/powernv/opal.c @@ -397,7 +397,7 @@ static void opal_handle_message(void) s64 ret; u32 type; - ret = opal_get_msg(__pa(opal_msg), opal_msg_size); + ret = opal_get_msg((u64)opal_msg, opal_msg_size); /* No opal message pending. */ if (ret == OPAL_RESOURCE) return; @@ -961,7 +961,7 @@ static void __init opal_dump_region_init(void) return; rc = opal_register_dump_region(OPAL_DUMP_REGION_LOG_BUF, - __pa(addr), size); + (u64)addr, size); /* Don't warn if this is just an older OPAL that doesn't * know about that call */ @@ -1197,7 +1197,7 @@ struct opal_sg_list *opal_vmalloc_to_sg_list(void *vmalloc_addr, sg->length = cpu_to_be64( i * sizeof(struct opal_sg_entry) + 16); i = 0; - sg->next = cpu_to_be64(__pa(next)); + sg->next = cpu_to_be64(next); sg = next; } diff --git a/arch/powerpc/platforms/powernv/pci-ioda.c b/arch/powerpc/platforms/powernv/pci-ioda.c index 57d3a6af1d52..dc6caec7cb46 100644 --- a/arch/powerpc/platforms/powernv/pci-ioda.c +++ b/arch/powerpc/platforms/powernv/pci-ioda.c @@ -1844,7 +1844,7 @@ static int pnv_pci_ioda_dma_64bit_bypass(struct pnv_ioda_pe *pe) /* reconfigure window 0 */ (pe->pe_number << 1) + 0, 1, - __pa(tces), + __pa(tces), /* XXX? */ table_size, 1 << tce_order); if (rc == OPAL_SUCCESS) { diff --git a/arch/powerpc/sysdev/xive/native.c b/arch/powerpc/sysdev/xive/native.c index 5218fdc4b29a..a80960829bf0 100644 --- a/arch/powerpc/sysdev/xive/native.c +++ b/arch/powerpc/sysdev/xive/native.c @@ -647,7 +647,7 @@ static bool xive_native_provision_pages(void) pr_err("Failed to allocate provisioning page\n"); return false; } - opal_xive_donate_page(chip, __pa(p)); + opal_xive_donate_page(chip, (u64)p); } return true; } diff --git a/drivers/char/powernv-op-panel.c b/drivers/char/powernv-op-panel.c index 027484ecfb0d..e7569f5025ef 100644 --- a/drivers/char/powernv-op-panel.c +++ b/drivers/char/powernv-op-panel.c @@ -175,8 +175,7 @@ static int oppanel_probe(struct platform_device *pdev) memset(oppanel_data, ' ', oppanel_size); for (i = 0; i < num_lines; i++) { oppanel_lines[i].line_len = cpu_to_be64(line_len); - oppanel_lines[i].line = cpu_to_be64(__pa(&oppanel_data[i * - line_len])); + oppanel_lines[i].line = cpu_to_be64(&oppanel_data[i * line_len]); } rc = misc_register(&oppanel_dev); diff --git a/drivers/i2c/busses/i2c-opal.c b/drivers/i2c/busses/i2c-opal.c index 1c4c9bb06a0b..a2ea1e36d9aa 100644 --- a/drivers/i2c/busses/i2c-opal.c +++ b/drivers/i2c/busses/i2c-opal.c @@ -87,7 +87,7 @@ static int i2c_opal_master_xfer(struct i2c_adapter *adap, struct i2c_msg *msgs, OPAL_I2C_RAW_READ : OPAL_I2C_RAW_WRITE; req.addr = cpu_to_be16(msgs[0].addr); req.size = cpu_to_be32(msgs[0].len); - req.buffer_ra = cpu_to_be64(__pa(msgs[0].buf)); + req.buffer_ra = cpu_to_be64(msgs[0].buf); break; case 2: req.type = (msgs[1].flags & I2C_M_RD) ? @@ -98,7 +98,7 @@ static int i2c_opal_master_xfer(struct i2c_adapter *adap, struct i2c_msg *msgs, req.subaddr = (req.subaddr << 8) | msgs[0].buf[i]; req.subaddr = cpu_to_be32(req.subaddr); req.size = cpu_to_be32(msgs[1].len); - req.buffer_ra = cpu_to_be64(__pa(msgs[1].buf)); + req.buffer_ra = cpu_to_be64(msgs[1].buf); break; } @@ -123,7 +123,7 @@ static int i2c_opal_smbus_xfer(struct i2c_adapter *adap, u16 addr, req.addr = cpu_to_be16(addr); switch (size) { case I2C_SMBUS_BYTE: - req.buffer_ra = cpu_to_be64(__pa(&data->byte)); + req.buffer_ra = cpu_to_be64(&data->byte); req.size = cpu_to_be32(1); /* Fall through */ case I2C_SMBUS_QUICK: @@ -131,7 +131,7 @@ static int i2c_opal_smbus_xfer(struct i2c_adapter *adap, u16 addr, OPAL_I2C_RAW_READ : OPAL_I2C_RAW_WRITE; break; case I2C_SMBUS_BYTE_DATA: - req.buffer_ra = cpu_to_be64(__pa(&data->byte)); + req.buffer_ra = cpu_to_be64(&data->byte); req.size = cpu_to_be32(1); req.subaddr = cpu_to_be32(command); req.subaddr_sz = 1; @@ -143,7 +143,7 @@ static int i2c_opal_smbus_xfer(struct i2c_adapter *adap, u16 addr, local[0] = data->word & 0xff; local[1] = (data->word >> 8) & 0xff; } - req.buffer_ra = cpu_to_be64(__pa(local)); + req.buffer_ra = cpu_to_be64(local); req.size = cpu_to_be32(2); req.subaddr = cpu_to_be32(command); req.subaddr_sz = 1; @@ -151,7 +151,7 @@ static int i2c_opal_smbus_xfer(struct i2c_adapter *adap, u16 addr, OPAL_I2C_SM_READ : OPAL_I2C_SM_WRITE; break; case I2C_SMBUS_I2C_BLOCK_DATA: - req.buffer_ra = cpu_to_be64(__pa(&data->block[1])); + req.buffer_ra = cpu_to_be64(&data->block[1]); req.size = cpu_to_be32(data->block[0]); req.subaddr = cpu_to_be32(command); req.subaddr_sz = 1; diff --git a/drivers/mtd/devices/powernv_flash.c b/drivers/mtd/devices/powernv_flash.c index 0b757d9ba2f6..86dbaae8808f 100644 --- a/drivers/mtd/devices/powernv_flash.c +++ b/drivers/mtd/devices/powernv_flash.c @@ -66,10 +66,10 @@ static int powernv_flash_async_op(struct mtd_info *mtd, enum flash_op op, switch (op) { case FLASH_OP_READ: - rc = opal_flash_read(info->id, offset, __pa(buf), len, token); + rc = opal_flash_read(info->id, offset, (u64)buf, len, token); break; case FLASH_OP_WRITE: - rc = opal_flash_write(info->id, offset, __pa(buf), len, token); + rc = opal_flash_write(info->id, offset, (u64)buf, len, token); break; case FLASH_OP_ERASE: rc = opal_flash_erase(info->id, offset, len, token); From patchwork Sat May 2 11:19:10 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Nicholas Piggin X-Patchwork-Id: 1281609 Return-Path: X-Original-To: patchwork-incoming@ozlabs.org Delivered-To: patchwork-incoming@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 49DnVW5BdVz9sP7 for ; Sat, 2 May 2020 21:50:11 +1000 (AEST) Authentication-Results: ozlabs.org; dmarc=pass (p=none dis=none) header.from=gmail.com Authentication-Results: ozlabs.org; dkim=pass (2048-bit key; unprotected) header.d=gmail.com header.i=@gmail.com header.a=rsa-sha256 header.s=20161025 header.b=gsx6nWF8; dkim-atps=neutral Received: from bilbo.ozlabs.org (lists.ozlabs.org [IPv6:2401:3900:2:1::3]) by lists.ozlabs.org (Postfix) with ESMTP id 49DnVW4Dw8zDqnZ for ; Sat, 2 May 2020 21:50:11 +1000 (AEST) X-Original-To: linuxppc-dev@lists.ozlabs.org Delivered-To: linuxppc-dev@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.a=rsa-sha256 header.s=20161025 header.b=gsx6nWF8; 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 49Dmqt6qL7zDr6v for ; Sat, 2 May 2020 21:20:10 +1000 (AEST) Received: by mail-pl1-x643.google.com with SMTP id a21so1121437pls.4 for ; Sat, 02 May 2020 04:20:10 -0700 (PDT) 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=TRG3snmF5tseeCaythTgToFsHUjdZrmW3z8maxEAfWE=; b=gsx6nWF8P/cl81VOSjQV8IgOZQDxpCA7yr7W2BXJK3Cdzx80l9YTZ1BpDzTT3dSeAa TTPeKxw5gXcMaMCNBXRP1xXdx80TDYyP57WYD0giNvoCFWht7s5yHKOo0dXVktKGDTBj 4odFqTpl0PWL/RKO3ha/KLVaSjuA1KtffR3HTDmWgTxNtqI1iFUHhB5/1tCdNwDfDNwO E/POlqNWE600IOOVb4CzQjK+U92fqEBmEJjj87stw6M5Bmf2w6e14IJyQUnNO0gwZ6Xo LzgOlBDH7pTVj1YlKpCqRyDh3v8i/l3oQLFwYpLoRLwmCrE1Ee4mh+9+LaAiat1KWJ4p O6YQ== 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=TRG3snmF5tseeCaythTgToFsHUjdZrmW3z8maxEAfWE=; b=jSfDl+bhjs76ic2g8Ri1hfiw2BZUFV/OhpgyI6c3keBwYE1GrQGVAE6qmXfndp/9V8 XjnR44sfbU3PZ+Un/AoWxchKjgKHP4HPyKkGaofHdXlbyaO27st+HLxJjrwsBLbHx9pZ bKlvzyMa8SQbqaTxqjxFNcKcc/Zq1jIi4ZhfYBTtNqYDOZmrYyhJg5HjznxpxfWN5aGr JcnTYX1Wfkc1HzdGxgE6NUhu8VX3jM1fAG7gLZZIo3i3Z3T4f1/aQ2+0Rc3H0Khypygi 2DLKlkjmps/MhKlxJYuZgNpUhp31DCvmTqHnGQPq09YL2M6THMkeVQUy8OPL1l9stOoc Sv1A== X-Gm-Message-State: AGi0PuZxMolW2vGtVWCIixhDBLEb28taKiSVopZjzLVow8w29XuJc+D2 NIiJc3lgQEY/q+g294EghANg3ey0 X-Google-Smtp-Source: APiQypIkmnViE9JbEUr0GdcemXKQ8aOET2SjOq1ZE/dFlM8CHun6YTOztzEBJQcpfFXWPaGQwcCXiQ== X-Received: by 2002:a17:90a:fc8c:: with SMTP id ci12mr5271724pjb.104.1588418408012; Sat, 02 May 2020 04:20:08 -0700 (PDT) Received: from bobo.ozlabs.ibm.com ([203.220.177.17]) by smtp.gmail.com with ESMTPSA id q15sm3862790pgj.52.2020.05.02.04.20.05 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Sat, 02 May 2020 04:20:07 -0700 (PDT) From: Nicholas Piggin To: linuxppc-dev@lists.ozlabs.org Subject: [RFC PATCH 06/10] powerpc/powernv: opal use new opal call entry point if it exists Date: Sat, 2 May 2020 21:19:10 +1000 Message-Id: <20200502111914.166578-7-npiggin@gmail.com> X-Mailer: git-send-email 2.23.0 In-Reply-To: <20200502111914.166578-1-npiggin@gmail.com> References: <20200502111914.166578-1-npiggin@gmail.com> MIME-Version: 1.0 X-BeenThere: linuxppc-dev@lists.ozlabs.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: Linux on PowerPC Developers Mail List List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: Nicholas Piggin Errors-To: linuxppc-dev-bounces+patchwork-incoming=ozlabs.org@lists.ozlabs.org Sender: "Linuxppc-dev" OPAL may advertise new endian-specific entry point which has different calling conventions including using the caller's stack, but otherwise provides the standard OPAL call API without any changes required to the OS. Signed-off-by: Nicholas Piggin --- arch/powerpc/boot/opal.c | 5 +++ arch/powerpc/platforms/powernv/opal-call.c | 36 ++++++++++++++++++++++ arch/powerpc/platforms/powernv/opal.c | 30 +++++++++++------- 3 files changed, 60 insertions(+), 11 deletions(-) diff --git a/arch/powerpc/boot/opal.c b/arch/powerpc/boot/opal.c index b69818ce592b..8b006a0282ac 100644 --- a/arch/powerpc/boot/opal.c +++ b/arch/powerpc/boot/opal.c @@ -13,6 +13,7 @@ struct opal { u64 base; u64 entry; + u64 v4_le_entry; } opal; static u32 opal_con_id; @@ -75,6 +76,10 @@ static void opal_init(void) if (getprop(opal_node, "opal-entry-address", &opal.entry, sizeof(u64)) < 0) return; opal.entry = be64_to_cpu(opal.entry); + + if (getprop(opal_node, "opal-v4-le-entry-address", &opal.v4_le_entry, sizeof(u64)) < 0) + return; + opal.v4_le_entry = be64_to_cpu(opal.v4_le_entry); } int opal_console_init(void *devp, struct serial_console_data *scdp) diff --git a/arch/powerpc/platforms/powernv/opal-call.c b/arch/powerpc/platforms/powernv/opal-call.c index 506b1798081a..32857254d268 100644 --- a/arch/powerpc/platforms/powernv/opal-call.c +++ b/arch/powerpc/platforms/powernv/opal-call.c @@ -92,6 +92,18 @@ static s64 __opal_call_trace(s64 a0, s64 a1, s64 a2, s64 a3, #define DO_TRACE false #endif /* CONFIG_TRACEPOINTS */ +struct opal { + u64 base; + u64 entry; + u64 size; + u64 v4_le_entry; +}; +extern struct opal opal; + +typedef int64_t (*opal_v4_le_entry_fn)(uint64_t r3, uint64_t r4, uint64_t r5, + uint64_t r6, uint64_t r7, uint64_t r8, + uint64_t r9, uint64_t r10); + static int64_t opal_call(int64_t a0, int64_t a1, int64_t a2, int64_t a3, int64_t a4, int64_t a5, int64_t a6, int64_t a7, int64_t opcode) { @@ -99,6 +111,30 @@ static int64_t opal_call(int64_t a0, int64_t a1, int64_t a2, int64_t a3, unsigned long msr = mfmsr(); bool mmu = (msr & (MSR_IR|MSR_DR)); int64_t ret; + opal_v4_le_entry_fn fn; + + if (IS_ENABLED(CONFIG_CPU_LITTLE_ENDIAN)) + fn = (opal_v4_le_entry_fn)(opal.v4_le_entry); + + if (fn) { + if (!mmu) { + BUG_ON(msr & MSR_EE); + ret = fn(opcode, a0, a1, a2, a3, a4, a5, a6); + return ret; + } + + local_irq_save(flags); + hard_irq_disable(); /* XXX r13 */ + msr &= ~MSR_EE; + mtmsr(msr & ~(MSR_IR|MSR_DR)); + + ret = fn(opcode, a0, a1, a2, a3, a4, a5, a6); + + mtmsr(msr); + local_irq_restore(flags); + + return ret; + } msr &= ~MSR_EE; diff --git a/arch/powerpc/platforms/powernv/opal.c b/arch/powerpc/platforms/powernv/opal.c index a0e9808237b2..d00772d40680 100644 --- a/arch/powerpc/platforms/powernv/opal.c +++ b/arch/powerpc/platforms/powernv/opal.c @@ -46,13 +46,14 @@ static DEFINE_SPINLOCK(msg_list_lock); static LIST_HEAD(msg_list); /* /sys/firmware/opal */ -struct kobject *opal_kobj; +struct kobject *opal_kobj __read_mostly; struct opal { u64 base; u64 entry; u64 size; -} opal; + u64 v4_le_entry; +} opal __read_mostly; struct mcheck_recoverable_range { u64 start_addr; @@ -150,14 +151,15 @@ unsigned long arch_symbol_lookup_name(const char *name) int __init early_init_dt_scan_opal(unsigned long node, const char *uname, int depth, void *data) { - const void *basep, *entryp, *sizep; - int basesz, entrysz, runtimesz; + const void *basep, *entryp, *v4_le_entryp, *sizep; + int basesz, entrysz, v4_le_entrysz, runtimesz; if (depth != 1 || strcmp(uname, "ibm,opal") != 0) return 0; basep = of_get_flat_dt_prop(node, "opal-base-address", &basesz); entryp = of_get_flat_dt_prop(node, "opal-entry-address", &entrysz); + v4_le_entryp = of_get_flat_dt_prop(node, "opal-v4-le-entry-address", &v4_le_entrysz); sizep = of_get_flat_dt_prop(node, "opal-runtime-size", &runtimesz); if (!basep || !entryp || !sizep) @@ -166,19 +168,25 @@ int __init early_init_dt_scan_opal(unsigned long node, opal.base = of_read_number(basep, basesz/4); opal.entry = of_read_number(entryp, entrysz/4); opal.size = of_read_number(sizep, runtimesz/4); + opal.v4_le_entry = of_read_number(v4_le_entryp, v4_le_entrysz/4); + + if (of_flat_dt_is_compatible(node, "ibm,opal-v3")) { + powerpc_firmware_features |= FW_FEATURE_OPAL; + pr_debug("OPAL detected !\n"); + } else { + panic("OPAL v3 compatible firmware not detected, can not continue.\n"); + } pr_debug("OPAL Base = 0x%llx (basep=%p basesz=%d)\n", opal.base, basep, basesz); - pr_debug("OPAL Entry = 0x%llx (entryp=%p basesz=%d)\n", + pr_debug("OPAL Entry = 0x%llx (entryp=%p entrysz=%d)\n", opal.entry, entryp, entrysz); - pr_debug("OPAL Entry = 0x%llx (sizep=%p runtimesz=%d)\n", + pr_debug("OPAL Size = 0x%llx (sizep=%p runtimesz=%d)\n", opal.size, sizep, runtimesz); + if (IS_ENABLED(CONFIG_CPU_LITTLE_ENDIAN) && v4_le_entryp) { - if (of_flat_dt_is_compatible(node, "ibm,opal-v3")) { - powerpc_firmware_features |= FW_FEATURE_OPAL; - pr_debug("OPAL detected !\n"); - } else { - panic("OPAL != V3 detected, no longer supported.\n"); + pr_debug("OPAL v4 Entry = 0x%llx (v4_le_entryp=%p v4_le_entrysz=%d)\n", + opal.v4_le_entry, v4_le_entryp, v4_le_entrysz); } return 1; From patchwork Sat May 2 11:19:11 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Nicholas Piggin X-Patchwork-Id: 1281610 Return-Path: X-Original-To: patchwork-incoming@ozlabs.org Delivered-To: patchwork-incoming@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 49DnXc3qdlz9sP7 for ; Sat, 2 May 2020 21:52:00 +1000 (AEST) Authentication-Results: ozlabs.org; dmarc=pass (p=none dis=none) header.from=gmail.com Authentication-Results: ozlabs.org; dkim=pass (2048-bit key; unprotected) header.d=gmail.com header.i=@gmail.com header.a=rsa-sha256 header.s=20161025 header.b=Lg9Go0uU; dkim-atps=neutral Received: from bilbo.ozlabs.org (lists.ozlabs.org [IPv6:2401:3900:2:1::3]) by lists.ozlabs.org (Postfix) with ESMTP id 49DnXb5RjWzDr0d for ; Sat, 2 May 2020 21:51:59 +1000 (AEST) X-Original-To: linuxppc-dev@lists.ozlabs.org Delivered-To: linuxppc-dev@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.a=rsa-sha256 header.s=20161025 header.b=Lg9Go0uU; 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 49Dmqx4RkBzDr74 for ; Sat, 2 May 2020 21:20:13 +1000 (AEST) Received: by mail-pj1-x1041.google.com with SMTP id y6so1163468pjc.4 for ; Sat, 02 May 2020 04:20:13 -0700 (PDT) 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=L0wEJ5HZ8r+nRVrRsZHlmhZc+GWjXfB9g8N+4FHcUtA=; b=Lg9Go0uUTM0zYUvHq0fhRIPjYQoHcTVTPLGp5ZQsNBUkoLybEVVZwwUtu8O7wIMMQN jGeOjrDSlhvT5ao+rUdGb/M6E/sggR0tP4NkkhQSCwpau/cwb0CDAHANwA0zK+KqMw7x rWjLQfVwcLrnAjU1AhGNoV2il3KqQz2iDbOfJKuxADoHQEeuCUCCEV30y9b+a7pfPxwj NPFkAxwnCIRVqqZ9EZUf70TQEXgnc/slKFr7eqlNg0ZI9rpQzbs+Su+DfmsbTbnoeGMP 33BDlFddONcnILQJHAxVkyrhtbxWNS/SfP6uQ+garVUiaZMuqI9nGAus5EyEWrsSfSSR LvZQ== 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=L0wEJ5HZ8r+nRVrRsZHlmhZc+GWjXfB9g8N+4FHcUtA=; b=FhtLZ+dDZYY7SZLQiGDo5GxjS5j+G3l+GWuHGQ+X/ZzNYZpafM72uqov5UY7eXsZId 9qqwswQV8MWDbPbwSWE/oFyJm11nkZYrz9zahI0uyhUUPzygEzQkarPIptS5z7cQ/n5O Z/MXF0AayJRgVPu/w36wZpqhUy63O7alCsEbne7ONd8343P+oZE1g+Wn3cd35WRnW5ol +5PDSY1vHKlqGLtDAEMgckYCkv8S6h8BC73lu6KfTDCKOBzWnlyV2y6QnWnyo8LZjGBP Duamct4R3Mb6LVuLNGxuQoZS64iZyhbC0Zu1XcDRFiaUuYGFTJdeLRvQtEFl3fUT6dvT WgPw== X-Gm-Message-State: AGi0PuZlQ0dv5UcOzT3n747aY3oiTPodg3cJouWS4K3W3kAMAVo1EwoK noWOhzCJvgNuZe2XSMeOxRvBto6z X-Google-Smtp-Source: APiQypKByZ7XJEQWyJg/EXBQqC+/j5ld2sdrdZ3EwO5WANV0aSE4ZmN/OY/dwVRm6nkyzXkK3ASoHQ== X-Received: by 2002:a17:902:ac97:: with SMTP id h23mr8682855plr.89.1588418411026; Sat, 02 May 2020 04:20:11 -0700 (PDT) Received: from bobo.ozlabs.ibm.com ([203.220.177.17]) by smtp.gmail.com with ESMTPSA id q15sm3862790pgj.52.2020.05.02.04.20.08 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Sat, 02 May 2020 04:20:10 -0700 (PDT) From: Nicholas Piggin To: linuxppc-dev@lists.ozlabs.org Subject: [RFC PATCH 07/10] powerpc/powernv: Add OPAL_FIND_VM_AREA API Date: Sat, 2 May 2020 21:19:11 +1000 Message-Id: <20200502111914.166578-8-npiggin@gmail.com> X-Mailer: git-send-email 2.23.0 In-Reply-To: <20200502111914.166578-1-npiggin@gmail.com> References: <20200502111914.166578-1-npiggin@gmail.com> MIME-Version: 1.0 X-BeenThere: linuxppc-dev@lists.ozlabs.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: Linux on PowerPC Developers Mail List List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: Nicholas Piggin Errors-To: linuxppc-dev-bounces+patchwork-incoming=ozlabs.org@lists.ozlabs.org Sender: "Linuxppc-dev" This will be used in the next patch. Signed-off-by: Nicholas Piggin --- arch/powerpc/include/asm/opal-api.h | 15 ++++++++++++++- arch/powerpc/include/asm/opal.h | 2 ++ arch/powerpc/platforms/powernv/opal-call.c | 1 + 3 files changed, 17 insertions(+), 1 deletion(-) diff --git a/arch/powerpc/include/asm/opal-api.h b/arch/powerpc/include/asm/opal-api.h index 018d4734c323..0be5ff4e51b5 100644 --- a/arch/powerpc/include/asm/opal-api.h +++ b/arch/powerpc/include/asm/opal-api.h @@ -217,7 +217,8 @@ #define OPAL_ADDR_TO_SYM 181 #define OPAL_SYM_TO_ADDR 182 #define OPAL_REPORT_TRAP 183 -#define OPAL_LAST 183 +#define OPAL_FIND_VM_AREA 184 +#define OPAL_LAST 184 #define QUIESCE_HOLD 1 /* Spin all calls at entry */ #define QUIESCE_REJECT 2 /* Fail all calls with OPAL_BUSY */ @@ -1189,6 +1190,18 @@ struct opal_mpipl_fadump { #define OPAL_TRAP_WARN 2 #define OPAL_TRAP_PANIC 3 +#define OS_VM_FLAG_READ 0x1 +#define OS_VM_FLAG_WRITE 0x2 +#define OS_VM_FLAG_EXECUTE 0x4 +#define OS_VM_FLAG_CI 0x8 + +struct opal_vm_area { + __be64 address; + __be64 length; + __be64 pa; + __be64 vm_flags; +}; + #endif /* __ASSEMBLY__ */ #endif /* __OPAL_API_H */ diff --git a/arch/powerpc/include/asm/opal.h b/arch/powerpc/include/asm/opal.h index dc77c2d5e036..199b5582b700 100644 --- a/arch/powerpc/include/asm/opal.h +++ b/arch/powerpc/include/asm/opal.h @@ -405,6 +405,8 @@ void opal_powercap_init(void); void opal_psr_init(void); void opal_sensor_groups_init(void); +int64_t opal_find_vm_area(uint64_t addr, struct opal_vm_area *opal_vm_area); + #endif /* __ASSEMBLY__ */ #endif /* _ASM_POWERPC_OPAL_H */ diff --git a/arch/powerpc/platforms/powernv/opal-call.c b/arch/powerpc/platforms/powernv/opal-call.c index 32857254d268..e62a74dfb3d0 100644 --- a/arch/powerpc/platforms/powernv/opal-call.c +++ b/arch/powerpc/platforms/powernv/opal-call.c @@ -332,3 +332,4 @@ OPAL_CALL(opal_secvar_enqueue_update, OPAL_SECVAR_ENQUEUE_UPDATE); OPAL_CALL(opal_addr_to_sym, OPAL_ADDR_TO_SYM); OPAL_CALL(opal_sym_to_addr, OPAL_SYM_TO_ADDR); OPAL_CALL(opal_report_trap, OPAL_REPORT_TRAP); +OPAL_CALL(opal_find_vm_area, OPAL_FIND_VM_AREA); From patchwork Sat May 2 11:19:12 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Nicholas Piggin X-Patchwork-Id: 1281611 Return-Path: X-Original-To: patchwork-incoming@ozlabs.org Delivered-To: patchwork-incoming@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 49Dnb71QpHz9sP7 for ; Sat, 2 May 2020 21:54:11 +1000 (AEST) Authentication-Results: ozlabs.org; dmarc=pass (p=none dis=none) header.from=gmail.com Authentication-Results: ozlabs.org; dkim=pass (2048-bit key; unprotected) header.d=gmail.com header.i=@gmail.com header.a=rsa-sha256 header.s=20161025 header.b=n1Xb6A1Q; dkim-atps=neutral Received: from bilbo.ozlabs.org (lists.ozlabs.org [IPv6:2401:3900:2:1::3]) by lists.ozlabs.org (Postfix) with ESMTP id 49Dnb70zJSzDqY0 for ; Sat, 2 May 2020 21:54:11 +1000 (AEST) X-Original-To: linuxppc-dev@lists.ozlabs.org Delivered-To: linuxppc-dev@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.a=rsa-sha256 header.s=20161025 header.b=n1Xb6A1Q; 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 49Dmr04hvhzDr4F for ; Sat, 2 May 2020 21:20:16 +1000 (AEST) Received: by mail-pf1-x444.google.com with SMTP id w65so2876460pfc.12 for ; Sat, 02 May 2020 04:20:16 -0700 (PDT) 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=ngF+/VTXuSTxQr/xXhijWJSjNKdEe+slKpomc4w9zks=; b=n1Xb6A1QucNWxtSqDUjF2AVj3hI7cvqjG/UGnBoMTm77TndibzaB29q4ZubOVjTUTB m0oX2crAMhbcm3W2m8h2rWpX81+dgQim/5SODJDDXQQUN7zB/2x256l1gW9jYjt3KBDm Ir2Y0XXZloje7yVGuMcC07nX0IpZZzckPtyD9vfBs6MD9vEgagOOXFZgKH0ZEh6/scyD ZbBuUapiOqPkY661n12llkOy774etbAjpgwMlwP9Nj1qr1lyT13kapJqX47qVRlAU2C0 mr59l0rq7bXRySlDhZkP8auy7be+sHxnjiv4k8i9Dmiy/ZUWqBOtaMIUOF91U+68n1U9 IX3Q== 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=ngF+/VTXuSTxQr/xXhijWJSjNKdEe+slKpomc4w9zks=; b=MX2qaJh1KpspkoRfbRj5K9R1FVtePL/19KThz8P5ngQjIoP+T15J/VsFq6zK6gNoze 0eeSOZmrPr4ldU1qt/JlNZUsNoUBZvw6lxmmBeECkFJT4E/6FNYSL74L14HTyL0uEr+q qJy8QOSvYfZxS+iciNvkTk+JnmCNFKqon3dDkoA+G6i37bVpqo2t929XLsgKb24O7WPF YMqGFcLZrVfl5WQ23m8cCjjZOixLwb602t/8S9nrTuBiOcJFZxMBhl+IZIyZhlPdki1W P1c9lTSMYrbDwZTLld6medF/Dw1k5okwTmA7qu8wry4zJvBbeMn1EOUFHpfgj0xaUkTy hLvg== X-Gm-Message-State: AGi0PuYV4UEUx7EmAGz0bYODck3BHk1jiYKHcWmacJ6L8y0RPxXbBacX HsOwv7N6jhPUnWeLrSJXNcxFuuHh X-Google-Smtp-Source: APiQypKO+1ZgQmHC2wj2b5DuGrYsFc+pi0uGops4herWIQ5xvXEksxt0hIaf/mgJ5yrWTIil9dloqQ== X-Received: by 2002:a62:3181:: with SMTP id x123mr8248812pfx.109.1588418413656; Sat, 02 May 2020 04:20:13 -0700 (PDT) Received: from bobo.ozlabs.ibm.com ([203.220.177.17]) by smtp.gmail.com with ESMTPSA id q15sm3862790pgj.52.2020.05.02.04.20.11 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Sat, 02 May 2020 04:20:13 -0700 (PDT) From: Nicholas Piggin To: linuxppc-dev@lists.ozlabs.org Subject: [RFC PATCH 08/10] powerpc/powernv: Set up an mm context to call OPAL in Date: Sat, 2 May 2020 21:19:12 +1000 Message-Id: <20200502111914.166578-9-npiggin@gmail.com> X-Mailer: git-send-email 2.23.0 In-Reply-To: <20200502111914.166578-1-npiggin@gmail.com> References: <20200502111914.166578-1-npiggin@gmail.com> MIME-Version: 1.0 X-BeenThere: linuxppc-dev@lists.ozlabs.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: Linux on PowerPC Developers Mail List List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: Nicholas Piggin Errors-To: linuxppc-dev-bounces+patchwork-incoming=ozlabs.org@lists.ozlabs.org Sender: "Linuxppc-dev" This creates an mm context to be used for OPAL V4 calls, which is populated with ptes according to querying OPAL_FIND_VM_AREA. Signed-off-by: Nicholas Piggin --- arch/powerpc/platforms/powernv/opal-call.c | 21 +++- arch/powerpc/platforms/powernv/opal.c | 119 ++++++++++++++++++++- 2 files changed, 137 insertions(+), 3 deletions(-) diff --git a/arch/powerpc/platforms/powernv/opal-call.c b/arch/powerpc/platforms/powernv/opal-call.c index e62a74dfb3d0..4bdad3d2fa18 100644 --- a/arch/powerpc/platforms/powernv/opal-call.c +++ b/arch/powerpc/platforms/powernv/opal-call.c @@ -104,6 +104,9 @@ typedef int64_t (*opal_v4_le_entry_fn)(uint64_t r3, uint64_t r4, uint64_t r5, uint64_t r6, uint64_t r7, uint64_t r8, uint64_t r9, uint64_t r10); +extern struct mm_struct *opal_mm; +extern bool opal_mm_enabled; + static int64_t opal_call(int64_t a0, int64_t a1, int64_t a2, int64_t a3, int64_t a4, int64_t a5, int64_t a6, int64_t a7, int64_t opcode) { @@ -117,6 +120,8 @@ static int64_t opal_call(int64_t a0, int64_t a1, int64_t a2, int64_t a3, fn = (opal_v4_le_entry_fn)(opal.v4_le_entry); if (fn) { + struct mm_struct *old_mm = current->active_mm; + if (!mmu) { BUG_ON(msr & MSR_EE); ret = fn(opcode, a0, a1, a2, a3, a4, a5, a6); @@ -126,11 +131,23 @@ static int64_t opal_call(int64_t a0, int64_t a1, int64_t a2, int64_t a3, local_irq_save(flags); hard_irq_disable(); /* XXX r13 */ msr &= ~MSR_EE; - mtmsr(msr & ~(MSR_IR|MSR_DR)); + if (!opal_mm_enabled) + mtmsr(msr & ~(MSR_IR|MSR_DR)); + + if (opal_mm_enabled && old_mm != opal_mm) { + current->active_mm = opal_mm; + switch_mm_irqs_off(NULL, opal_mm, current); + } ret = fn(opcode, a0, a1, a2, a3, a4, a5, a6); - mtmsr(msr); + if (opal_mm_enabled && old_mm != opal_mm) { + current->active_mm = old_mm; + switch_mm_irqs_off(NULL, old_mm, current); + } + + if (!opal_mm_enabled) + mtmsr(msr); local_irq_restore(flags); return ret; diff --git a/arch/powerpc/platforms/powernv/opal.c b/arch/powerpc/platforms/powernv/opal.c index d00772d40680..98d6d7fc5411 100644 --- a/arch/powerpc/platforms/powernv/opal.c +++ b/arch/powerpc/platforms/powernv/opal.c @@ -45,6 +45,10 @@ struct opal_msg_node { static DEFINE_SPINLOCK(msg_list_lock); static LIST_HEAD(msg_list); +struct mm_struct *opal_mm __read_mostly; +bool opal_v4_present __read_mostly; +bool opal_mm_enabled __read_mostly; + /* /sys/firmware/opal */ struct kobject *opal_kobj __read_mostly; @@ -172,7 +176,12 @@ int __init early_init_dt_scan_opal(unsigned long node, if (of_flat_dt_is_compatible(node, "ibm,opal-v3")) { powerpc_firmware_features |= FW_FEATURE_OPAL; - pr_debug("OPAL detected !\n"); + if (of_flat_dt_is_compatible(node, "ibm,opal-v4")) { + opal_v4_present = true; + pr_debug("OPAL v4 runtime firmware\n"); + } else { + pr_debug("OPAL detected !\n"); + } } else { panic("OPAL v3 compatible firmware not detected, can not continue.\n"); } @@ -187,6 +196,9 @@ int __init early_init_dt_scan_opal(unsigned long node, pr_debug("OPAL v4 Entry = 0x%llx (v4_le_entryp=%p v4_le_entrysz=%d)\n", opal.v4_le_entry, v4_le_entryp, v4_le_entrysz); + } else { + /* Can't use v4 entry */ + opal_v4_present = false; } return 1; @@ -1033,6 +1045,111 @@ static void opal_init_heartbeat(void) kopald_tsk = kthread_run(kopald, NULL, "kopald"); } +static pgprot_t opal_vm_flags_to_prot(uint64_t flags) +{ + pgprot_t prot; + + BUG_ON(!flags); + if (flags & OS_VM_FLAG_EXECUTE) { + if (flags & OS_VM_FLAG_CI) + BUG(); + if (flags & OS_VM_FLAG_WRITE) + prot = PAGE_KERNEL_X; + else + prot = PAGE_KERNEL_X /* XXX!? PAGE_KERNEL_ROX */; + } else { + if (flags & OS_VM_FLAG_WRITE) + prot = PAGE_KERNEL; + else if (flags & OS_VM_FLAG_READ) + prot = PAGE_KERNEL_RO; + else + BUG(); + if (flags & OS_VM_FLAG_CI) + prot = pgprot_noncached(prot); + } + return prot; +} + +static int __init opal_init_mm(void) +{ + struct mm_struct *mm; + unsigned long addr; + struct opal_vm_area vm_area; + + mm = copy_init_mm(); + if (!mm) + return -ENOMEM; + + /* Set up initial mappings for OPAL. */ + addr = 0; + while (opal_find_vm_area(addr, &vm_area) == OPAL_SUCCESS) { + unsigned long length; + unsigned long pa; + unsigned long flags; + unsigned long end; + pgprot_t prot; + + addr = be64_to_cpu(vm_area.address); + length = be64_to_cpu(vm_area.length); + pa = be64_to_cpu(vm_area.pa); + flags = be64_to_cpu(vm_area.vm_flags); + + if (flags == 0) { + /* flags == 0 is a special case */ + BUG_ON(pa != 0); + } else { + /* Don't support non-linear (yet?) */ + BUG_ON(addr != pa); + prot = opal_vm_flags_to_prot(flags); + } + + /* Align to PAGE_SIZE */ + end = (addr + length + PAGE_SIZE - 1) & ~(PAGE_SIZE - 1); + addr &= ~(PAGE_SIZE - 1); + + while (addr < end) { + spinlock_t *ptl; + pte_t pte, *ptep; + + ptep = get_locked_pte(mm, addr, &ptl); + if (flags) { + pte = pfn_pte(addr >> PAGE_SHIFT, prot); + set_pte_at(mm, addr, ptep, pte); + } else { + pte_clear(mm, addr, ptep); + } + pte_unmap_unlock(ptep, ptl); + + addr += PAGE_SIZE; + } + } + + printk("OPAL Virtual Memory Runtime Enabled, using PID=0x%04x\n", (unsigned int)mm->context.id); + + opal_mm = mm; + opal_mm_enabled = true; + + return 0; +} + +static int __init opal_init_early(void) +{ + int rc; + + if (opal_v4_present) { + if (radix_enabled()) { + /* Hash can't resolve SLB faults to the switched mm */ + rc = opal_init_mm(); + if (rc) { + pr_warn("OPAL virtual memory init failed, firmware will run in real-mode.\n"); + } + } + } + + return 0; +} +machine_early_initcall(powernv, opal_init_early); + static int __init opal_init(void) { struct device_node *np, *consoles, *leds; From patchwork Sat May 2 11:19:13 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Nicholas Piggin X-Patchwork-Id: 1281613 Return-Path: X-Original-To: patchwork-incoming@ozlabs.org Delivered-To: patchwork-incoming@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 49DndC56jXz9sP7 for ; Sat, 2 May 2020 21:55:59 +1000 (AEST) Authentication-Results: ozlabs.org; dmarc=pass (p=none dis=none) header.from=gmail.com Authentication-Results: ozlabs.org; dkim=pass (2048-bit key; unprotected) header.d=gmail.com header.i=@gmail.com header.a=rsa-sha256 header.s=20161025 header.b=W7UdLSyt; dkim-atps=neutral Received: from bilbo.ozlabs.org (lists.ozlabs.org [IPv6:2401:3900:2:1::3]) by lists.ozlabs.org (Postfix) with ESMTP id 49DndC3WWVzDql8 for ; Sat, 2 May 2020 21:55:59 +1000 (AEST) X-Original-To: linuxppc-dev@lists.ozlabs.org Delivered-To: linuxppc-dev@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.a=rsa-sha256 header.s=20161025 header.b=W7UdLSyt; 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 49Dmr42Mv1zDqWG for ; Sat, 2 May 2020 21:20:20 +1000 (AEST) Received: by mail-pj1-x1044.google.com with SMTP id 7so5271691pjo.0 for ; Sat, 02 May 2020 04:20:20 -0700 (PDT) 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=2HyciahCFMxe6R5fKnTUUAj0hJW4ymHA2fRAQaelpsQ=; b=W7UdLSytigtJh66m2pNrsSZA+beoY2XGp+vCuTGjQwa93aoYrz6Sp4M+X5Mi37vBiv 3J+1Wu4cEv8VXt7466FYeq8M0FKwDYrDJtsTBGRbnYjTPB1zMknAH/KHrx+JVx9Y5DFK vcSI88vHCe3XpB8qpuLBoLsEuZRffvhBpPtLlpDM5nh6CqbyAfwMCzf9Gkf75x8vQlv6 s9BDobLe/bpb8KpjxvRZKBSDl6CKYWc5aHNHd/nKRgI4rVUihx1da3ocKh7eBNSTRY/j njcvlENBFcW0Gq0cqhoTodpTV/dOUuracSbRTTWGkPpzr/0xnQt7zBPC4ZOizNVluw23 4XNQ== 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=2HyciahCFMxe6R5fKnTUUAj0hJW4ymHA2fRAQaelpsQ=; b=mq3vdjTZzvaFjhCfC3L86E8evZFgPuQuvusyJqH1TH3xJYSKS29gw4C+pANmnig9RX ri3tYJTAxNoMahR3+E4clbMVJF1d3F1AmxSNqtpwGx7ocgJLTivuzXd84U3NS0p/IOu/ JJAZQ7QR3qPD+0HRbqMhAusqgtiwx58vSNkhV2c7mPHbWOpNIIRHTuBs1UsjAhiuaqud ajeBwLc4SyGEbvxnGsBiKS2cQI1gRWj5wdU/JReV+ekwgi4Lpg6RlsAFZwcy1igkOr0K d5U7VHv6bC/DnTrejL7xt+y7hVxzveZ4CIUID7cwiRuNFsYCYGp/WXEvzZ2Rgu2JRLD+ fWYQ== X-Gm-Message-State: AGi0PuboRKXtkA8mqD7LYHdA/J94Zee+UsvTmtMXmyFHGWhwick9J7F8 J9s84tLBTicSzBWoyo8LKHSjhrfT X-Google-Smtp-Source: APiQypKqhYEsHDRAKIZ2nzVmmQcqvnqkUs37l7v1xeQnXEAgQi7guPSMSMT6Nzi41LSBvHQHqTgdFw== X-Received: by 2002:a17:902:b203:: with SMTP id t3mr8227311plr.276.1588418416497; Sat, 02 May 2020 04:20:16 -0700 (PDT) Received: from bobo.ozlabs.ibm.com ([203.220.177.17]) by smtp.gmail.com with ESMTPSA id q15sm3862790pgj.52.2020.05.02.04.20.14 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Sat, 02 May 2020 04:20:16 -0700 (PDT) From: Nicholas Piggin To: linuxppc-dev@lists.ozlabs.org Subject: [RFC PATCH 09/10] powerpc/powernv: OPAL V4 OS services Date: Sat, 2 May 2020 21:19:13 +1000 Message-Id: <20200502111914.166578-10-npiggin@gmail.com> X-Mailer: git-send-email 2.23.0 In-Reply-To: <20200502111914.166578-1-npiggin@gmail.com> References: <20200502111914.166578-1-npiggin@gmail.com> MIME-Version: 1.0 X-BeenThere: linuxppc-dev@lists.ozlabs.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: Linux on PowerPC Developers Mail List List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: Nicholas Piggin Errors-To: linuxppc-dev-bounces+patchwork-incoming=ozlabs.org@lists.ozlabs.org Sender: "Linuxppc-dev" This implements OPAL_REGISTER_OS_OPS and implements the printf service. When this API is called, OPAL switches to V4 mode which requires the OS to subsequently handle its program interrupts and printf calls. Signed-off-by: Nicholas Piggin --- arch/powerpc/include/asm/opal-api.h | 7 ++++- arch/powerpc/include/asm/opal.h | 1 + arch/powerpc/platforms/powernv/opal-call.c | 1 + arch/powerpc/platforms/powernv/opal.c | 36 ++++++++++++++++++++++ 4 files changed, 44 insertions(+), 1 deletion(-) diff --git a/arch/powerpc/include/asm/opal-api.h b/arch/powerpc/include/asm/opal-api.h index 0be5ff4e51b5..1b2f176677fc 100644 --- a/arch/powerpc/include/asm/opal-api.h +++ b/arch/powerpc/include/asm/opal-api.h @@ -218,7 +218,8 @@ #define OPAL_SYM_TO_ADDR 182 #define OPAL_REPORT_TRAP 183 #define OPAL_FIND_VM_AREA 184 -#define OPAL_LAST 184 +#define OPAL_REGISTER_OS_OPS 185 +#define OPAL_LAST 185 #define QUIESCE_HOLD 1 /* Spin all calls at entry */ #define QUIESCE_REJECT 2 /* Fail all calls with OPAL_BUSY */ @@ -1202,6 +1203,10 @@ struct opal_vm_area { __be64 vm_flags; }; +struct opal_os_ops { + __be64 os_printf; /* void printf(int32_t level, const char *str) */ +}; + #endif /* __ASSEMBLY__ */ #endif /* __OPAL_API_H */ diff --git a/arch/powerpc/include/asm/opal.h b/arch/powerpc/include/asm/opal.h index 199b5582b700..09985b7718b3 100644 --- a/arch/powerpc/include/asm/opal.h +++ b/arch/powerpc/include/asm/opal.h @@ -406,6 +406,7 @@ void opal_psr_init(void); void opal_sensor_groups_init(void); int64_t opal_find_vm_area(uint64_t addr, struct opal_vm_area *opal_vm_area); +int64_t opal_register_os_ops(struct opal_os_ops *ops, uint64_t size); #endif /* __ASSEMBLY__ */ diff --git a/arch/powerpc/platforms/powernv/opal-call.c b/arch/powerpc/platforms/powernv/opal-call.c index 4bdad3d2fa18..11f419e76059 100644 --- a/arch/powerpc/platforms/powernv/opal-call.c +++ b/arch/powerpc/platforms/powernv/opal-call.c @@ -350,3 +350,4 @@ OPAL_CALL(opal_addr_to_sym, OPAL_ADDR_TO_SYM); OPAL_CALL(opal_sym_to_addr, OPAL_SYM_TO_ADDR); OPAL_CALL(opal_report_trap, OPAL_REPORT_TRAP); OPAL_CALL(opal_find_vm_area, OPAL_FIND_VM_AREA); +OPAL_CALL(opal_register_os_ops, OPAL_REGISTER_OS_OPS); diff --git a/arch/powerpc/platforms/powernv/opal.c b/arch/powerpc/platforms/powernv/opal.c index 98d6d7fc5411..0fbfcd088c58 100644 --- a/arch/powerpc/platforms/powernv/opal.c +++ b/arch/powerpc/platforms/powernv/opal.c @@ -47,6 +47,7 @@ static LIST_HEAD(msg_list); struct mm_struct *opal_mm __read_mostly; bool opal_v4_present __read_mostly; +bool opal_v4_enabled __read_mostly; bool opal_mm_enabled __read_mostly; /* /sys/firmware/opal */ @@ -152,6 +153,8 @@ unsigned long arch_symbol_lookup_name(const char *name) return be64_to_cpu(addr); } +static void os_printf(int32_t level, const char *str); + int __init early_init_dt_scan_opal(unsigned long node, const char *uname, int depth, void *data) { @@ -1045,6 +1048,28 @@ static void opal_init_heartbeat(void) kopald_tsk = kthread_run(kopald, NULL, "kopald"); } +static void os_printf(int32_t level, const char *str) +{ + const char *l; + + /* Assuming printk does not work in real mode */ + if (WARN_ON_ONCE(!(mfmsr() & (MSR_IR|MSR_DR)))) + return; + + switch (level) { + case 0: l = KERN_EMERG; break; + case 1: l = KERN_ALERT; break; + case 2: l = KERN_CRIT; break; + case 3: l = KERN_ERR; break; + case 4: l = KERN_WARNING; break; + case 5: l = KERN_NOTICE; break; + case 6: l = KERN_INFO; break; + case 7: l = KERN_DEBUG; break; + default: l = KERN_ERR; + } + printk("%s[OPAL] %s", l, str); +} + static pgprot_t opal_vm_flags_to_prot(uint64_t flags) { pgprot_t prot; @@ -1137,6 +1162,8 @@ static int __init opal_init_early(void) int rc; if (opal_v4_present) { + struct opal_os_ops opal_os_ops; + if (radix_enabled()) { /* Hash can't resolve SLB faults to the switched mm */ rc = opal_init_mm(); @@ -1144,6 +1171,15 @@ static int __init opal_init_early(void) pr_warn("OPAL virtual memory init failed, firmware will run in real-mode.\n"); } } + + memset(&opal_os_ops, 0, sizeof(opal_os_ops)); + opal_os_ops.os_printf = cpu_to_be64(&os_printf); + if (opal_register_os_ops(&opal_os_ops, sizeof(opal_os_ops))) { + pr_warn("OPAL register OS ops failed, firmware will run in v3 mode.\n"); + } else { + opal_v4_enabled = true; + pr_warn("OPAL running in v4 mode!\n"); + } } return 0; From patchwork Sat May 2 11:19:14 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Nicholas Piggin X-Patchwork-Id: 1281614 Return-Path: X-Original-To: patchwork-incoming@ozlabs.org Delivered-To: patchwork-incoming@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 49Dng56s1dz9sSr for ; Sat, 2 May 2020 21:57:37 +1000 (AEST) Authentication-Results: ozlabs.org; dmarc=pass (p=none dis=none) header.from=gmail.com Authentication-Results: ozlabs.org; dkim=pass (2048-bit key; unprotected) header.d=gmail.com header.i=@gmail.com header.a=rsa-sha256 header.s=20161025 header.b=Kp6eAYJg; dkim-atps=neutral Received: from bilbo.ozlabs.org (lists.ozlabs.org [IPv6:2401:3900:2:1::3]) by lists.ozlabs.org (Postfix) with ESMTP id 49Dng56RrJzDq9s for ; Sat, 2 May 2020 21:57:37 +1000 (AEST) X-Original-To: linuxppc-dev@lists.ozlabs.org Delivered-To: linuxppc-dev@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.a=rsa-sha256 header.s=20161025 header.b=Kp6eAYJg; 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 49Dmr60hjjzDqTL for ; Sat, 2 May 2020 21:20:21 +1000 (AEST) Received: by mail-pj1-x1043.google.com with SMTP id fu13so1169745pjb.5 for ; Sat, 02 May 2020 04:20:21 -0700 (PDT) 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=Wftzfvearoip9hQ1Jfrm2JqetKDnSGE9kRDT1TpOP5A=; b=Kp6eAYJglICKSeRKhJv5ZvQlHZ9Jc32DFfidjsIeGMz9hgx7uWFj1WbPvlHSM4QgUh /jNxwDeEpieIldhZJlYyBQxeWsDTu/RYO8Pmqt2jvei+kBBaKLnVF7NY5sgZOW28SvqB CrGFN+McJKZguqMC68AnZDWtO5SynmaJeP2RSBnnVanzALw72zjji6AU2yHPf0SC4NzF cn8Hal2VKZws7WcZ0hNTIxzqPKuaEZiIBN7pQ00PoQVhuImIShv2NdmDLNezrW2e1gDr 1RfzsRnocl3Jcngi1nWOJ7evyMCISMcA7M6otAiE9hHKEfWu88pW1bwazKjlCLNYfx6k b6+w== 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=Wftzfvearoip9hQ1Jfrm2JqetKDnSGE9kRDT1TpOP5A=; b=WrT2sQxs5YRNX0QjoEfKYNx804akc3aP3QIcKxW5nQNFrgLQiWXEqFEgFjOH/rspCW meRK/CvDZzoyzTU25AKrGaAbOa7oqcB/2PlryaioIb8YqDN/XerlSuVhCDe1KqvV7Fpl mckoSz47wJbmeXSngt+DpTYxwzsqgQQm+DVNK07pSPGA81LrbQWFQOvSpJ+PAorDbSdB CER4xq0lKYOlI38q/3WP6kK2JJa3hbIR/oHpDBL90M4T+R11hK8veNy/smclc842AHOI apkOyZNsLAFXDtxKs13rONeMDqh+UCgPosEoVDR1443sdQjZYYWTyp0++2ljqiBETd36 0GuA== X-Gm-Message-State: AGi0PuYvCxKWppiu/NjVel4vjAF1ax8rLqIxlyEeRlDCFm/L7xd6JXCc ohl+fUbDDg8hDVkbyz+2UGs31KFf X-Google-Smtp-Source: APiQypKzFzswzR3XX2wb/2HpEwcW0qSHAd4mqG1RNrHCepgFJnhXJjjN0ocI9xeS4n4XlhG9zNQYpA== X-Received: by 2002:a17:902:740a:: with SMTP id g10mr8923518pll.137.1588418419421; Sat, 02 May 2020 04:20:19 -0700 (PDT) Received: from bobo.ozlabs.ibm.com ([203.220.177.17]) by smtp.gmail.com with ESMTPSA id q15sm3862790pgj.52.2020.05.02.04.20.16 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Sat, 02 May 2020 04:20:19 -0700 (PDT) From: Nicholas Piggin To: linuxppc-dev@lists.ozlabs.org Subject: [RFC PATCH 10/10] powerpc/powernv: OPAL V4 Implement vm_map/unmap service Date: Sat, 2 May 2020 21:19:14 +1000 Message-Id: <20200502111914.166578-11-npiggin@gmail.com> X-Mailer: git-send-email 2.23.0 In-Reply-To: <20200502111914.166578-1-npiggin@gmail.com> References: <20200502111914.166578-1-npiggin@gmail.com> MIME-Version: 1.0 X-BeenThere: linuxppc-dev@lists.ozlabs.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: Linux on PowerPC Developers Mail List List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: Nicholas Piggin Errors-To: linuxppc-dev-bounces+patchwork-incoming=ozlabs.org@lists.ozlabs.org Sender: "Linuxppc-dev" This implements os_vm_map, os_vm_unmap. OPAL uses EA regions that is specifies in OPAL_FIND_VM_AREA for these mappings, so provided the page tables are allocated at init-time and not freed, these services can be provided without memory allocation / blocking. Signed-off-by: Nicholas Piggin --- arch/powerpc/include/asm/opal-api.h | 2 + arch/powerpc/platforms/powernv/opal.c | 57 +++++++++++++++++++++++++++ 2 files changed, 59 insertions(+) diff --git a/arch/powerpc/include/asm/opal-api.h b/arch/powerpc/include/asm/opal-api.h index 1b2f176677fc..97c5e5423827 100644 --- a/arch/powerpc/include/asm/opal-api.h +++ b/arch/powerpc/include/asm/opal-api.h @@ -1205,6 +1205,8 @@ struct opal_vm_area { struct opal_os_ops { __be64 os_printf; /* void printf(int32_t level, const char *str) */ + __be64 os_vm_map; /* int64_t os_vm_map(uint64_t ea, uint64_t pa, uint64_t flags) */ + __be64 os_vm_unmap; /* void os_vm_unmap(uint64_t ea) */ }; #endif /* __ASSEMBLY__ */ diff --git a/arch/powerpc/platforms/powernv/opal.c b/arch/powerpc/platforms/powernv/opal.c index 0fbfcd088c58..93b9afaf33b3 100644 --- a/arch/powerpc/platforms/powernv/opal.c +++ b/arch/powerpc/platforms/powernv/opal.c @@ -1095,6 +1095,61 @@ static pgprot_t opal_vm_flags_to_prot(uint64_t flags) return prot; } +static int64_t os_vm_map(uint64_t ea, uint64_t pa, uint64_t flags) +{ + struct mm_struct *mm = opal_mm; + spinlock_t *ptl; + pte_t pte, *ptep; + pgprot_t prot; + + if (WARN_ON_ONCE(!opal_mm_enabled)) + return -EINVAL; + + if (WARN_ON_ONCE(!(mfmsr() & (MSR_IR|MSR_DR)))) + return -EINVAL; + + /* mm should be active_mm if MMU is on here */ + +// printk("os_vm_map 0x%llx->0x%llx flags=0x%llx\n", ea, pa, flags); + + prot = opal_vm_flags_to_prot(flags); + + pte = pfn_pte(pa >> PAGE_SHIFT, PAGE_KERNEL_X); + + ptep = get_locked_pte(mm, ea, &ptl); + set_pte_at(mm, ea, ptep, pte); + pte_unmap_unlock(ptep, ptl); + + return 0; +} + +static void os_vm_unmap(uint64_t ea) +{ + struct mm_struct *mm = opal_mm; + spinlock_t *ptl; + pte_t *ptep; + + if (WARN_ON_ONCE(!opal_mm_enabled)) + return; + + if (WARN_ON_ONCE(!(mfmsr() & (MSR_IR|MSR_DR)))) + return; + +// printk("os_vm_unmap 0x%llx\n", ea); + + /* mm should be active_mm if MMU is on here */ + + ptep = get_locked_pte(mm, ea, &ptl); + pte_clear(mm, ea, ptep); + pte_unmap_unlock(ptep, ptl); + + /* + * This leaves potential TLBs in other CPUs for this EA, but it is + * only used by this CPU. Can't do a broadcast flush here, no IPIs. + */ + local_flush_tlb_mm(mm); +} + static int __init opal_init_mm(void) { struct mm_struct *mm; @@ -1174,6 +1229,8 @@ static int __init opal_init_early(void) memset(&opal_os_ops, 0, sizeof(opal_os_ops)); opal_os_ops.os_printf = cpu_to_be64(&os_printf); + opal_os_ops.os_vm_map = cpu_to_be64(&os_vm_map); + opal_os_ops.os_vm_unmap = cpu_to_be64(&os_vm_unmap); if (opal_register_os_ops(&opal_os_ops, sizeof(opal_os_ops))) { pr_warn("OPAL register OS ops failed, firmware will run in v3 mode.\n"); } else {