Received: by 2002:a05:6358:bb9e:b0:b9:5105:a5b4 with SMTP id df30csp5405626rwb; Wed, 7 Sep 2022 02:13:31 -0700 (PDT) X-Google-Smtp-Source: AA6agR5OeEkJMUoUzVAAifGCoMWjbX/zHNRitc0etiuXQN3bMoyrcCI4Shm2eSS2N3jrh1/sYfWc X-Received: by 2002:a17:902:9308:b0:174:9dff:716b with SMTP id bc8-20020a170902930800b001749dff716bmr2937605plb.75.1662542011273; Wed, 07 Sep 2022 02:13:31 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1662542011; cv=none; d=google.com; s=arc-20160816; b=lR1aNUDY3N60bybNXvWUy+dHuuqTxoFZOBHJpeOOwlMNf7Z9BpAegdXrX7FaHJKRJb CssNS6ygqY+4ZosJqIDQ/KmmSH7tsirNqqs0wtdsX9TGnEcUEdGuneLpfxXVdkZQLH13 NmLEqYM959pBHORKjui/uYPsXVshJg6Y2OHG9WFWufx0c3O3Wz6/4XrY0J5keyyceqGI jXHpIQM/QV9qpfOhezjj8GQjcdSpy/ZemE9aG6UmJ5A0uSZKu8sW+ipDwaDB3pVecBtk /+gZ2oAYemTO199lJCXLvIbGPirkZaWD6l5eGm7O1dfW1EN+nUdwMM3Km+PjpDE0iWUG bHTA== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:cc:to:subject:message-id:date:from:in-reply-to :references:mime-version:dkim-signature; bh=qRQJH9FOv1ch+h8S4C846f5bMyz0NyEFQNx3nL1ReVg=; b=Hv+V2yxBo5nH7NLakzs48vxqbKYLTS1o5Cy//uf/+VEi3FEc01iNFoHF9UWEYDMSEF L1Tec5N65AXfusxI5tILjNLkzfGrQlzzhSsi12fFX0BM2EBJlxMnIPhgarxpZT0T57Ne fiM5qQQ6x3qQ/UigB4l4Vfz9Vp93uE08lvUDgNt2bZsUfAgAKlSRsxAqh97Sh9wPpOPI 3bM3GIGO5aD3OV/5rOfXI0mEv12M8Z0hv+kvZuN+pUOYns2rQXilFWiPHIbi0r1HjGPg Y+eevYy3DfSMR+f0BfIZqLtSSmAlzWCxhwJFEEa5dxNuM1xs4iKFNtb82pLcxAghMgPS rTFA== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@linaro.org header.s=google header.b=eUG+wNmW; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::1:20 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=linaro.org Return-Path: Received: from out1.vger.email (out1.vger.email. [2620:137:e000::1:20]) by mx.google.com with ESMTP id t4-20020a62ea04000000b0052e6e3e0a05si15380557pfh.322.2022.09.07.02.13.19; Wed, 07 Sep 2022 02:13:31 -0700 (PDT) Received-SPF: pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::1:20 as permitted sender) client-ip=2620:137:e000::1:20; Authentication-Results: mx.google.com; dkim=pass header.i=@linaro.org header.s=google header.b=eUG+wNmW; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::1:20 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=linaro.org Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S229911AbiIGIkn (ORCPT + 99 others); Wed, 7 Sep 2022 04:40:43 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:40048 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S229719AbiIGIkk (ORCPT ); Wed, 7 Sep 2022 04:40:40 -0400 Received: from mail-pj1-x1033.google.com (mail-pj1-x1033.google.com [IPv6:2607:f8b0:4864:20::1033]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id DEAF377E85 for ; Wed, 7 Sep 2022 01:40:04 -0700 (PDT) Received: by mail-pj1-x1033.google.com with SMTP id o4so13809200pjp.4 for ; Wed, 07 Sep 2022 01:40:04 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linaro.org; s=google; h=cc:to:subject:message-id:date:from:in-reply-to:references :mime-version:from:to:cc:subject:date; bh=qRQJH9FOv1ch+h8S4C846f5bMyz0NyEFQNx3nL1ReVg=; b=eUG+wNmW7Vyte1QmieH1HM2Qnhz3qg45qPZTtVe/gYrUTTg8oHuJMcsmtf2aqKbJQg 5APYoKp9WNzVrzvfaxM/pZYV+XAJKYIqq5eVPr6yyjr3Cp938WdirdNGZrjORHcsvzEC lPslAxO/ChFBNVqTlvGu7/ekBueDTP2etqYasWagGrEKneXVXx/2EEXaHm6daZZwT/qK hc65dseoySBgaMqHHfjkljm0ZNRJoNnerNZQxoDhdiUzcE2934B58a6W+QXqcSxDzd53 aE0lyFx1W62jt4o6PQrznulgeK0vcM+fhRpE5qf6MkXCazeZ6COhNYFoC/hKkv8a6a1u w5RA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=cc:to:subject:message-id:date:from:in-reply-to:references :mime-version:x-gm-message-state:from:to:cc:subject:date; bh=qRQJH9FOv1ch+h8S4C846f5bMyz0NyEFQNx3nL1ReVg=; b=xXKN18zHvOmLc3UGgi5gTIZKTemuEnW9MfPKHvYl99V4Ka2Cn1Hr5Yg8IM9U+QX9gZ 23zp4SwDUrj/0IjlMfuuaA1lDP24R2Lt6xQLLM5QE8Vzh/7ibaGrDk+6JpcKr8b384eu Zm9j6Ajcas9I+mXVcXxGB+YKiNwrfGy0gJ6EAthapi+g4/3zHZqO8GwifKnQG+suUg3E HuFojplc7n2tsXszbhoxXCXfE3Y7pYmMfwe0hqLNCXnIGcro1RxxIfQVI/lD7sujAVXZ YdQveez86phOUUo53n0XN2fYk0s/HY8TUgL5j03PLZk7OHslZaimHUm9GaPXncDShnId nn7Q== X-Gm-Message-State: ACgBeo2zlBxkOCfZ7OTI2PQboTQKeOz1GSoNtiU6USXsl/W6kSqMrb14 eV9M23m5C83VzqHnPzolY+XkMXcxl66qUv65TKyAhQ== X-Received: by 2002:a17:902:f684:b0:172:d54d:6f9e with SMTP id l4-20020a170902f68400b00172d54d6f9emr2830838plg.174.1662539895784; Wed, 07 Sep 2022 01:38:15 -0700 (PDT) MIME-Version: 1.0 References: <20220902124032.788488-1-sudeep.holla@arm.com> <20220902124032.788488-9-sudeep.holla@arm.com> In-Reply-To: <20220902124032.788488-9-sudeep.holla@arm.com> From: Jens Wiklander Date: Wed, 7 Sep 2022 10:38:05 +0200 Message-ID: Subject: Re: [PATCH v2 08/10] firmware: arm_ffa: Add v1.1 get_partition_info support To: Sudeep Holla Cc: linux-arm-kernel@lists.infradead.org, linux-kernel@vger.kernel.org, op-tee@lists.trustedfirmware.org, Marc Bonnici , Achin Gupta , Valentin Laurent , Lukas Hanel , Coboy Chen Content-Type: text/plain; charset="UTF-8" X-Spam-Status: No, score=-2.1 required=5.0 tests=BAYES_00,DKIM_SIGNED, DKIM_VALID,DKIM_VALID_AU,DKIM_VALID_EF,RCVD_IN_DNSWL_NONE, SPF_HELO_NONE,SPF_PASS,T_SCC_BODY_TEXT_LINE 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 On Fri, Sep 2, 2022 at 2:40 PM Sudeep Holla wrote: > > FF-A v1.1 adds support to discovery the UUIDs of the partitions that was > missing in v1.0 and which the driver workarounds by using UUIDs supplied > by the ffa_drivers. > > Add the v1.1 get_partition_info support and disable the workaround if > the detected FF-A version is greater than v1.0. > > Signed-off-by: Sudeep Holla > --- > drivers/firmware/arm_ffa/driver.c | 42 +++++++++++++++++++++++++------ > include/linux/arm_ffa.h | 1 + > 2 files changed, 35 insertions(+), 8 deletions(-) > > diff --git a/drivers/firmware/arm_ffa/driver.c b/drivers/firmware/arm_ffa/driver.c > index 2532e0f16cc9..dd6ab2f81580 100644 > --- a/drivers/firmware/arm_ffa/driver.c > +++ b/drivers/firmware/arm_ffa/driver.c > @@ -264,18 +264,24 @@ static int ffa_rxtx_unmap(u16 vm_id) > return 0; > } > > +#define PARTITION_INFO_GET_RETURN_COUNT_ONLY BIT(0) > + > /* buffer must be sizeof(struct ffa_partition_info) * num_partitions */ > static int > __ffa_partition_info_get(u32 uuid0, u32 uuid1, u32 uuid2, u32 uuid3, > struct ffa_partition_info *buffer, int num_partitions) > { > - int count; > + int idx, count, flags = 0, size; > ffa_value_t partition_info; > > + if (!buffer || !num_partitions) /* Just get the count for now */ > + flags = PARTITION_INFO_GET_RETURN_COUNT_ONLY; > + > mutex_lock(&drv_info->rx_lock); > invoke_ffa_fn((ffa_value_t){ > .a0 = FFA_PARTITION_INFO_GET, > .a1 = uuid0, .a2 = uuid1, .a3 = uuid2, .a4 = uuid3, > + .a5 = flags, > }, &partition_info); > > if (partition_info.a0 == FFA_ERROR) { > @@ -285,8 +291,18 @@ __ffa_partition_info_get(u32 uuid0, u32 uuid1, u32 uuid2, u32 uuid3, > > count = partition_info.a2; > > + if (drv_info->version > FFA_VERSION_1_0) { > + size = partition_info.a3; > + if (size > sizeof(*buffer)) > + size = sizeof(*buffer); Below when calculating the address in the source buffer with "drv_info->rx_buffer + idx * size" you should use the size from partition_info.a3 even if it's larger than sizeof(*buffer). The amount of bytes to copy looks correct though. Does that make sense? Cheers, Jens > + } else { > + size = 8; /* FFA_VERSION_1_0 lacks size in the response */ > + } > + > if (buffer && count <= num_partitions) > - memcpy(buffer, drv_info->rx_buffer, sizeof(*buffer) * count); > + for (idx = 0; idx < count; idx++) > + memcpy(buffer + idx, drv_info->rx_buffer + idx * size, > + size); > > ffa_rx_release(); > > @@ -681,6 +697,14 @@ void ffa_device_match_uuid(struct ffa_device *ffa_dev, const uuid_t *uuid) > int count, idx; > struct ffa_partition_info *pbuf, *tpbuf; > > + /* > + * FF-A v1.1 provides UUID for each partition as part of the discovery > + * API, the discovered UUID must be populated in the device's UUID and > + * there is no need to copy the same from the driver table. > + */ > + if (drv_info->version > FFA_VERSION_1_0) > + return; > + > count = ffa_partition_probe(uuid, &pbuf); > if (count <= 0) > return; > @@ -694,6 +718,7 @@ void ffa_device_match_uuid(struct ffa_device *ffa_dev, const uuid_t *uuid) > static void ffa_setup_partitions(void) > { > int count, idx; > + uuid_t uuid; > struct ffa_device *ffa_dev; > struct ffa_partition_info *pbuf, *tpbuf; > > @@ -704,14 +729,15 @@ static void ffa_setup_partitions(void) > } > > for (idx = 0, tpbuf = pbuf; idx < count; idx++, tpbuf++) { > - /* Note that the &uuid_null parameter will require > + import_uuid(&uuid, (u8 *)tpbuf->uuid); > + > + /* Note that if the UUID will be uuid_null, that will require > * ffa_device_match() to find the UUID of this partition id > - * with help of ffa_device_match_uuid(). Once the FF-A spec > - * is updated to provide correct UUID here for each partition > - * as part of the discovery API, we need to pass the > - * discovered UUID here instead. > + * with help of ffa_device_match_uuid(). FF-A v1.1 and above > + * provides UUID here for each partition as part of the > + * discovery API and the same is passed. > */ > - ffa_dev = ffa_device_register(&uuid_null, tpbuf->id, &ffa_ops); > + ffa_dev = ffa_device_register(&uuid, tpbuf->id, &ffa_ops); > if (!ffa_dev) { > pr_err("%s: failed to register partition ID 0x%x\n", > __func__, tpbuf->id); > diff --git a/include/linux/arm_ffa.h b/include/linux/arm_ffa.h > index 4c4b06783035..09567ffd1f49 100644 > --- a/include/linux/arm_ffa.h > +++ b/include/linux/arm_ffa.h > @@ -107,6 +107,7 @@ struct ffa_partition_info { > /* partition can send and receive indirect messages. */ > #define FFA_PARTITION_INDIRECT_MSG BIT(2) > u32 properties; > + u32 uuid[4]; > }; > > /* For use with FFA_MSG_SEND_DIRECT_{REQ,RESP} which pass data via registers */ > -- > 2.37.3 >