r128_crtc.c revision a56d54ac
1e3d74329Smrg/* 2e3d74329Smrg * Copyright 2000 ATI Technologies Inc., Markham, Ontario, and 3e3d74329Smrg * VA Linux Systems Inc., Fremont, California. 4e3d74329Smrg * 5e3d74329Smrg * All Rights Reserved. 6e3d74329Smrg * 7e3d74329Smrg * Permission is hereby granted, free of charge, to any person obtaining 8e3d74329Smrg * a copy of this software and associated documentation files (the 9e3d74329Smrg * "Software"), to deal in the Software without restriction, including 10e3d74329Smrg * without limitation on the rights to use, copy, modify, merge, 11e3d74329Smrg * publish, distribute, sublicense, and/or sell copies of the Software, 12e3d74329Smrg * and to permit persons to whom the Software is furnished to do so, 13e3d74329Smrg * subject to the following conditions: 14e3d74329Smrg * 15e3d74329Smrg * The above copyright notice and this permission notice (including the 16e3d74329Smrg * next paragraph) shall be included in all copies or substantial 17e3d74329Smrg * portions of the Software. 18e3d74329Smrg * 19e3d74329Smrg * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, 20e3d74329Smrg * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF 21e3d74329Smrg * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND 22e3d74329Smrg * NON-INFRINGEMENT. IN NO EVENT SHALL ATI, VA LINUX SYSTEMS AND/OR 23e3d74329Smrg * THEIR SUPPLIERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, 24e3d74329Smrg * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 25e3d74329Smrg * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER 26e3d74329Smrg * DEALINGS IN THE SOFTWARE. 27e3d74329Smrg */ 28e3d74329Smrg 29e3d74329Smrg#ifdef HAVE_CONFIG_H 30e3d74329Smrg#include "config.h" 31e3d74329Smrg#endif 32e3d74329Smrg 33e3d74329Smrg#include <string.h> 34e3d74329Smrg#include <stdio.h> 35e3d74329Smrg 36e3d74329Smrg#include "xf86.h" 37e3d74329Smrg#include "xf86Modes.h" 38a56d54acSmrg 39a56d54acSmrg#ifdef HAVE_XEXTPROTO_71 40e3d74329Smrg#include "X11/extensions/dpmsconst.h" 41a56d54acSmrg#else 42a56d54acSmrg#define DPMS_SERVER 43a56d54acSmrg#include "X11/extensions/dpms.h" 44a56d54acSmrg#endif 45e3d74329Smrg 46e3d74329Smrg#include "r128.h" 47e3d74329Smrg#include "r128_probe.h" 48e3d74329Smrg#include "r128_reg.h" 49e3d74329Smrg 50e3d74329Smrgstatic void r128_crtc_load_lut(xf86CrtcPtr crtc); 51e3d74329Smrg 52e3d74329Smrgstatic void r128_crtc_dpms(xf86CrtcPtr crtc, int mode) 53e3d74329Smrg{ 54e3d74329Smrg int mask; 55e3d74329Smrg ScrnInfoPtr pScrn = crtc->scrn; 56e3d74329Smrg R128InfoPtr info = R128PTR(pScrn); 57e3d74329Smrg unsigned char *R128MMIO = info->MMIO; 58e3d74329Smrg R128CrtcPrivatePtr r128_crtc = crtc->driver_private; 59e3d74329Smrg 60e3d74329Smrg /* XXX: The HSYNC and VSYNC bits for CRTC2 don't exist on the r128? */ 61e3d74329Smrg mask = r128_crtc->crtc_id ? R128_CRTC2_DISP_DIS : (R128_CRTC_DISPLAY_DIS | R128_CRTC_HSYNC_DIS | R128_CRTC_VSYNC_DIS); 62e3d74329Smrg 63e3d74329Smrg switch (mode) { 64e3d74329Smrg case DPMSModeOn: 65e3d74329Smrg if (r128_crtc->crtc_id) { 66e3d74329Smrg OUTREGP(R128_CRTC2_GEN_CNTL, 0, ~mask); 67e3d74329Smrg } else { 68e3d74329Smrg OUTREGP(R128_CRTC_EXT_CNTL, 0, ~mask); 69e3d74329Smrg } 70e3d74329Smrg break; 71e3d74329Smrg case DPMSModeStandby: 72e3d74329Smrg if (r128_crtc->crtc_id) { 73e3d74329Smrg OUTREGP(R128_CRTC2_GEN_CNTL, R128_CRTC2_DISP_DIS, ~mask); 74e3d74329Smrg } else { 75e3d74329Smrg OUTREGP(R128_CRTC_EXT_CNTL, (R128_CRTC_DISPLAY_DIS | R128_CRTC_HSYNC_DIS), ~mask); 76e3d74329Smrg } 77e3d74329Smrg break; 78e3d74329Smrg case DPMSModeSuspend: 79e3d74329Smrg if (r128_crtc->crtc_id) { 80e3d74329Smrg OUTREGP(R128_CRTC2_GEN_CNTL, R128_CRTC2_DISP_DIS, ~mask); 81e3d74329Smrg } else { 82e3d74329Smrg OUTREGP(R128_CRTC_EXT_CNTL, (R128_CRTC_DISPLAY_DIS | R128_CRTC_VSYNC_DIS), ~mask); 83e3d74329Smrg } 84e3d74329Smrg break; 85e3d74329Smrg case DPMSModeOff: 86e3d74329Smrg if (r128_crtc->crtc_id) { 87e3d74329Smrg OUTREGP(R128_CRTC2_GEN_CNTL, mask, ~mask); 88e3d74329Smrg } else { 89e3d74329Smrg OUTREGP(R128_CRTC_EXT_CNTL, mask, ~mask); 90e3d74329Smrg } 91e3d74329Smrg break; 92e3d74329Smrg } 93e3d74329Smrg 94e3d74329Smrg if (mode != DPMSModeOn) { 95e3d74329Smrg if (r128_crtc->crtc_id) { 96e3d74329Smrg OUTREGP(R128_CRTC2_GEN_CNTL, 0, ~R128_CRTC2_EN); 97e3d74329Smrg } else { 98e3d74329Smrg OUTREGP(R128_CRTC_GEN_CNTL, 0, ~R128_CRTC_EN); 99e3d74329Smrg } 100e3d74329Smrg } else { 101e3d74329Smrg if (r128_crtc->crtc_id) { 102e3d74329Smrg OUTREGP(R128_CRTC2_GEN_CNTL, R128_CRTC2_EN, ~R128_CRTC2_EN); 103e3d74329Smrg } else { 104e3d74329Smrg OUTREGP(R128_CRTC_GEN_CNTL, R128_CRTC_EN, ~R128_CRTC_EN); 105e3d74329Smrg } 106e3d74329Smrg } 107e3d74329Smrg 108e3d74329Smrg if (mode != DPMSModeOff) 109e3d74329Smrg r128_crtc_load_lut(crtc); 110e3d74329Smrg} 111e3d74329Smrg 112e3d74329Smrgvoid r128_crtc_load_lut(xf86CrtcPtr crtc) 113e3d74329Smrg{ 114e3d74329Smrg ScrnInfoPtr pScrn = crtc->scrn; 115e3d74329Smrg R128InfoPtr info = R128PTR(pScrn); 116e3d74329Smrg unsigned char *R128MMIO = info->MMIO; 117e3d74329Smrg R128CrtcPrivatePtr r128_crtc = crtc->driver_private; 118e3d74329Smrg int i; 119e3d74329Smrg 120e3d74329Smrg if (!crtc->enabled) 121e3d74329Smrg return; 122e3d74329Smrg 123e3d74329Smrg PAL_SELECT(r128_crtc->crtc_id); 124e3d74329Smrg 125e3d74329Smrg for (i = 0; i < 256; i++) { 126e3d74329Smrg OUTPAL(i, r128_crtc->lut_r[i], r128_crtc->lut_g[i], r128_crtc->lut_b[i]); 127e3d74329Smrg } 128e3d74329Smrg} 129e3d74329Smrg 130e3d74329Smrgstatic Bool r128_crtc_mode_fixup(xf86CrtcPtr crtc, DisplayModePtr mode, DisplayModePtr adjusted_mode) 131e3d74329Smrg{ 132e3d74329Smrg return TRUE; 133e3d74329Smrg} 134e3d74329Smrg 135e3d74329Smrgstatic void r128_crtc_mode_prepare(xf86CrtcPtr crtc) 136e3d74329Smrg{ 137e3d74329Smrg r128_crtc_dpms(crtc, DPMSModeOff); 138e3d74329Smrg} 139e3d74329Smrg 140e3d74329Smrgstatic void r128_crtc_mode_set(xf86CrtcPtr crtc, DisplayModePtr mode, DisplayModePtr adjusted_mode, int x, int y) 141e3d74329Smrg{ 142e3d74329Smrg ScrnInfoPtr pScrn = crtc->scrn; 143e3d74329Smrg R128CrtcPrivatePtr r128_crtc = crtc->driver_private; 144e3d74329Smrg R128InfoPtr info = R128PTR(pScrn); 145e3d74329Smrg double dot_clock = adjusted_mode->Clock / 1000.0; 146e3d74329Smrg 147e3d74329Smrg if (r128_crtc->cursor_offset) r128_crtc_hide_cursor(crtc); 148e3d74329Smrg xf86PrintModeline(pScrn->scrnIndex, adjusted_mode); 149e3d74329Smrg R128InitCommonRegisters(&info->ModeReg, info); 150e3d74329Smrg 151e3d74329Smrg switch (r128_crtc->crtc_id) { 152e3d74329Smrg case 0: 153e3d74329Smrg R128InitCrtcRegisters(crtc, &info->ModeReg, adjusted_mode); 154e3d74329Smrg R128InitCrtcBase(crtc, &info->ModeReg, x, y); 155e3d74329Smrg if (dot_clock) { 156e3d74329Smrg R128InitPLLRegisters(crtc, &info->ModeReg, &info->pll, dot_clock); 157e3d74329Smrg R128InitDDARegisters(crtc, &info->ModeReg, &info->pll, adjusted_mode); 158e3d74329Smrg } else { 159e3d74329Smrg info->ModeReg.ppll_ref_div = info->SavedReg.ppll_ref_div; 160e3d74329Smrg info->ModeReg.ppll_div_3 = info->SavedReg.ppll_div_3; 161e3d74329Smrg info->ModeReg.htotal_cntl = info->SavedReg.htotal_cntl; 162e3d74329Smrg info->ModeReg.dda_config = info->SavedReg.dda_config; 163e3d74329Smrg info->ModeReg.dda_on_off = info->SavedReg.dda_on_off; 164e3d74329Smrg } 165e3d74329Smrg break; 166e3d74329Smrg case 1: 167e3d74329Smrg R128InitCrtc2Registers(crtc, &info->ModeReg, adjusted_mode); 168e3d74329Smrg R128InitCrtc2Base(crtc, &info->ModeReg, x, y); 169e3d74329Smrg if (dot_clock) { 170e3d74329Smrg R128InitPLL2Registers(crtc, &info->ModeReg, &info->pll, dot_clock); 171e3d74329Smrg R128InitDDA2Registers(crtc, &info->ModeReg, &info->pll, adjusted_mode); 172e3d74329Smrg } 173e3d74329Smrg break; 174e3d74329Smrg } 175e3d74329Smrg 176e3d74329Smrg R128RestoreCommonRegisters(pScrn, &info->ModeReg); 177e3d74329Smrg 178e3d74329Smrg switch (r128_crtc->crtc_id) { 179e3d74329Smrg case 0: 180e3d74329Smrg R128RestoreDDARegisters(pScrn, &info->ModeReg); 181e3d74329Smrg R128RestoreCrtcRegisters(pScrn, &info->ModeReg); 182e3d74329Smrg R128RestorePLLRegisters(pScrn, &info->ModeReg); 183e3d74329Smrg break; 184e3d74329Smrg case 1: 185e3d74329Smrg R128RestoreDDA2Registers(pScrn, &info->ModeReg); 186e3d74329Smrg R128RestoreCrtc2Registers(pScrn, &info->ModeReg); 187e3d74329Smrg R128RestorePLL2Registers(pScrn, &info->ModeReg); 188e3d74329Smrg break; 189e3d74329Smrg } 190e3d74329Smrg 191e3d74329Smrg if (r128_crtc->cursor_offset) r128_crtc_show_cursor(crtc); 192e3d74329Smrg} 193e3d74329Smrg 194e3d74329Smrgstatic void r128_crtc_mode_commit(xf86CrtcPtr crtc) 195e3d74329Smrg{ 196e3d74329Smrg r128_crtc_dpms(crtc, DPMSModeOn); 197e3d74329Smrg} 198e3d74329Smrg 199e3d74329Smrgstatic void r128_crtc_gamma_set(xf86CrtcPtr crtc, uint16_t *red, uint16_t *green, uint16_t *blue, int size) 200e3d74329Smrg{ 201e3d74329Smrg R128CrtcPrivatePtr r128_crtc = crtc->driver_private; 202e3d74329Smrg int i; 203e3d74329Smrg 204e3d74329Smrg for (i = 0; i < 256; i++) { 205e3d74329Smrg r128_crtc->lut_r[i] = red[i] >> 8; 206e3d74329Smrg r128_crtc->lut_g[i] = green[i] >> 8; 207e3d74329Smrg r128_crtc->lut_b[i] = blue[i] >> 8; 208e3d74329Smrg } 209e3d74329Smrg 210e3d74329Smrg r128_crtc_load_lut(crtc); 211e3d74329Smrg} 212e3d74329Smrg 213e3d74329Smrgstatic Bool r128_crtc_lock(xf86CrtcPtr crtc) 214e3d74329Smrg{ 215e3d74329Smrg ScrnInfoPtr pScrn = crtc->scrn; 216e3d74329Smrg ScreenPtr pScreen = xf86ScrnToScreen(pScrn); 217e3d74329Smrg R128InfoPtr info = R128PTR(pScrn); 218e3d74329Smrg 219e3d74329Smrg#ifdef HAVE_XAA_H 220e3d74329Smrg if (info->accel) info->accel->Sync(pScrn); 221e3d74329Smrg#endif 222e3d74329Smrg#ifdef USE_EXA 223e3d74329Smrg if (info->ExaDriver) exaWaitSync(pScreen); 224e3d74329Smrg#endif 225e3d74329Smrg 226e3d74329Smrg return FALSE; 227e3d74329Smrg} 228e3d74329Smrg 229e3d74329Smrgstatic void r128_crtc_unlock(xf86CrtcPtr crtc) 230e3d74329Smrg{ 231e3d74329Smrg ScrnInfoPtr pScrn = crtc->scrn; 232e3d74329Smrg ScreenPtr pScreen = xf86ScrnToScreen(pScrn); 233e3d74329Smrg R128InfoPtr info = R128PTR(pScrn); 234e3d74329Smrg 235e3d74329Smrg#ifdef HAVE_XAA_H 236e3d74329Smrg if (info->accel) info->accel->Sync(pScrn); 237e3d74329Smrg#endif 238e3d74329Smrg#ifdef USE_EXA 239e3d74329Smrg if (info->ExaDriver) exaWaitSync(pScreen); 240e3d74329Smrg#endif 241e3d74329Smrg} 242e3d74329Smrg 243e3d74329Smrgstatic void *r128_crtc_shadow_allocate(xf86CrtcPtr crtc, int width, int height) 244e3d74329Smrg{ 245e3d74329Smrg ScrnInfoPtr pScrn = crtc->scrn; 246e3d74329Smrg R128InfoPtr info = R128PTR(pScrn); 247e3d74329Smrg 248e3d74329Smrg R128CrtcPrivatePtr r128_crtc = crtc->driver_private; 249e3d74329Smrg unsigned long rotate_offset = 0; 250e3d74329Smrg unsigned long rotate_pitch; 251e3d74329Smrg int cpp = pScrn->bitsPerPixel / 8; 252e3d74329Smrg int align = 4096; 253e3d74329Smrg int size; 254e3d74329Smrg 255e3d74329Smrg rotate_pitch = pScrn->displayWidth * cpp; 256e3d74329Smrg size = rotate_pitch * height; 257e3d74329Smrg rotate_offset = R128AllocateMemory(pScrn, &(r128_crtc->rotate_mem), size, align, TRUE); 258e3d74329Smrg 259e3d74329Smrg /* If allocations failed or if there was no accel. */ 260e3d74329Smrg if (rotate_offset == 0) 261e3d74329Smrg return NULL; 262e3d74329Smrg 263e3d74329Smrg return info->FB + rotate_offset; 264e3d74329Smrg} 265e3d74329Smrg 266e3d74329Smrgstatic PixmapPtr r128_crtc_shadow_create(xf86CrtcPtr crtc, void *data, int width, int height) 267e3d74329Smrg{ 268e3d74329Smrg ScrnInfoPtr pScrn = crtc->scrn; 269e3d74329Smrg PixmapPtr rotate_pixmap; 270e3d74329Smrg unsigned long rotate_pitch; 271e3d74329Smrg int cpp = pScrn->bitsPerPixel / 8; 272e3d74329Smrg 273e3d74329Smrg if (!data) data = r128_crtc_shadow_allocate(crtc, width, height); 274e3d74329Smrg 275e3d74329Smrg rotate_pitch = pScrn->displayWidth * cpp; 276e3d74329Smrg rotate_pixmap = GetScratchPixmapHeader(xf86ScrnToScreen(pScrn), 277e3d74329Smrg width, height, 278e3d74329Smrg pScrn->depth, 279e3d74329Smrg pScrn->bitsPerPixel, 280e3d74329Smrg rotate_pitch, 281e3d74329Smrg data); 282e3d74329Smrg 283e3d74329Smrg if (rotate_pixmap == NULL) { 284e3d74329Smrg xf86DrvMsg(pScrn->scrnIndex, X_ERROR, 285e3d74329Smrg "Couldn't allocate shadow memory for rotated CRTC\n"); 286e3d74329Smrg return NULL; 287e3d74329Smrg } 288e3d74329Smrg 289e3d74329Smrg return rotate_pixmap; 290e3d74329Smrg} 291e3d74329Smrg 292e3d74329Smrgstatic void r128_crtc_shadow_destroy(xf86CrtcPtr crtc, PixmapPtr rotate_pixmap, void *data) 293e3d74329Smrg{ 294e3d74329Smrg ScrnInfoPtr pScrn = crtc->scrn; 295e3d74329Smrg ScreenPtr pScreen = xf86ScrnToScreen(pScrn); 296e3d74329Smrg R128InfoPtr info = R128PTR(pScrn); 297e3d74329Smrg 298e3d74329Smrg R128CrtcPrivatePtr r128_crtc = crtc->driver_private; 299e3d74329Smrg 300e3d74329Smrg if (rotate_pixmap) FreeScratchPixmapHeader(rotate_pixmap); 301e3d74329Smrg 302e3d74329Smrg if (data && r128_crtc->rotate_mem != NULL) { 303e3d74329Smrg#ifdef USE_EXA 304e3d74329Smrg if (info->ExaDriver) 305e3d74329Smrg exaOffscreenFree(pScreen, (ExaOffscreenArea *) r128_crtc->rotate_mem); 306e3d74329Smrg#endif 307e3d74329Smrg#ifdef HAVE_XAA_H 308e3d74329Smrg if (info->accel) 309e3d74329Smrg xf86FreeOffscreenLinear((FBLinearPtr) r128_crtc->rotate_mem); 310e3d74329Smrg#endif 311e3d74329Smrg r128_crtc->rotate_mem = NULL; 312e3d74329Smrg } 313e3d74329Smrg} 314e3d74329Smrg 315e3d74329Smrgstatic const xf86CrtcFuncsRec r128_crtc_funcs = { 316e3d74329Smrg .dpms = r128_crtc_dpms, 317e3d74329Smrg .save = NULL, 318e3d74329Smrg .restore = NULL, 319e3d74329Smrg .mode_fixup = r128_crtc_mode_fixup, 320e3d74329Smrg .prepare = r128_crtc_mode_prepare, 321e3d74329Smrg .mode_set = r128_crtc_mode_set, 322e3d74329Smrg .commit = r128_crtc_mode_commit, 323e3d74329Smrg .gamma_set = r128_crtc_gamma_set, 324e3d74329Smrg .lock = r128_crtc_lock, 325e3d74329Smrg .unlock = r128_crtc_unlock, 326e3d74329Smrg .shadow_create = r128_crtc_shadow_create, 327e3d74329Smrg .shadow_allocate = r128_crtc_shadow_allocate, 328e3d74329Smrg .shadow_destroy = r128_crtc_shadow_destroy, 329e3d74329Smrg .set_cursor_colors = r128_crtc_set_cursor_colors, 330e3d74329Smrg .set_cursor_position = r128_crtc_set_cursor_position, 331e3d74329Smrg .show_cursor = r128_crtc_show_cursor, 332e3d74329Smrg .hide_cursor = r128_crtc_hide_cursor, 333e3d74329Smrg .load_cursor_image = r128_crtc_load_cursor_image, 334e3d74329Smrg .destroy = NULL, 335e3d74329Smrg}; 336e3d74329Smrg 337e3d74329SmrgBool R128AllocateControllers(ScrnInfoPtr pScrn) 338e3d74329Smrg{ 339e3d74329Smrg R128EntPtr pR128Ent = R128EntPriv(pScrn); 340e3d74329Smrg 341e3d74329Smrg if (pR128Ent->Controller[0]) 342e3d74329Smrg return TRUE; 343e3d74329Smrg 344e3d74329Smrg pR128Ent->pCrtc[0] = xf86CrtcCreate(pScrn, &r128_crtc_funcs); 345e3d74329Smrg if (!pR128Ent->pCrtc[0]) 346e3d74329Smrg return FALSE; 347e3d74329Smrg 348e3d74329Smrg pR128Ent->Controller[0] = xnfcalloc(sizeof(R128CrtcPrivateRec), 1); 349e3d74329Smrg if (!pR128Ent->Controller[0]) 350e3d74329Smrg return FALSE; 351e3d74329Smrg 352e3d74329Smrg pR128Ent->pCrtc[0]->driver_private = pR128Ent->Controller[0]; 353e3d74329Smrg pR128Ent->Controller[0]->crtc_id = 0; 354e3d74329Smrg 355e3d74329Smrg if (!pR128Ent->HasCRTC2) 356e3d74329Smrg return TRUE; 357e3d74329Smrg 358e3d74329Smrg pR128Ent->pCrtc[1] = xf86CrtcCreate(pScrn, &r128_crtc_funcs); 359e3d74329Smrg if (!pR128Ent->pCrtc[1]) 360e3d74329Smrg return FALSE; 361e3d74329Smrg 362e3d74329Smrg pR128Ent->Controller[1] = xnfcalloc(sizeof(R128CrtcPrivateRec), 1); 363e3d74329Smrg if (!pR128Ent->Controller[1]) { 364e3d74329Smrg free(pR128Ent->Controller[0]); 365e3d74329Smrg return FALSE; 366e3d74329Smrg } 367e3d74329Smrg 368e3d74329Smrg pR128Ent->pCrtc[1]->driver_private = pR128Ent->Controller[1]; 369e3d74329Smrg pR128Ent->Controller[1]->crtc_id = 1; 370e3d74329Smrg 371e3d74329Smrg return TRUE; 372e3d74329Smrg} 373e3d74329Smrg 374e3d74329Smrgvoid R128Blank(ScrnInfoPtr pScrn) 375e3d74329Smrg{ 376e3d74329Smrg xf86CrtcConfigPtr xf86_config = XF86_CRTC_CONFIG_PTR(pScrn); 377e3d74329Smrg xf86OutputPtr output; 378e3d74329Smrg xf86CrtcPtr crtc; 379e3d74329Smrg int o, c; 380e3d74329Smrg 381e3d74329Smrg for (c = 0; c < xf86_config->num_crtc; c++) { 382e3d74329Smrg crtc = xf86_config->crtc[c]; 383e3d74329Smrg for (o = 0; o < xf86_config->num_output; o++) { 384e3d74329Smrg output = xf86_config->output[o]; 385e3d74329Smrg if (output->crtc != crtc) 386e3d74329Smrg continue; 387e3d74329Smrg 388e3d74329Smrg output->funcs->dpms(output, DPMSModeOff); 389e3d74329Smrg } 390e3d74329Smrg crtc->funcs->dpms(crtc, DPMSModeOff); 391e3d74329Smrg } 392e3d74329Smrg} 393e3d74329Smrg 394e3d74329Smrgvoid R128Unblank(ScrnInfoPtr pScrn) 395e3d74329Smrg{ 396e3d74329Smrg xf86CrtcConfigPtr xf86_config = XF86_CRTC_CONFIG_PTR(pScrn); 397e3d74329Smrg xf86OutputPtr output; 398e3d74329Smrg xf86CrtcPtr crtc; 399e3d74329Smrg int o, c; 400e3d74329Smrg 401e3d74329Smrg for (c = 0; c < xf86_config->num_crtc; c++) { 402e3d74329Smrg crtc = xf86_config->crtc[c]; 403e3d74329Smrg if (!crtc->enabled) 404e3d74329Smrg continue; 405e3d74329Smrg crtc->funcs->dpms(crtc, DPMSModeOn); 406e3d74329Smrg for (o = 0; o < xf86_config->num_output; o++) { 407e3d74329Smrg output = xf86_config->output[o]; 408e3d74329Smrg if (output->crtc != crtc) 409e3d74329Smrg continue; 410e3d74329Smrg 411e3d74329Smrg output->funcs->dpms(output, DPMSModeOn); 412e3d74329Smrg } 413e3d74329Smrg } 414e3d74329Smrg} 415