]> git.sur5r.net Git - u-boot/blobdiff - arch/arm/cpu/armv8/cache_v8.c
armv8: mmu: Add support of non-identical mapping
[u-boot] / arch / arm / cpu / armv8 / cache_v8.c
index 8604035e148c40637c235821abc001bd7ba6963a..ac909a15ffaa6974c2c633a2e73bd00a62c6d41d 100644 (file)
@@ -44,7 +44,7 @@ u64 get_tcr(int el, u64 *pips, u64 *pva_bits)
 
        /* Find the largest address we need to support */
        for (i = 0; mem_map[i].size || mem_map[i].attrs; i++)
-               max_addr = max(max_addr, mem_map[i].base + mem_map[i].size);
+               max_addr = max(max_addr, mem_map[i].virt + mem_map[i].size);
 
        /* Calculate the maximum physical (and thus virtual) address */
        if (max_addr > (1ULL << 44)) {
@@ -202,7 +202,8 @@ static void split_block(u64 *pte, int level)
 static void add_map(struct mm_region *map)
 {
        u64 *pte;
-       u64 addr = map->base;
+       u64 virt = map->virt;
+       u64 phys = map->phys;
        u64 size = map->size;
        u64 attrs = map->attrs | PTE_TYPE_BLOCK | PTE_BLOCK_AF;
        u64 blocksize;
@@ -210,37 +211,39 @@ static void add_map(struct mm_region *map)
        u64 *new_table;
 
        while (size) {
-               pte = find_pte(addr, 0);
+               pte = find_pte(virt, 0);
                if (pte && (pte_type(pte) == PTE_TYPE_FAULT)) {
-                       debug("Creating table for addr 0x%llx\n", addr);
+                       debug("Creating table for virt 0x%llx\n", virt);
                        new_table = create_table();
                        set_pte_table(pte, new_table);
                }
 
                for (level = 1; level < 4; level++) {
-                       pte = find_pte(addr, level);
+                       pte = find_pte(virt, level);
                        if (!pte)
                                panic("pte not found\n");
+
                        blocksize = 1ULL << level2shift(level);
-                       debug("Checking if pte fits for addr=%llx size=%llx "
-                             "blocksize=%llx\n", addr, size, blocksize);
-                       if (size >= blocksize && !(addr & (blocksize - 1))) {
+                       debug("Checking if pte fits for virt=%llx size=%llx blocksize=%llx\n",
+                             virt, size, blocksize);
+                       if (size >= blocksize && !(virt & (blocksize - 1))) {
                                /* Page fits, create block PTE */
-                               debug("Setting PTE %p to block addr=%llx\n",
-                                     pte, addr);
-                               *pte = addr | attrs;
-                               addr += blocksize;
+                               debug("Setting PTE %p to block virt=%llx\n",
+                                     pte, virt);
+                               *pte = phys | attrs;
+                               virt += blocksize;
+                               phys += blocksize;
                                size -= blocksize;
                                break;
                        } else if (pte_type(pte) == PTE_TYPE_FAULT) {
                                /* Page doesn't fit, create subpages */
-                               debug("Creating subtable for addr 0x%llx "
-                                     "blksize=%llx\n", addr, blocksize);
+                               debug("Creating subtable for virt 0x%llx blksize=%llx\n",
+                                     virt, blocksize);
                                new_table = create_table();
                                set_pte_table(pte, new_table);
                        } else if (pte_type(pte) == PTE_TYPE_BLOCK) {
-                               debug("Split block into subtable for addr 0x%llx blksize=0x%llx\n",
-                                     addr, blocksize);
+                               debug("Split block into subtable for virt 0x%llx blksize=0x%llx\n",
+                                     virt, blocksize);
                                split_block(pte, level);
                        }
                }
@@ -271,7 +274,7 @@ static int count_required_pts(u64 addr, int level, u64 maxaddr)
 
        for (i = 0; mem_map[i].size || mem_map[i].attrs; i++) {
                struct mm_region *map = &mem_map[i];
-               u64 start = map->base;
+               u64 start = map->virt;
                u64 end = start + map->size;
 
                /* Check if the PTE would overlap with the map */