On Tue, Oct 10, 2023 at 5:05 PM Si-Wei Liu <si-wei.liu@xxxxxxxxxx> wrote: > > Device specific IOMMU parent driver who wishes to see mapping to be > decoupled from virtio or vdpa device life cycle (device reset) can use > it to restore memory mapping in the device IOMMU to the initial or > default state. The reset of mapping is done per address space basis. > > The reason why a separate .reset_map op is introduced is because this > allows a simple on-chip IOMMU model without exposing too much device > implementation details to the upper vdpa layer. The .dma_map/unmap or > .set_map driver API is meant to be used to manipulate the IOTLB mappings, > and has been abstracted in a way similar to how a real IOMMU device maps > or unmaps pages for certain memory ranges. However, apart from this there > also exists other mapping needs, in which case 1:1 passthrough mapping > has to be used by other users (read virtio-vdpa). To ease parent/vendor > driver implementation and to avoid abusing DMA ops in an unexpacted way, > these on-chip IOMMU devices can start with 1:1 passthrough mapping mode > initially at the he time of creation. Then the .reset_map op can be used > to switch iotlb back to this initial state without having to expose a > complex two-dimensional IOMMU device model. > > Signed-off-by: Si-Wei Liu <si-wei.liu@xxxxxxxxxx> > --- > include/linux/vdpa.h | 10 ++++++++++ > 1 file changed, 10 insertions(+) > > diff --git a/include/linux/vdpa.h b/include/linux/vdpa.h > index d376309..26ae6ae 100644 > --- a/include/linux/vdpa.h > +++ b/include/linux/vdpa.h > @@ -327,6 +327,15 @@ struct vdpa_map_file { > * @iova: iova to be unmapped > * @size: size of the area > * Returns integer: success (0) or error (< 0) > + * @reset_map: Reset device memory mapping to the default > + * state (optional) I think we need to mention that this is a must for parents that use set_map()? Other than this: Acked-by: Jason Wang <jasowang@xxxxxxxxxx> Thanks > + * Needed for devices that are using device > + * specific DMA translation and prefer mapping > + * to be decoupled from the virtio life cycle, > + * i.e. device .reset op does not reset mapping > + * @vdev: vdpa device > + * @asid: address space identifier > + * Returns integer: success (0) or error (< 0) > * @get_vq_dma_dev: Get the dma device for a specific > * virtqueue (optional) > * @vdev: vdpa device > @@ -405,6 +414,7 @@ struct vdpa_config_ops { > u64 iova, u64 size, u64 pa, u32 perm, void *opaque); > int (*dma_unmap)(struct vdpa_device *vdev, unsigned int asid, > u64 iova, u64 size); > + int (*reset_map)(struct vdpa_device *vdev, unsigned int asid); > int (*set_group_asid)(struct vdpa_device *vdev, unsigned int group, > unsigned int asid); > struct device *(*get_vq_dma_dev)(struct vdpa_device *vdev, u16 idx); > -- > 1.8.3.1 > _______________________________________________ Virtualization mailing list Virtualization@xxxxxxxxxxxxxxxxxxxxxxxxxx https://lists.linuxfoundation.org/mailman/listinfo/virtualization