Received: by 10.223.176.5 with SMTP id f5csp2685267wra; Thu, 1 Feb 2018 04:33:55 -0800 (PST) X-Google-Smtp-Source: AH8x226ql1Ngx9MV104ULv7Vvz70lrmkQv971eyD1anJkd4HUU67IFS9NeKH4rplEkkvFLcF3WRn X-Received: by 10.101.81.141 with SMTP id h13mr20143621pgq.241.1517488435282; Thu, 01 Feb 2018 04:33:55 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1517488435; cv=none; d=google.com; s=arc-20160816; b=SSBYEBCihswIMOvXBlKb27yBtJpic44wx3vcqYP9nEISJGEqyQqVfu5WWBL24+hBCS o2Im6GImJfalVcTnpRPBrZgAWtVIVZVNt+N+CrQb14bCuZOypaa83ewBJoWf1Z6E6U/s dKgNf/i2MPabS6tnS5PBGRDJwxPARK04RTZW185n7Yv1vWUctGTmTT9Xe4krMMg1szxf p1k4iZcE8C3NdF69Nk4N0kIm9bZiYrHyBsy3VpeullGSamk54pW0p7/WZPNYLzCpToEf JPzp5MaA7IWdg7Ymvl8YAhvTFGlUQ7pNVOKbFkq/yVUa7wO7hnCKpQFlKjJx8W+3fc9K 4RaA== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:sender:content-transfer-encoding :content-language:in-reply-to:mime-version:user-agent:date :message-id:from:references:cc:to:subject:arc-authentication-results; bh=9s69DeTwkvweQWDVgajO1GJFA2LFEuUPUVEd3la1NUs=; b=pmNhBZNbbZT9D0C+RRzhw9lg59jSeuwBErgTLuhRKA94civ3huVHo81QXWD97V34Na PQ+m3/vRMPgdaHij92tCqPwJKJdgN/swlqk+RGyFQmuRTKQoPp+o8ImoyDrBYFNtqcTI YiuJRLz5aa5hKlSYjldylbh4yryoHn8wJ/rq+bzk07RGqQ7Lc0+X4Yt3LljZmO/rJXgO vk9njgvjWtihGdwiMx25NqZDwFCxTwYPltFnJC7nZkD3GWy499QiJa+u7+No00C+Ltif NM8u1yWKahkAYCBhOYTbJPf8rhAT88nKXdt3odH0JMzHeanxJA153BpPQHKn8DpdB8tE 84OA== ARC-Authentication-Results: i=1; mx.google.com; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org Return-Path: Received: from vger.kernel.org (vger.kernel.org. [209.132.180.67]) by mx.google.com with ESMTP id u2-v6si1024695plm.757.2018.02.01.04.33.40; Thu, 01 Feb 2018 04:33:55 -0800 (PST) Received-SPF: pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) client-ip=209.132.180.67; Authentication-Results: mx.google.com; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1752506AbeBAMci (ORCPT + 99 others); Thu, 1 Feb 2018 07:32:38 -0500 Received: from usa-sjc-mx-foss1.foss.arm.com ([217.140.101.70]:49492 "EHLO foss.arm.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1752463AbeBAMcf (ORCPT ); Thu, 1 Feb 2018 07:32:35 -0500 Received: from usa-sjc-imap-foss1.foss.arm.com (unknown [10.72.51.249]) by usa-sjc-mx-foss1.foss.arm.com (Postfix) with ESMTP id 2A40680D; Thu, 1 Feb 2018 04:32:35 -0800 (PST) Received: from [10.1.210.88] (e110467-lin.cambridge.arm.com [10.1.210.88]) by usa-sjc-imap-foss1.foss.arm.com (Postfix) with ESMTPSA id 7CE793F25C; Thu, 1 Feb 2018 04:32:32 -0800 (PST) Subject: Re: [PATCH v3 14/18] firmware/psci: Expose SMCCC version through psci_ops To: Marc Zyngier , linux-kernel@vger.kernel.org, linux-arm-kernel@lists.infradead.org, kvmarm@lists.cs.columbia.edu Cc: Catalin Marinas , Will Deacon , Peter Maydell , Christoffer Dall , Lorenzo Pieralisi , Mark Rutland , Ard Biesheuvel , Andrew Jones , Hanjun Guo , Jayachandran C , Jon Masters , Russell King - ARM Linux References: <20180201114657.7323-1-marc.zyngier@arm.com> <20180201114657.7323-15-marc.zyngier@arm.com> From: Robin Murphy Message-ID: <87705115-ca05-4d35-a169-51e1f3676133@arm.com> Date: Thu, 1 Feb 2018 12:32:31 +0000 User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:52.0) Gecko/20100101 Thunderbird/52.6.0 MIME-Version: 1.0 In-Reply-To: <20180201114657.7323-15-marc.zyngier@arm.com> Content-Type: text/plain; charset=utf-8; format=flowed Content-Language: en-GB Content-Transfer-Encoding: 7bit Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org On 01/02/18 11:46, Marc Zyngier wrote: > Since PSCI 1.0 allows the SMCCC version to be (indirectly) probed, > let's do that at boot time, and expose the version of the calling > convention as part of the psci_ops structure. > > Acked-by: Lorenzo Pieralisi > Signed-off-by: Marc Zyngier > --- > drivers/firmware/psci.c | 19 +++++++++++++++++++ > include/linux/psci.h | 6 ++++++ > 2 files changed, 25 insertions(+) > > diff --git a/drivers/firmware/psci.c b/drivers/firmware/psci.c > index e9493da2b111..8631906c414c 100644 > --- a/drivers/firmware/psci.c > +++ b/drivers/firmware/psci.c > @@ -61,6 +61,7 @@ bool psci_tos_resident_on(int cpu) > > struct psci_operations psci_ops = { > .conduit = PSCI_CONDUIT_NONE, > + .smccc_version = SMCCC_VERSION_1_0, > }; > > typedef unsigned long (psci_fn)(unsigned long, unsigned long, > @@ -511,6 +512,23 @@ static void __init psci_init_migrate(void) > pr_info("Trusted OS resident on physical CPU 0x%lx\n", cpuid); > } > > +static void __init psci_init_smccc(u32 ver) > +{ > + int feature; > + > + feature = psci_features(ARM_SMCCC_VERSION_FUNC_ID); > + > + if (feature != PSCI_RET_NOT_SUPPORTED) { > + ver = invoke_psci_fn(ARM_SMCCC_VERSION_FUNC_ID, 0, 0, 0); > + if (ver != ARM_SMCCC_VERSION_1_1) > + psci_ops.smccc_version = SMCCC_VERSION_1_0; AFAICS, unless you somehow run psci_probe() twice *and* have schizophrenic firmware, this assignment now does precisely nothing. With the condition flipped and the redundant else case removed (or an explanation of why I'm wrong...) Reviewed-by: Robin Murphy > + else > + psci_ops.smccc_version = SMCCC_VERSION_1_1; > + } > + > + pr_info("SMC Calling Convention v1.%d\n", psci_ops.smccc_version); > +} > + > static void __init psci_0_2_set_functions(void) > { > pr_info("Using standard PSCI v0.2 function IDs\n"); > @@ -559,6 +577,7 @@ static int __init psci_probe(void) > psci_init_migrate(); > > if (PSCI_VERSION_MAJOR(ver) >= 1) { > + psci_init_smccc(ver); > psci_init_cpu_suspend(); > psci_init_system_suspend(); > } > diff --git a/include/linux/psci.h b/include/linux/psci.h > index f2679e5faa4f..8b1b3b5935ab 100644 > --- a/include/linux/psci.h > +++ b/include/linux/psci.h > @@ -31,6 +31,11 @@ enum psci_conduit { > PSCI_CONDUIT_HVC, > }; > > +enum smccc_version { > + SMCCC_VERSION_1_0, > + SMCCC_VERSION_1_1, > +}; > + > struct psci_operations { > u32 (*get_version)(void); > int (*cpu_suspend)(u32 state, unsigned long entry_point); > @@ -41,6 +46,7 @@ struct psci_operations { > unsigned long lowest_affinity_level); > int (*migrate_info_type)(void); > enum psci_conduit conduit; > + enum smccc_version smccc_version; > }; > > extern struct psci_operations psci_ops; >