Skip to content

Commit 2c0c15a

Browse files
Ben Skeggskarolherbst
authored andcommitted
drm/nouveau/fb/gp102-ga100: switch to simpler vram size detection method
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
1 parent ba1efd8 commit 2c0c15a

10 files changed

Lines changed: 72 additions & 4 deletions

File tree

drivers/gpu/drm/nouveau/include/nvkm/subdev/fb.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -59,6 +59,7 @@ struct nvkm_fb {
5959
struct nvkm_memory *mmu_wr;
6060
};
6161

62+
u64 nvkm_fb_vidmem_size(struct nvkm_device *);
6263
int nvkm_fb_mem_unlock(struct nvkm_fb *);
6364

6465
void nvkm_fb_tile_init(struct nvkm_fb *, int region, u32 addr, u32 size,

drivers/gpu/drm/nouveau/nvkm/subdev/fb/Kbuild

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -55,6 +55,7 @@ nvkm-y += nvkm/subdev/fb/ramgk104.o
5555
nvkm-y += nvkm/subdev/fb/ramgm107.o
5656
nvkm-y += nvkm/subdev/fb/ramgm200.o
5757
nvkm-y += nvkm/subdev/fb/ramgp100.o
58+
nvkm-y += nvkm/subdev/fb/ramgp102.o
5859
nvkm-y += nvkm/subdev/fb/ramga102.o
5960
nvkm-y += nvkm/subdev/fb/sddr2.o
6061
nvkm-y += nvkm/subdev/fb/sddr3.o

drivers/gpu/drm/nouveau/nvkm/subdev/fb/base.c

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -174,6 +174,18 @@ nvkm_fb_mem_unlock(struct nvkm_fb *fb)
174174
return 0;
175175
}
176176

177+
u64
178+
nvkm_fb_vidmem_size(struct nvkm_device *device)
179+
{
180+
struct nvkm_fb *fb = device->fb;
181+
182+
if (fb && fb->func->vidmem.size)
183+
return fb->func->vidmem.size(fb);
184+
185+
WARN_ON(1);
186+
return 0;
187+
}
188+
177189
static int
178190
nvkm_fb_init(struct nvkm_subdev *subdev)
179191
{

drivers/gpu/drm/nouveau/nvkm/subdev/fb/ga100.c

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,8 @@ ga100_fb = {
3030
.init_page = gv100_fb_init_page,
3131
.init_unkn = gp100_fb_init_unkn,
3232
.sysmem.flush_page_init = gf100_fb_sysmem_flush_page_init,
33-
.ram_new = gp100_ram_new,
33+
.vidmem.size = gp102_fb_vidmem_size,
34+
.ram_new = gp102_ram_new,
3435
.default_bigpage = 16,
3536
};
3637

drivers/gpu/drm/nouveau/nvkm/subdev/fb/gp102.c

Lines changed: 16 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,20 @@ gp102_fb_vpr_scrub_required(struct nvkm_fb *fb)
4040
return (nvkm_rd32(device, 0x100cd0) & 0x00000010) != 0;
4141
}
4242

