dma: Introduce dma_aligned_pow2_mask()

Currently get_naturally_aligned_size() is used by the intel iommu
to compute the maximum invalidation range based on @size which is
a power of 2 while being aligned with the @start address and less
than the maximum range defined by @gaw.

This helper is also useful for other iommu devices (virtio-iommu,
SMMUv3) to make sure IOMMU UNMAP notifiers only are called with
power of 2 range sizes.

Let's move this latter into dma-helpers.c and rename it into
dma_aligned_pow2_mask(). Also rewrite the helper so that it
accomodates UINT64_MAX values for the size mask and max mask.
It now returns a mask instead of a size. Change the caller.

Signed-off-by: Eric Auger <eric.auger@redhat.com>
Reviewed-by: Peter Xu <peterx@redhat.com>
Message-id: 20210309102742.30442-3-eric.auger@redhat.com
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
This commit is contained in:
Eric Auger 2021-03-09 11:27:37 +01:00 committed by Peter Maydell
parent 41ce9a9126
commit f14fb6c2db
3 changed files with 45 additions and 23 deletions

View file

@ -296,4 +296,16 @@ uint64_t dma_buf_write(uint8_t *ptr, int32_t len, QEMUSGList *sg);
void dma_acct_start(BlockBackend *blk, BlockAcctCookie *cookie,
QEMUSGList *sg, enum BlockAcctType type);
/**
* dma_aligned_pow2_mask: Return the address bit mask of the largest
* power of 2 size less or equal than @end - @start + 1, aligned with @start,
* and bounded by 1 << @max_addr_bits bits.
*
* @start: range start address
* @end: range end address (greater than @start)
* @max_addr_bits: max address bits (<= 64)
*/
uint64_t dma_aligned_pow2_mask(uint64_t start, uint64_t end,
int max_addr_bits);
#endif