From: Aneesh Kumar K.V <aneesh.kumar@kernel.org>
To: Jonathan Cameron <jonathan.cameron@huawei.com>
Cc: linux-coco@lists.linux.dev, kvmarm@lists.linux.dev,
linux-pci@vger.kernel.org, linux-kernel@vger.kernel.org,
dan.j.williams@intel.com, aik@amd.com, lukas@wunner.de,
Samuel Ortiz <sameo@rivosinc.com>,
Xu Yilun <yilun.xu@linux.intel.com>,
Jason Gunthorpe <jgg@ziepe.ca>,
Suzuki K Poulose <Suzuki.Poulose@arm.com>,
Steven Price <steven.price@arm.com>,
Bjorn Helgaas <helgaas@kernel.org>,
Catalin Marinas <catalin.marinas@arm.com>,
Marc Zyngier <maz@kernel.org>, Will Deacon <will@kernel.org>,
Oliver Upton <oliver.upton@linux.dev>
Subject: Re: [PATCH v2 02/11] coco: guest: arm64: Add Realm Host Interface and guest DA helper
Date: Mon, 24 Nov 2025 10:37:13 +0530 [thread overview]
Message-ID: <yq5aa50cm326.fsf@kernel.org> (raw)
In-Reply-To: <20251119153200.00007fd0@huawei.com>
Jonathan Cameron <jonathan.cameron@huawei.com> writes:
> On Mon, 17 Nov 2025 19:29:58 +0530
> "Aneesh Kumar K.V (Arm)" <aneesh.kumar@kernel.org> wrote:
>
>> - describe the Realm Host Interface SMC IDs and result codes in a new
>> `asm/rhi.h` header
>> - expose `struct rsi_host_call` plus an `rsi_host_call()` helper so we can
>> invoke `SMC_RSI_HOST_CALL` from C code
>> - build a guest-side `rhi-da` helper that drives the vdev TDI state machine
>> via RHI host calls and translates the firmware status codes
>>
>> This provides the basic RHI plumbing that later DA features rely on.
>>
>> Signed-off-by: Aneesh Kumar K.V (Arm) <aneesh.kumar@kernel.org>
> Hi Aneesh, minor comments follow.
>
>> diff --git a/drivers/virt/coco/arm-cca-guest/rhi-da.c b/drivers/virt/coco/arm-cca-guest/rhi-da.c
>> new file mode 100644
>> index 000000000000..3430d8df4424
>> --- /dev/null
>> +++ b/drivers/virt/coco/arm-cca-guest/rhi-da.c
> ...
>
>> +
>> +bool rhi_has_da_support(void)
>> +{
>> + int ret;
>> + struct rsi_host_call *rhicall;
>> +
>> + rhicall = kmalloc(sizeof(struct rsi_host_call), GFP_KERNEL);
>
> Doesn't look to be passed out anywhere, so not obvious why the lifetime
> of this extends beyond this function. Maybe I'm missing something.
>
This should be similar to other calls
struct rsi_host_call *rhicall __free(kfree) =
kmalloc(sizeof(struct rsi_host_call), GFP_KERNEL);
I’ll update the code to reflect that. Thanks for pointing it out.
>
>> + if (!rhicall)
>> + return -ENOMEM;
>> +
>> + rhicall->imm = 0;
>> + rhicall->gprs[0] = RHI_DA_FEATURES;
>> +
>> + ret = rsi_host_call(virt_to_phys(rhicall));
>> + if (ret != RSI_SUCCESS || rhicall->gprs[0] == SMCCC_RET_NOT_SUPPORTED)
>> + return false;
>> +
>> + /* For base DA to work we need these to be supported */
>> + if ((rhicall->gprs[0] & RHI_DA_BASE_FEATURE) == RHI_DA_BASE_FEATURE)
>> + return true;
>> +
>> + return false;
>> +}
>> +
>> +static inline int rhi_vdev_continue(unsigned long vdev_id, unsigned long cookie)
>> +{
>> + unsigned long ret;
>> +
>> + struct rsi_host_call *rhi_call __free(kfree) =
>> + kmalloc(sizeof(struct rsi_host_call), GFP_KERNEL);
>
> sizeof(*rhi_call) Same for all other cases of this.
>
>> + if (!rhi_call)
>> + return -ENOMEM;
>> +
>> + rhi_call->imm = 0;
>> + rhi_call->gprs[0] = RHI_DA_VDEV_CONTINUE;
>> + rhi_call->gprs[1] = vdev_id;
>> + rhi_call->gprs[2] = cookie;
>> +
>> + ret = rsi_host_call(virt_to_phys(rhi_call));
>> + if (ret != RSI_SUCCESS)
>> + return -EIO;
>> +
>> + return map_rhi_da_error(rhi_call->gprs[0]);
>> +}
>> +
>> +static int __rhi_vdev_abort(unsigned long vdev_id, unsigned long *da_error)
>> +{
>> + unsigned long ret;
>> + struct rsi_host_call *rhi_call __free(kfree) =
>> + kmalloc(sizeof(struct rsi_host_call), GFP_KERNEL);
>
> sizeof(*rhi_call) probably preferred.
>
>> + if (!rhi_call)
>> + return -ENOMEM;
>> +
>> + rhi_call->imm = 0;
>> + rhi_call->gprs[0] = RHI_DA_VDEV_ABORT;
>> + rhi_call->gprs[1] = vdev_id;
>> +
>> + ret = rsi_host_call(virt_to_phys(rhi_call));
>> + if (ret != RSI_SUCCESS)
>> + return -EIO;
>> +
>> + return *da_error = rhi_call->gprs[0];
>> + return 0;
>
> ? Run builds after each patch and you may catch stuff like this.
>
>> +}
>> +
>> +static bool should_abort_rhi_call_loop(unsigned long vdev_id)
>> +{
>> + int ret;
>> +
>> + cond_resched();
>> + if (signal_pending(current)) {
>> + unsigned long da_error;
>> +
>> + ret = __rhi_vdev_abort(vdev_id, &da_error);
>> + /* consider all kind of error as not aborted */
>> + if (!ret && (da_error == RHI_DA_SUCCESS))
>> + return true;
>> + }
>> + return false;
>> +}
>> +
>> +static int __rhi_vdev_set_tdi_state(unsigned long vdev_id,
>> + unsigned long target_state,
>
> Maybe use an enum for target state? Can name it to align with the
> RHIDAVDevTDIState used as the type for this in the RHI spec.
>
how about enum rhi_tdi_state ?
>
>
>> + unsigned long *cookie)
>> +{
>> + unsigned long ret;
>> +
>> + struct rsi_host_call *rhi_call __free(kfree) =
>> + kmalloc(sizeof(struct rsi_host_call), GFP_KERNEL);
>> + if (!rhi_call)
>> + return -ENOMEM;
>> +
>> + rhi_call->imm = 0;
>> + rhi_call->gprs[0] = RHI_DA_VDEV_SET_TDI_STATE;
>> + rhi_call->gprs[1] = vdev_id;
>> + rhi_call->gprs[2] = target_state;
>> +
>> + ret = rsi_host_call(virt_to_phys(rhi_call));
>> + if (ret != RSI_SUCCESS)
>> + return -EIO;
>> +
>> + *cookie = rhi_call->gprs[1];
>> + return map_rhi_da_error(rhi_call->gprs[0]);
>> +}
>
>> diff --git a/drivers/virt/coco/arm-cca-guest/rhi-da.h b/drivers/virt/coco/arm-cca-guest/rhi-da.h
>> new file mode 100644
>> index 000000000000..8dd77c7ed645
>> --- /dev/null
>> +++ b/drivers/virt/coco/arm-cca-guest/rhi-da.h
>> @@ -0,0 +1,14 @@
>> +/* SPDX-License-Identifier: GPL-2.0-only */
>> +/*
>> + * Copyright (C) 2024 ARM Ltd.
>
> Possibly update if this has changed much this year.
>
>> + */
>> +
>> +#ifndef _VIRT_COCO_RHI_DA_H_
>> +#define _VIRT_COCO_RHI_DA_H_
>> +
>> +#include <asm/rhi.h>
>> +
>> +struct pci_dev;
>> +bool rhi_has_da_support(void);
>> +int rhi_vdev_set_tdi_state(struct pci_dev *pdev, unsigned long target_state);
>> +#endif
-aneesh
next prev parent reply other threads:[~2025-11-24 5:07 UTC|newest]
Thread overview: 30+ messages / expand[flat|nested] mbox.gz Atom feed top
2025-11-17 13:59 [PATCH v2 00/11] TSM: Implement ->lock()/->accept() callbacks for ARM CCA TDISP setup Aneesh Kumar K.V (Arm)
2025-11-17 13:59 ` [PATCH v2 01/11] coco: guest: arm64: Guest TSM callback and realm device lock support Aneesh Kumar K.V (Arm)
2025-11-19 15:22 ` Jonathan Cameron
2025-11-24 4:40 ` Aneesh Kumar K.V
2025-11-17 13:59 ` [PATCH v2 02/11] coco: guest: arm64: Add Realm Host Interface and guest DA helper Aneesh Kumar K.V (Arm)
2025-11-19 15:32 ` Jonathan Cameron
2025-11-24 5:07 ` Aneesh Kumar K.V [this message]
2025-11-17 13:59 ` [PATCH v2 03/11] coco: guest: arm64: Add support for guest initiated TDI bind/unbind Aneesh Kumar K.V (Arm)
2025-11-19 15:50 ` Jonathan Cameron
2026-01-08 15:32 ` Will Deacon
2025-11-17 14:00 ` [PATCH v2 04/11] coco: guest: arm64: Add support for updating interface reports from device Aneesh Kumar K.V (Arm)
2025-11-19 15:54 ` Jonathan Cameron
2025-11-24 5:42 ` Aneesh Kumar K.V
2025-11-17 14:00 ` [PATCH v2 05/11] coco: guest: arm64: Add support for updating measurements " Aneesh Kumar K.V (Arm)
2025-11-20 15:22 ` Jonathan Cameron
2025-11-24 6:18 ` Aneesh Kumar K.V
2025-11-17 14:00 ` [PATCH v2 06/11] coco: guest: arm64: Add support for reading cached objects from host Aneesh Kumar K.V (Arm)
2025-11-20 17:31 ` Jonathan Cameron
2025-11-24 6:52 ` Aneesh Kumar K.V
2025-11-17 14:00 ` [PATCH v2 07/11] coco: guest: arm64: Validate Realm MMIO mappings from TDISP report Aneesh Kumar K.V (Arm)
2025-11-20 17:43 ` Jonathan Cameron
2025-11-17 14:00 ` [PATCH v2 08/11] coco: guest: arm64: Add support for fetching and verifying device info Aneesh Kumar K.V (Arm)
2025-11-20 17:54 ` Jonathan Cameron
2025-11-24 8:28 ` Aneesh Kumar K.V
2025-11-17 14:00 ` [PATCH v2 09/11] coco: guest: arm64: Wire Realm TDISP RUN/STOP transitions into guest driver Aneesh Kumar K.V (Arm)
2025-11-20 17:55 ` Jonathan Cameron
2025-11-17 14:00 ` [PATCH v2 10/11] coco: arm64: dma: Update force_dma_unencrypted for accepted devices Aneesh Kumar K.V (Arm)
2025-11-20 17:58 ` Jonathan Cameron
2025-11-17 14:00 ` [PATCH v2 11/11] coco: guest: arm64: Enable vdev DMA after attestation Aneesh Kumar K.V (Arm)
2025-11-20 17:59 ` Jonathan Cameron
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=yq5aa50cm326.fsf@kernel.org \
--to=aneesh.kumar@kernel.org \
--cc=Suzuki.Poulose@arm.com \
--cc=aik@amd.com \
--cc=catalin.marinas@arm.com \
--cc=dan.j.williams@intel.com \
--cc=helgaas@kernel.org \
--cc=jgg@ziepe.ca \
--cc=jonathan.cameron@huawei.com \
--cc=kvmarm@lists.linux.dev \
--cc=linux-coco@lists.linux.dev \
--cc=linux-kernel@vger.kernel.org \
--cc=linux-pci@vger.kernel.org \
--cc=lukas@wunner.de \
--cc=maz@kernel.org \
--cc=oliver.upton@linux.dev \
--cc=sameo@rivosinc.com \
--cc=steven.price@arm.com \
--cc=will@kernel.org \
--cc=yilun.xu@linux.intel.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.