]> www.infradead.org Git - users/dwmw2/linux.git/commitdiff
drm/nouveau/fb/gp102-ga100: switch to simpler vram size detection method
authorBen Skeggs <bskeggs@redhat.com>
Thu, 25 May 2023 00:30:59 +0000 (10:30 +1000)
committerKarol Herbst <kherbst@redhat.com>
Thu, 6 Jul 2023 15:22:33 +0000 (17:22 +0200)
Also exposes this for use by upcoming GSP-RM initialisation code.

v2: add SPDX header

Signed-off-by: Ben Skeggs <bskeggs@redhat.com>
Reviewed-by: Lyude Paul <lyude@redhat.com>
Signed-off-by: Karol Herbst <kherbst@redhat.com>
Link: https://patchwork.freedesktop.org/patch/msgid/20230525003106.3853741-3-skeggsb@gmail.com
drivers/gpu/drm/nouveau/include/nvkm/subdev/fb.h
drivers/gpu/drm/nouveau/nvkm/subdev/fb/Kbuild
drivers/gpu/drm/nouveau/nvkm/subdev/fb/base.c
drivers/gpu/drm/nouveau/nvkm/subdev/fb/ga100.c
drivers/gpu/drm/nouveau/nvkm/subdev/fb/gp102.c
drivers/gpu/drm/nouveau/nvkm/subdev/fb/gv100.c
drivers/gpu/drm/nouveau/nvkm/subdev/fb/priv.h
drivers/gpu/drm/nouveau/nvkm/subdev/fb/ram.h
drivers/gpu/drm/nouveau/nvkm/subdev/fb/ramgp102.c [new file with mode: 0644]
drivers/gpu/drm/nouveau/nvkm/subdev/fb/tu102.c

index 01a22a13b452047425a63914cad7f2f081c8d37b..1755b0df3cc1db62a8bb967bc88aebf52420b16c 100644 (file)
@@ -59,6 +59,7 @@ struct nvkm_fb {
        struct nvkm_memory *mmu_wr;
 };
 
+u64 nvkm_fb_vidmem_size(struct nvkm_device *);
 int nvkm_fb_mem_unlock(struct nvkm_fb *);
 
 void nvkm_fb_tile_init(struct nvkm_fb *, int region, u32 addr, u32 size,
index 6ba5120a2ebe1d8c6f7804f4cd17634c3deba887..11dbfc4a381a87de768d2f7777181e507122bba6 100644 (file)
@@ -55,6 +55,7 @@ nvkm-y += nvkm/subdev/fb/ramgk104.o
 nvkm-y += nvkm/subdev/fb/ramgm107.o
 nvkm-y += nvkm/subdev/fb/ramgm200.o
 nvkm-y += nvkm/subdev/fb/ramgp100.o
+nvkm-y += nvkm/subdev/fb/ramgp102.o
 nvkm-y += nvkm/subdev/fb/ramga102.o
 nvkm-y += nvkm/subdev/fb/sddr2.o
 nvkm-y += nvkm/subdev/fb/sddr3.o
index 0955340cc421898625fa06d33dfb3a34658d17a1..8a286a9349ac62485ef4c486cc5a8ded917686ea 100644 (file)
@@ -174,6 +174,18 @@ nvkm_fb_mem_unlock(struct nvkm_fb *fb)
        return 0;
 }
 
+u64
+nvkm_fb_vidmem_size(struct nvkm_device *device)
+{
+       struct nvkm_fb *fb = device->fb;
+
+       if (fb && fb->func->vidmem.size)
+               return fb->func->vidmem.size(fb);
+
+       WARN_ON(1);
+       return 0;
+}
+
 static int
 nvkm_fb_init(struct nvkm_subdev *subdev)
 {
index a7456e7864636978b0fad6da210ce1e4a201a1ce..12037fd4fdf27fd708c345700b7a297448fae4e9 100644 (file)
@@ -30,7 +30,8 @@ ga100_fb = {
        .init_page = gv100_fb_init_page,
        .init_unkn = gp100_fb_init_unkn,
        .sysmem.flush_page_init = gf100_fb_sysmem_flush_page_init,
-       .ram_new = gp100_ram_new,
+       .vidmem.size = gp102_fb_vidmem_size,
+       .ram_new = gp102_ram_new,
        .default_bigpage = 16,
 };
 
index 14d942e8b857f43566fb7359d52464a092f69480..534553c6480547cd4ffdc7578c59838741b1b588 100644 (file)
@@ -40,6 +40,20 @@ gp102_fb_vpr_scrub_required(struct nvkm_fb *fb)
        return (nvkm_rd32(device, 0x100cd0) & 0x00000010) != 0;
 }
 
