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

Commit 603f2e6d authored by Dave Airlie's avatar Dave Airlie
Browse files

Merge branch 'drm-nouveau-next' of...

Merge branch 'drm-nouveau-next' of git://anongit.freedesktop.org/git/nouveau/linux-2.6 into drm-core-next

* 'drm-nouveau-next' of git://anongit.freedesktop.org/git/nouveau/linux-2.6:
  drm/nouveau/gr: disable fifo access and idle before suspend ctx unload
  drm/nouveau: pass flag to engine fini() method on suspend
  drm/nouveau: replace nv04_graph_fifo_access() use with direct reg bashing
  drm/nv40/gr: rewrite/split context takedown functions
  drm/nouveau: detect disabled device in irq handler and return IRQ_NONE
  drm/nouveau: ignore connector type when deciding digital/analog on DVI-I
  drm/nouveau: Add a quirk for Gigabyte NX86T
  drm/nouveau: do not leak in nv20_graph_create
  drm/nv50/dp: fix hack to work for macbooks booted via EFI
parents e55b9422 9962cc6e
Loading
Loading
Loading
Loading
+6 −0
Original line number Diff line number Diff line
@@ -5966,6 +5966,12 @@ apply_dcb_connector_quirks(struct nvbios *bios, int idx)
		if (cte->type == DCB_CONNECTOR_HDMI_1)
			cte->type = DCB_CONNECTOR_DVI_I;
	}

	/* Gigabyte GV-NX86T512H */
	if (nv_match_device(dev, 0x0402, 0x1458, 0x3455)) {
		if (cte->type == DCB_CONNECTOR_HDMI_1)
			cte->type = DCB_CONNECTOR_DVI_I;
	}
}

