Skip to content

Commit 6630506

Browse files
committed
Merge tag 'drm-misc-fixes-2023-02-23' of git://anongit.freedesktop.org/drm/drm-misc into drm-fixes
A fix for nouveau preventing the system shutdown and one for a build warning, and NULL pointer dereference fix for cirrus. Signed-off-by: Dave Airlie <[email protected]> From: Maxime Ripard <[email protected]> Link: https://patchwork.freedesktop.org/patch/msgid/20230223083839.5gtmu6i42bnj7pfh@houat
2 parents fe15c26 + 1b9b4f9 commit 6630506

File tree

10 files changed

+40
-53
lines changed

10 files changed

+40
-53
lines changed

drivers/gpu/drm/nouveau/dispnv50/wndw.h

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -35,8 +35,9 @@ struct nv50_wndw {
3535

3636
int nv50_wndw_new_(const struct nv50_wndw_func *, struct drm_device *,
3737
enum drm_plane_type, const char *name, int index,
38-
const u32 *format, enum nv50_disp_interlock_type,
39-
u32 interlock_data, u32 heads, struct nv50_wndw **);
38+
const u32 *format, u32 heads,
39+
enum nv50_disp_interlock_type, u32 interlock_data,
40+
struct nv50_wndw **);
4041
void nv50_wndw_flush_set(struct nv50_wndw *, u32 *interlock,
4142
struct nv50_wndw_atom *);
4243
void nv50_wndw_flush_clr(struct nv50_wndw *, u32 *interlock, bool flush,

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

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22
#ifndef __NVKM_FB_H__
33
#define __NVKM_FB_H__
44
#include <core/subdev.h>
5+
#include <core/falcon.h>
56
#include <core/mm.h>
67

78
/* memory type/access flags, do not match hardware values */
@@ -33,7 +34,7 @@ struct nvkm_fb {
3334
const struct nvkm_fb_func *func;
3435
struct nvkm_subdev subdev;
3536

36-
struct nvkm_blob vpr_scrubber;
37+
struct nvkm_falcon_fw vpr_scrubber;
3738

3839
struct {
3940
struct page *flush_page;

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

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -143,14 +143,18 @@ nvkm_fb_mem_unlock(struct nvkm_fb *fb)
143143
if (!fb->func->vpr.scrub_required)
144144
return 0;
145145

146+
ret = nvkm_subdev_oneinit(subdev);
147+
if (ret)
148+
return ret;
149+
146150
if (!fb->func->vpr.scrub_required(fb)) {
147151
nvkm_debug(subdev, "VPR not locked\n");
148152
return 0;
149153
}
150154

151155
nvkm_debug(subdev, "VPR locked, running scrubber binary\n");
152156

153-
if (!fb->vpr_scrubber.size) {
157+
if (!fb->vpr_scrubber.fw.img) {
154158
nvkm_warn(subdev, "VPR locked, but no scrubber binary!\n");
155159
return 0;
156160
}
@@ -229,7 +233,7 @@ nvkm_fb_dtor(struct nvkm_subdev *subdev)
229233

230234
nvkm_ram_del(&fb->ram);
231235

232-
nvkm_blob_dtor(&fb->vpr_scrubber);
236+
nvkm_falcon_fw_dtor(&fb->vpr_scrubber);
233237

234238
if (fb->sysmem.flush_page) {
235239
dma_unmap_page(subdev->device->dev, fb->sysmem.flush_page_addr,

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -37,5 +37,5 @@ ga100_fb = {
3737
int
3838
ga100_fb_new(struct nvkm_device *device, enum nvkm_subdev_type type, int inst, struct nvkm_fb **pfb)
3939
{
40-
return gp102_fb_new_(&ga100_fb, device, type, inst, pfb);
40+
return gf100_fb_new_(&ga100_fb, device, type, inst, pfb);
4141
}

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

Lines changed: 8 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -25,39 +25,34 @@
2525
#include <engine/nvdec.h>
2626

2727
static int
28-
ga102_fb_vpr_scrub(struct nvkm_fb *fb)
28+
ga102_fb_oneinit(struct nvkm_fb *fb)
2929
{
30-
struct nvkm_falcon_fw fw = {};
31-
int ret;
30+
struct nvkm_subdev *subdev = &fb->subdev;
3231

33-
ret = nvkm_falcon_fw_ctor_hs_v2(&ga102_flcn_fw, "mem-unlock", &fb->subdev, "nvdec/scrubber",
34-
0, &fb->subdev.device->nvdec[0]->falcon, &fw);
35-
if (ret)
36-
return ret;
32+
nvkm_falcon_fw_ctor_hs_v2(&ga102_flcn_fw, "mem-unlock", subdev, "nvdec/scrubber",
33+
0, &subdev->device->nvdec[0]->falcon, &fb->vpr_scrubber);
3734

38-
ret = nvkm_falcon_fw_boot(&fw, &fb->subdev, true, NULL, NULL, 0, 0);
39-
nvkm_falcon_fw_dtor(&fw);
40-
return ret;
35+
return gf100_fb_oneinit(fb);
4136
}
4237

4338
static const struct nvkm_fb_func
4439
ga102_fb = {
4540
.dtor = gf100_fb_dtor,
46-
.oneinit = gf100_fb_oneinit,
41+
.oneinit = ga102_fb_oneinit,
4742
.init = gm200_fb_init,
4843
.init_page = gv100_fb_init_page,
4944
.init_unkn = gp100_fb_init_unkn,
5045
.sysmem.flush_page_init = gf100_fb_sysmem_flush_page_init,
5146
.ram_new = ga102_ram_new,
5247
.default_bigpage = 16,
5348
.vpr.scrub_required = tu102_fb_vpr_scrub_required,
54-
.vpr.scrub = ga102_fb_vpr_scrub,
49+
.vpr.scrub = gp102_fb_vpr_scrub,
5550
};
5651

5752
int
5853
ga102_fb_new(struct nvkm_device *device, enum nvkm_subdev_type type, int inst, struct nvkm_fb **pfb)
5954
{
60-
return gp102_fb_new_(&ga102_fb, device, type, inst, pfb);
55+
return gf100_fb_new_(&ga102_fb, device, type, inst, pfb);
6156
}
6257

6358
MODULE_FIRMWARE("nvidia/ga102/nvdec/scrubber.bin");

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

Lines changed: 14 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -29,18 +29,7 @@
2929
int
3030
gp102_fb_vpr_scrub(struct nvkm_fb *fb)
3131
{
32-
struct nvkm_subdev *subdev = &fb->subdev;
33-
struct nvkm_falcon_fw fw = {};
34-
int ret;
35-
36-
ret = nvkm_falcon_fw_ctor_hs(&gm200_flcn_fw, "mem-unlock", subdev, NULL,
37-
"nvdec/scrubber", 0, &subdev->device->nvdec[0]->falcon, &fw);
38-
if (ret)
39-
return ret;
40-
41-
ret = nvkm_falcon_fw_boot(&fw, subdev, true, NULL, NULL, 0, 0x00000000);
42-
nvkm_falcon_fw_dtor(&fw);
43-
return ret;
32+
return nvkm_falcon_fw_boot(&fb->vpr_scrubber, &fb->subdev, true, NULL, NULL, 0, 0x00000000);
4433
}
4534

4635
bool
@@ -51,10 +40,21 @@ gp102_fb_vpr_scrub_required(struct nvkm_fb *fb)
5140
return (nvkm_rd32(device, 0x100cd0) & 0x00000010) != 0;
5241
}
5342

43+
int
44+
gp102_fb_oneinit(struct nvkm_fb *fb)
45+
{
46+
struct nvkm_subdev *subdev = &fb->subdev;
47+
48+
nvkm_falcon_fw_ctor_hs(&gm200_flcn_fw, "mem-unlock", subdev, NULL, "nvdec/scrubber",
49+
0, &subdev->device->nvdec[0]->falcon, &fb->vpr_scrubber);
50+
51+
return gf100_fb_oneinit(fb);
52+
}
53+
5454
static const struct nvkm_fb_func
5555
gp102_fb = {
5656
.dtor = gf100_fb_dtor,
57-
.oneinit = gf100_fb_oneinit,
57+
.oneinit = gp102_fb_oneinit,
5858
.init = gm200_fb_init,
5959
.init_remapper = gp100_fb_init_remapper,
6060
.init_page = gm200_fb_init_page,
@@ -64,23 +64,10 @@ gp102_fb = {
6464
.ram_new = gp100_ram_new,
6565
};
6666

67-
int
68-
gp102_fb_new_(const struct nvkm_fb_func *func, struct nvkm_device *device,
69-
enum nvkm_subdev_type type, int inst, struct nvkm_fb **pfb)
70-
{
71-
int ret = gf100_fb_new_(func, device, type, inst, pfb);
72-
if (ret)
73-
return ret;
74-
75-
nvkm_firmware_load_blob(&(*pfb)->subdev, "nvdec/scrubber", "", 0,
76-
&(*pfb)->vpr_scrubber);
77-
return 0;
78-
}
79-
8067
int
8168
gp102_fb_new(struct nvkm_device *device, enum nvkm_subdev_type type, int inst, struct nvkm_fb **pfb)
8269
{
83-
return gp102_fb_new_(&gp102_fb, device, type, inst, pfb);
70+
return gf100_fb_new_(&gp102_fb, device, type, inst, pfb);
8471
}
8572

8673
MODULE_FIRMWARE("nvidia/gp102/nvdec/scrubber.bin");

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

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,7 @@ gv100_fb_init_page(struct nvkm_fb *fb)
3131
static const struct nvkm_fb_func
3232
gv100_fb = {
3333
.dtor = gf100_fb_dtor,
34-
.oneinit = gf100_fb_oneinit,
34+
.oneinit = gp102_fb_oneinit,
3535
.init = gm200_fb_init,
3636
.init_page = gv100_fb_init_page,
3737
.init_unkn = gp100_fb_init_unkn,
@@ -45,7 +45,7 @@ gv100_fb = {
4545
int
4646
gv100_fb_new(struct nvkm_device *device, enum nvkm_subdev_type type, int inst, struct nvkm_fb **pfb)
4747
{
48-
return gp102_fb_new_(&gv100_fb, device, type, inst, pfb);
48+
return gf100_fb_new_(&gv100_fb, device, type, inst, pfb);
4949
}
5050

5151
MODULE_FIRMWARE("nvidia/gv100/nvdec/scrubber.bin");

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

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -83,8 +83,7 @@ int gm200_fb_init_page(struct nvkm_fb *);
8383
void gp100_fb_init_remapper(struct nvkm_fb *);
8484
void gp100_fb_init_unkn(struct nvkm_fb *);
8585

86-
int gp102_fb_new_(const struct nvkm_fb_func *, struct nvkm_device *, enum nvkm_subdev_type, int,
87-
struct nvkm_fb **);
86+
int gp102_fb_oneinit(struct nvkm_fb *);
8887
bool gp102_fb_vpr_scrub_required(struct nvkm_fb *);
8988
int gp102_fb_vpr_scrub(struct nvkm_fb *);
9089

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

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,7 @@ tu102_fb_vpr_scrub_required(struct nvkm_fb *fb)
3131
static const struct nvkm_fb_func
3232
tu102_fb = {
3333
.dtor = gf100_fb_dtor,
34-
.oneinit = gf100_fb_oneinit,
34+
.oneinit = gp102_fb_oneinit,
3535
.init = gm200_fb_init,
3636
.init_page = gv100_fb_init_page,
3737
.init_unkn = gp100_fb_init_unkn,
@@ -45,7 +45,7 @@ tu102_fb = {
4545
int
4646
tu102_fb_new(struct nvkm_device *device, enum nvkm_subdev_type type, int inst, struct nvkm_fb **pfb)
4747
{
48-
return gp102_fb_new_(&tu102_fb, device, type, inst, pfb);
48+
return gf100_fb_new_(&tu102_fb, device, type, inst, pfb);
4949
}
5050

5151
MODULE_FIRMWARE("nvidia/tu102/nvdec/scrubber.bin");

drivers/gpu/drm/tiny/cirrus.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -455,7 +455,7 @@ static void cirrus_pipe_update(struct drm_simple_display_pipe *pipe,
455455
if (state->fb && cirrus->cpp != cirrus_cpp(state->fb))
456456
cirrus_mode_set(cirrus, &crtc->mode, state->fb);
457457

458-
if (drm_atomic_helper_damage_merged(old_state, state, &rect))
458+
if (state->fb && drm_atomic_helper_damage_merged(old_state, state, &rect))
459459
cirrus_fb_blit_rect(state->fb, &shadow_plane_state->data[0], &rect);
460460
}
461461

0 commit comments

Comments
 (0)