]> asedeno.scripts.mit.edu Git - linux.git/commitdiff
drm/nouveau/core/mm: have users explicitly define heap identifiers
authorBen Skeggs <bskeggs@redhat.com>
Tue, 31 Oct 2017 17:56:19 +0000 (03:56 +1000)
committerBen Skeggs <bskeggs@redhat.com>
Thu, 2 Nov 2017 03:32:22 +0000 (13:32 +1000)
Different sections of VRAM may have different properties (ie. can't be used
for compression/display, can't be mapped, etc).

We currently already support this, but it's a bit magic.  This change makes
it more obvious where we're allocating from.

Signed-off-by: Ben Skeggs <bskeggs@redhat.com>
15 files changed:
drivers/gpu/drm/nouveau/include/nvkm/core/mm.h
drivers/gpu/drm/nouveau/include/nvkm/subdev/fb.h
drivers/gpu/drm/nouveau/nouveau_abi16.c
drivers/gpu/drm/nouveau/nvkm/core/gpuobj.c
drivers/gpu/drm/nouveau/nvkm/core/mm.c
drivers/gpu/drm/nouveau/nvkm/engine/device/tegra.c
drivers/gpu/drm/nouveau/nvkm/subdev/fb/ram.c
drivers/gpu/drm/nouveau/nvkm/subdev/fb/ramgf100.c
drivers/gpu/drm/nouveau/nvkm/subdev/fb/rammcp77.c
drivers/gpu/drm/nouveau/nvkm/subdev/fb/ramnv50.c
drivers/gpu/drm/nouveau/nvkm/subdev/instmem/nv04.c
drivers/gpu/drm/nouveau/nvkm/subdev/instmem/nv40.c
drivers/gpu/drm/nouveau/nvkm/subdev/ltc/gf100.c
drivers/gpu/drm/nouveau/nvkm/subdev/ltc/gp100.c
drivers/gpu/drm/nouveau/nvkm/subdev/mmu/base.c

index 7bd4897a8a2adc4953f1b3bf4b44553743e9510c..21b1a4d43f517cfeabf467dcf3f7d66e476aeba3 100644 (file)
@@ -30,7 +30,7 @@ nvkm_mm_initialised(struct nvkm_mm *mm)
        return mm->heap_nodes;
 }
 
-int  nvkm_mm_init(struct nvkm_mm *, u32 offset, u32 length, u32 block);
+int  nvkm_mm_init(struct nvkm_mm *, u8 heap, u32 offset, u32 length, u32 block);
 int  nvkm_mm_fini(struct nvkm_mm *);
 int  nvkm_mm_head(struct nvkm_mm *, u8 heap, u8 type, u32 size_max,
                  u32 size_min, u32 align, struct nvkm_mm_node **);
index dde444a7d3f04333e97848f190df2926584aec48..29b21a4f189c12fd218ae2fb56075c434216dc63 100644 (file)
@@ -123,6 +123,10 @@ struct nvkm_ram {
        u64 size;
 
 #define NVKM_RAM_MM_SHIFT 12
+#define NVKM_RAM_MM_ANY    (NVKM_MM_HEAP_ANY + 0)
+#define NVKM_RAM_MM_NORMAL (NVKM_MM_HEAP_ANY + 1)
+#define NVKM_RAM_MM_NOMAP  (NVKM_MM_HEAP_ANY + 2)
+#define NVKM_RAM_MM_MIXED  (NVKM_MM_HEAP_ANY + 3)
        struct nvkm_mm vram;
        struct nvkm_mm tags;
        u64 stolen;
index 9b0b210a37f827ba4977ecd958c9a1dd3f9427e6..4c4e016aba9519edff9c988584888db09b0a0baf 100644 (file)
@@ -340,7 +340,7 @@ nouveau_abi16_ioctl_channel_alloc(ABI16_IOCTL_ARGS)
        if (ret)
                goto done;
 
-       ret = nvkm_mm_init(&chan->heap, 0, PAGE_SIZE, 1);
+       ret = nvkm_mm_init(&chan->heap, 0, 0, PAGE_SIZE, 1);
 done:
        if (ret)
                nouveau_abi16_chan_fini(abi16, chan);
index a7bd22706b2a5e92b062dbd187fe0e4b4f4ef66e..04e5b2136f0cf69c2e5afe0d7ce02fa7e13f4142 100644 (file)
@@ -185,7 +185,7 @@ nvkm_gpuobj_ctor(struct nvkm_device *device, u32 size, int align, bool zero,
                gpuobj->size = nvkm_memory_size(gpuobj->memory);
        }
 
-       return nvkm_mm_init(&gpuobj->heap, 0, gpuobj->size, 1);
+       return nvkm_mm_init(&gpuobj->heap, 0, 0, gpuobj->size, 1);
 }
 
 void
index 5c7891234eea5b33971bd87600dbd45fb89dc303..f78a06a6b2f16d19b5fb4d5a9d7538b38e1a372b 100644 (file)
@@ -237,7 +237,7 @@ nvkm_mm_tail(struct nvkm_mm *mm, u8 heap, u8 type, u32 size_max, u32 size_min,
 }
 
 int