static const u8 hpd_gpio[16] = {
+19 −15
Original line number Diff line number Diff line
@@ -40,7 +40,7 @@
static void nouveau_connector_hotplug(void *, int);

static struct nouveau_encoder *
find_encoder_by_type(struct drm_connector *connector, int type)
find_encoder(struct drm_connector *connector, int type)
{
	struct drm_device *dev = connector->dev;
	struct nouveau_encoder *nv_encoder;
@@ -170,8 +170,8 @@ nouveau_connector_of_detect(struct drm_connector *connector)
	struct device_node *cn, *dn = pci_device_to_OF_node(dev->pdev);

	if (!dn ||
	    !((nv_encoder = find_encoder_by_type(connector, OUTPUT_TMDS)) ||
	      (nv_encoder = find_encoder_by_type(connector, OUTPUT_ANALOG))))
	    !((nv_encoder = find_encoder(connector, OUTPUT_TMDS)) ||
	      (nv_encoder = find_encoder(connector, OUTPUT_ANALOG))))
		return NULL;

	for_each_child_of_node(dn, cn) {
@@ -233,6 +233,7 @@ nouveau_connector_detect(struct drm_connector *connector, bool force)
	struct drm_device *dev = connector->dev;
	struct nouveau_connector *nv_connector = nouveau_connector(connector);
	struct nouveau_encoder *nv_encoder = NULL;
	struct nouveau_encoder *nv_partner;
	struct nouveau_i2c_chan *i2c;
	int type;

@@ -266,19 +267,22 @@ nouveau_connector_detect(struct drm_connector *connector, bool force)
		 * same i2c channel so the value returned from ddc_detect
		 * isn't necessarily correct.
		 */
		if (nv_connector->dcb->type == DCB_CONNECTOR_DVI_I) {
		nv_partner = NULL;
		if (nv_encoder->dcb->type == OUTPUT_TMDS)
			nv_partner = find_encoder(connector, OUTPUT_ANALOG);
		if (nv_encoder->dcb->type == OUTPUT_ANALOG)
			nv_partner = find_encoder(connector, OUTPUT_TMDS);

		if (nv_partner && ((nv_encoder->dcb->type == OUTPUT_ANALOG &&
				    nv_partner->dcb->type == OUTPUT_TMDS) ||
				   (nv_encoder->dcb->type == OUTPUT_TMDS &&
				    nv_partner->dcb->type == OUTPUT_ANALOG))) {
			if (nv_connector->edid->input & DRM_EDID_INPUT_DIGITAL)
				type = OUTPUT_TMDS;
			else
				type = OUTPUT_ANALOG;

			nv_encoder = find_encoder_by_type(connector, type);
			if (!nv_encoder) {
				NV_ERROR(dev, "Detected %d encoder on %s, "
					      "but no object!\n", type,
					 drm_get_connector_name(connector));
				return connector_status_disconnected;
			}
			nv_encoder = find_encoder(connector, type);
		}

		nouveau_connector_set_encoder(connector, nv_encoder);
@@ -292,9 +296,9 @@ nouveau_connector_detect(struct drm_connector *connector, bool force)
	}

detect_analog:
	nv_encoder = find_encoder_by_type(connector, OUTPUT_ANALOG);
	nv_encoder = find_encoder(connector, OUTPUT_ANALOG);
	if (!nv_encoder && !nouveau_tv_disable)
		nv_encoder = find_encoder_by_type(connector, OUTPUT_TV);
		nv_encoder = find_encoder(connector, OUTPUT_TV);
	if (nv_encoder && force) {
		struct drm_encoder *encoder = to_drm_encoder(nv_encoder);
		struct drm_encoder_helper_funcs *helper =
@@ -327,7 +331,7 @@ nouveau_connector_detect_lvds(struct drm_connector *connector, bool force)
		nv_connector->edid = NULL;
	}

	nv_encoder = find_encoder_by_type(connector, OUTPUT_LVDS);
	nv_encoder = find_encoder(connector, OUTPUT_LVDS);
	if (!nv_encoder)
		return connector_status_disconnected;

@@ -405,7 +409,7 @@ nouveau_connector_force(struct drm_connector *connector)
	} else
		type = OUTPUT_ANY;

	nv_encoder = find_encoder_by_type(connector, type);
	nv_encoder = find_encoder(connector, type);
	if (!nv_encoder) {
		NV_ERROR(connector->dev, "can't find encoder to force %s on!\n",
			 drm_get_connector_name(connector));
+7 −4
Original line number Diff line number Diff line
@@ -214,9 +214,12 @@ nouveau_pci_suspend(struct pci_dev *pdev, pm_message_t pm_state)
	pfifo->unload_context(dev);

	for (e = NVOBJ_ENGINE_NR - 1; e >= 0; e--) {
		if (dev_priv->eng[e]) {
			ret = dev_priv->eng[e]->fini(dev, e);
			if (ret)
		if (!dev_priv->eng[e])
			continue;

		ret = dev_priv->eng[e]->fini(dev, e, true);
		if (ret) {
			NV_ERROR(dev, "... engine %d failed: %d\n", i, ret);
			goto out_abort;
		}
	}
+1 −2
Original line number Diff line number Diff line
@@ -312,7 +312,7 @@ struct nouveau_channel {
struct nouveau_exec_engine {
	void (*destroy)(struct drm_device *, int engine);
	int  (*init)(struct drm_device *, int engine);
	int  (*fini)(struct drm_device *, int engine);
	int  (*fini)(struct drm_device *, int engine, bool suspend);
	int  (*context_new)(struct nouveau_channel *, int engine);
	void (*context_del)(struct nouveau_channel *, int engine);
	int  (*object_new)(struct nouveau_channel *, int engine,
@@ -1142,7 +1142,6 @@ extern int nvc0_fifo_unload_context(struct drm_device *);

/* nv04_graph.c */
extern int  nv04_graph_create(struct drm_device *);
extern void nv04_graph_fifo_access(struct drm_device *, bool);
extern int  nv04_graph_object_new(struct nouveau_channel *, int, u32, u16);
extern int  nv04_graph_mthd_page_flip(struct nouveau_channel *chan,
				      u32 class, u32 mthd, u32 data);
+1 −1
Original line number Diff line number Diff line
@@ -79,7 +79,7 @@ nouveau_irq_handler(DRM_IRQ_ARGS)
	int i;

	stat = nv_rd32(dev, NV03_PMC_INTR_0);
	if (!stat)
	if (stat == 0 || stat == ~0)
		return IRQ_NONE;

	spin_lock_irqsave(&dev_priv->context_switch_lock, flags);
Loading