+u64
+gp102_fb_vidmem_size(struct nvkm_fb *fb)
+{
+       const u32 data = nvkm_rd32(fb->subdev.device, 0x100ce0);
+       const u32 lmag = (data & 0x000003f0) >> 4;
+       const u32 lsca = (data & 0x0000000f);
+       const u64 size = (u64)lmag << (lsca + 20);
+
+       if (data & 0x40000000)
+               return size / 16 * 15;
+
+       return size;
+}
+
 int
 gp102_fb_oneinit(struct nvkm_fb *fb)
 {
@@ -59,9 +73,10 @@ gp102_fb = {
        .init_remapper = gp100_fb_init_remapper,
        .init_page = gm200_fb_init_page,
        .sysmem.flush_page_init = gf100_fb_sysmem_flush_page_init,
+       .vidmem.size = gp102_fb_vidmem_size,
        .vpr.scrub_required = gp102_fb_vpr_scrub_required,
        .vpr.scrub = gp102_fb_vpr_scrub,
-       .ram_new = gp100_ram_new,
+       .ram_new = gp102_ram_new,
 };
 
 int
index 4d8a286a7a348ce2e918720716a12143b152da66..f422564bee5b0afb1e81aaf7d085842324dab4f2 100644 (file)
@@ -36,9 +36,10 @@ gv100_fb = {
        .init_page = gv100_fb_init_page,
        .init_unkn = gp100_fb_init_unkn,
        .sysmem.flush_page_init = gf100_fb_sysmem_flush_page_init,
+       .vidmem.size = gp102_fb_vidmem_size,
        .vpr.scrub_required = gp102_fb_vpr_scrub_required,
        .vpr.scrub = gp102_fb_vpr_scrub,
-       .ram_new = gp100_ram_new,
+       .ram_new = gp102_ram_new,
        .default_bigpage = 16,
 };
 
index 726c30c8bf95d3fa27864d06fc26704b25242e49..77d6a8c108298c78f4c6082ca4c2a2c65fa247b4 100644 (file)
@@ -20,6 +20,10 @@ struct nvkm_fb_func {
                void (*flush_page_init)(struct nvkm_fb *);
        } sysmem;
 
+       struct nvkm_fb_func_vidmem {
+               u64 (*size)(struct nvkm_fb *);
+       } vidmem;
+
        struct {
                bool (*scrub_required)(struct nvkm_fb *);
                int (*scrub)(struct nvkm_fb *);
@@ -84,6 +88,7 @@ void gp100_fb_init_remapper(struct nvkm_fb *);
 void gp100_fb_init_unkn(struct nvkm_fb *);
 
 int gp102_fb_oneinit(struct nvkm_fb *);
+u64 gp102_fb_vidmem_size(struct nvkm_fb *);
 bool gp102_fb_vpr_scrub_required(struct nvkm_fb *);
 int gp102_fb_vpr_scrub(struct nvkm_fb *);
 
index ea7d66f3dd825dba1f4eb6162e9a66e163d1677a..33d4ab8d92e6ff1480deedcefa5ccd391415b078 100644 (file)
@@ -70,5 +70,6 @@ int gk104_ram_new(struct nvkm_fb *, struct nvkm_ram **);
 int gm107_ram_new(struct nvkm_fb *, struct nvkm_ram **);
 int gm200_ram_new(struct nvkm_fb *, struct nvkm_ram **);
 int gp100_ram_new(struct nvkm_fb *, struct nvkm_ram **);
+int gp102_ram_new(struct nvkm_fb *, struct nvkm_ram **);
 int ga102_ram_new(struct nvkm_fb *, struct nvkm_ram **);
 #endif
diff --git a/drivers/gpu/drm/nouveau/nvkm/subdev/fb/ramgp102.c b/drivers/gpu/drm/nouveau/nvkm/subdev/fb/ramgp102.c
new file mode 100644 (file)
index 0000000..8550f5e
--- /dev/null
@@ -0,0 +1,30 @@
+// SPDX-License-Identifier: MIT
+#include "ram.h"
+
+#include <subdev/bios.h>
+
+static const struct nvkm_ram_func
+gp102_ram = {
+};
+
+int
+gp102_ram_new(struct nvkm_fb *fb, struct nvkm_ram **pram)
+{
+       enum nvkm_ram_type type = nvkm_fb_bios_memtype(fb->subdev.device->bios);
+       const u32 rsvd_head = ( 256 * 1024); /* vga memory */
+       const u32 rsvd_tail = (1024 * 1024); /* vbios etc */
+       u64 size = fb->func->vidmem.size(fb);
+       int ret;
+
+       ret = nvkm_ram_new_(&gp102_ram, fb, type, size, pram);
+       if (ret)
+               return ret;
+
+       nvkm_mm_fini(&(*pram)->vram);
+
+       return nvkm_mm_init(&(*pram)->vram, NVKM_RAM_MM_NORMAL,
+                           rsvd_head >> NVKM_RAM_MM_SHIFT,
+                           (size - rsvd_head - rsvd_tail) >> NVKM_RAM_MM_SHIFT,
+                           1);
+
+}
index b8803c124c3b2307df5214ca3463d9c0d683fbb8..bcc23d4c8115d1d6b44c0dc1776ce5bdaeb3bf6f 100644 (file)
@@ -36,9 +36,10 @@ tu102_fb = {
        .init_page = gv100_fb_init_page,
        .init_unkn = gp100_fb_init_unkn,
        .sysmem.flush_page_init = gf100_fb_sysmem_flush_page_init,
+       .vidmem.size = gp102_fb_vidmem_size,
        .vpr.scrub_required = tu102_fb_vpr_scrub_required,
        .vpr.scrub = gp102_fb_vpr_scrub,
-       .ram_new = gp100_ram_new,
+       .ram_new = gp102_ram_new,
        .default_bigpage = 16,
 };