-nvkm_mm_init(struct nvkm_mm *mm, u32 offset, u32 length, u32 block)
+nvkm_mm_init(struct nvkm_mm *mm, u8 heap, u32 offset, u32 length, u32 block)
 {
        struct nvkm_mm_node *node, *prev;
        u32 next;
@@ -274,7 +274,8 @@ nvkm_mm_init(struct nvkm_mm *mm, u32 offset, u32 length, u32 block)
 
        list_add_tail(&node->nl_entry, &mm->nodes);
        list_add_tail(&node->fl_entry, &mm->free);
-       node->heap = ++mm->heap_nodes;
+       node->heap = heap;
+       mm->heap_nodes++;
        return 0;
 }
 
index 30483c5d27c3b3a2b9c2b511d4d5571e1261f2ab..d35a32e168d6e92754a3d84902e2e051703c3b85 100644 (file)
@@ -136,7 +136,7 @@ nvkm_device_tegra_probe_iommu(struct nvkm_device_tegra *tdev)
                if (ret)
                        goto free_domain;
 
-               ret = nvkm_mm_init(&tdev->iommu.mm, 0,
+               ret = nvkm_mm_init(&tdev->iommu.mm, 0, 0,
                                   (1ULL << tdev->func->iommu_bit) >>
                                   tdev->iommu.pgshift, 1);
                if (ret)
index c17d559dbfbe3ee52885cd898a541ab15ab9e784..5d908177766f16497f53772c04623cce9575a1c3 100644 (file)
@@ -73,13 +73,14 @@ nvkm_ram_ctor(const struct nvkm_ram_func *func, struct nvkm_fb *fb,
        ram->size = size;
 
        if (!nvkm_mm_initialised(&ram->vram)) {
-               ret = nvkm_mm_init(&ram->vram, 0, size >> NVKM_RAM_MM_SHIFT, 1);
+               ret = nvkm_mm_init(&ram->vram, NVKM_RAM_MM_NORMAL, 0,
+                                  size >> NVKM_RAM_MM_SHIFT, 1);
                if (ret)
                        return ret;
        }
 
        if (!nvkm_mm_initialised(&ram->tags)) {
-               ret = nvkm_mm_init(&ram->tags, 0, tags ? ++tags : 0, 1);
+               ret = nvkm_mm_init(&ram->tags, 0, 0, tags ? ++tags : 0, 1);
                if (ret)
                        return ret;
 
index 4a9bd4f1cb931afdfaa71375f165f5dda79b53d7..f3fcb499242fc244f0655b8bddd7450237cf829a 100644 (file)
@@ -617,7 +617,8 @@ gf100_ram_ctor(const struct nvkm_ram_func *func, struct nvkm_fb *fb,
         */
        if (lower != total) {
                /* The common memory amount is addressed normally. */
-               ret = nvkm_mm_init(&ram->vram, rsvd_head >> NVKM_RAM_MM_SHIFT,
+               ret = nvkm_mm_init(&ram->vram, NVKM_RAM_MM_NORMAL,
+                                  rsvd_head >> NVKM_RAM_MM_SHIFT,
                                   (lower - rsvd_head) >> NVKM_RAM_MM_SHIFT, 1);
                if (ret)
                        return ret;
@@ -625,13 +626,15 @@ gf100_ram_ctor(const struct nvkm_ram_func *func, struct nvkm_fb *fb,
                /* And the rest is much higher in the physical address
                 * space, and may not be usable for certain operations.
                 */
-               ret = nvkm_mm_init(&ram->vram, ubase >> NVKM_RAM_MM_SHIFT,
+               ret = nvkm_mm_init(&ram->vram, NVKM_RAM_MM_MIXED,
+                                  ubase >> NVKM_RAM_MM_SHIFT,
                                   (usize - rsvd_tail) >> NVKM_RAM_MM_SHIFT, 1);
                if (ret)
                        return ret;
        } else {
                /* GPUs without mixed-memory are a lot nicer... */
-               ret = nvkm_mm_init(&ram->vram, rsvd_head >> NVKM_RAM_MM_SHIFT,
+               ret = nvkm_mm_init(&ram->vram, NVKM_RAM_MM_NORMAL,
+                                  rsvd_head >> NVKM_RAM_MM_SHIFT,
                                   (total - rsvd_head - rsvd_tail) >>
                                   NVKM_RAM_MM_SHIFT, 1);
                if (ret)
index 017a91de74a0d37f28fba357797ce8ba3b538c7a..28ab1914718e0c0bb26380b7811c4c17f3397e7c 100644 (file)
@@ -81,7 +81,8 @@ mcp77_ram_new(struct nvkm_fb *fb, struct nvkm_ram **pram)
        ram->base.stolen = base;
        nvkm_mm_fini(&ram->base.vram);
 
-       return nvkm_mm_init(&ram->base.vram, rsvd_head >> NVKM_RAM_MM_SHIFT,
+       return nvkm_mm_init(&ram->base.vram, NVKM_RAM_MM_NORMAL,
+                           rsvd_head >> NVKM_RAM_MM_SHIFT,
                            (size - rsvd_head - rsvd_tail) >>
                            NVKM_RAM_MM_SHIFT, 1);
 }
index 6549b05883095f32314e321b6082299d0eb77e8c..949188569794f7a85063e1fd988e68ccf81ef052 100644 (file)
@@ -669,7 +669,8 @@ nv50_ram_ctor(const struct nvkm_ram_func *func,
        ram->ranks = (nvkm_rd32(device, 0x100200) & 0x4) ? 2 : 1;
        nvkm_mm_fini(&ram->vram);
 
-       return nvkm_mm_init(&ram->vram, rsvd_head >> NVKM_RAM_MM_SHIFT,
+       return nvkm_mm_init(&ram->vram, NVKM_RAM_MM_NORMAL,
+                           rsvd_head >> NVKM_RAM_MM_SHIFT,
                            (size - rsvd_head - rsvd_tail) >> NVKM_RAM_MM_SHIFT,
                            nv50_fb_vram_rblock(ram) >> NVKM_RAM_MM_SHIFT);
 }
index df75da764bd4288cc43b56941f99cd6217ada162..2e1141319e939335b74eee080c6b11ec82397fc1 100644 (file)
@@ -165,7 +165,7 @@ nv04_instmem_oneinit(struct nvkm_instmem *base)
        /* PRAMIN aperture maps over the end of VRAM, reserve it */
        imem->base.reserved = 512 * 1024;
 
-       ret = nvkm_mm_init(&imem->heap, 0, imem->base.reserved, 1);
+       ret = nvkm_mm_init(&imem->heap, 0, 0, imem->base.reserved, 1);
        if (ret)
                return ret;
 
index d8ab5fa86893fe72618e4de456d6ca3e73c85b76..7f52a525d2e1ad5598bceac21c4ac8c81f784b58 100644 (file)
@@ -177,7 +177,7 @@ nv40_instmem_oneinit(struct nvkm_instmem *base)
        imem->base.reserved += 512 * 1024;      /* object storage */
        imem->base.reserved = round_up(imem->base.reserved, 4096);
 
-       ret = nvkm_mm_init(&imem->heap, 0, imem->base.reserved, 1);
+       ret = nvkm_mm_init(&imem->heap, 0, 0, imem->base.reserved, 1);
        if (ret)
                return ret;
 
index 4a0fa0a9b80287b5f68b292764f985502a27277d..6b0cb7f3fa776be579ae8a87223a2de6a02be1ee 100644 (file)
@@ -183,8 +183,8 @@ gf100_ltc_oneinit_tag_ram(struct nvkm_ltc *ltc)
        tag_size += tag_align;
        tag_size  = (tag_size + 0xfff) >> 12; /* round up */
 
-       ret = nvkm_mm_tail(&ram->vram, 1, 1, tag_size, tag_size, 1,
-                          &ltc->tag_ram);
+       ret = nvkm_mm_tail(&ram->vram, NVKM_RAM_MM_NORMAL, 1, tag_size,
+                          tag_size, 1, &ltc->tag_ram);
        if (ret) {
                ltc->num_tags = 0;
        } else {
@@ -197,7 +197,7 @@ gf100_ltc_oneinit_tag_ram(struct nvkm_ltc *ltc)
        }
 
 mm_init:
-       return nvkm_mm_init(&ltc->tags, 0, ltc->num_tags, 1);
+       return nvkm_mm_init(&ltc->tags, 0, 0, ltc->num_tags, 1);
 }
 
 int
index 0bdfb2f40266d35eb35292916ad7dfd67482b15b..74ed4dd203bc6e3bfee235e8c83bab177244db1b 100644 (file)
@@ -45,7 +45,7 @@ gp100_ltc_oneinit(struct nvkm_ltc *ltc)
        ltc->ltc_nr = nvkm_rd32(device, 0x12006c);
        ltc->lts_nr = nvkm_rd32(device, 0x17e280) >> 28;
        /*XXX: tagram allocation - TBD */
-       return nvkm_mm_init(&ltc->tags, 0, 0, 1);
+       return nvkm_mm_init(&ltc->tags, 0, 0, 0, 1);
 }
 
 static void
index f2b1a3e75f176894f001bf1c01f31a2bb7f1ddbf..44c2403e88e6c2b6669b6acc1f89044bd4da76ce 100644 (file)
@@ -388,7 +388,7 @@ nvkm_vm_create(struct nvkm_mmu *mmu, u64 offset, u64 length, u64 mm_offset,
                return -ENOMEM;
        }
 
-       ret = nvkm_mm_init(&vm->mm, mm_offset >> 12, mm_length >> 12,
+       ret = nvkm_mm_init(&vm->mm, 0, mm_offset >> 12, mm_length >> 12,
                           block >> 12);
        if (ret) {
                vfree(vm->pgt);