1ddbaf79a8b047dcccf766d0518626cdc0f43d58eBen Skeggs/*
2ddbaf79a8b047dcccf766d0518626cdc0f43d58eBen Skeggs * Copyright 2010 Red Hat Inc.
3ddbaf79a8b047dcccf766d0518626cdc0f43d58eBen Skeggs *
4ddbaf79a8b047dcccf766d0518626cdc0f43d58eBen Skeggs * Permission is hereby granted, free of charge, to any person obtaining a
5ddbaf79a8b047dcccf766d0518626cdc0f43d58eBen Skeggs * copy of this software and associated documentation files (the "Software"),
6ddbaf79a8b047dcccf766d0518626cdc0f43d58eBen Skeggs * to deal in the Software without restriction, including without limitation
7ddbaf79a8b047dcccf766d0518626cdc0f43d58eBen Skeggs * the rights to use, copy, modify, merge, publish, distribute, sublicense,
8ddbaf79a8b047dcccf766d0518626cdc0f43d58eBen Skeggs * and/or sell copies of the Software, and to permit persons to whom the
9ddbaf79a8b047dcccf766d0518626cdc0f43d58eBen Skeggs * Software is furnished to do so, subject to the following conditions:
10ddbaf79a8b047dcccf766d0518626cdc0f43d58eBen Skeggs *
11ddbaf79a8b047dcccf766d0518626cdc0f43d58eBen Skeggs * The above copyright notice and this permission notice shall be included in
12ddbaf79a8b047dcccf766d0518626cdc0f43d58eBen Skeggs * all copies or substantial portions of the Software.
13ddbaf79a8b047dcccf766d0518626cdc0f43d58eBen Skeggs *
14ddbaf79a8b047dcccf766d0518626cdc0f43d58eBen Skeggs * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
15ddbaf79a8b047dcccf766d0518626cdc0f43d58eBen Skeggs * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
16ddbaf79a8b047dcccf766d0518626cdc0f43d58eBen Skeggs * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
17ddbaf79a8b047dcccf766d0518626cdc0f43d58eBen Skeggs * THE COPYRIGHT HOLDER(S) OR AUTHOR(S) BE LIABLE FOR ANY CLAIM, DAMAGES OR
18ddbaf79a8b047dcccf766d0518626cdc0f43d58eBen Skeggs * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
19ddbaf79a8b047dcccf766d0518626cdc0f43d58eBen Skeggs * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
20ddbaf79a8b047dcccf766d0518626cdc0f43d58eBen Skeggs * OTHER DEALINGS IN THE SOFTWARE.
21ddbaf79a8b047dcccf766d0518626cdc0f43d58eBen Skeggs *
22ddbaf79a8b047dcccf766d0518626cdc0f43d58eBen Skeggs * Authors: Ben Skeggs
23ddbaf79a8b047dcccf766d0518626cdc0f43d58eBen Skeggs */
24ddbaf79a8b047dcccf766d0518626cdc0f43d58eBen Skeggs
25ddbaf79a8b047dcccf766d0518626cdc0f43d58eBen Skeggs#include "drmP.h"
26ddbaf79a8b047dcccf766d0518626cdc0f43d58eBen Skeggs#include "nouveau_drv.h"
27ddbaf79a8b047dcccf766d0518626cdc0f43d58eBen Skeggs#include "nouveau_dma.h"
28ddbaf79a8b047dcccf766d0518626cdc0f43d58eBen Skeggs#include "nouveau_ramht.h"
29ddbaf79a8b047dcccf766d0518626cdc0f43d58eBen Skeggs#include "nouveau_fbcon.h"
30ddbaf79a8b047dcccf766d0518626cdc0f43d58eBen Skeggs#include "nouveau_mm.h"
31ddbaf79a8b047dcccf766d0518626cdc0f43d58eBen Skeggs
32ddbaf79a8b047dcccf766d0518626cdc0f43d58eBen Skeggsint
33ddbaf79a8b047dcccf766d0518626cdc0f43d58eBen Skeggsnvc0_fbcon_fillrect(struct fb_info *info, const struct fb_fillrect *rect)
34ddbaf79a8b047dcccf766d0518626cdc0f43d58eBen Skeggs{
35ddbaf79a8b047dcccf766d0518626cdc0f43d58eBen Skeggs	struct nouveau_fbdev *nfbdev = info->par;
36ddbaf79a8b047dcccf766d0518626cdc0f43d58eBen Skeggs	struct drm_device *dev = nfbdev->dev;
37ddbaf79a8b047dcccf766d0518626cdc0f43d58eBen Skeggs	struct drm_nouveau_private *dev_priv = dev->dev_private;
38ddbaf79a8b047dcccf766d0518626cdc0f43d58eBen Skeggs	struct nouveau_channel *chan = dev_priv->channel;
39ddbaf79a8b047dcccf766d0518626cdc0f43d58eBen Skeggs	int ret;
40ddbaf79a8b047dcccf766d0518626cdc0f43d58eBen Skeggs
41ddbaf79a8b047dcccf766d0518626cdc0f43d58eBen Skeggs	ret = RING_SPACE(chan, rect->rop == ROP_COPY ? 7 : 11);
42ddbaf79a8b047dcccf766d0518626cdc0f43d58eBen Skeggs	if (ret)
43ddbaf79a8b047dcccf766d0518626cdc0f43d58eBen Skeggs		return ret;
44ddbaf79a8b047dcccf766d0518626cdc0f43d58eBen Skeggs
45ddbaf79a8b047dcccf766d0518626cdc0f43d58eBen Skeggs	if (rect->rop != ROP_COPY) {
46ddbaf79a8b047dcccf766d0518626cdc0f43d58eBen Skeggs		BEGIN_NVC0(chan, 2, NvSub2D, 0x02ac, 1);
47ddbaf79a8b047dcccf766d0518626cdc0f43d58eBen Skeggs		OUT_RING  (chan, 1);
48ddbaf79a8b047dcccf766d0518626cdc0f43d58eBen Skeggs	}
49ddbaf79a8b047dcccf766d0518626cdc0f43d58eBen Skeggs	BEGIN_NVC0(chan, 2, NvSub2D, 0x0588, 1);
50ddbaf79a8b047dcccf766d0518626cdc0f43d58eBen Skeggs	if (info->fix.visual == FB_VISUAL_TRUECOLOR ||
51ddbaf79a8b047dcccf766d0518626cdc0f43d58eBen Skeggs	    info->fix.visual == FB_VISUAL_DIRECTCOLOR)
52ddbaf79a8b047dcccf766d0518626cdc0f43d58eBen Skeggs		OUT_RING  (chan, ((uint32_t *)info->pseudo_palette)[rect->color]);
53ddbaf79a8b047dcccf766d0518626cdc0f43d58eBen Skeggs	else
54ddbaf79a8b047dcccf766d0518626cdc0f43d58eBen Skeggs		OUT_RING  (chan, rect->color);
55ddbaf79a8b047dcccf766d0518626cdc0f43d58eBen Skeggs	BEGIN_NVC0(chan, 2, NvSub2D, 0x0600, 4);
56ddbaf79a8b047dcccf766d0518626cdc0f43d58eBen Skeggs	OUT_RING  (chan, rect->dx);
57ddbaf79a8b047dcccf766d0518626cdc0f43d58eBen Skeggs	OUT_RING  (chan, rect->dy);
58ddbaf79a8b047dcccf766d0518626cdc0f43d58eBen Skeggs	OUT_RING  (chan, rect->dx + rect->width);
59ddbaf79a8b047dcccf766d0518626cdc0f43d58eBen Skeggs	OUT_RING  (chan, rect->dy + rect->height);
60ddbaf79a8b047dcccf766d0518626cdc0f43d58eBen Skeggs	if (rect->rop != ROP_COPY) {
61ddbaf79a8b047dcccf766d0518626cdc0f43d58eBen Skeggs		BEGIN_NVC0(chan, 2, NvSub2D, 0x02ac, 1);
62ddbaf79a8b047dcccf766d0518626cdc0f43d58eBen Skeggs		OUT_RING  (chan, 3);
63ddbaf79a8b047dcccf766d0518626cdc0f43d58eBen Skeggs	}
64ddbaf79a8b047dcccf766d0518626cdc0f43d58eBen Skeggs	FIRE_RING(chan);
65ddbaf79a8b047dcccf766d0518626cdc0f43d58eBen Skeggs	return 0;
66ddbaf79a8b047dcccf766d0518626cdc0f43d58eBen Skeggs}
67ddbaf79a8b047dcccf766d0518626cdc0f43d58eBen Skeggs
68ddbaf79a8b047dcccf766d0518626cdc0f43d58eBen Skeggsint
69ddbaf79a8b047dcccf766d0518626cdc0f43d58eBen Skeggsnvc0_fbcon_copyarea(struct fb_info *info, const struct fb_copyarea *region)
70ddbaf79a8b047dcccf766d0518626cdc0f43d58eBen Skeggs{
71ddbaf79a8b047dcccf766d0518626cdc0f43d58eBen Skeggs	struct nouveau_fbdev *nfbdev = info->par;
72ddbaf79a8b047dcccf766d0518626cdc0f43d58eBen Skeggs	struct drm_device *dev = nfbdev->dev;
73ddbaf79a8b047dcccf766d0518626cdc0f43d58eBen Skeggs	struct drm_nouveau_private *dev_priv = dev->dev_private;
74ddbaf79a8b047dcccf766d0518626cdc0f43d58eBen Skeggs	struct nouveau_channel *chan = dev_priv->channel;
75ddbaf79a8b047dcccf766d0518626cdc0f43d58eBen Skeggs	int ret;
76ddbaf79a8b047dcccf766d0518626cdc0f43d58eBen Skeggs
77ddbaf79a8b047dcccf766d0518626cdc0f43d58eBen Skeggs	ret = RING_SPACE(chan, 12);
78ddbaf79a8b047dcccf766d0518626cdc0f43d58eBen Skeggs	if (ret)
79ddbaf79a8b047dcccf766d0518626cdc0f43d58eBen Skeggs		return ret;
80ddbaf79a8b047dcccf766d0518626cdc0f43d58eBen Skeggs
81ddbaf79a8b047dcccf766d0518626cdc0f43d58eBen Skeggs	BEGIN_NVC0(chan, 2, NvSub2D, 0x0110, 1);
82ddbaf79a8b047dcccf766d0518626cdc0f43d58eBen Skeggs	OUT_RING  (chan, 0);
83ddbaf79a8b047dcccf766d0518626cdc0f43d58eBen Skeggs	BEGIN_NVC0(chan, 2, NvSub2D, 0x08b0, 4);
84ddbaf79a8b047dcccf766d0518626cdc0f43d58eBen Skeggs	OUT_RING  (chan, region->dx);
85ddbaf79a8b047dcccf766d0518626cdc0f43d58eBen Skeggs	OUT_RING  (chan, region->dy);
86ddbaf79a8b047dcccf766d0518626cdc0f43d58eBen Skeggs	OUT_RING  (chan, region->width);
87ddbaf79a8b047dcccf766d0518626cdc0f43d58eBen Skeggs	OUT_RING  (chan, region->height);
88ddbaf79a8b047dcccf766d0518626cdc0f43d58eBen Skeggs	BEGIN_NVC0(chan, 2, NvSub2D, 0x08d0, 4);
89ddbaf79a8b047dcccf766d0518626cdc0f43d58eBen Skeggs	OUT_RING  (chan, 0);
90ddbaf79a8b047dcccf766d0518626cdc0f43d58eBen Skeggs	OUT_RING  (chan, region->sx);
91ddbaf79a8b047dcccf766d0518626cdc0f43d58eBen Skeggs	OUT_RING  (chan, 0);
92ddbaf79a8b047dcccf766d0518626cdc0f43d58eBen Skeggs	OUT_RING  (chan, region->sy);
93ddbaf79a8b047dcccf766d0518626cdc0f43d58eBen Skeggs	FIRE_RING(chan);
94ddbaf79a8b047dcccf766d0518626cdc0f43d58eBen Skeggs	return 0;
95ddbaf79a8b047dcccf766d0518626cdc0f43d58eBen Skeggs}
96ddbaf79a8b047dcccf766d0518626cdc0f43d58eBen Skeggs
97ddbaf79a8b047dcccf766d0518626cdc0f43d58eBen Skeggsint
98ddbaf79a8b047dcccf766d0518626cdc0f43d58eBen Skeggsnvc0_fbcon_imageblit(struct fb_info *info, const struct fb_image *image)
99ddbaf79a8b047dcccf766d0518626cdc0f43d58eBen Skeggs{
100ddbaf79a8b047dcccf766d0518626cdc0f43d58eBen Skeggs	struct nouveau_fbdev *nfbdev = info->par;
101ddbaf79a8b047dcccf766d0518626cdc0f43d58eBen Skeggs	struct drm_device *dev = nfbdev->dev;
102ddbaf79a8b047dcccf766d0518626cdc0f43d58eBen Skeggs	struct drm_nouveau_private *dev_priv = dev->dev_private;
103ddbaf79a8b047dcccf766d0518626cdc0f43d58eBen Skeggs	struct nouveau_channel *chan = dev_priv->channel;
104ddbaf79a8b047dcccf766d0518626cdc0f43d58eBen Skeggs	uint32_t width, dwords, *data = (uint32_t *)image->data;
105ddbaf79a8b047dcccf766d0518626cdc0f43d58eBen Skeggs	uint32_t mask = ~(~0 >> (32 - info->var.bits_per_pixel));
106ddbaf79a8b047dcccf766d0518626cdc0f43d58eBen Skeggs	uint32_t *palette = info->pseudo_palette;
107ddbaf79a8b047dcccf766d0518626cdc0f43d58eBen Skeggs	int ret;
108ddbaf79a8b047dcccf766d0518626cdc0f43d58eBen Skeggs
109ddbaf79a8b047dcccf766d0518626cdc0f43d58eBen Skeggs	if (image->depth != 1)
110ddbaf79a8b047dcccf766d0518626cdc0f43d58eBen Skeggs		return -ENODEV;
111ddbaf79a8b047dcccf766d0518626cdc0f43d58eBen Skeggs
112ddbaf79a8b047dcccf766d0518626cdc0f43d58eBen Skeggs	ret = RING_SPACE(chan, 11);
113ddbaf79a8b047dcccf766d0518626cdc0f43d58eBen Skeggs	if (ret)
114ddbaf79a8b047dcccf766d0518626cdc0f43d58eBen Skeggs		return ret;
115ddbaf79a8b047dcccf766d0518626cdc0f43d58eBen Skeggs
116ddbaf79a8b047dcccf766d0518626cdc0f43d58eBen Skeggs	width = ALIGN(image->width, 32);
117ddbaf79a8b047dcccf766d0518626cdc0f43d58eBen Skeggs	dwords = (width * image->height) >> 5;
118ddbaf79a8b047dcccf766d0518626cdc0f43d58eBen Skeggs
119ddbaf79a8b047dcccf766d0518626cdc0f43d58eBen Skeggs	BEGIN_NVC0(chan, 2, NvSub2D, 0x0814, 2);
120ddbaf79a8b047dcccf766d0518626cdc0f43d58eBen Skeggs	if (info->fix.visual == FB_VISUAL_TRUECOLOR ||
121ddbaf79a8b047dcccf766d0518626cdc0f43d58eBen Skeggs	    info->fix.visual == FB_VISUAL_DIRECTCOLOR) {
122ddbaf79a8b047dcccf766d0518626cdc0f43d58eBen Skeggs		OUT_RING  (chan, palette[image->bg_color] | mask);
123ddbaf79a8b047dcccf766d0518626cdc0f43d58eBen Skeggs		OUT_RING  (chan, palette[image->fg_color] | mask);
124ddbaf79a8b047dcccf766d0518626cdc0f43d58eBen Skeggs	} else {
125ddbaf79a8b047dcccf766d0518626cdc0f43d58eBen Skeggs		OUT_RING  (chan, image->bg_color);
126ddbaf79a8b047dcccf766d0518626cdc0f43d58eBen Skeggs		OUT_RING  (chan, image->fg_color);
127ddbaf79a8b047dcccf766d0518626cdc0f43d58eBen Skeggs	}
128ddbaf79a8b047dcccf766d0518626cdc0f43d58eBen Skeggs	BEGIN_NVC0(chan, 2, NvSub2D, 0x0838, 2);
129ddbaf79a8b047dcccf766d0518626cdc0f43d58eBen Skeggs	OUT_RING  (chan, image->width);
130ddbaf79a8b047dcccf766d0518626cdc0f43d58eBen Skeggs	OUT_RING  (chan, image->height);
131ddbaf79a8b047dcccf766d0518626cdc0f43d58eBen Skeggs	BEGIN_NVC0(chan, 2, NvSub2D, 0x0850, 4);
132ddbaf79a8b047dcccf766d0518626cdc0f43d58eBen Skeggs	OUT_RING  (chan, 0);
133ddbaf79a8b047dcccf766d0518626cdc0f43d58eBen Skeggs	OUT_RING  (chan, image->dx);
134ddbaf79a8b047dcccf766d0518626cdc0f43d58eBen Skeggs	OUT_RING  (chan, 0);
135ddbaf79a8b047dcccf766d0518626cdc0f43d58eBen Skeggs	OUT_RING  (chan, image->dy);
136ddbaf79a8b047dcccf766d0518626cdc0f43d58eBen Skeggs
137ddbaf79a8b047dcccf766d0518626cdc0f43d58eBen Skeggs	while (dwords) {
138ddbaf79a8b047dcccf766d0518626cdc0f43d58eBen Skeggs		int push = dwords > 2047 ? 2047 : dwords;
139ddbaf79a8b047dcccf766d0518626cdc0f43d58eBen Skeggs
140ddbaf79a8b047dcccf766d0518626cdc0f43d58eBen Skeggs		ret = RING_SPACE(chan, push + 1);
141ddbaf79a8b047dcccf766d0518626cdc0f43d58eBen Skeggs		if (ret)
142ddbaf79a8b047dcccf766d0518626cdc0f43d58eBen Skeggs			return ret;
143ddbaf79a8b047dcccf766d0518626cdc0f43d58eBen Skeggs
144ddbaf79a8b047dcccf766d0518626cdc0f43d58eBen Skeggs		dwords -= push;
145ddbaf79a8b047dcccf766d0518626cdc0f43d58eBen Skeggs
146ddbaf79a8b047dcccf766d0518626cdc0f43d58eBen Skeggs		BEGIN_NVC0(chan, 6, NvSub2D, 0x0860, push);
147ddbaf79a8b047dcccf766d0518626cdc0f43d58eBen Skeggs		OUT_RINGp(chan, data, push);
148ddbaf79a8b047dcccf766d0518626cdc0f43d58eBen Skeggs		data += push;
149ddbaf79a8b047dcccf766d0518626cdc0f43d58eBen Skeggs	}
150ddbaf79a8b047dcccf766d0518626cdc0f43d58eBen Skeggs
151ddbaf79a8b047dcccf766d0518626cdc0f43d58eBen Skeggs	FIRE_RING(chan);
152ddbaf79a8b047dcccf766d0518626cdc0f43d58eBen Skeggs	return 0;
153ddbaf79a8b047dcccf766d0518626cdc0f43d58eBen Skeggs}
154ddbaf79a8b047dcccf766d0518626cdc0f43d58eBen Skeggs
155ddbaf79a8b047dcccf766d0518626cdc0f43d58eBen Skeggsint
156ddbaf79a8b047dcccf766d0518626cdc0f43d58eBen Skeggsnvc0_fbcon_accel_init(struct fb_info *info)
157ddbaf79a8b047dcccf766d0518626cdc0f43d58eBen Skeggs{
158ddbaf79a8b047dcccf766d0518626cdc0f43d58eBen Skeggs	struct nouveau_fbdev *nfbdev = info->par;
159ddbaf79a8b047dcccf766d0518626cdc0f43d58eBen Skeggs	struct drm_device *dev = nfbdev->dev;
160ddbaf79a8b047dcccf766d0518626cdc0f43d58eBen Skeggs	struct drm_nouveau_private *dev_priv = dev->dev_private;
161ddbaf79a8b047dcccf766d0518626cdc0f43d58eBen Skeggs	struct nouveau_channel *chan = dev_priv->channel;
16245143cb53c793b11b875d555eb96ca32bcbea1c7Ben Skeggs	struct nouveau_framebuffer *fb = &nfbdev->nouveau_fb;
163ddbaf79a8b047dcccf766d0518626cdc0f43d58eBen Skeggs	int ret, format;
164ddbaf79a8b047dcccf766d0518626cdc0f43d58eBen Skeggs
165ddbaf79a8b047dcccf766d0518626cdc0f43d58eBen Skeggs	ret = nouveau_gpuobj_gr_new(chan, 0x902d, 0x902d);
166ddbaf79a8b047dcccf766d0518626cdc0f43d58eBen Skeggs	if (ret)
167ddbaf79a8b047dcccf766d0518626cdc0f43d58eBen Skeggs		return ret;
168ddbaf79a8b047dcccf766d0518626cdc0f43d58eBen Skeggs
169ddbaf79a8b047dcccf766d0518626cdc0f43d58eBen Skeggs	switch (info->var.bits_per_pixel) {
170ddbaf79a8b047dcccf766d0518626cdc0f43d58eBen Skeggs	case 8:
171ddbaf79a8b047dcccf766d0518626cdc0f43d58eBen Skeggs		format = 0xf3;
172ddbaf79a8b047dcccf766d0518626cdc0f43d58eBen Skeggs		break;
173ddbaf79a8b047dcccf766d0518626cdc0f43d58eBen Skeggs	case 15:
174ddbaf79a8b047dcccf766d0518626cdc0f43d58eBen Skeggs		format = 0xf8;
175ddbaf79a8b047dcccf766d0518626cdc0f43d58eBen Skeggs		break;
176ddbaf79a8b047dcccf766d0518626cdc0f43d58eBen Skeggs	case 16:
177ddbaf79a8b047dcccf766d0518626cdc0f43d58eBen Skeggs		format = 0xe8;
178ddbaf79a8b047dcccf766d0518626cdc0f43d58eBen Skeggs		break;
179ddbaf79a8b047dcccf766d0518626cdc0f43d58eBen Skeggs	case 32:
180ddbaf79a8b047dcccf766d0518626cdc0f43d58eBen Skeggs		switch (info->var.transp.length) {
181ddbaf79a8b047dcccf766d0518626cdc0f43d58eBen Skeggs		case 0: /* depth 24 */
182ddbaf79a8b047dcccf766d0518626cdc0f43d58eBen Skeggs		case 8: /* depth 32, just use 24.. */
183ddbaf79a8b047dcccf766d0518626cdc0f43d58eBen Skeggs			format = 0xe6;
184ddbaf79a8b047dcccf766d0518626cdc0f43d58eBen Skeggs			break;
185ddbaf79a8b047dcccf766d0518626cdc0f43d58eBen Skeggs		case 2: /* depth 30 */
186ddbaf79a8b047dcccf766d0518626cdc0f43d58eBen Skeggs			format = 0xd1;
187ddbaf79a8b047dcccf766d0518626cdc0f43d58eBen Skeggs			break;
188ddbaf79a8b047dcccf766d0518626cdc0f43d58eBen Skeggs		default:
189ddbaf79a8b047dcccf766d0518626cdc0f43d58eBen Skeggs			return -EINVAL;
190ddbaf79a8b047dcccf766d0518626cdc0f43d58eBen Skeggs		}
191ddbaf79a8b047dcccf766d0518626cdc0f43d58eBen Skeggs		break;
192ddbaf79a8b047dcccf766d0518626cdc0f43d58eBen Skeggs	default:
193ddbaf79a8b047dcccf766d0518626cdc0f43d58eBen Skeggs		return -EINVAL;
194ddbaf79a8b047dcccf766d0518626cdc0f43d58eBen Skeggs	}
195ddbaf79a8b047dcccf766d0518626cdc0f43d58eBen Skeggs
196ddbaf79a8b047dcccf766d0518626cdc0f43d58eBen Skeggs	ret = RING_SPACE(chan, 60);
197ddbaf79a8b047dcccf766d0518626cdc0f43d58eBen Skeggs	if (ret) {
198ddbaf79a8b047dcccf766d0518626cdc0f43d58eBen Skeggs		WARN_ON(1);
199ddbaf79a8b047dcccf766d0518626cdc0f43d58eBen Skeggs		nouveau_fbcon_gpu_lockup(info);
200ddbaf79a8b047dcccf766d0518626cdc0f43d58eBen Skeggs		return ret;
201ddbaf79a8b047dcccf766d0518626cdc0f43d58eBen Skeggs	}
202ddbaf79a8b047dcccf766d0518626cdc0f43d58eBen Skeggs
203ddbaf79a8b047dcccf766d0518626cdc0f43d58eBen Skeggs	BEGIN_NVC0(chan, 2, NvSub2D, 0x0000, 1);
204ddbaf79a8b047dcccf766d0518626cdc0f43d58eBen Skeggs	OUT_RING  (chan, 0x0000902d);
205ddbaf79a8b047dcccf766d0518626cdc0f43d58eBen Skeggs	BEGIN_NVC0(chan, 2, NvSub2D, 0x0104, 2);
2060b7187335fc2f38691cc169b202ff436abbefd68Ben Skeggs	OUT_RING  (chan, upper_32_bits(chan->notifier_vma.offset));
2070b7187335fc2f38691cc169b202ff436abbefd68Ben Skeggs	OUT_RING  (chan, lower_32_bits(chan->notifier_vma.offset));
208ddbaf79a8b047dcccf766d0518626cdc0f43d58eBen Skeggs	BEGIN_NVC0(chan, 2, NvSub2D, 0x0290, 1);
209ddbaf79a8b047dcccf766d0518626cdc0f43d58eBen Skeggs	OUT_RING  (chan, 0);
210ddbaf79a8b047dcccf766d0518626cdc0f43d58eBen Skeggs	BEGIN_NVC0(chan, 2, NvSub2D, 0x0888, 1);
211ddbaf79a8b047dcccf766d0518626cdc0f43d58eBen Skeggs	OUT_RING  (chan, 1);
212ddbaf79a8b047dcccf766d0518626cdc0f43d58eBen Skeggs	BEGIN_NVC0(chan, 2, NvSub2D, 0x02ac, 1);
213ddbaf79a8b047dcccf766d0518626cdc0f43d58eBen Skeggs	OUT_RING  (chan, 3);
214ddbaf79a8b047dcccf766d0518626cdc0f43d58eBen Skeggs	BEGIN_NVC0(chan, 2, NvSub2D, 0x02a0, 1);
215ddbaf79a8b047dcccf766d0518626cdc0f43d58eBen Skeggs	OUT_RING  (chan, 0x55);
216ddbaf79a8b047dcccf766d0518626cdc0f43d58eBen Skeggs	BEGIN_NVC0(chan, 2, NvSub2D, 0x08c0, 4);
217ddbaf79a8b047dcccf766d0518626cdc0f43d58eBen Skeggs	OUT_RING  (chan, 0);
218ddbaf79a8b047dcccf766d0518626cdc0f43d58eBen Skeggs	OUT_RING  (chan, 1);
219ddbaf79a8b047dcccf766d0518626cdc0f43d58eBen Skeggs	OUT_RING  (chan, 0);
220ddbaf79a8b047dcccf766d0518626cdc0f43d58eBen Skeggs	OUT_RING  (chan, 1);
221ddbaf79a8b047dcccf766d0518626cdc0f43d58eBen Skeggs	BEGIN_NVC0(chan, 2, NvSub2D, 0x0580, 2);
222ddbaf79a8b047dcccf766d0518626cdc0f43d58eBen Skeggs	OUT_RING  (chan, 4);
223ddbaf79a8b047dcccf766d0518626cdc0f43d58eBen Skeggs	OUT_RING  (chan, format);
224ddbaf79a8b047dcccf766d0518626cdc0f43d58eBen Skeggs	BEGIN_NVC0(chan, 2, NvSub2D, 0x02e8, 2);
225ddbaf79a8b047dcccf766d0518626cdc0f43d58eBen Skeggs	OUT_RING  (chan, 2);
226ddbaf79a8b047dcccf766d0518626cdc0f43d58eBen Skeggs	OUT_RING  (chan, 1);
227ddbaf79a8b047dcccf766d0518626cdc0f43d58eBen Skeggs
228ddbaf79a8b047dcccf766d0518626cdc0f43d58eBen Skeggs	BEGIN_NVC0(chan, 2, NvSub2D, 0x0804, 1);
229ddbaf79a8b047dcccf766d0518626cdc0f43d58eBen Skeggs	OUT_RING  (chan, format);
230ddbaf79a8b047dcccf766d0518626cdc0f43d58eBen Skeggs	BEGIN_NVC0(chan, 2, NvSub2D, 0x0800, 1);
231ddbaf79a8b047dcccf766d0518626cdc0f43d58eBen Skeggs	OUT_RING  (chan, 1);
232ddbaf79a8b047dcccf766d0518626cdc0f43d58eBen Skeggs	BEGIN_NVC0(chan, 2, NvSub2D, 0x0808, 3);
233ddbaf79a8b047dcccf766d0518626cdc0f43d58eBen Skeggs	OUT_RING  (chan, 0);
234ddbaf79a8b047dcccf766d0518626cdc0f43d58eBen Skeggs	OUT_RING  (chan, 0);
235ddbaf79a8b047dcccf766d0518626cdc0f43d58eBen Skeggs	OUT_RING  (chan, 1);
236ddbaf79a8b047dcccf766d0518626cdc0f43d58eBen Skeggs	BEGIN_NVC0(chan, 2, NvSub2D, 0x081c, 1);
237ddbaf79a8b047dcccf766d0518626cdc0f43d58eBen Skeggs	OUT_RING  (chan, 1);
238ddbaf79a8b047dcccf766d0518626cdc0f43d58eBen Skeggs	BEGIN_NVC0(chan, 2, NvSub2D, 0x0840, 4);
239ddbaf79a8b047dcccf766d0518626cdc0f43d58eBen Skeggs	OUT_RING  (chan, 0);
240ddbaf79a8b047dcccf766d0518626cdc0f43d58eBen Skeggs	OUT_RING  (chan, 1);
241ddbaf79a8b047dcccf766d0518626cdc0f43d58eBen Skeggs	OUT_RING  (chan, 0);
242ddbaf79a8b047dcccf766d0518626cdc0f43d58eBen Skeggs	OUT_RING  (chan, 1);
243ddbaf79a8b047dcccf766d0518626cdc0f43d58eBen Skeggs	BEGIN_NVC0(chan, 2, NvSub2D, 0x0200, 10);
244ddbaf79a8b047dcccf766d0518626cdc0f43d58eBen Skeggs	OUT_RING  (chan, format);
245ddbaf79a8b047dcccf766d0518626cdc0f43d58eBen Skeggs	OUT_RING  (chan, 1);
246ddbaf79a8b047dcccf766d0518626cdc0f43d58eBen Skeggs	OUT_RING  (chan, 0);
247ddbaf79a8b047dcccf766d0518626cdc0f43d58eBen Skeggs	OUT_RING  (chan, 1);
248ddbaf79a8b047dcccf766d0518626cdc0f43d58eBen Skeggs	OUT_RING  (chan, 0);
249ddbaf79a8b047dcccf766d0518626cdc0f43d58eBen Skeggs	OUT_RING  (chan, info->fix.line_length);
250ddbaf79a8b047dcccf766d0518626cdc0f43d58eBen Skeggs	OUT_RING  (chan, info->var.xres_virtual);
251ddbaf79a8b047dcccf766d0518626cdc0f43d58eBen Skeggs	OUT_RING  (chan, info->var.yres_virtual);
25245143cb53c793b11b875d555eb96ca32bcbea1c7Ben Skeggs	OUT_RING  (chan, upper_32_bits(fb->vma.offset));
25345143cb53c793b11b875d555eb96ca32bcbea1c7Ben Skeggs	OUT_RING  (chan, lower_32_bits(fb->vma.offset));
254ddbaf79a8b047dcccf766d0518626cdc0f43d58eBen Skeggs	BEGIN_NVC0(chan, 2, NvSub2D, 0x0230, 10);
255ddbaf79a8b047dcccf766d0518626cdc0f43d58eBen Skeggs	OUT_RING  (chan, format);
256ddbaf79a8b047dcccf766d0518626cdc0f43d58eBen Skeggs	OUT_RING  (chan, 1);
257ddbaf79a8b047dcccf766d0518626cdc0f43d58eBen Skeggs	OUT_RING  (chan, 0);
258ddbaf79a8b047dcccf766d0518626cdc0f43d58eBen Skeggs	OUT_RING  (chan, 1);
259ddbaf79a8b047dcccf766d0518626cdc0f43d58eBen Skeggs	OUT_RING  (chan, 0);
260ddbaf79a8b047dcccf766d0518626cdc0f43d58eBen Skeggs	OUT_RING  (chan, info->fix.line_length);
261ddbaf79a8b047dcccf766d0518626cdc0f43d58eBen Skeggs	OUT_RING  (chan, info->var.xres_virtual);
262ddbaf79a8b047dcccf766d0518626cdc0f43d58eBen Skeggs	OUT_RING  (chan, info->var.yres_virtual);
26345143cb53c793b11b875d555eb96ca32bcbea1c7Ben Skeggs	OUT_RING  (chan, upper_32_bits(fb->vma.offset));
26445143cb53c793b11b875d555eb96ca32bcbea1c7Ben Skeggs	OUT_RING  (chan, lower_32_bits(fb->vma.offset));
265ddbaf79a8b047dcccf766d0518626cdc0f43d58eBen Skeggs	FIRE_RING (chan);
266ddbaf79a8b047dcccf766d0518626cdc0f43d58eBen Skeggs
267ddbaf79a8b047dcccf766d0518626cdc0f43d58eBen Skeggs	return 0;
268ddbaf79a8b047dcccf766d0518626cdc0f43d58eBen Skeggs}
269ddbaf79a8b047dcccf766d0518626cdc0f43d58eBen Skeggs
270