drm/nouveau/fb: move comptags mm into nvkm_fb
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)
We're moving towards having a central place to handle comptag allocation,
and as some GPUs don't have a ram submodule (ie. Tegra), we need to move
the mm somewhere else.

It probably never belonged in ram anyways.

Signed-off-by: Ben Skeggs <bskeggs@redhat.com>
drivers/gpu/drm/nouveau/include/nvkm/subdev/fb.h
drivers/gpu/drm/nouveau/nvkm/subdev/fb/base.c
drivers/gpu/drm/nouveau/nvkm/subdev/fb/nv20.c
drivers/gpu/drm/nouveau/nvkm/subdev/fb/nv25.c
drivers/gpu/drm/nouveau/nvkm/subdev/fb/nv30.c
drivers/gpu/drm/nouveau/nvkm/subdev/fb/nv35.c
drivers/gpu/drm/nouveau/nvkm/subdev/fb/nv36.c
drivers/gpu/drm/nouveau/nvkm/subdev/fb/nv40.c
drivers/gpu/drm/nouveau/nvkm/subdev/fb/ram.c
drivers/gpu/drm/nouveau/nvkm/subdev/fb/ramnv50.c

index 29b21a4f189c12fd218ae2fb56075c434216dc63..b838d9385859798b749c8e508c238780dfbe7608 100644 (file)
@@ -44,6 +44,7 @@ struct nvkm_fb {
        struct nvkm_subdev subdev;
 
        struct nvkm_ram *ram;
+       struct nvkm_mm tags;
 
        struct {
                struct nvkm_fb_tile region[16];
@@ -128,7 +129,6 @@ struct nvkm_ram {
 #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;
 
        int ranks;
index fa0fad10b62cd31c34dd5605217e315d6043aeaa..dea04406816d10cd7926e562fe2b156266302c01 100644 (file)
@@ -159,6 +159,7 @@ nvkm_fb_dtor(struct nvkm_subdev *subdev)
        for (i = 0; i < fb->tile.regions; i++)
                fb->func->tile.fini(fb, i, &fb->tile.region[i]);
 
+       nvkm_mm_fini(&fb->tags);
        nvkm_ram_del(&fb->ram);
 
        if (fb->func->dtor)
index 126865dfe77731c145f8a5b4067d81c1aadaa270..ec5a438b79dea8a9243456e36cc3646535c2f5cb 100644 (file)
@@ -45,7 +45,7 @@ nv20_fb_tile_comp(struct nvkm_fb *fb, int i, u32 size, u32 flags,
 {
        u32 tiles = DIV_ROUND_UP(size, 0x40);
        u32 tags  = round_up(tiles / fb->ram->parts, 0x40);
-       if (!nvkm_mm_head(&fb->ram->tags, 0, 1, tags, tags, 1, &tile->tag)) {
+       if (!nvkm_mm_head(&fb->tags, 0, 1, tags, tags, 1, &tile->tag)) {
                if (!(flags & 2)) tile->zcomp = 0x00000000; /* Z16 */
                else              tile->zcomp = 0x04000000; /* Z24S8 */
                tile->zcomp |= tile->tag->offset;
@@ -63,7 +63,7 @@ nv20_fb_tile_fini(struct nvkm_fb *fb, int i, struct nvkm_fb_tile *tile)
        tile->limit = 0;
        tile->pitch = 0;
        tile->zcomp = 0;
-       nvkm_mm_free(&fb->ram->tags, &tile->tag);
+       nvkm_mm_free(&fb->tags, &tile->tag);
 }
 
 void
index c56746d2a502c74e481917579216ebfee0fc291a..bf342a239b4868eab81a9d0a432d3b08f665a6d9 100644 (file)
@@ -32,7 +32,7 @@ nv25_fb_tile_comp(struct nvkm_fb *fb, int i, u32 size, u32 flags,
 {
        u32 tiles = DIV_ROUND_UP(size, 0x40);
        u32 tags  = round_up(tiles / fb->ram->parts, 0x40);
-       if (!nvkm_mm_head(&fb->ram->tags, 0, 1, tags, tags, 1, &tile->tag)) {
+       if (!nvkm_mm_head(&fb->tags, 0, 1, tags, tags, 1, &tile->tag)) {
                if (!(flags & 2)) tile->zcomp = 0x00100000; /* Z16 */
                else              tile->zcomp = 0x00200000; /* Z24S8 */
                tile->zcomp |= tile->tag->offset;
index 2a7c4831b82172d17bd126c5cb6ea63c5d37deb8..2280fbae508ad6632ab9d56d90847ac7b049b9f1 100644 (file)
@@ -51,7 +51,7 @@ nv30_fb_tile_comp(struct nvkm_fb *fb, int i, u32 size, u32 flags,
 {
        u32 tiles = DIV_ROUND_UP(size, 0x40);
        u32 tags  = round_up(tiles / fb->ram->parts, 0x40);
-       if (!nvkm_mm_head(&fb->ram->tags, 0, 1, tags, tags, 1, &tile->tag)) {
+       if (!nvkm_mm_head(&fb->tags, 0, 1, tags, tags, 1, &tile->tag)) {
                if (flags & 2) tile->zcomp |= 0x01000000; /* Z16 */
                else           tile->zcomp |= 0x02000000; /* Z24S8 */
                tile->zcomp |= ((tile->tag->offset           ) >> 6);
index 1604b3789ad16fe3c8307747c65c5b5e37f97d25..244c3ec3a4eddac1da447158ddd69b45c54720ba 100644 (file)
@@ -32,7 +32,7 @@ nv35_fb_tile_comp(struct nvkm_fb *fb, int i, u32 size, u32 flags,
 {
        u32 tiles = DIV_ROUND_UP(size, 0x40);
        u32 tags  = round_up(tiles / fb->ram->parts, 0x40);
-       if (!nvkm_mm_head(&fb->ram->tags, 0, 1, tags, tags, 1, &tile->tag)) {
+       if (!nvkm_mm_head(&fb->tags, 0, 1, tags, tags, 1, &tile->tag)) {
                if (flags & 2) tile->zcomp |= 0x04000000; /* Z16 */
                else           tile->zcomp |= 0x08000000; /* Z24S8 */
                tile->zcomp |= ((tile->tag->offset           ) >> 6);
index 80cc0a6e3416d5d2748d3f0d43880f582c7b2c33..a0a9b1fd0a00029eeba2157d3b4b6a971d484e53 100644 (file)
@@ -32,7 +32,7 @@ nv36_fb_tile_comp(struct nvkm_fb *fb, int i, u32 size, u32 flags,
 {
        u32 tiles = DIV_ROUND_UP(size, 0x40);
        u32 tags  = round_up(tiles / fb->ram->parts, 0x40);
-       if (!nvkm_mm_head(&fb->ram->tags, 0, 1, tags, tags, 1, &tile->tag)) {
+       if (!nvkm_mm_head(&fb->tags, 0, 1, tags, tags, 1, &tile->tag)) {
                if (flags & 2) tile->zcomp |= 0x10000000; /* Z16 */
                else           tile->zcomp |= 0x20000000; /* Z24S8 */
                tile->zcomp |= ((tile->tag->offset           ) >> 6);
index deec46a310f8f00b516805889ca96f15f350b701..bdb97bb03b624c35e2bd9496b3af0f5011bfe325 100644 (file)
@@ -33,7 +33,7 @@ nv40_fb_tile_comp(struct nvkm_fb *fb, int i, u32 size, u32 flags,
        u32 tiles = DIV_ROUND_UP(size, 0x80);
        u32 tags  = round_up(tiles / fb->ram->parts, 0x100);
        if ( (flags & 2) &&
-           !nvkm_mm_head(&fb->ram->tags, 0, 1, tags, tags, 1, &tile->tag)) {
+           !nvkm_mm_head(&fb->tags, 0, 1, tags, tags, 1, &tile->tag)) {
                tile->zcomp  = 0x28000000; /* Z24S8_SPLIT_GRAD */
                tile->zcomp |= ((tile->tag->offset           ) >> 8);
                tile->zcomp |= ((tile->tag->offset + tags - 1) >> 8) << 13;
index 5d908177766f16497f53772c04623cce9575a1c3..2cfd4336b5c56f11a4a991b12661c466a0819b21 100644 (file)
@@ -38,7 +38,6 @@ nvkm_ram_del(struct nvkm_ram **pram)
        if (ram && !WARN_ON(!ram->func)) {
                if (ram->func->dtor)
                        *pram = ram->func->dtor(ram);
-               nvkm_mm_fini(&ram->tags);
                nvkm_mm_fini(&ram->vram);
                kfree(*pram);
                *pram = NULL;
@@ -79,8 +78,8 @@ nvkm_ram_ctor(const struct nvkm_ram_func *func, struct nvkm_fb *fb,
                        return ret;
        }
 
-       if (!nvkm_mm_initialised(&ram->tags)) {
-               ret = nvkm_mm_init(&ram->tags, 0, 0, tags ? ++tags : 0, 1);
+       if (!nvkm_mm_initialised(&fb->tags)) {
+               ret = nvkm_mm_init(&fb->tags, 0, 0, tags ? ++tags : 0, 1);
                if (ret)
                        return ret;
 
index 949188569794f7a85063e1fd988e68ccf81ef052..0fa02fbc561d25bd400bc3425e119914d5425aeb 100644 (file)
@@ -502,7 +502,7 @@ __nv50_ram_put(struct nvkm_ram *ram, struct nvkm_mem *mem)
                next = node->next;
                nvkm_mm_free(&ram->vram, &node);
        }
-       nvkm_mm_free(&ram->tags, &mem->tag);
+       nvkm_mm_free(&ram->fb->tags, &mem->tag);
 }
 
 void
@@ -526,7 +526,7 @@ nv50_ram_get(struct nvkm_ram *ram, u64 size, u32 align, u32 ncmin,
             u32 memtype, struct nvkm_mem **pmem)
 {
        struct nvkm_mm *heap = &ram->vram;
-       struct nvkm_mm *tags = &ram->tags;
+       struct nvkm_mm *tags = &ram->fb->tags;
        struct nvkm_mm_node **node, *r;
        struct nvkm_mem *mem;
        int comp = (memtype & 0x300) >> 8;