Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 9920779c authored by Dave Airlie's avatar Dave Airlie
Browse files

Merge branch 'linux-4.7' of git://github.com/skeggsb/linux into drm-fixes

Fixes for two issues reported by KASAN, a display engine hang due to
incorrect BIOS table parsing, and incorrect LTC interrupt handling on
Maxwell which could lead to a never-ending interrupt storm.

* 'linux-4.7' of git://github.com/skeggsb/linux:
  drm/nouveau/disp/sor/gm107: training pattern registers are like gm200
  drm/nouveau/disp/sor/gf119: both links use the same training register
  drm/nouveau/core: swap the order of imem/fb
  drm/nouveau/fbcon: fix out-of-bounds memory accesses
  drm/nouveau/gr/gf100-: update sm error decoding from gk20a nvgpu headers
  drm/nouveau/ltc/gm107-: fix typo in the address of NV_PLTCG_LTC0_LTS0_INTR
  drm/nouveau/bios/disp: fix handling of "match any protocol" entries
parents af8c34ce 4691409b
Loading
Loading
Loading
Loading
+1 −1
Original line number Original line Diff line number Diff line
@@ -16,9 +16,9 @@ enum nvkm_devidx {
	NVKM_SUBDEV_MC,
	NVKM_SUBDEV_MC,
	NVKM_SUBDEV_BUS,
	NVKM_SUBDEV_BUS,
	NVKM_SUBDEV_TIMER,
	NVKM_SUBDEV_TIMER,
	NVKM_SUBDEV_INSTMEM,
	NVKM_SUBDEV_FB,
	NVKM_SUBDEV_FB,
	NVKM_SUBDEV_LTC,
	NVKM_SUBDEV_LTC,
	NVKM_SUBDEV_INSTMEM,
	NVKM_SUBDEV_MMU,
	NVKM_SUBDEV_MMU,
	NVKM_SUBDEV_BAR,
	NVKM_SUBDEV_BAR,
	NVKM_SUBDEV_PMU,
	NVKM_SUBDEV_PMU,
+3 −2
Original line number Original line Diff line number Diff line
@@ -25,7 +25,8 @@ u16 nvbios_outp_match(struct nvkm_bios *, u16 type, u16 mask,
		      u8 *ver, u8 *hdr, u8 *cnt, u8 *len, struct nvbios_outp *);
		      u8 *ver, u8 *hdr, u8 *cnt, u8 *len, struct nvbios_outp *);


struct nvbios_ocfg {
struct nvbios_ocfg {
	u16 match;
	u8  proto;
	u8  flags;
	u16 clkcmp[2];
	u16 clkcmp[2];
};
};


@@ -33,7 +34,7 @@ u16 nvbios_ocfg_entry(struct nvkm_bios *, u16 outp, u8 idx,
		      u8 *ver, u8 *hdr, u8 *cnt, u8 *len);
		      u8 *ver, u8 *hdr, u8 *cnt, u8 *len);
u16 nvbios_ocfg_parse(struct nvkm_bios *, u16 outp, u8 idx,
u16 nvbios_ocfg_parse(struct nvkm_bios *, u16 outp, u8 idx,
		      u8 *ver, u8 *hdr, u8 *cnt, u8 *len, struct nvbios_ocfg *);
		      u8 *ver, u8 *hdr, u8 *cnt, u8 *len, struct nvbios_ocfg *);
u16 nvbios_ocfg_match(struct nvkm_bios *, u16 outp, u16 type,
u16 nvbios_ocfg_match(struct nvkm_bios *, u16 outp, u8 proto, u8 flags,
		      u8 *ver, u8 *hdr, u8 *cnt, u8 *len, struct nvbios_ocfg *);
		      u8 *ver, u8 *hdr, u8 *cnt, u8 *len, struct nvbios_ocfg *);
u16 nvbios_oclk_match(struct nvkm_bios *, u16 cmp, u32 khz);
u16 nvbios_oclk_match(struct nvkm_bios *, u16 cmp, u32 khz);
#endif
#endif
+1 −0
Original line number Original line Diff line number Diff line
@@ -552,6 +552,7 @@ nouveau_fbcon_init(struct drm_device *dev)
	if (ret)
	if (ret)
		goto fini;
		goto fini;


	fbcon->helper.fbdev->pixmap.buf_align = 4;
	return 0;
	return 0;


