Hi Jason, On 5/6/2025 5:31 PM, Jason Gunthorpe wrote: > On Tue, May 06, 2025 at 02:45:00PM +0530, Vasant Hegde wrote: >>> +/** >>> + * struct iommu_vqueue_alloc - ioctl(IOMMU_VQUEUE_ALLOC) >>> + * @size: sizeof(struct iommu_vqueue_alloc) >>> + * @flags: Must be 0 >>> + * @viommu_id: Virtual IOMMU ID to associate the virtual queue with >>> + * @type: One of enum iommu_vqueue_type >>> + * @index: The logical index to the virtual queue per virtual IOMMU, for a multi >>> + * queue model >>> + * @out_vqueue_id: The ID of the new virtual queue >>> + * @addr: Base address of the queue memory in the guest physical address space >>> + * @length: Length of the queue memory in the guest physical address space >>> + * >>> + * Allocate a virtual queue object for a vIOMMU-specific HW-acceleration feature >>> + * that allows HW to access a guest queue memory described by @addr and @length. >>> + * It's suggested for VMM to back the queue memory using a single huge page with >>> + * a proper alignment for its contiguity in the host physical address space. The >>> + * call will fail, if the queue memory is not contiguous in the physical address >>> + * space. Upon success, its underlying physical pages will be pinned to prevent >>> + * VMM from unmapping them in the IOAS, until the virtual queue gets destroyed. >>> + * >>> + * A vIOMMU can allocate multiple queues, but it must use a different @index to >>> + * separate each allocation, e.g. VCMDQ0, VCMDQ1, ... >> >> This will handle multiple queues. But AMD vIOMMU needs to comunicate certain >> control bit setting which is not related to buffers like "Completion wait >> interrupt". >> >> How do we handle that? extend iommu_queue_alloc() or have different interface? > > Do you need a modify queue operation? We have two types of operations. One that impacts the queue, other set of bits which doesn't operate on qeueue. ex: Event log buffer - We configure "MMIO Offset 0010h Event Log Base Address Register" with Base address and size - MMIO Offset 0018h IOMMU Control Register EventLogEn: Event log enable * When guest sets this bit, qemu will trap and will send queue_alloc * When guest disables this bit, qemu will trap and send vqueue_destroy This part is fine. EventIntEn: Event log interrupt enable * When guest sets this bit, qemu will trap * this needs to be communicated to Host so that we can program VF Control BAR and enable the interrupt - There is other bit "Completion wait interrupt enable" This doesn't related to any buffer. Instead if we configure this for completion wait command it will generate interrupt. I am asking how do we handle above two steps? Should it be part of queue IOCTL or may be some other IOCTL which just passes these info to HW driver? -Vasant