Commit 66305069 authored by Dave Airlie's avatar Dave Airlie
Browse files

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: default avatarDave Airlie <airlied@redhat.com>

From: Maxime Ripard <maxime@cerno.tech>
Link: https://patchwork.freedesktop.org/patch/msgid/20230223083839.5gtmu6i42bnj7pfh@houat
parents fe15c26e 1b9b4f92
Loading
Loading
Loading
Loading
+3 −2
Original line number Diff line number Diff line
@@ -35,8 +35,9 @@ struct nv50_wndw {

int nv50_wndw_new_(const struct nv50_wndw_func *, struct drm_device *,
		   enum drm_plane_type, const char *name, int index,
		   const u32 *format, enum nv50_disp_interlock_type,
		   u32 interlock_data, u32 heads, struct nv50_wndw **);
		   const u32 *format, u32 heads,
		   enum nv50_disp_interlock_type, u32 interlock_data,
		   struct nv50_wndw **);
void nv50_wndw_flush_set(struct nv50_wndw *, u32 *interlock,
			 struct nv50_wndw_atom *);
void nv50_wndw_flush_clr(struct nv50_wndw *, u32 *interlock, bool flush,
+2 −1
Original line number Diff line number Diff line
@@ -2,6 +2,7 @@
#ifndef __NVKM_FB_H__
#define __NVKM_FB_H__
#include <core/subdev.h>
#include <core/falcon.h>
#include <core/mm.h>

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

	struct nvkm_blob vpr_scrubber;
	struct nvkm_falcon_fw vpr_scrubber;

	struct {
		struct page *flush_page;
+6 −2
Original line number Diff line number Diff line
@@ -143,6 +143,10 @@ nvkm_fb_mem_unlock(struct nvkm_fb *fb)
	if (!fb->func->vpr.scrub_required)
		return 0;

	ret = nvkm_subdev_oneinit(subdev);
	if (ret)
		return ret;

	if (!fb->func->vpr.scrub_required(fb)) {
		nvkm_debug(subdev, "VPR not locked\n");
		return 0;
@@ -150,7 +154,7 @@ nvkm_fb_mem_unlock(struct nvkm_fb *fb)

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

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

	nvkm_ram_del(&fb->ram);

	nvkm_blob_dtor(&fb->vpr_scrubber);
	nvkm_falcon_fw_dtor(&fb->vpr_scrubber);

	if (fb->sysmem.flush_page) {
		dma_unmap_page(subdev->device->dev, fb->sysmem.flush_page_addr,
+1 −1
Original line number Diff line number Diff line
@@ -37,5 +37,5 @@ ga100_fb = {
int
ga100_fb_new(struct nvkm_device *device, enum nvkm_subdev_type type, int inst, struct nvkm_fb **pfb)
{
	return gp102_fb_new_(&ga100_fb, device, type, inst, pfb);
	return gf100_fb_new_(&ga100_fb, device, type, inst, pfb);
}
+8 −13
Original line number Diff line number Diff line
@@ -25,25 +25,20 @@
#include <engine/nvdec.h>

static int
ga102_fb_vpr_scrub(struct nvkm_fb *fb)
ga102_fb_oneinit(struct nvkm_fb *fb)
{
	struct nvkm_falcon_fw fw = {};
	int ret;
	struct nvkm_subdev *subdev = &fb->subdev;

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

	ret = nvkm_falcon_fw_boot(&fw, &fb->subdev, true, NULL, NULL, 0, 0);
	nvkm_falcon_fw_dtor(&fw);
	return ret;
	return gf100_fb_oneinit(fb);
}

static const struct nvkm_fb_func
ga102_fb = {
	.dtor = gf100_fb_dtor,
	.oneinit = gf100_fb_oneinit,
	.oneinit = ga102_fb_oneinit,
	.init = gm200_fb_init,
	.init_page = gv100_fb_init_page,
	.init_unkn = gp100_fb_init_unkn,
@@ -51,13 +46,13 @@ ga102_fb = {
	.ram_new = ga102_ram_new,
	.default_bigpage = 16,
	.vpr.scrub_required = tu102_fb_vpr_scrub_required,
	.vpr.scrub = ga102_fb_vpr_scrub,
	.vpr.scrub = gp102_fb_vpr_scrub,
};

int
ga102_fb_new(struct nvkm_device *device, enum nvkm_subdev_type type, int inst, struct nvkm_fb **pfb)
{
	return gp102_fb_new_(&ga102_fb, device, type, inst, pfb);
	return gf100_fb_new_(&ga102_fb, device, type, inst, pfb);
}

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