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

Commit e2d4370b authored by Linus Torvalds's avatar Linus Torvalds
Browse files

Merge branch 'drm-fixes' of git://people.freedesktop.org/~airlied/linux

Intel, radeon, exynos fixes.

Intel: fixes a few Ivybridge hangs, along with fixing RC6 on SNB (still
not on, but at least allows for distros to patch it on easily).

radeon: oops reading some files in debugfs that weren't meant to appear,
a fix that touches a lot of files, so looks worse than it is, it fixes
an oops if a GPU reset fails and userspace keeps submitting more data,
along with a minor BIOS fix for newer boards.

exynos: a group of fixes for exynos, they've sent me a few more but
these were all I got through, and its no hw vanilla kernel users see a
lot off yet.

* 'drm-fixes' of git://people.freedesktop.org/~airlied/linux:
  drm/radeon/kms/atom: dpms bios scratch reg updates
  drm/radeon/kms: properly set accel working flag and bailout when false
  drm/radeon: Only create additional ring debugfs files on Cayman or newer.
  drm/exynos: added postclose to release resource.
  drm/exynos: removed exynos_drm_fbdev_recreate function.
  drm/exynos: fixed page flip issue.
  drm/exynos: added possible_clones setup function.
  drm/exynos: removed pageflip_event_list init code when closed.
  drm/exynos: changed priority of mixer layers.
  drm/exynos: Fix typo in exynos_mixer.c
  drm/i915: do not enable RC6p on Sandy Bridge
  drm/i915: gen7: Disable the RHWO optimization as it can cause GPU hangs.
  drm/i915: gen7: work around a system hang on IVB
  drm/i915: gen7: Implement an L3 caching workaround.
  drm/i915: gen7: implement rczunit workaround
