mirror of
https://github.com/torvalds/linux.git
synced 2026-05-30 10:04:04 +02:00
iommu/tegra241-cmdqv: Add IOMMU_VEVENTQ_TYPE_TEGRA241_CMDQV support
Add a new vEVENTQ type for VINTFs that are assigned to the user space. Simply report the two 64-bit LVCMDQ_ERR_MAPs register values. Link: https://patch.msgid.link/r/68161a980da41fa5022841209638aeff258557b5.1752126748.git.nicolinc@nvidia.com Reviewed-by: Alok Tiwari <alok.a.tiwari@oracle.com> Reviewed-by: Pranjal Shrivastava <praan@google.com> Reviewed-by: Jason Gunthorpe <jgg@nvidia.com> Signed-off-by: Nicolin Chen <nicolinc@nvidia.com> Signed-off-by: Jason Gunthorpe <jgg@nvidia.com>
This commit is contained in:
parent
4dc0d12474
commit
32b2d3a57e
|
|
@ -295,6 +295,20 @@ static inline int vcmdq_write_config(struct tegra241_vcmdq *vcmdq, u32 regval)
|
|||
|
||||
/* ISR Functions */
|
||||
|
||||
static void tegra241_vintf_user_handle_error(struct tegra241_vintf *vintf)
|
||||
{
|
||||
struct iommufd_viommu *viommu = &vintf->vsmmu.core;
|
||||
struct iommu_vevent_tegra241_cmdqv vevent_data;
|
||||
int i;
|
||||
|
||||
for (i = 0; i < LVCMDQ_ERR_MAP_NUM_64; i++)
|
||||
vevent_data.lvcmdq_err_map[i] =
|
||||
readq_relaxed(REG_VINTF(vintf, LVCMDQ_ERR_MAP_64(i)));
|
||||
|
||||
iommufd_viommu_report_event(viommu, IOMMU_VEVENTQ_TYPE_TEGRA241_CMDQV,
|
||||
&vevent_data, sizeof(vevent_data));
|
||||
}
|
||||
|
||||
static void tegra241_vintf0_handle_error(struct tegra241_vintf *vintf)
|
||||
{
|
||||
int i;
|
||||
|
|
@ -340,6 +354,14 @@ static irqreturn_t tegra241_cmdqv_isr(int irq, void *devid)
|
|||
vintf_map &= ~BIT_ULL(0);
|
||||
}
|
||||
|
||||
/* Handle other user VINTFs and their LVCMDQs */
|
||||
while (vintf_map) {
|
||||
unsigned long idx = __ffs64(vintf_map);
|
||||
|
||||
tegra241_vintf_user_handle_error(cmdqv->vintfs[idx]);
|
||||
vintf_map &= ~BIT_ULL(idx);
|
||||
}
|
||||
|
||||
return IRQ_HANDLED;
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -1146,10 +1146,12 @@ struct iommufd_vevent_header {
|
|||
* enum iommu_veventq_type - Virtual Event Queue Type
|
||||
* @IOMMU_VEVENTQ_TYPE_DEFAULT: Reserved for future use
|
||||
* @IOMMU_VEVENTQ_TYPE_ARM_SMMUV3: ARM SMMUv3 Virtual Event Queue
|
||||
* @IOMMU_VEVENTQ_TYPE_TEGRA241_CMDQV: NVIDIA Tegra241 CMDQV Extension IRQ
|
||||
*/
|
||||
enum iommu_veventq_type {
|
||||
IOMMU_VEVENTQ_TYPE_DEFAULT = 0,
|
||||
IOMMU_VEVENTQ_TYPE_ARM_SMMUV3 = 1,
|
||||
IOMMU_VEVENTQ_TYPE_TEGRA241_CMDQV = 2,
|
||||
};
|
||||
|
||||
/**
|
||||
|
|
@ -1173,6 +1175,19 @@ struct iommu_vevent_arm_smmuv3 {
|
|||
__aligned_le64 evt[4];
|
||||
};
|
||||
|
||||
/**
|
||||
* struct iommu_vevent_tegra241_cmdqv - Tegra241 CMDQV IRQ
|
||||
* (IOMMU_VEVENTQ_TYPE_TEGRA241_CMDQV)
|
||||
* @lvcmdq_err_map: 128-bit logical vcmdq error map, little-endian.
|
||||
* (Refer to register LVCMDQ_ERR_MAPs per VINTF )
|
||||
*
|
||||
* The 128-bit register value from HW exclusively reflect the error bits for a
|
||||
* Virtual Interface represented by a vIOMMU object. Read and report directly.
|
||||
*/
|
||||
struct iommu_vevent_tegra241_cmdqv {
|
||||
__aligned_le64 lvcmdq_err_map[2];
|
||||
};
|
||||
|
||||
/**
|
||||
* struct iommu_veventq_alloc - ioctl(IOMMU_VEVENTQ_ALLOC)
|
||||
* @size: sizeof(struct iommu_veventq_alloc)
|
||||
|
|
|
|||
Loading…
Reference in New Issue
Block a user