Received: by 2002:a05:7412:3784:b0:e2:908c:2ebd with SMTP id jk4csp2708742rdb; Wed, 4 Oct 2023 09:06:47 -0700 (PDT) X-Google-Smtp-Source: AGHT+IH3slD+a9DjW29zCkX8fX4YtVLlJ4tF8bz8e9mEhTiTp39JV/KCqCEB2edHpZb0Uw80Yrs+ X-Received: by 2002:a17:902:db11:b0:1b8:8682:62fb with SMTP id m17-20020a170902db1100b001b8868262fbmr116387plx.4.1696435607255; Wed, 04 Oct 2023 09:06:47 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1696435607; cv=none; d=google.com; s=arc-20160816; b=DbvHPr9v37xweekH9fCPP5Rqls2uWOaB5Fxfj8wkzqKG7iV33JpDSRbHrfpkinYTgg hid89ZkSMuiiytotOw9nH/9bnWXwXroPZHmdXAuyk6CuJbC99MFF+mnCUd4loaO2uB2u Ldlv0CaCD9QSglkcu6wsXGc/dbOIGdMlhmDBoQ4PsjnnWJciX4rz8ZvL8TvB6A96kYt3 RwNNTiETOXPczfU4tcXtj+qnA7XPb3D6y8F35M3H71W3YGAJLMjDXGFKJNBmxt1d4ZO5 lty1WjZEn9W8Y768aVAAf+TWaaIaK/k4icX1to3qar0riDGUug34UXGYkpRmMuYtIIez KkoA== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:in-reply-to:content-transfer-encoding :content-disposition:mime-version:references:message-id:subject:cc :to:from:date; bh=CeKnyATaenonqX/cCFrC6vI35Y3aQhJM4DI4kivKmFQ=; fh=P56c0mDPWWM87WjO2FiKATbC1uYqUJ4yma1naTDzAA0=; b=ZH+SLfJj/cX2DvIpT39OUl0+3ZaZvW+JVu0OL8xjb/Hqry3lmjexe45YbN0O/KcUvd 9LxNqUP2p+kUtm4RjqnSF1LffJls/rRYhGGlYY9OKWtQ34SMZgRcGeuP3LKgAWPS4dSF KlI5vwr1O9tORe3SJweTcz+OQinVbllkx9hRmM01MbHK+gN/81JVgVM37W3E3y5RBEBO wmXt4e5YmyUk54PqDXbLjI1owsi4X1f7buwlzqSYOBG73L8wG+KKDSlecZsYaF3BcobQ CyCFZsbvRgZO+X+6s9XT4CDqSmJrdNpmbrDOSFJyGgsf8MwHkhnE8W5EiqABG1Cxllud g1hw== ARC-Authentication-Results: i=1; mx.google.com; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::3:4 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=fail (p=NONE sp=NONE dis=NONE) header.from=arm.com Return-Path: Received: from howler.vger.email (howler.vger.email. [2620:137:e000::3:4]) by mx.google.com with ESMTPS id lh14-20020a170903290e00b001c7218c4db8si3855418plb.119.2023.10.04.09.06.43 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 04 Oct 2023 09:06:47 -0700 (PDT) Received-SPF: pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::3:4 as permitted sender) client-ip=2620:137:e000::3:4; Authentication-Results: mx.google.com; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::3:4 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=fail (p=NONE sp=NONE dis=NONE) header.from=arm.com Received: from out1.vger.email (depot.vger.email [IPv6:2620:137:e000::3:0]) by howler.vger.email (Postfix) with ESMTP id 80FB182CBA52; Wed, 4 Oct 2023 09:06:42 -0700 (PDT) X-Virus-Status: Clean X-Virus-Scanned: clamav-milter 0.103.10 at howler.vger.email Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S243224AbjJDQGj (ORCPT + 99 others); Wed, 4 Oct 2023 12:06:39 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:43316 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S233451AbjJDQGi (ORCPT ); Wed, 4 Oct 2023 12:06:38 -0400 Received: from foss.arm.com (foss.arm.com [217.140.110.172]) by lindbergh.monkeyblade.net (Postfix) with ESMTP id ADE3EC9; Wed, 4 Oct 2023 09:06:34 -0700 (PDT) Received: from usa-sjc-imap-foss1.foss.arm.com (unknown [10.121.207.14]) by usa-sjc-mx-foss1.foss.arm.com (Postfix) with ESMTP id 11DB2C15; Wed, 4 Oct 2023 09:07:13 -0700 (PDT) Received: from bogus (e103737-lin.cambridge.arm.com [10.1.197.49]) by usa-sjc-imap-foss1.foss.arm.com (Postfix) with ESMTPSA id E57103F762; Wed, 4 Oct 2023 09:06:32 -0700 (PDT) Date: Wed, 4 Oct 2023 17:06:30 +0100 From: Sudeep Holla To: Nikunj Kela Cc: cristian.marussi@arm.com, robh+dt@kernel.org, Sudeep Holla , krzysztof.kozlowski+dt@linaro.org, conor+dt@kernel.org, andersson@kernel.org, konrad.dybcio@linaro.org, linux-arm-kernel@lists.infradead.org, devicetree@vger.kernel.org, linux-kernel@vger.kernel.org, linux-arm-msm@vger.kernel.org Subject: Re: [PATCH v4 4/4] firmware: arm_scmi: Add qcom hvc/shmem transport support Message-ID: <20231004160630.pxspafszlt6o7oj6@bogus> References: <20230718160833.36397-1-quic_nkela@quicinc.com> <20230911194359.27547-1-quic_nkela@quicinc.com> <20230911194359.27547-5-quic_nkela@quicinc.com> <20231003111914.63z35sn3r3k7drtp@bogus> <6246714a-3b40-e1b6-640e-560ba55b6436@quicinc.com> MIME-Version: 1.0 Content-Type: text/plain; charset=iso-8859-1 Content-Disposition: inline Content-Transfer-Encoding: 8bit In-Reply-To: <6246714a-3b40-e1b6-640e-560ba55b6436@quicinc.com> X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00, RCVD_IN_DNSWL_BLOCKED,SPF_HELO_NONE,SPF_NONE autolearn=ham autolearn_force=no version=3.4.6 X-Spam-Checker-Version: SpamAssassin 3.4.6 (2021-04-09) on lindbergh.monkeyblade.net Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org X-Greylist: Sender passed SPF test, not delayed by milter-greylist-4.6.4 (howler.vger.email [0.0.0.0]); Wed, 04 Oct 2023 09:06:42 -0700 (PDT) On Tue, Oct 03, 2023 at 09:16:27AM -0700, Nikunj Kela wrote: > > On 10/3/2023 4:19 AM, Sudeep Holla wrote: > > On Mon, Sep 11, 2023 at 12:43:59PM -0700, Nikunj Kela wrote: > > > This change adds the support for SCMI message exchange on Qualcomm > > > virtual platforms. > > > > > > The hypervisor associates an object-id also known as capability-id > > > with each hvc doorbell object. The capability-id is used to identify the > > > doorbell from the VM's capability namespace, similar to a file-descriptor. > > > > > > The hypervisor, in addition to the function-id, expects the capability-id > > > to be passed in x1 register when HVC call is invoked. > > > > > > The function-id & capability-id are allocated by the hypervisor on bootup > > > and are stored in the shmem region by the firmware before starting Linux. > > > > > > Signed-off-by: Nikunj Kela > > > --- > > > drivers/firmware/arm_scmi/driver.c | 1 + > > > drivers/firmware/arm_scmi/smc.c | 47 ++++++++++++++++++++++++++---- > > > 2 files changed, 43 insertions(+), 5 deletions(-) > > > > > > diff --git a/drivers/firmware/arm_scmi/driver.c b/drivers/firmware/arm_scmi/driver.c > > > index 87383c05424b..ea344bc6ae49 100644 > > > --- a/drivers/firmware/arm_scmi/driver.c > > > +++ b/drivers/firmware/arm_scmi/driver.c > > > @@ -2915,6 +2915,7 @@ static const struct of_device_id scmi_of_match[] = { > > > #ifdef CONFIG_ARM_SCMI_TRANSPORT_SMC > > > { .compatible = "arm,scmi-smc", .data = &scmi_smc_desc}, > > > { .compatible = "arm,scmi-smc-param", .data = &scmi_smc_desc}, > > > + { .compatible = "qcom,scmi-hvc-shmem", .data = &scmi_smc_desc}, > > > #endif > > > #ifdef CONFIG_ARM_SCMI_TRANSPORT_VIRTIO > > > { .compatible = "arm,scmi-virtio", .data = &scmi_virtio_desc}, > > > diff --git a/drivers/firmware/arm_scmi/smc.c b/drivers/firmware/arm_scmi/smc.c > > > index 0a0b7e401159..94ec07fdc14a 100644 > > > --- a/drivers/firmware/arm_scmi/smc.c > > > +++ b/drivers/firmware/arm_scmi/smc.c > > > @@ -50,6 +50,9 @@ > > > * @func_id: smc/hvc call function id > > > * @param_page: 4K page number of the shmem channel > > > * @param_offset: Offset within the 4K page of the shmem channel > > > + * @cap_id: hvc doorbell's capability id to be used on Qualcomm virtual > > > + * platforms > > > + * @qcom_xport: Flag to indicate the transport on Qualcomm virtual platforms > > > */ > > > struct scmi_smc { > > > @@ -63,6 +66,8 @@ struct scmi_smc { > > > u32 func_id; > > > u32 param_page; > > > u32 param_offset; > > > + u64 cap_id; > > Can it be unsigned long instead so that it just works for both 32 and 64 bit. > > My first version of this patch was ulong but Bjorn suggested to make this > structure size fixed i.e. architecture independent. Hence changed it to u64. > If you are ok with ulong, I can change it back to ulong. > SMCCC pre-v1.2 used the common structure in that way. I don't see any issue with that. I haven't followed Bjorn suggestions/comments though. > > > > > > + bool qcom_xport; > > Do we really need this ? > > Not if we initialize it with a negative value since 0 is a valid value for > cap-id. > Fine with negative value(-EINVAL may be). > > > int ret; > > > if (!tx) > > > @@ -158,9 +164,34 @@ static int smc_chan_setup(struct scmi_chan_info *cinfo, struct device *dev, > > > return -EADDRNOTAVAIL; > > > } > > > - ret = of_property_read_u32(dev->of_node, "arm,smc-id", &func_id); > > > - if (ret < 0) > > > - return ret; > > > + if (of_device_is_compatible(dev->of_node, "qcom,scmi-hvc-shmem")) { > > > + scmi_info->qcom_xport = true; > > > + > > > + /* The func-id & capability-id are kept in last 16 bytes of shmem. > > > + * +-------+ > > > + * | | > > > + * | shmem | > > > + * | | > > > + * | | > > > + * +-------+ <-- (size - 16) > > > + * | funcId| > > > + * +-------+ <-- (size - 8) > > > + * | capId | > > > + * +-------+ <-- size > > > + */ > > > + > > > + func_id = readl((void __iomem *)(scmi_info->shmem) + size - 16); > > So unlike 'arm,scmi-smc', you don't want 'arm,smc-id' in the DT ? Any > > particular reason ? Just to get both FID and cap ID from shmem ? > I am fine either way. If you use from DT(via arm,smc-id), then "qcom,scmi" can be just addition compatible that expects you to read cap-id from the shmem. May need adjustment in the binding as you allow both "qcom,scmi-smc", "arm,scmi-smc". I will leave the details to you. > I could use smc-id binding for func-id, it's just two parameters will come > from two different places so thought of keeping everything at one place to > maintain consistency.? Since DT can't take cap-id, I decided to move > func-id. I am fine if you want me to use smc-id binding. > Up to you. If you want to make "qcom,scmi-smc" and "arm,scmi-smc" compatible in way in that way or you can keep it incompatible as you have proposed in this patch set. > > > > +#ifdef CONFIG_ARM64 > > I would rather make this arch agnostic using CONFIG_64BIT > ok. > > > > > + cap_id = readq((void __iomem *)(scmi_info->shmem) + size - 8); > > Do you need __iomem typecast here ? Is scmi_info->shmem not already __iomem ? > > Also scmi_info->shmem is ioremapped just few steps above and you are using > > read* here, is that safe ? > > I saw some compilation warnings without __iomem. I will use ioread* API > instead of read*. > That was the clue that you were using __iomem with read* calls IMO. > > > > > > +#else > > > + /* capability-id is 32 bit wide on 32bit machines */ > > > + cap_id = rieadl((void __iomem *)(scmi_info->shmem) + size - 8); > > Other thought once you move for u64 to unsigned long you need not have > > #ifdeffery, just do copy of sizeof(unsigned long) > Right, my first version was like that only. OK > > > > > +#endif > > > + } else { > > > + ret = of_property_read_u32(dev->of_node, "arm,smc-id", &func_id); > > > + if (ret < 0) > > > + return ret; > > > + } > > > if (of_device_is_compatible(dev->of_node, "arm,scmi-smc-param")) { > > > scmi_info->param_page = SHMEM_PAGE(res.start); > > > @@ -184,6 +215,7 @@ static int smc_chan_setup(struct scmi_chan_info *cinfo, struct device *dev, > > > } > > > scmi_info->func_id = func_id; > > > + scmi_info->cap_id = cap_id; > > > scmi_info->cinfo = cinfo; > > > smc_channel_lock_init(scmi_info); > > > cinfo->transport_info = scmi_info; > > > @@ -213,6 +245,7 @@ static int smc_send_message(struct scmi_chan_info *cinfo, > > > struct arm_smccc_res res; > > > unsigned long page = scmi_info->param_page; > > > unsigned long offset = scmi_info->param_offset; > > > + unsigned long cap_id = (unsigned long)scmi_info->cap_id; > > > /* > > > * Channel will be released only once response has been > > > @@ -222,8 +255,12 @@ static int smc_send_message(struct scmi_chan_info *cinfo, > > > shmem_tx_prepare(scmi_info->shmem, xfer, cinfo); > > > - arm_smccc_1_1_invoke(scmi_info->func_id, page, offset, 0, 0, 0, 0, 0, > > > - &res); > > > + if (scmi_info->qcom_xport) > > Just make sure cap_id is set only for qcom and just use that as your flag. > > No point in setting always true scmi_info->qcom_xport and using it here. > ok, I can remove that. Though 0 is a valid value for cap-id so will have to > init cap-id with a negative value. Yes as mentioned above. -- Regards, Sudeep