43+
u64
44+
gp102_fb_vidmem_size(struct nvkm_fb *fb)
45+
{
46+
const u32 data = nvkm_rd32(fb->subdev.device, 0x100ce0);
47+
const u32 lmag = (data & 0x000003f0) >> 4;
48+
const u32 lsca = (data & 0x0000000f);
49+
const u64 size = (u64)lmag << (lsca + 20);
50+
51+
if (data & 0x40000000)
52+
return size / 16 * 15;
53+
54+
return size;
55+
}
56+
4357
int
4458
gp102_fb_oneinit(struct nvkm_fb *fb)
4559
{
@@ -59,9 +73,10 @@ gp102_fb = {
5973
.init_remapper = gp100_fb_init_remapper,
6074
.init_page = gm200_fb_init_page,
6175
.sysmem.flush_page_init = gf100_fb_sysmem_flush_page_init,
76+
.vidmem.size = gp102_fb_vidmem_size,
6277
.vpr.scrub_required = gp102_fb_vpr_scrub_required,
6378
.vpr.scrub = gp102_fb_vpr_scrub,
64-
.ram_new = gp100_ram_new,
79+
.ram_new = gp102_ram_new,
6580
};
6681

6782
int

drivers/gpu/drm/nouveau/nvkm/subdev/fb/gv100.c

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -36,9 +36,10 @@ gv100_fb = {
3636
.init_page = gv100_fb_init_page,
3737
.init_unkn = gp100_fb_init_unkn,
3838
.sysmem.flush_page_init = gf100_fb_sysmem_flush_page_init,
39+
.vidmem.size = gp102_fb_vidmem_size,
3940
.vpr.scrub_required = gp102_fb_vpr_scrub_required,
4041
.vpr.scrub = gp102_fb_vpr_scrub,
41-
.ram_new = gp100_ram_new,
42+
.ram_new = gp102_ram_new,
4243
.default_bigpage = 16,
4344
};
4445

drivers/gpu/drm/nouveau/nvkm/subdev/fb/priv.h

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,10 @@ struct nvkm_fb_func {
2020
void (*flush_page_init)(struct nvkm_fb *);
2121
} sysmem;
2222

23+
struct nvkm_fb_func_vidmem {
24+
u64 (*size)(struct nvkm_fb *);
25+
} vidmem;
26+
2327
struct {
2428
bool (*scrub_required)(struct nvkm_fb *);
2529
int (*scrub)(struct nvkm_fb *);
@@ -84,6 +88,7 @@ void gp100_fb_init_remapper(struct nvkm_fb *);
8488
void gp100_fb_init_unkn(struct nvkm_fb *);
8589

8690
int gp102_fb_oneinit(struct nvkm_fb *);
91+
u64 gp102_fb_vidmem_size(struct nvkm_fb *);
8792
bool gp102_fb_vpr_scrub_required(struct nvkm_fb *);
8893
int gp102_fb_vpr_scrub(struct nvkm_fb *);
8994

drivers/gpu/drm/nouveau/nvkm/subdev/fb/ram.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -70,5 +70,6 @@ int gk104_ram_new(struct nvkm_fb *, struct nvkm_ram **);
7070
int gm107_ram_new(struct nvkm_fb *, struct nvkm_ram **);
7171
int gm200_ram_new(struct nvkm_fb *, struct nvkm_ram **);
7272
int gp100_ram_new(struct nvkm_fb *, struct nvkm_ram **);
73+
int gp102_ram_new(struct nvkm_fb *, struct nvkm_ram **);
7374
int ga102_ram_new(struct nvkm_fb *, struct nvkm_ram **);
7475
#endif
Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
// SPDX-License-Identifier: MIT
2+
#include "ram.h"
3+
4+
#include <subdev/bios.h>
5+
6+
static const struct nvkm_ram_func
7+
gp102_ram = {
8+
};
9+
10+
int
11+
gp102_ram_new(struct nvkm_fb *fb, struct nvkm_ram **pram)
12+
{
13+
enum nvkm_ram_type type = nvkm_fb_bios_memtype(fb->subdev.device->bios);
14+
const u32 rsvd_head = ( 256 * 1024); /* vga memory */
15+
const u32 rsvd_tail = (1024 * 1024); /* vbios etc */
16+
u64 size = fb->func->vidmem.size(fb);
17+
int ret;
18+
19+
ret = nvkm_ram_new_(&gp102_ram, fb, type, size, pram);
20+
if (ret)
21+
return ret;
22+
23+
nvkm_mm_fini(&(*pram)->vram);
24+
25+
return nvkm_mm_init(&(*pram)->vram, NVKM_RAM_MM_NORMAL,
26+
rsvd_head >> NVKM_RAM_MM_SHIFT,
27+
(size - rsvd_head - rsvd_tail) >> NVKM_RAM_MM_SHIFT,
28+
1);
29+
30+
}

drivers/gpu/drm/nouveau/nvkm/subdev/fb/tu102.c

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -36,9 +36,10 @@ tu102_fb = {
3636
.init_page = gv100_fb_init_page,
3737
.init_unkn = gp100_fb_init_unkn,
3838
.sysmem.flush_page_init = gf100_fb_sysmem_flush_page_init,
39+
.vidmem.size = gp102_fb_vidmem_size,
3940
.vpr.scrub_required = tu102_fb_vpr_scrub_required,
4041
.vpr.scrub = gp102_fb_vpr_scrub,
41-
.ram_new = gp100_ram_new,
42+
.ram_new = gp102_ram_new,
4243
.default_bigpage = 16,
4344
};
4445

0 commit comments

Comments
 (0)