parents 71c01b9d 3ac0eb6d
Loading
Loading
Loading
Loading
+3 −0
Original line number Original line Diff line number Diff line
@@ -193,6 +193,9 @@ int exynos_drm_subdrv_register(struct exynos_drm_subdrv *subdrv)
			return err;
			return err;
		}
		}


		/* setup possible_clones. */
		exynos_drm_encoder_setup(drm_dev);

		/*
		/*
		 * if any specific driver such as fimd or hdmi driver called
		 * if any specific driver such as fimd or hdmi driver called
		 * exynos_drm_subdrv_register() later than drm_load(),
		 * exynos_drm_subdrv_register() later than drm_load(),
+3 −3
Original line number Original line Diff line number Diff line
@@ -307,9 +307,6 @@ static int exynos_drm_crtc_page_flip(struct drm_crtc *crtc,
		 */
		 */
		event->pipe = exynos_crtc->pipe;
		event->pipe = exynos_crtc->pipe;


		list_add_tail(&event->base.link,
				&dev_priv->pageflip_event_list);

		ret = drm_vblank_get(dev, exynos_crtc->pipe);
		ret = drm_vblank_get(dev, exynos_crtc->pipe);
		if (ret) {
		if (ret) {
			DRM_DEBUG("failed to acquire vblank counter\n");
			DRM_DEBUG("failed to acquire vblank counter\n");
@@ -318,6 +315,9 @@ static int exynos_drm_crtc_page_flip(struct drm_crtc *crtc,
			goto out;
			goto out;
		}
		}


		list_add_tail(&event->base.link,
				&dev_priv->pageflip_event_list);

		crtc->fb = fb;
		crtc->fb = fb;
		ret = exynos_drm_crtc_update(crtc);
		ret = exynos_drm_crtc_update(crtc);
		if (ret) {
		if (ret) {
+18 −8
Original line number Original line Diff line number Diff line
@@ -33,6 +33,7 @@


#include "exynos_drm_drv.h"
#include "exynos_drm_drv.h"
#include "exynos_drm_crtc.h"
#include "exynos_drm_crtc.h"
#include "exynos_drm_encoder.h"
#include "exynos_drm_fbdev.h"
#include "exynos_drm_fbdev.h"
#include "exynos_drm_fb.h"
#include "exynos_drm_fb.h"
#include "exynos_drm_gem.h"
#include "exynos_drm_gem.h"
@@ -99,6 +100,9 @@ static int exynos_drm_load(struct drm_device *dev, unsigned long flags)
	if (ret)
	if (ret)
		goto err_vblank;
		goto err_vblank;


	/* setup possible_clones. */
	exynos_drm_encoder_setup(dev);

	/*
	/*
	 * create and configure fb helper and also exynos specific
	 * create and configure fb helper and also exynos specific
	 * fbdev object.
	 * fbdev object.
@@ -141,16 +145,21 @@ static int exynos_drm_unload(struct drm_device *dev)
}
}


static void exynos_drm_preclose(struct drm_device *dev,
static void exynos_drm_preclose(struct drm_device *dev,
					struct drm_file *file_priv)
					struct drm_file *file)
{
{
	struct exynos_drm_private *dev_priv = dev->dev_private;
	DRM_DEBUG_DRIVER("%s\n", __FILE__);


	/*
}
	 * drm framework frees all events at release time,

	 * so private event list should be cleared.
static void exynos_drm_postclose(struct drm_device *dev, struct drm_file *file)
	 */
{
	if (!list_empty(&dev_priv->pageflip_event_list))
	DRM_DEBUG_DRIVER("%s\n", __FILE__);
		INIT_LIST_HEAD(&dev_priv->pageflip_event_list);

	if (!file->driver_priv)
		return;

	kfree(file->driver_priv);
	file->driver_priv = NULL;
}
}


static void exynos_drm_lastclose(struct drm_device *dev)
static void exynos_drm_lastclose(struct drm_device *dev)
@@ -195,6 +204,7 @@ static struct drm_driver exynos_drm_driver = {
	.unload			= exynos_drm_unload,
	.unload			= exynos_drm_unload,
	.preclose		= exynos_drm_preclose,
	.preclose		= exynos_drm_preclose,
	.lastclose		= exynos_drm_lastclose,
	.lastclose		= exynos_drm_lastclose,
	.postclose		= exynos_drm_postclose,
	.get_vblank_counter	= drm_vblank_count,
	.get_vblank_counter	= drm_vblank_count,
	.enable_vblank		= exynos_drm_crtc_enable_vblank,
	.enable_vblank		= exynos_drm_crtc_enable_vblank,
	.disable_vblank		= exynos_drm_crtc_disable_vblank,
	.disable_vblank		= exynos_drm_crtc_disable_vblank,
+34 −0
Original line number Original line Diff line number Diff line
@@ -195,6 +195,40 @@ static struct drm_encoder_funcs exynos_encoder_funcs = {
	.destroy = exynos_drm_encoder_destroy,
	.destroy = exynos_drm_encoder_destroy,
};
};


static unsigned int exynos_drm_encoder_clones(struct drm_encoder *encoder)
{
	struct drm_encoder *clone;
	struct drm_device *dev = encoder->dev;
	struct exynos_drm_encoder *exynos_encoder = to_exynos_encoder(encoder);
	struct exynos_drm_display_ops *display_ops =
				exynos_encoder->manager->display_ops;
	unsigned int clone_mask = 0;
	int cnt = 0;

	list_for_each_entry(clone, &dev->mode_config.encoder_list, head) {
		switch (display_ops->type) {
		case EXYNOS_DISPLAY_TYPE_LCD:
		case EXYNOS_DISPLAY_TYPE_HDMI:
			clone_mask |= (1 << (cnt++));
			break;
		default:
			continue;
		}
	}

	return clone_mask;
}

void exynos_drm_encoder_setup(struct drm_device *dev)
{
	struct drm_encoder *encoder;

	DRM_DEBUG_KMS("%s\n", __FILE__);

	list_for_each_entry(encoder, &dev->mode_config.encoder_list, head)
		encoder->possible_clones = exynos_drm_encoder_clones(encoder);
}

struct drm_encoder *
struct drm_encoder *
exynos_drm_encoder_create(struct drm_device *dev,
exynos_drm_encoder_create(struct drm_device *dev,
			   struct exynos_drm_manager *manager,
			   struct exynos_drm_manager *manager,
+1 −0
Original line number Original line Diff line number Diff line
@@ -30,6 +30,7 @@


struct exynos_drm_manager;
struct exynos_drm_manager;


void exynos_drm_encoder_setup(struct drm_device *dev);
struct drm_encoder *exynos_drm_encoder_create(struct drm_device *dev,
struct drm_encoder *exynos_drm_encoder_create(struct drm_device *dev,
					       struct exynos_drm_manager *mgr,
					       struct exynos_drm_manager *mgr,
					       unsigned int possible_crtcs);
					       unsigned int possible_crtcs);
Loading