From: Mostafa Saleh <smostafa@google.com>
To: Jean-Philippe Brucker <jean-philippe@linaro.org>
Cc: maz@kernel.org, catalin.marinas@arm.com, will@kernel.org,
joro@8bytes.org, robin.murphy@arm.com, james.morse@arm.com,
suzuki.poulose@arm.com, oliver.upton@linux.dev,
yuzenghui@huawei.com, dbrazdil@google.com, ryan.roberts@arm.com,
linux-arm-kernel@lists.infradead.org, kvmarm@lists.linux.dev,
iommu@lists.linux.dev
Subject: Re: [RFC PATCH 27/45] KVM: arm64: smmu-v3: Setup domains and page table configuration
Date: Fri, 23 Jun 2023 19:12:05 +0000 [thread overview]
Message-ID: <ZJXuhQeDgK4sShRA@google.com> (raw)
In-Reply-To: <20230201125328.2186498-28-jean-philippe@linaro.org>
Hi Jean,
On Wed, Feb 01, 2023 at 12:53:11PM +0000, Jean-Philippe Brucker wrote:
> Setup the stream table entries when the host issues the attach_dev() and
> detach_dev() hypercalls. The driver holds one io-pgtable configuration
> for all domains.
>
> Signed-off-by: Jean-Philippe Brucker <jean-philippe@linaro.org>
> ---
> include/kvm/arm_smmu_v3.h | 2 +
> arch/arm64/kvm/hyp/nvhe/iommu/arm-smmu-v3.c | 178 +++++++++++++++++++-
> 2 files changed, 177 insertions(+), 3 deletions(-)
>
> diff --git a/include/kvm/arm_smmu_v3.h b/include/kvm/arm_smmu_v3.h
> index fc67a3bf5709..ed139b0e9612 100644
> --- a/include/kvm/arm_smmu_v3.h
> +++ b/include/kvm/arm_smmu_v3.h
> @@ -3,6 +3,7 @@
> #define __KVM_ARM_SMMU_V3_H
>
> #include <asm/kvm_asm.h>
> +#include <linux/io-pgtable-arm.h>
> #include <kvm/iommu.h>
>
> #if IS_ENABLED(CONFIG_ARM_SMMU_V3_PKVM)
> @@ -28,6 +29,7 @@ struct hyp_arm_smmu_v3_device {
> size_t strtab_num_entries;
> size_t strtab_num_l1_entries;
> u8 strtab_split;
> + struct arm_lpae_io_pgtable pgtable;
> };
>
> extern size_t kvm_nvhe_sym(kvm_hyp_arm_smmu_v3_count);
> diff --git a/arch/arm64/kvm/hyp/nvhe/iommu/arm-smmu-v3.c b/arch/arm64/kvm/hyp/nvhe/iommu/arm-smmu-v3.c
> index 81040339ccfe..56e313203a16 100644
> --- a/arch/arm64/kvm/hyp/nvhe/iommu/arm-smmu-v3.c
> +++ b/arch/arm64/kvm/hyp/nvhe/iommu/arm-smmu-v3.c
> @@ -152,7 +152,6 @@ static int smmu_send_cmd(struct hyp_arm_smmu_v3_device *smmu,
> return smmu_sync_cmd(smmu);
> }
>
> -__maybe_unused
> static int smmu_sync_ste(struct hyp_arm_smmu_v3_device *smmu, u32 sid)
> {
> struct arm_smmu_cmdq_ent cmd = {
> @@ -194,7 +193,6 @@ static int smmu_alloc_l2_strtab(struct hyp_arm_smmu_v3_device *smmu, u32 idx)
> return 0;
> }
>
> -__maybe_unused
> static u64 *smmu_get_ste_ptr(struct hyp_arm_smmu_v3_device *smmu, u32 sid)
> {
> u32 idx;
> @@ -382,6 +380,68 @@ static int smmu_reset_device(struct hyp_arm_smmu_v3_device *smmu)
> return smmu_write_cr0(smmu, 0);
> }
>
> +static struct hyp_arm_smmu_v3_device *to_smmu(struct kvm_hyp_iommu *iommu)
> +{
> + return container_of(iommu, struct hyp_arm_smmu_v3_device, iommu);
> +}
> +
> +static void smmu_tlb_flush_all(void *cookie)
> +{
> + struct kvm_iommu_tlb_cookie *data = cookie;
> + struct hyp_arm_smmu_v3_device *smmu = to_smmu(data->iommu);
> + struct arm_smmu_cmdq_ent cmd = {
> + .opcode = CMDQ_OP_TLBI_S12_VMALL,
> + .tlbi.vmid = data->domain_id,
> + };
> +
> + WARN_ON(smmu_send_cmd(smmu, &cmd));
> +}
> +
> +static void smmu_tlb_inv_range(struct kvm_iommu_tlb_cookie *data,
> + unsigned long iova, size_t size, size_t granule,
> + bool leaf)
> +{
> + struct hyp_arm_smmu_v3_device *smmu = to_smmu(data->iommu);
> + unsigned long end = iova + size;
> + struct arm_smmu_cmdq_ent cmd = {
> + .opcode = CMDQ_OP_TLBI_S2_IPA,
> + .tlbi.vmid = data->domain_id,
> + .tlbi.leaf = leaf,
> + };
> +
> + /*
> + * There are no mappings at high addresses since we don't use TTB1, so
> + * no overflow possible.
> + */
> + BUG_ON(end < iova);
> +
> + while (iova < end) {
> + cmd.tlbi.addr = iova;
> + WARN_ON(smmu_send_cmd(smmu, &cmd));
> + BUG_ON(iova + granule < iova);
> + iova += granule;
> + }
> +}
> +
> +static void smmu_tlb_flush_walk(unsigned long iova, size_t size,
> + size_t granule, void *cookie)
> +{
> + smmu_tlb_inv_range(cookie, iova, size, granule, false);
> +}
> +
> +static void smmu_tlb_add_page(struct iommu_iotlb_gather *gather,
> + unsigned long iova, size_t granule,
> + void *cookie)
> +{
> + smmu_tlb_inv_range(cookie, iova, granule, granule, true);
> +}
> +
> +static const struct iommu_flush_ops smmu_tlb_ops = {
> + .tlb_flush_all = smmu_tlb_flush_all,
> + .tlb_flush_walk = smmu_tlb_flush_walk,
> + .tlb_add_page = smmu_tlb_add_page,
> +};
> +
> static int smmu_init_device(struct hyp_arm_smmu_v3_device *smmu)
> {
> int ret;
> @@ -394,6 +454,14 @@ static int smmu_init_device(struct hyp_arm_smmu_v3_device *smmu)
> if (IS_ERR(smmu->base))
> return PTR_ERR(smmu->base);
>
> + smmu->iommu.pgtable_cfg.tlb = &smmu_tlb_ops;
> +
> + ret = kvm_arm_io_pgtable_init(&smmu->iommu.pgtable_cfg, &smmu->pgtable);
> + if (ret)
> + return ret;
> +
> + smmu->iommu.pgtable = &smmu->pgtable.iop;
> +
> ret = smmu_init_registers(smmu);
> if (ret)
> return ret;
> @@ -406,7 +474,11 @@ static int smmu_init_device(struct hyp_arm_smmu_v3_device *smmu)
> if (ret)
> return ret;
>
> - return smmu_reset_device(smmu);
> + ret = smmu_reset_device(smmu);
> + if (ret)
> + return ret;
> +
> + return kvm_iommu_init_device(&smmu->iommu);
> }
>
> static int smmu_init(void)
> @@ -414,6 +486,10 @@ static int smmu_init(void)
> int ret;
> struct hyp_arm_smmu_v3_device *smmu;
>
> + ret = kvm_iommu_init();
> + if (ret)
> + return ret;
> +
> ret = pkvm_create_mappings(kvm_hyp_arm_smmu_v3_smmus,
> kvm_hyp_arm_smmu_v3_smmus +
> kvm_hyp_arm_smmu_v3_count,
> @@ -430,8 +506,104 @@ static int smmu_init(void)
> return 0;
> }
>
> +static struct kvm_hyp_iommu *smmu_id_to_iommu(pkvm_handle_t smmu_id)
> +{
> + if (smmu_id >= kvm_hyp_arm_smmu_v3_count)
> + return NULL;
> + smmu_id = array_index_nospec(smmu_id, kvm_hyp_arm_smmu_v3_count);
> +
> + return &kvm_hyp_arm_smmu_v3_smmus[smmu_id].iommu;
> +}
> +
> +static int smmu_attach_dev(struct kvm_hyp_iommu *iommu, pkvm_handle_t domain_id,
> + struct kvm_hyp_iommu_domain *domain, u32 sid)
> +{
> + int i;
> + int ret;
> + u64 *dst;
> + struct io_pgtable_cfg *cfg;
> + u64 ts, sl, ic, oc, sh, tg, ps;
> + u64 ent[STRTAB_STE_DWORDS] = {};
> + struct hyp_arm_smmu_v3_device *smmu = to_smmu(iommu);
> +
> + dst = smmu_get_ste_ptr(smmu, sid);
> + if (!dst || dst[0])
> + return -EINVAL;
> +
> + cfg = &smmu->pgtable.iop.cfg;
> + ps = cfg->arm_lpae_s2_cfg.vtcr.ps;
> + tg = cfg->arm_lpae_s2_cfg.vtcr.tg;
> + sh = cfg->arm_lpae_s2_cfg.vtcr.sh;
> + oc = cfg->arm_lpae_s2_cfg.vtcr.orgn;
> + ic = cfg->arm_lpae_s2_cfg.vtcr.irgn;
> + sl = cfg->arm_lpae_s2_cfg.vtcr.sl;
> + ts = cfg->arm_lpae_s2_cfg.vtcr.tsz;
> +
> + ent[0] = STRTAB_STE_0_V |
> + FIELD_PREP(STRTAB_STE_0_CFG, STRTAB_STE_0_CFG_S2_TRANS);
> + ent[2] = FIELD_PREP(STRTAB_STE_2_VTCR,
> + FIELD_PREP(STRTAB_STE_2_VTCR_S2PS, ps) |
> + FIELD_PREP(STRTAB_STE_2_VTCR_S2TG, tg) |
> + FIELD_PREP(STRTAB_STE_2_VTCR_S2SH0, sh) |
> + FIELD_PREP(STRTAB_STE_2_VTCR_S2OR0, oc) |
> + FIELD_PREP(STRTAB_STE_2_VTCR_S2IR0, ic) |
> + FIELD_PREP(STRTAB_STE_2_VTCR_S2SL0, sl) |
> + FIELD_PREP(STRTAB_STE_2_VTCR_S2T0SZ, ts)) |
> + FIELD_PREP(STRTAB_STE_2_S2VMID, domain_id) |
> + STRTAB_STE_2_S2AA64;
> + ent[3] = hyp_virt_to_phys(domain->pgd) & STRTAB_STE_3_S2TTB_MASK;
> +
> + /*
> + * The SMMU may cache a disabled STE.
> + * Initialize all fields, sync, then enable it.
> + */
> + for (i = 1; i < STRTAB_STE_DWORDS; i++)
> + dst[i] = cpu_to_le64(ent[i]);
> +
> + ret = smmu_sync_ste(smmu, sid);
> + if (ret)
> + return ret;
> +
> + WRITE_ONCE(dst[0], cpu_to_le64(ent[0]));
> + ret = smmu_sync_ste(smmu, sid);
> + if (ret)
> + dst[0] = 0;
> +
> + return ret;
> +}
> +
> +static int smmu_detach_dev(struct kvm_hyp_iommu *iommu, pkvm_handle_t domain_id,
> + struct kvm_hyp_iommu_domain *domain, u32 sid)
> +{
> + u64 ttb;
> + u64 *dst;
> + int i, ret;
> + struct hyp_arm_smmu_v3_device *smmu = to_smmu(iommu);
> +
> + dst = smmu_get_ste_ptr(smmu, sid);
> + if (!dst)
> + return -ENODEV;
> +
> + ttb = dst[3] & STRTAB_STE_3_S2TTB_MASK;
This is unused, does detach needs to do anything with ttb?
> + dst[0] = 0;
> + ret = smmu_sync_ste(smmu, sid);
> + if (ret)
> + return ret;
> +
> + for (i = 1; i < STRTAB_STE_DWORDS; i++)
> + dst[i] = 0;
> +
> + return smmu_sync_ste(smmu, sid);
> +}
> +
> static struct kvm_iommu_ops smmu_ops = {
> .init = smmu_init,
> + .get_iommu_by_id = smmu_id_to_iommu,
> + .alloc_iopt = kvm_arm_io_pgtable_alloc,
> + .free_iopt = kvm_arm_io_pgtable_free,
> + .attach_dev = smmu_attach_dev,
> + .detach_dev = smmu_detach_dev,
> };
>
> int kvm_arm_smmu_v3_register(void)
> --
> 2.39.0
Thanks,
Mostafa
WARNING: multiple messages have this Message-ID (diff)
From: Mostafa Saleh <smostafa@google.com>
To: Jean-Philippe Brucker <jean-philippe@linaro.org>
Cc: maz@kernel.org, catalin.marinas@arm.com, will@kernel.org,
joro@8bytes.org, robin.murphy@arm.com, james.morse@arm.com,
suzuki.poulose@arm.com, oliver.upton@linux.dev,
yuzenghui@huawei.com, dbrazdil@google.com, ryan.roberts@arm.com,
linux-arm-kernel@lists.infradead.org, kvmarm@lists.linux.dev,
iommu@lists.linux.dev
Subject: Re: [RFC PATCH 27/45] KVM: arm64: smmu-v3: Setup domains and page table configuration
Date: Fri, 23 Jun 2023 19:12:05 +0000 [thread overview]
Message-ID: <ZJXuhQeDgK4sShRA@google.com> (raw)
In-Reply-To: <20230201125328.2186498-28-jean-philippe@linaro.org>
Hi Jean,
On Wed, Feb 01, 2023 at 12:53:11PM +0000, Jean-Philippe Brucker wrote:
> Setup the stream table entries when the host issues the attach_dev() and
> detach_dev() hypercalls. The driver holds one io-pgtable configuration
> for all domains.
>
> Signed-off-by: Jean-Philippe Brucker <jean-philippe@linaro.org>
> ---
> include/kvm/arm_smmu_v3.h | 2 +
> arch/arm64/kvm/hyp/nvhe/iommu/arm-smmu-v3.c | 178 +++++++++++++++++++-
> 2 files changed, 177 insertions(+), 3 deletions(-)
>
> diff --git a/include/kvm/arm_smmu_v3.h b/include/kvm/arm_smmu_v3.h
> index fc67a3bf5709..ed139b0e9612 100644
> --- a/include/kvm/arm_smmu_v3.h
> +++ b/include/kvm/arm_smmu_v3.h
> @@ -3,6 +3,7 @@
> #define __KVM_ARM_SMMU_V3_H
>
> #include <asm/kvm_asm.h>
> +#include <linux/io-pgtable-arm.h>
> #include <kvm/iommu.h>
>
> #if IS_ENABLED(CONFIG_ARM_SMMU_V3_PKVM)
> @@ -28,6 +29,7 @@ struct hyp_arm_smmu_v3_device {
> size_t strtab_num_entries;
> size_t strtab_num_l1_entries;
> u8 strtab_split;
> + struct arm_lpae_io_pgtable pgtable;
> };
>
> extern size_t kvm_nvhe_sym(kvm_hyp_arm_smmu_v3_count);
> diff --git a/arch/arm64/kvm/hyp/nvhe/iommu/arm-smmu-v3.c b/arch/arm64/kvm/hyp/nvhe/iommu/arm-smmu-v3.c
> index 81040339ccfe..56e313203a16 100644
> --- a/arch/arm64/kvm/hyp/nvhe/iommu/arm-smmu-v3.c
> +++ b/arch/arm64/kvm/hyp/nvhe/iommu/arm-smmu-v3.c
> @@ -152,7 +152,6 @@ static int smmu_send_cmd(struct hyp_arm_smmu_v3_device *smmu,
> return smmu_sync_cmd(smmu);
> }
>
> -__maybe_unused
> static int smmu_sync_ste(struct hyp_arm_smmu_v3_device *smmu, u32 sid)
> {
> struct arm_smmu_cmdq_ent cmd = {
> @@ -194,7 +193,6 @@ static int smmu_alloc_l2_strtab(struct hyp_arm_smmu_v3_device *smmu, u32 idx)
> return 0;
> }
>
> -__maybe_unused
> static u64 *smmu_get_ste_ptr(struct hyp_arm_smmu_v3_device *smmu, u32 sid)
> {
> u32 idx;
> @@ -382,6 +380,68 @@ static int smmu_reset_device(struct hyp_arm_smmu_v3_device *smmu)
> return smmu_write_cr0(smmu, 0);
> }
>
> +static struct hyp_arm_smmu_v3_device *to_smmu(struct kvm_hyp_iommu *iommu)
> +{
> + return container_of(iommu, struct hyp_arm_smmu_v3_device, iommu);
> +}
> +
> +static void smmu_tlb_flush_all(void *cookie)
> +{
> + struct kvm_iommu_tlb_cookie *data = cookie;
> + struct hyp_arm_smmu_v3_device *smmu = to_smmu(data->iommu);
> + struct arm_smmu_cmdq_ent cmd = {
> + .opcode = CMDQ_OP_TLBI_S12_VMALL,
> + .tlbi.vmid = data->domain_id,
> + };
> +
> + WARN_ON(smmu_send_cmd(smmu, &cmd));
> +}
> +
> +static void smmu_tlb_inv_range(struct kvm_iommu_tlb_cookie *data,
> + unsigned long iova, size_t size, size_t granule,
> + bool leaf)
> +{
> + struct hyp_arm_smmu_v3_device *smmu = to_smmu(data->iommu);
> + unsigned long end = iova + size;
> + struct arm_smmu_cmdq_ent cmd = {
> + .opcode = CMDQ_OP_TLBI_S2_IPA,
> + .tlbi.vmid = data->domain_id,
> + .tlbi.leaf = leaf,
> + };
> +
> + /*
> + * There are no mappings at high addresses since we don't use TTB1, so
> + * no overflow possible.
> + */
> + BUG_ON(end < iova);
> +
> + while (iova < end) {
> + cmd.tlbi.addr = iova;
> + WARN_ON(smmu_send_cmd(smmu, &cmd));
> + BUG_ON(iova + granule < iova);
> + iova += granule;
> + }
> +}
> +
> +static void smmu_tlb_flush_walk(unsigned long iova, size_t size,
> + size_t granule, void *cookie)
> +{
> + smmu_tlb_inv_range(cookie, iova, size, granule, false);
> +}
> +
> +static void smmu_tlb_add_page(struct iommu_iotlb_gather *gather,
> + unsigned long iova, size_t granule,
> + void *cookie)
> +{
> + smmu_tlb_inv_range(cookie, iova, granule, granule, true);
> +}
> +
> +static const struct iommu_flush_ops smmu_tlb_ops = {
> + .tlb_flush_all = smmu_tlb_flush_all,
> + .tlb_flush_walk = smmu_tlb_flush_walk,
> + .tlb_add_page = smmu_tlb_add_page,
> +};
> +
> static int smmu_init_device(struct hyp_arm_smmu_v3_device *smmu)
> {
> int ret;
> @@ -394,6 +454,14 @@ static int smmu_init_device(struct hyp_arm_smmu_v3_device *smmu)
> if (IS_ERR(smmu->base))
> return PTR_ERR(smmu->base);
>
> + smmu->iommu.pgtable_cfg.tlb = &smmu_tlb_ops;
> +
> + ret = kvm_arm_io_pgtable_init(&smmu->iommu.pgtable_cfg, &smmu->pgtable);
> + if (ret)
> + return ret;
> +
> + smmu->iommu.pgtable = &smmu->pgtable.iop;
> +
> ret = smmu_init_registers(smmu);
> if (ret)
> return ret;
> @@ -406,7 +474,11 @@ static int smmu_init_device(struct hyp_arm_smmu_v3_device *smmu)
> if (ret)
> return ret;
>
> - return smmu_reset_device(smmu);
> + ret = smmu_reset_device(smmu);
> + if (ret)
> + return ret;
> +
> + return kvm_iommu_init_device(&smmu->iommu);
> }
>
> static int smmu_init(void)
> @@ -414,6 +486,10 @@ static int smmu_init(void)
> int ret;
> struct hyp_arm_smmu_v3_device *smmu;
>
> + ret = kvm_iommu_init();
> + if (ret)
> + return ret;
> +
> ret = pkvm_create_mappings(kvm_hyp_arm_smmu_v3_smmus,
> kvm_hyp_arm_smmu_v3_smmus +
> kvm_hyp_arm_smmu_v3_count,
> @@ -430,8 +506,104 @@ static int smmu_init(void)
> return 0;
> }
>
> +static struct kvm_hyp_iommu *smmu_id_to_iommu(pkvm_handle_t smmu_id)
> +{
> + if (smmu_id >= kvm_hyp_arm_smmu_v3_count)
> + return NULL;
> + smmu_id = array_index_nospec(smmu_id, kvm_hyp_arm_smmu_v3_count);
> +
> + return &kvm_hyp_arm_smmu_v3_smmus[smmu_id].iommu;
> +}
> +
> +static int smmu_attach_dev(struct kvm_hyp_iommu *iommu, pkvm_handle_t domain_id,
> + struct kvm_hyp_iommu_domain *domain, u32 sid)
> +{
> + int i;
> + int ret;
> + u64 *dst;
> + struct io_pgtable_cfg *cfg;
> + u64 ts, sl, ic, oc, sh, tg, ps;
> + u64 ent[STRTAB_STE_DWORDS] = {};
> + struct hyp_arm_smmu_v3_device *smmu = to_smmu(iommu);
> +
> + dst = smmu_get_ste_ptr(smmu, sid);
> + if (!dst || dst[0])
> + return -EINVAL;
> +
> + cfg = &smmu->pgtable.iop.cfg;
> + ps = cfg->arm_lpae_s2_cfg.vtcr.ps;
> + tg = cfg->arm_lpae_s2_cfg.vtcr.tg;
> + sh = cfg->arm_lpae_s2_cfg.vtcr.sh;
> + oc = cfg->arm_lpae_s2_cfg.vtcr.orgn;
> + ic = cfg->arm_lpae_s2_cfg.vtcr.irgn;
> + sl = cfg->arm_lpae_s2_cfg.vtcr.sl;
> + ts = cfg->arm_lpae_s2_cfg.vtcr.tsz;
> +
> + ent[0] = STRTAB_STE_0_V |
> + FIELD_PREP(STRTAB_STE_0_CFG, STRTAB_STE_0_CFG_S2_TRANS);
> + ent[2] = FIELD_PREP(STRTAB_STE_2_VTCR,
> + FIELD_PREP(STRTAB_STE_2_VTCR_S2PS, ps) |
> + FIELD_PREP(STRTAB_STE_2_VTCR_S2TG, tg) |
> + FIELD_PREP(STRTAB_STE_2_VTCR_S2SH0, sh) |
> + FIELD_PREP(STRTAB_STE_2_VTCR_S2OR0, oc) |
> + FIELD_PREP(STRTAB_STE_2_VTCR_S2IR0, ic) |
> + FIELD_PREP(STRTAB_STE_2_VTCR_S2SL0, sl) |
> + FIELD_PREP(STRTAB_STE_2_VTCR_S2T0SZ, ts)) |
> + FIELD_PREP(STRTAB_STE_2_S2VMID, domain_id) |
> + STRTAB_STE_2_S2AA64;
> + ent[3] = hyp_virt_to_phys(domain->pgd) & STRTAB_STE_3_S2TTB_MASK;
> +
> + /*
> + * The SMMU may cache a disabled STE.
> + * Initialize all fields, sync, then enable it.
> + */
> + for (i = 1; i < STRTAB_STE_DWORDS; i++)
> + dst[i] = cpu_to_le64(ent[i]);
> +
> + ret = smmu_sync_ste(smmu, sid);
> + if (ret)
> + return ret;
> +
> + WRITE_ONCE(dst[0], cpu_to_le64(ent[0]));
> + ret = smmu_sync_ste(smmu, sid);
> + if (ret)
> + dst[0] = 0;
> +
> + return ret;
> +}
> +
> +static int smmu_detach_dev(struct kvm_hyp_iommu *iommu, pkvm_handle_t domain_id,
> + struct kvm_hyp_iommu_domain *domain, u32 sid)
> +{
> + u64 ttb;
> + u64 *dst;
> + int i, ret;
> + struct hyp_arm_smmu_v3_device *smmu = to_smmu(iommu);
> +
> + dst = smmu_get_ste_ptr(smmu, sid);
> + if (!dst)
> + return -ENODEV;
> +
> + ttb = dst[3] & STRTAB_STE_3_S2TTB_MASK;
This is unused, does detach needs to do anything with ttb?
> + dst[0] = 0;
> + ret = smmu_sync_ste(smmu, sid);
> + if (ret)
> + return ret;
> +
> + for (i = 1; i < STRTAB_STE_DWORDS; i++)
> + dst[i] = 0;
> +
> + return smmu_sync_ste(smmu, sid);
> +}
> +
> static struct kvm_iommu_ops smmu_ops = {
> .init = smmu_init,
> + .get_iommu_by_id = smmu_id_to_iommu,
> + .alloc_iopt = kvm_arm_io_pgtable_alloc,
> + .free_iopt = kvm_arm_io_pgtable_free,
> + .attach_dev = smmu_attach_dev,
> + .detach_dev = smmu_detach_dev,
> };
>
> int kvm_arm_smmu_v3_register(void)
> --
> 2.39.0
Thanks,
Mostafa
_______________________________________________
linux-arm-kernel mailing list
linux-arm-kernel@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/linux-arm-kernel
next prev parent reply other threads:[~2023-06-23 19:12 UTC|newest]
Thread overview: 201+ messages / expand[flat|nested] mbox.gz Atom feed top
2023-02-01 12:52 [RFC PATCH 00/45] KVM: Arm SMMUv3 driver for pKVM Jean-Philippe Brucker
2023-02-01 12:52 ` Jean-Philippe Brucker
2023-02-01 12:52 ` [RFC PATCH 01/45] iommu/io-pgtable-arm: Split the page table driver Jean-Philippe Brucker
2023-02-01 12:52 ` Jean-Philippe Brucker
2023-02-01 12:52 ` [RFC PATCH 02/45] iommu/io-pgtable-arm: Split initialization Jean-Philippe Brucker
2023-02-01 12:52 ` Jean-Philippe Brucker
2023-02-01 12:52 ` [RFC PATCH 03/45] iommu/io-pgtable: Move fmt into io_pgtable_cfg Jean-Philippe Brucker
2023-02-01 12:52 ` Jean-Philippe Brucker
2024-02-16 11:55 ` Mostafa Saleh
2024-02-16 11:55 ` Mostafa Saleh
2023-02-01 12:52 ` [RFC PATCH 04/45] iommu/io-pgtable: Add configure() operation Jean-Philippe Brucker
2023-02-01 12:52 ` Jean-Philippe Brucker
2023-02-01 12:52 ` [RFC PATCH 05/45] iommu/io-pgtable: Split io_pgtable structure Jean-Philippe Brucker
2023-02-01 12:52 ` Jean-Philippe Brucker
2023-02-07 12:16 ` Mostafa Saleh
2023-02-08 18:01 ` Jean-Philippe Brucker
2023-02-08 18:01 ` Jean-Philippe Brucker
2023-02-01 12:52 ` [RFC PATCH 06/45] iommu/io-pgtable-arm: Extend __arm_lpae_free_pgtable() to only free child tables Jean-Philippe Brucker
2023-02-01 12:52 ` Jean-Philippe Brucker
2023-02-01 12:52 ` [RFC PATCH 07/45] iommu/arm-smmu-v3: Move some definitions to arm64 include/ Jean-Philippe Brucker
2023-02-01 12:52 ` Jean-Philippe Brucker
2023-02-01 12:52 ` [RFC PATCH 08/45] KVM: arm64: pkvm: Add pkvm_udelay() Jean-Philippe Brucker
2023-02-01 12:52 ` Jean-Philippe Brucker
2023-02-01 12:52 ` [RFC PATCH 09/45] KVM: arm64: pkvm: Add pkvm_create_hyp_device_mapping() Jean-Philippe Brucker
2023-02-01 12:52 ` Jean-Philippe Brucker
2023-02-07 12:22 ` Mostafa Saleh
2023-02-07 12:22 ` Mostafa Saleh
2023-02-08 18:02 ` Jean-Philippe Brucker
2023-02-08 18:02 ` Jean-Philippe Brucker
2023-02-01 12:52 ` [RFC PATCH 10/45] KVM: arm64: pkvm: Expose pkvm_map/unmap_donated_memory() Jean-Philippe Brucker
2023-02-01 12:52 ` Jean-Philippe Brucker
2023-02-01 12:52 ` [RFC PATCH 11/45] KVM: arm64: pkvm: Expose pkvm_admit_host_page() Jean-Philippe Brucker
2023-02-01 12:52 ` Jean-Philippe Brucker
2023-02-01 12:52 ` [RFC PATCH 12/45] KVM: arm64: pkvm: Unify pkvm_pkvm_teardown_donated_memory() Jean-Philippe Brucker
2023-02-01 12:52 ` Jean-Philippe Brucker
2024-01-15 14:33 ` Sebastian Ene
2024-01-15 14:33 ` Sebastian Ene
2024-01-23 19:49 ` Jean-Philippe Brucker
2024-01-23 19:49 ` Jean-Philippe Brucker
2023-02-01 12:52 ` [RFC PATCH 13/45] KVM: arm64: pkvm: Add hyp_page_ref_inc_return() Jean-Philippe Brucker
2023-02-01 12:52 ` Jean-Philippe Brucker
2023-02-01 12:52 ` [RFC PATCH 14/45] KVM: arm64: pkvm: Prevent host donation of device memory Jean-Philippe Brucker
2023-02-01 12:52 ` Jean-Philippe Brucker
2023-02-01 12:52 ` [RFC PATCH 15/45] KVM: arm64: pkvm: Add __pkvm_host_share/unshare_dma() Jean-Philippe Brucker
2023-02-01 12:52 ` Jean-Philippe Brucker
2023-02-04 12:51 ` tina.zhang
2023-02-04 12:51 ` tina.zhang
2023-02-06 12:13 ` Jean-Philippe Brucker
2023-02-06 12:13 ` Jean-Philippe Brucker
2023-02-07 2:37 ` tina.zhang
2023-02-07 2:37 ` tina.zhang
2023-02-07 10:39 ` Jean-Philippe Brucker
2023-02-07 10:39 ` Jean-Philippe Brucker
2023-02-07 12:53 ` Mostafa Saleh
2023-02-07 12:53 ` Mostafa Saleh
2023-02-10 19:21 ` Jean-Philippe Brucker
2023-02-10 19:21 ` Jean-Philippe Brucker
2023-02-01 12:53 ` [RFC PATCH 16/45] KVM: arm64: Introduce IOMMU driver infrastructure Jean-Philippe Brucker
2023-02-01 12:53 ` Jean-Philippe Brucker
2023-02-01 12:53 ` [RFC PATCH 17/45] KVM: arm64: pkvm: Add IOMMU hypercalls Jean-Philippe Brucker
2023-02-01 12:53 ` Jean-Philippe Brucker
2023-02-01 12:53 ` [RFC PATCH 18/45] KVM: arm64: iommu: Add per-cpu page queue Jean-Philippe Brucker
2023-02-01 12:53 ` Jean-Philippe Brucker
2023-02-01 12:53 ` [RFC PATCH 19/45] KVM: arm64: iommu: Add domains Jean-Philippe Brucker
2023-02-01 12:53 ` Jean-Philippe Brucker
2023-02-07 13:13 ` Mostafa Saleh
2023-02-07 13:13 ` Mostafa Saleh
2023-02-08 12:31 ` Mostafa Saleh
2023-02-08 12:31 ` Mostafa Saleh
2023-02-08 18:05 ` Jean-Philippe Brucker
2023-02-08 18:05 ` Jean-Philippe Brucker
2023-02-10 22:03 ` Mostafa Saleh
2023-02-10 22:03 ` Mostafa Saleh
2023-05-19 15:33 ` Mostafa Saleh
2023-05-19 15:33 ` Mostafa Saleh
2023-06-02 15:29 ` Jean-Philippe Brucker
2023-06-02 15:29 ` Jean-Philippe Brucker
2023-06-15 13:32 ` Mostafa Saleh
2023-06-15 13:32 ` Mostafa Saleh
2023-02-01 12:53 ` [RFC PATCH 20/45] KVM: arm64: iommu: Add map() and unmap() operations Jean-Philippe Brucker
2023-02-01 12:53 ` Jean-Philippe Brucker
2023-03-30 18:14 ` Mostafa Saleh
2023-03-30 18:14 ` Mostafa Saleh
2023-04-04 16:00 ` Jean-Philippe Brucker
2023-04-04 16:00 ` Jean-Philippe Brucker
2023-09-20 16:23 ` Mostafa Saleh
2023-09-20 16:23 ` Mostafa Saleh
2023-09-25 17:21 ` Jean-Philippe Brucker
2023-09-25 17:21 ` Jean-Philippe Brucker
2024-02-16 11:59 ` Mostafa Saleh
2024-02-16 11:59 ` Mostafa Saleh
2024-02-26 14:12 ` Jean-Philippe Brucker
2024-02-26 14:12 ` Jean-Philippe Brucker
2023-02-01 12:53 ` [RFC PATCH 21/45] KVM: arm64: iommu: Add SMMUv3 driver Jean-Philippe Brucker
2023-02-01 12:53 ` Jean-Philippe Brucker
2023-02-01 12:53 ` [RFC PATCH 22/45] KVM: arm64: smmu-v3: Initialize registers Jean-Philippe Brucker
2023-02-01 12:53 ` Jean-Philippe Brucker
2023-02-01 12:53 ` [RFC PATCH 23/45] KVM: arm64: smmu-v3: Setup command queue Jean-Philippe Brucker
2023-02-01 12:53 ` Jean-Philippe Brucker
2023-02-01 12:53 ` [RFC PATCH 24/45] KVM: arm64: smmu-v3: Setup stream table Jean-Philippe Brucker
2023-02-01 12:53 ` Jean-Philippe Brucker
2024-01-16 8:59 ` Mostafa Saleh
2024-01-16 8:59 ` Mostafa Saleh
2024-01-23 19:45 ` Jean-Philippe Brucker
2024-01-23 19:45 ` Jean-Philippe Brucker
2024-02-16 12:19 ` Mostafa Saleh
2024-02-16 12:19 ` Mostafa Saleh
2024-02-26 14:13 ` Jean-Philippe Brucker
2024-02-26 14:13 ` Jean-Philippe Brucker
2024-03-06 12:51 ` Mostafa Saleh
2024-03-06 12:51 ` Mostafa Saleh
2023-02-01 12:53 ` [RFC PATCH 25/45] KVM: arm64: smmu-v3: Reset the device Jean-Philippe Brucker
2023-02-01 12:53 ` Jean-Philippe Brucker
2023-02-01 12:53 ` [RFC PATCH 26/45] KVM: arm64: smmu-v3: Support io-pgtable Jean-Philippe Brucker
2023-02-01 12:53 ` Jean-Philippe Brucker
2023-02-01 12:53 ` [RFC PATCH 27/45] KVM: arm64: smmu-v3: Setup domains and page table configuration Jean-Philippe Brucker
2023-02-01 12:53 ` Jean-Philippe Brucker
2023-06-23 19:12 ` Mostafa Saleh [this message]
2023-06-23 19:12 ` Mostafa Saleh
2023-07-03 10:41 ` Jean-Philippe Brucker
2023-07-03 10:41 ` Jean-Philippe Brucker
2024-01-15 14:34 ` Mostafa Saleh
2024-01-15 14:34 ` Mostafa Saleh
2024-01-23 19:50 ` Jean-Philippe Brucker
2024-01-23 19:50 ` Jean-Philippe Brucker
2024-02-16 12:11 ` Mostafa Saleh
2024-02-16 12:11 ` Mostafa Saleh
2024-02-26 14:18 ` Jean-Philippe Brucker
2024-02-26 14:18 ` Jean-Philippe Brucker
2023-02-01 12:53 ` [RFC PATCH 28/45] iommu/arm-smmu-v3: Extract driver-specific bits from probe function Jean-Philippe Brucker
2023-02-01 12:53 ` Jean-Philippe Brucker
2023-02-01 12:53 ` [RFC PATCH 29/45] iommu/arm-smmu-v3: Move some functions to arm-smmu-v3-common.c Jean-Philippe Brucker
2023-02-01 12:53 ` Jean-Philippe Brucker
2023-02-01 12:53 ` [RFC PATCH 30/45] iommu/arm-smmu-v3: Move queue and table allocation " Jean-Philippe Brucker
2023-02-01 12:53 ` Jean-Philippe Brucker
2024-02-16 12:03 ` Mostafa Saleh
2024-02-16 12:03 ` Mostafa Saleh
2024-02-26 14:19 ` Jean-Philippe Brucker
2024-02-26 14:19 ` Jean-Philippe Brucker
2023-02-01 12:53 ` [RFC PATCH 31/45] iommu/arm-smmu-v3: Move firmware probe to arm-smmu-v3-common Jean-Philippe Brucker
2023-02-01 12:53 ` Jean-Philippe Brucker
2023-02-01 12:53 ` [RFC PATCH 32/45] iommu/arm-smmu-v3: Move IOMMU registration to arm-smmu-v3-common.c Jean-Philippe Brucker
2023-02-01 12:53 ` Jean-Philippe Brucker
2023-02-01 12:53 ` [RFC PATCH 33/45] iommu/arm-smmu-v3: Use single pages for level-2 stream tables Jean-Philippe Brucker
2023-02-01 12:53 ` Jean-Philippe Brucker
2023-02-01 12:53 ` [RFC PATCH 34/45] iommu/arm-smmu-v3: Add host driver for pKVM Jean-Philippe Brucker
2023-02-01 12:53 ` Jean-Philippe Brucker
2023-02-01 12:53 ` [RFC PATCH 35/45] iommu/arm-smmu-v3-kvm: Pass a list of SMMU devices to the hypervisor Jean-Philippe Brucker
2023-02-01 12:53 ` Jean-Philippe Brucker
2023-02-01 12:53 ` [RFC PATCH 36/45] iommu/arm-smmu-v3-kvm: Validate device features Jean-Philippe Brucker
2023-02-01 12:53 ` Jean-Philippe Brucker
2023-02-01 12:53 ` [RFC PATCH 37/45] iommu/arm-smmu-v3-kvm: Allocate structures and reset device Jean-Philippe Brucker
2023-02-01 12:53 ` Jean-Philippe Brucker
2023-02-01 12:53 ` [RFC PATCH 38/45] iommu/arm-smmu-v3-kvm: Add per-cpu page queue Jean-Philippe Brucker
2023-02-01 12:53 ` Jean-Philippe Brucker
2023-02-01 12:53 ` [RFC PATCH 39/45] iommu/arm-smmu-v3-kvm: Initialize page table configuration Jean-Philippe Brucker
2023-02-01 12:53 ` Jean-Philippe Brucker
2023-03-22 10:23 ` Mostafa Saleh
2023-03-22 10:23 ` Mostafa Saleh
2023-03-22 14:42 ` Jean-Philippe Brucker
2023-03-22 14:42 ` Jean-Philippe Brucker
2023-02-01 12:53 ` [RFC PATCH 40/45] iommu/arm-smmu-v3-kvm: Add IOMMU ops Jean-Philippe Brucker
2023-02-01 12:53 ` Jean-Philippe Brucker
2023-02-07 13:22 ` Mostafa Saleh
2023-02-07 13:22 ` Mostafa Saleh
2023-02-08 18:13 ` Jean-Philippe Brucker
2023-02-08 18:13 ` Jean-Philippe Brucker
2023-09-20 16:27 ` Mostafa Saleh
2023-09-20 16:27 ` Mostafa Saleh
2023-09-25 17:18 ` Jean-Philippe Brucker
2023-09-25 17:18 ` Jean-Philippe Brucker
2023-09-26 9:54 ` Mostafa Saleh
2023-09-26 9:54 ` Mostafa Saleh
2023-02-01 12:53 ` [RFC PATCH 41/45] KVM: arm64: pkvm: Add __pkvm_host_add_remove_page() Jean-Philippe Brucker
2023-02-01 12:53 ` Jean-Philippe Brucker
2023-02-01 12:53 ` [RFC PATCH 42/45] KVM: arm64: pkvm: Support SCMI power domain Jean-Philippe Brucker
2023-02-01 12:53 ` Jean-Philippe Brucker
2023-02-07 13:27 ` Mostafa Saleh
2023-02-07 13:27 ` Mostafa Saleh
2023-02-10 19:23 ` Jean-Philippe Brucker
2023-02-10 19:23 ` Jean-Philippe Brucker
2023-02-01 12:53 ` [RFC PATCH 43/45] KVM: arm64: smmu-v3: Support power management Jean-Philippe Brucker
2023-02-01 12:53 ` Jean-Philippe Brucker
2023-02-01 12:53 ` [RFC PATCH 44/45] iommu/arm-smmu-v3-kvm: Support power management with SCMI SMC Jean-Philippe Brucker
2023-02-01 12:53 ` Jean-Philippe Brucker
2023-02-01 12:53 ` [RFC PATCH 45/45] iommu/arm-smmu-v3-kvm: Enable runtime PM Jean-Philippe Brucker
2023-02-01 12:53 ` Jean-Philippe Brucker
2023-02-02 7:07 ` [RFC PATCH 00/45] KVM: Arm SMMUv3 driver for pKVM Tian, Kevin
2023-02-02 7:07 ` Tian, Kevin
2023-02-02 10:05 ` Jean-Philippe Brucker
2023-02-02 10:05 ` Jean-Philippe Brucker
2023-02-03 2:04 ` Tian, Kevin
2023-02-03 2:04 ` Tian, Kevin
2023-02-03 8:39 ` Chen, Jason CJ
2023-02-03 8:39 ` Chen, Jason CJ
2023-02-03 11:23 ` Jean-Philippe Brucker
2023-02-03 11:23 ` Jean-Philippe Brucker
2023-02-04 8:19 ` Chen, Jason CJ
2023-02-04 8:19 ` Chen, Jason CJ
2023-02-04 12:30 ` tina.zhang
2023-02-04 12:30 ` tina.zhang
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=ZJXuhQeDgK4sShRA@google.com \
--to=smostafa@google.com \
--cc=catalin.marinas@arm.com \
--cc=dbrazdil@google.com \
--cc=iommu@lists.linux.dev \
--cc=james.morse@arm.com \
--cc=jean-philippe@linaro.org \
--cc=joro@8bytes.org \
--cc=kvmarm@lists.linux.dev \
--cc=linux-arm-kernel@lists.infradead.org \
--cc=maz@kernel.org \
--cc=oliver.upton@linux.dev \
--cc=robin.murphy@arm.com \
--cc=ryan.roberts@arm.com \
--cc=suzuki.poulose@arm.com \
--cc=will@kernel.org \
--cc=yuzenghui@huawei.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.