[PATCH v4 22/23] iommu/tegra241-cmdqv: Add user-space use support

Tian, Kevin kevin.tian at intel.com
Thu May 15 01:27:17 PDT 2025


> From: Nicolin Chen <nicolinc at nvidia.com>
> Sent: Friday, May 9, 2025 11:03 AM
> 
>  /**
>   * struct iommu_hw_info_arm_smmuv3 - ARM SMMUv3 hardware
> information
>   *                                   (IOMMU_HW_INFO_TYPE_ARM_SMMUV3)
>   *
> - * @flags: Must be set to 0
> - * @impl: Must be 0
> + * @flags: Combination of enum iommu_hw_info_arm_smmuv3_flags
> + * @impl: Implementation-defined bits when the following flags are set:
> + *        - IOMMU_HW_INFO_ARM_SMMUV3_HAS_TEGRA241_CMDQV
> + *          Bits[15:12] - Log2 of the total number of SID replacements
> + *          Bits[11:08] - Log2 of the total number of VINTFs per vIOMMU
> + *          Bits[07:04] - Log2 of the total number of VCMDQs per vIOMMU
> + *          Bits[03:00] - Version number for the CMDQ-V HW

hmm throughout this series I drew an equation between VINTF
and vIOMMU. Not sure how multiple VINTFs can be represented
w/o introducing more objects. Do we want to keep such info here?

> +	 * - suggest to back the queue memory with contiguous physical
> pages or
> +	 *   a single huge page with alignment of the queue size, limit
> vSMMU's
> +	 *   IDR1.CMDQS to the huge page size divided by 16 bytes
> +	 */
> +	IOMMU_HW_QUEUE_TYPE_TEGRA241_CMDQV = 1,

Not sure about the last sentence. 'limit' refers to a certain action
which the user should perform?

> +
> +	ret = tegra241_vintf_init_lvcmdq(vintf, lidx, vcmdq);
> +	if (ret)
> +		goto undepend_vcmdq;
> +
> +	dev_dbg(cmdqv->dev, "%sallocated\n",
> +		lvcmdq_error_header(vcmdq, header, 64));
> +
> +	tegra241_vcmdq_map_lvcmdq(vcmdq);
> +
> +	vcmdq->cmdq.q.q_base = q_base & VCMDQ_ADDR;
> +	vcmdq->cmdq.q.q_base |= log2size;
> +
> +	ret = tegra241_vcmdq_hw_init_user(vcmdq);
> +	if (ret)
> +		goto unmap_lvcmdq;
> +	vintf->lvcmdqs[lidx] = vcmdq;

this is already done in tegra241_vintf_init_lvcmdq().



More information about the linux-arm-kernel mailing list