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