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