|
@@ -1428,8 +1428,8 @@ static unsigned long iommu_unmap_page(struct protection_domain *dom,
|
|
|
unsigned long bus_addr,
|
|
|
unsigned long page_size)
|
|
|
{
|
|
|
- unsigned long long unmap_size, unmapped;
|
|
|
- unsigned long pte_pgsize;
|
|
|
+ unsigned long long unmapped;
|
|
|
+ unsigned long unmap_size;
|
|
|
u64 *pte;
|
|
|
|
|
|
BUG_ON(!is_power_of_2(page_size));
|
|
@@ -1438,28 +1438,12 @@ static unsigned long iommu_unmap_page(struct protection_domain *dom,
|
|
|
|
|
|
while (unmapped < page_size) {
|
|
|
|
|
|
- pte = fetch_pte(dom, bus_addr, &pte_pgsize);
|
|
|
-
|
|
|
- if (!pte) {
|
|
|
- /*
|
|
|
- * No PTE for this address
|
|
|
- * move forward in 4kb steps
|
|
|
- */
|
|
|
- unmap_size = PAGE_SIZE;
|
|
|
- } else if (PM_PTE_LEVEL(*pte) == 0) {
|
|
|
- /* 4kb PTE found for this address */
|
|
|
- unmap_size = PAGE_SIZE;
|
|
|
- *pte = 0ULL;
|
|
|
- } else {
|
|
|
- int count, i;
|
|
|
-
|
|
|
- /* Large PTE found which maps this address */
|
|
|
- unmap_size = PTE_PAGE_SIZE(*pte);
|
|
|
-
|
|
|
- /* Only unmap from the first pte in the page */
|
|
|
- if ((unmap_size - 1) & bus_addr)
|
|
|
- break;
|
|
|
- count = PAGE_SIZE_PTE_COUNT(unmap_size);
|
|
|
+ pte = fetch_pte(dom, bus_addr, &unmap_size);
|
|
|
+
|
|
|
+ if (pte) {
|
|
|
+ int i, count;
|
|
|
+
|
|
|
+ count = PAGE_SIZE_PTE_COUNT(unmap_size);
|
|
|
for (i = 0; i < count; i++)
|
|
|
pte[i] = 0ULL;
|
|
|
}
|