|
@@ -1390,13 +1390,14 @@ static int iommu_map_page(struct protection_domain *dom,
|
|
|
u64 __pte, *pte;
|
|
|
int i, count;
|
|
|
|
|
|
+ BUG_ON(!IS_ALIGNED(bus_addr, page_size));
|
|
|
+ BUG_ON(!IS_ALIGNED(phys_addr, page_size));
|
|
|
+
|
|
|
if (!(prot & IOMMU_PROT_MASK))
|
|
|
return -EINVAL;
|
|
|
|
|
|
- bus_addr = PAGE_ALIGN(bus_addr);
|
|
|
- phys_addr = PAGE_ALIGN(phys_addr);
|
|
|
- count = PAGE_SIZE_PTE_COUNT(page_size);
|
|
|
- pte = alloc_pte(dom, bus_addr, page_size, NULL, GFP_KERNEL);
|
|
|
+ count = PAGE_SIZE_PTE_COUNT(page_size);
|
|
|
+ pte = alloc_pte(dom, bus_addr, page_size, NULL, GFP_KERNEL);
|
|
|
|
|
|
if (!pte)
|
|
|
return -ENOMEM;
|
|
@@ -1405,7 +1406,7 @@ static int iommu_map_page(struct protection_domain *dom,
|
|
|
if (IOMMU_PTE_PRESENT(pte[i]))
|
|
|
return -EBUSY;
|
|
|
|
|
|
- if (page_size > PAGE_SIZE) {
|
|
|
+ if (count > 1) {
|
|
|
__pte = PAGE_SIZE_PTE(phys_addr, page_size);
|
|
|
__pte |= PM_LEVEL_ENC(7) | IOMMU_PTE_P | IOMMU_PTE_FC;
|
|
|
} else
|