diff options
author | Ben Skeggs <bskeggs@redhat.com> | 2023-09-18 22:21:41 +0200 |
---|---|---|
committer | Dave Airlie <airlied@redhat.com> | 2023-10-31 06:08:16 +0100 |
commit | 5bf0257136a223d0e887441799527b320fc8313f (patch) | |
tree | badbedf4722e14d1fbf6feb4df7f71652a5ef3f3 /drivers/gpu/drm/nouveau/nvkm/subdev/fb | |
parent | drm/nouveau/gsp/r535: add interrupt handling (diff) | |
download | linux-5bf0257136a223d0e887441799527b320fc8313f.tar.xz linux-5bf0257136a223d0e887441799527b320fc8313f.zip |
drm/nouveau/mmu/r535: initial support
- Valid VRAM regions are read from GSP-RM, and used to construct our MM
- BAR1/BAR2 VMMs modified to be shared with RM
- Client VMMs have RM VASPACE objects created for them
- Adds FBSR to backup system objects in VRAM across suspend
Signed-off-by: Ben Skeggs <bskeggs@redhat.com>
Signed-off-by: Dave Airlie <airlied@redhat.com>
Link: https://patchwork.freedesktop.org/patch/msgid/20230918202149.4343-37-skeggsb@gmail.com
Diffstat (limited to 'drivers/gpu/drm/nouveau/nvkm/subdev/fb')
-rw-r--r-- | drivers/gpu/drm/nouveau/nvkm/subdev/fb/r535.c | 37 |
1 files changed, 37 insertions, 0 deletions
diff --git a/drivers/gpu/drm/nouveau/nvkm/subdev/fb/r535.c b/drivers/gpu/drm/nouveau/nvkm/subdev/fb/r535.c index 0c301882f2fc..d32515010167 100644 --- a/drivers/gpu/drm/nouveau/nvkm/subdev/fb/r535.c +++ b/drivers/gpu/drm/nouveau/nvkm/subdev/fb/r535.c @@ -20,6 +20,42 @@ * OTHER DEALINGS IN THE SOFTWARE. */ #include "priv.h" +#include "ram.h" + +#include <subdev/gsp.h> + +static const struct nvkm_ram_func +r535_fb_ram = { +}; + +static int +r535_fb_ram_new(struct nvkm_fb *fb, struct nvkm_ram **pram) +{ + struct nvkm_gsp *gsp = fb->subdev.device->gsp; + struct nvkm_ram *ram; + int ret; + + if (!(ram = *pram = kzalloc(sizeof(*ram), GFP_KERNEL))) + return -ENOMEM; + + ram->func = &r535_fb_ram; + ram->fb = fb; + ram->type = NVKM_RAM_TYPE_UNKNOWN; /*TODO: pull this from GSP. */ + ram->size = gsp->fb.size; + ram->stolen = false; + mutex_init(&ram->mutex); + + for (int i = 0; i < gsp->fb.region_nr; i++) { + ret = nvkm_mm_init(&ram->vram, NVKM_RAM_MM_NORMAL, + gsp->fb.region[i].addr >> NVKM_RAM_MM_SHIFT, + gsp->fb.region[i].size >> NVKM_RAM_MM_SHIFT, + 1); + if (ret) + return ret; + } + + return 0; +} static void * r535_fb_dtor(struct nvkm_fb *fb) @@ -41,6 +77,7 @@ r535_fb_new(const struct nvkm_fb_func *hw, rm->dtor = r535_fb_dtor; rm->sysmem.flush_page_init = hw->sysmem.flush_page_init; rm->vidmem.size = hw->vidmem.size; + rm->ram_new = r535_fb_ram_new; ret = nvkm_fb_new_(rm, device, type, inst, pfb); if (ret) |