fini:
fini:
+2 −5
Original line number Original line Diff line number Diff line
@@ -82,7 +82,6 @@ nv04_fbcon_imageblit(struct fb_info *info, const struct fb_image *image)
	uint32_t fg;
	uint32_t fg;
	uint32_t bg;
	uint32_t bg;
	uint32_t dsize;
	uint32_t dsize;
	uint32_t width;
	uint32_t *data = (uint32_t *)image->data;
	uint32_t *data = (uint32_t *)image->data;
	int ret;
	int ret;


@@ -93,9 +92,6 @@ nv04_fbcon_imageblit(struct fb_info *info, const struct fb_image *image)
	if (ret)
	if (ret)
		return ret;
		return ret;


	width = ALIGN(image->width, 8);
	dsize = ALIGN(width * image->height, 32) >> 5;

	if (info->fix.visual == FB_VISUAL_TRUECOLOR ||
	if (info->fix.visual == FB_VISUAL_TRUECOLOR ||
	    info->fix.visual == FB_VISUAL_DIRECTCOLOR) {
	    info->fix.visual == FB_VISUAL_DIRECTCOLOR) {
		fg = ((uint32_t *) info->pseudo_palette)[image->fg_color];
		fg = ((uint32_t *) info->pseudo_palette)[image->fg_color];
@@ -111,10 +107,11 @@ nv04_fbcon_imageblit(struct fb_info *info, const struct fb_image *image)
			 ((image->dx + image->width) & 0xffff));
			 ((image->dx + image->width) & 0xffff));
	OUT_RING(chan, bg);
	OUT_RING(chan, bg);
	OUT_RING(chan, fg);
	OUT_RING(chan, fg);
	OUT_RING(chan, (image->height << 16) | width);
	OUT_RING(chan, (image->height << 16) | image->width);
	OUT_RING(chan, (image->height << 16) | image->width);
	OUT_RING(chan, (image->height << 16) | image->width);
	OUT_RING(chan, (image->dy << 16) | (image->dx & 0xffff));
	OUT_RING(chan, (image->dy << 16) | (image->dx & 0xffff));


	dsize = ALIGN(image->width * image->height, 32) >> 5;
	while (dsize) {
	while (dsize) {
		int iter_len = dsize > 128 ? 128 : dsize;
		int iter_len = dsize > 128 ? 128 : dsize;


+2 −4
Original line number Original line Diff line number Diff line
@@ -95,7 +95,7 @@ nv50_fbcon_imageblit(struct fb_info *info, const struct fb_image *image)
	struct nouveau_fbdev *nfbdev = info->par;
	struct nouveau_fbdev *nfbdev = info->par;
	struct nouveau_drm *drm = nouveau_drm(nfbdev->dev);
	struct nouveau_drm *drm = nouveau_drm(nfbdev->dev);
	struct nouveau_channel *chan = drm->channel;
	struct nouveau_channel *chan = drm->channel;
	uint32_t width, dwords, *data = (uint32_t *)image->data;
	uint32_t dwords, *data = (uint32_t *)image->data;
	uint32_t mask = ~(~0 >> (32 - info->var.bits_per_pixel));
	uint32_t mask = ~(~0 >> (32 - info->var.bits_per_pixel));
	uint32_t *palette = info->pseudo_palette;
	uint32_t *palette = info->pseudo_palette;
	int ret;
	int ret;
@@ -107,9 +107,6 @@ nv50_fbcon_imageblit(struct fb_info *info, const struct fb_image *image)
	if (ret)
	if (ret)
		return ret;
		return ret;


	width = ALIGN(image->width, 32);
	dwords = (width * image->height) >> 5;

	BEGIN_NV04(chan, NvSub2D, 0x0814, 2);
	BEGIN_NV04(chan, NvSub2D, 0x0814, 2);
	if (info->fix.visual == FB_VISUAL_TRUECOLOR ||
	if (info->fix.visual == FB_VISUAL_TRUECOLOR ||
	    info->fix.visual == FB_VISUAL_DIRECTCOLOR) {
	    info->fix.visual == FB_VISUAL_DIRECTCOLOR) {
@@ -128,6 +125,7 @@ nv50_fbcon_imageblit(struct fb_info *info, const struct fb_image *image)
	OUT_RING(chan, 0);
	OUT_RING(chan, 0);
	OUT_RING(chan, image->dy);
	OUT_RING(chan, image->dy);


	dwords = ALIGN(image->width * image->height, 32) >> 5;
	while (dwords) {
	while (dwords) {
		int push = dwords > 2047 ? 2047 : dwords;
		int push = dwords > 2047 ? 2047 : dwords;


Loading