2 * Copyright 2003 NVIDIA, Corporation
3 * Copyright 2006 Dave Airlie
4 * Copyright 2007 Maarten Maathuis
5 * Copyright 2007-2008 Stuart Bennett
7 * Permission is hereby granted, free of charge, to any person obtaining a
8 * copy of this software and associated documentation files (the "Software"),
9 * to deal in the Software without restriction, including without limitation
10 * the rights to use, copy, modify, merge, publish, distribute, sublicense,
11 * and/or sell copies of the Software, and to permit persons to whom the
12 * Software is furnished to do so, subject to the following conditions:
14 * The above copyright notice and this permission notice (including the next
15 * paragraph) shall be included in all copies or substantial portions of the
18 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
19 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
20 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
21 * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
22 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
23 * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
24 * DEALINGS IN THE SOFTWARE.
38 #include "mipointer.h"
39 #include "windowstr.h"
41 #include <X11/extensions/render.h>
42 #include "X11/Xatom.h"
45 #include "nv_include.h"
47 static int nv_output_ramdac_offset(struct nouveau_encoder *nv_encoder)
51 if (nv_encoder->dcb->or & (8 | OUTPUT_C))
53 if (nv_encoder->dcb->or & (8 | OUTPUT_B))
59 static void dpms_update_fp_control(ScrnInfoPtr pScrn, struct nouveau_encoder *nv_encoder, xf86CrtcPtr crtc, int mode)
61 NVPtr pNv = NVPTR(pScrn);
62 struct nouveau_crtc *nv_crtc;
64 xf86CrtcConfigPtr xf86_config = XF86_CRTC_CONFIG_PTR(pScrn);
67 if (mode == DPMSModeOn) {
68 nv_crtc = to_nouveau_crtc(crtc);
69 regp = &pNv->ModeReg.crtc_reg[nv_crtc->head];
71 nv_crtc->fp_users |= 1 << nv_encoder->dcb->index;
72 NVWriteRAMDAC(pNv, nv_crtc->head, NV_RAMDAC_FP_CONTROL, regp->fp_control & ~0x20000022);
74 for (i = 0; i <= pNv->twoHeads; i++) {
75 nv_crtc = to_nouveau_crtc(xf86_config->crtc[i]);
76 regp = &pNv->ModeReg.crtc_reg[nv_crtc->head];
78 nv_crtc->fp_users &= ~(1 << nv_encoder->dcb->index);
79 if (!nv_crtc->fp_users) {
80 /* cut the FP output */
81 regp->fp_control |= 0x20000022;
82 NVWriteRAMDAC(pNv, nv_crtc->head, NV_RAMDAC_FP_CONTROL, regp->fp_control);
87 static void nv_digital_output_prepare_sel_clk(NVPtr pNv, struct nouveau_encoder *nv_encoder, int head);
90 lvds_encoder_dpms(ScrnInfoPtr pScrn, struct nouveau_encoder *nv_encoder, xf86CrtcPtr crtc, int mode)
92 NVPtr pNv = NVPTR(pScrn);
94 xf86DrvMsg(pScrn->scrnIndex, X_INFO, "lvds_encoder_dpms is called with mode %d\n", mode);
96 if (nv_encoder->last_dpms == mode)
98 nv_encoder->last_dpms = mode;
100 if (nv_encoder->dcb->lvdsconf.use_power_scripts) {
101 /* when removing an output, crtc may not be set, but PANEL_OFF must still be run */
102 int head = nv_get_digital_bound_head(pNv, nv_encoder->dcb->or);
103 int pclk = nv_encoder->native_mode->Clock;
106 head = to_nouveau_crtc(crtc)->head;
108 if (mode == DPMSModeOn)
109 call_lvds_script(pScrn, nv_encoder->dcb, head, LVDS_PANEL_ON, pclk);
111 call_lvds_script(pScrn, nv_encoder->dcb, head, LVDS_PANEL_OFF, pclk);
114 dpms_update_fp_control(pScrn, nv_encoder, crtc, mode);
116 if (mode == DPMSModeOn)
117 nv_digital_output_prepare_sel_clk(pNv, nv_encoder, to_nouveau_crtc(crtc)->head);
119 pNv->ModeReg.sel_clk = NVReadRAMDAC(pNv, 0, NV_RAMDAC_SEL_CLK);
120 pNv->ModeReg.sel_clk &= ~0xf0;
122 NVWriteRAMDAC(pNv, 0, NV_RAMDAC_SEL_CLK, pNv->ModeReg.sel_clk);
126 vga_encoder_dpms(ScrnInfoPtr pScrn, struct nouveau_encoder *nv_encoder, xf86CrtcPtr crtc, int mode)
128 NVPtr pNv = NVPTR(pScrn);
130 xf86DrvMsg(pScrn->scrnIndex, X_INFO, "vga_encoder_dpms is called with mode %d\n", mode);
132 if (nv_encoder->last_dpms == mode)
134 nv_encoder->last_dpms = mode;
137 uint32_t outputval = NVReadRAMDAC(pNv, 0, NV_RAMDAC_OUTPUT + nv_output_ramdac_offset(nv_encoder));
139 if (mode == DPMSModeOff)
140 NVWriteRAMDAC(pNv, 0, NV_RAMDAC_OUTPUT + nv_output_ramdac_offset(nv_encoder),
141 outputval & ~NV_RAMDAC_OUTPUT_DAC_ENABLE);
142 else if (mode == DPMSModeOn)
143 NVWriteRAMDAC(pNv, 0, NV_RAMDAC_OUTPUT + nv_output_ramdac_offset(nv_encoder),
144 outputval | NV_RAMDAC_OUTPUT_DAC_ENABLE);
149 tmds_encoder_dpms(ScrnInfoPtr pScrn, struct nouveau_encoder *nv_encoder, xf86CrtcPtr crtc, int mode)
151 NVPtr pNv = NVPTR(pScrn);
153 xf86DrvMsg(pScrn->scrnIndex, X_INFO, "tmds_encoder_dpms is called with mode %d\n", mode);
155 if (nv_encoder->last_dpms == mode)
157 nv_encoder->last_dpms = mode;
159 dpms_update_fp_control(pScrn, nv_encoder, crtc, mode);
161 if (nv_encoder->dcb->location != LOC_ON_CHIP) {
162 struct nouveau_crtc *nv_crtc;
165 if (mode == DPMSModeOn) {
166 nv_crtc = to_nouveau_crtc(crtc);
167 NVWriteVgaCrtc(pNv, nv_crtc->head, NV_VGA_CRTCX_LCD,
168 pNv->ModeReg.crtc_reg[nv_crtc->head].CRTC[NV_VGA_CRTCX_LCD]);
170 for (i = 0; i <= pNv->twoHeads; i++)
171 NVWriteVgaCrtc(pNv, i, NV_VGA_CRTCX_LCD,
172 NVReadVgaCrtc(pNv, i, NV_VGA_CRTCX_LCD) & ~((nv_encoder->dcb->or << 4) & 0x30));
176 static void nv_output_dpms(xf86OutputPtr output, int mode)
178 struct nouveau_encoder *nv_encoder = to_nouveau_encoder(output);
179 ScrnInfoPtr pScrn = output->scrn;
180 xf86CrtcPtr crtc = output->crtc;
181 void (* const encoder_dpms[4])(ScrnInfoPtr, struct nouveau_encoder *, xf86CrtcPtr, int) =
182 /* index matches DCB type */
183 { vga_encoder_dpms, NULL, tmds_encoder_dpms, lvds_encoder_dpms };
185 encoder_dpms[nv_encoder->dcb->type](pScrn, nv_encoder, crtc, mode);
188 static void nv_output_save(xf86OutputPtr output)
190 struct nouveau_encoder *nv_encoder = to_nouveau_encoder(output);
191 ScrnInfoPtr pScrn = output->scrn;
192 NVPtr pNv = NVPTR(pScrn);
194 xf86DrvMsg(pScrn->scrnIndex, X_INFO, "nv_output_save is called.\n");
196 if (pNv->twoHeads && nv_encoder->dcb->type == OUTPUT_ANALOG)
197 nv_encoder->restore.output = NVReadRAMDAC(pNv, 0, NV_RAMDAC_OUTPUT + nv_output_ramdac_offset(nv_encoder));
198 if (nv_encoder->dcb->type == OUTPUT_TMDS || nv_encoder->dcb->type == OUTPUT_LVDS)
199 nv_encoder->restore.head = nv_get_digital_bound_head(pNv, nv_encoder->dcb->or);
202 static uint32_t nv_get_clock_from_crtc(ScrnInfoPtr pScrn, RIVA_HW_STATE *state, uint8_t crtc)
204 NVPtr pNv = NVPTR(pScrn);
205 struct pll_lims pll_lim;
206 uint32_t vplla = state->crtc_reg[crtc].vpll_a;
207 uint32_t vpllb = state->crtc_reg[crtc].vpll_b;
208 bool nv40_single = pNv->Architecture == 0x40 &&
209 ((!crtc && state->reg580 & NV_RAMDAC_580_VPLL1_ACTIVE) ||
210 (crtc && state->reg580 & NV_RAMDAC_580_VPLL2_ACTIVE));
212 if (!get_pll_limits(pScrn, crtc ? VPLL2 : VPLL1, &pll_lim))
215 return nv_decode_pll_highregs(pNv, vplla, vpllb, nv40_single, pll_lim.refclk);
218 static void nv_output_restore(xf86OutputPtr output)
220 struct nouveau_encoder *nv_encoder = to_nouveau_encoder(output);
221 ScrnInfoPtr pScrn = output->scrn;
222 NVPtr pNv = NVPTR(pScrn);
223 int head = nv_encoder->restore.head;
225 xf86DrvMsg(pScrn->scrnIndex, X_INFO, "nv_output_restore is called.\n");
227 if (pNv->twoHeads && nv_encoder->dcb->type == OUTPUT_ANALOG)
228 NVWriteRAMDAC(pNv, 0,
229 NV_RAMDAC_OUTPUT + nv_output_ramdac_offset(nv_encoder),
230 nv_encoder->restore.output);
231 if (nv_encoder->dcb->type == OUTPUT_LVDS)
232 call_lvds_script(pScrn, nv_encoder->dcb, head, LVDS_PANEL_ON,
233 nv_encoder->native_mode->Clock);
234 if (nv_encoder->dcb->type == OUTPUT_TMDS) {
235 int clock = nv_get_clock_from_crtc(pScrn, &pNv->SavedReg, head);
237 run_tmds_table(pScrn, nv_encoder->dcb, head, clock);
240 nv_encoder->last_dpms = NV_DPMS_CLEARED;
243 static int nv_output_mode_valid(xf86OutputPtr output, DisplayModePtr mode)
245 struct nouveau_encoder *nv_encoder = to_nouveau_encoder(output);
246 NVPtr pNv = NVPTR(output->scrn);
248 if (!output->doubleScanAllowed && mode->Flags & V_DBLSCAN)
249 return MODE_NO_DBLESCAN;
250 if (!output->interlaceAllowed && mode->Flags & V_INTERLACE)
251 return MODE_NO_INTERLACE;
253 if (nv_encoder->dcb->type == OUTPUT_ANALOG) {
254 if (mode->Clock > (pNv->twoStagePLL ? 400000 : 350000))
255 return MODE_CLOCK_HIGH;
256 if (mode->Clock < 12000)
257 return MODE_CLOCK_LOW;
259 if (nv_encoder->dcb->type == OUTPUT_LVDS || nv_encoder->dcb->type == OUTPUT_TMDS)
260 /* No modes > panel's native res */
261 if (mode->HDisplay > nv_encoder->native_mode->HDisplay ||
262 mode->VDisplay > nv_encoder->native_mode->VDisplay)
264 if (nv_encoder->dcb->type == OUTPUT_TMDS) {
265 if (nv_encoder->dcb->duallink_possible) {
266 if (mode->Clock > 330000) /* 2x165 MHz */
267 return MODE_CLOCK_HIGH;
269 if (mode->Clock > 165000) /* 165 MHz */
270 return MODE_CLOCK_HIGH;
278 nv_output_mode_fixup(xf86OutputPtr output, DisplayModePtr mode,
279 DisplayModePtr adjusted_mode)
281 struct nouveau_encoder *nv_encoder = to_nouveau_encoder(output);
282 ScrnInfoPtr pScrn = output->scrn;
284 xf86DrvMsg(pScrn->scrnIndex, X_INFO, "nv_output_mode_fixup is called.\n");
286 /* For internal panels and gpu scaling on DVI we need the native mode */
287 if (nv_encoder->dcb->type == OUTPUT_LVDS ||
288 (nv_encoder->dcb->type == OUTPUT_TMDS && nv_encoder->scaling_mode != SCALE_PANEL)) {
289 adjusted_mode->HDisplay = nv_encoder->native_mode->HDisplay;
290 adjusted_mode->HSkew = nv_encoder->native_mode->HSkew;
291 adjusted_mode->HSyncStart = nv_encoder->native_mode->HSyncStart;
292 adjusted_mode->HSyncEnd = nv_encoder->native_mode->HSyncEnd;
293 adjusted_mode->HTotal = nv_encoder->native_mode->HTotal;
294 adjusted_mode->VDisplay = nv_encoder->native_mode->VDisplay;
295 adjusted_mode->VScan = nv_encoder->native_mode->VScan;
296 adjusted_mode->VSyncStart = nv_encoder->native_mode->VSyncStart;
297 adjusted_mode->VSyncEnd = nv_encoder->native_mode->VSyncEnd;
298 adjusted_mode->VTotal = nv_encoder->native_mode->VTotal;
299 adjusted_mode->Clock = nv_encoder->native_mode->Clock;
300 adjusted_mode->Flags = nv_encoder->native_mode->Flags;
302 xf86SetModeCrtc(adjusted_mode, INTERLACE_HALVE_V);
309 nv_output_mode_set(xf86OutputPtr output, DisplayModePtr mode, DisplayModePtr adjusted_mode)
311 struct nouveau_encoder *nv_encoder = to_nouveau_encoder(output);
312 ScrnInfoPtr pScrn = output->scrn;
313 NVPtr pNv = NVPTR(pScrn);
314 struct nouveau_crtc *nv_crtc = to_nouveau_crtc(output->crtc);
316 xf86DrvMsg(pScrn->scrnIndex, X_INFO, "nv_output_mode_set is called.\n");
318 if (pNv->twoHeads && nv_encoder->dcb->type == OUTPUT_ANALOG)
319 /* bit 16-19 are bits that are set on some G70 cards,
320 * but don't seem to have much effect */
321 NVWriteRAMDAC(pNv, 0, NV_RAMDAC_OUTPUT + nv_output_ramdac_offset(nv_encoder),
322 nv_crtc->head << 8 | NV_RAMDAC_OUTPUT_DAC_ENABLE);
323 if (nv_encoder->dcb->type == OUTPUT_TMDS)
324 run_tmds_table(pScrn, nv_encoder->dcb, nv_crtc->head, adjusted_mode->Clock);
325 else if (nv_encoder->dcb->type == OUTPUT_LVDS)
326 call_lvds_script(pScrn, nv_encoder->dcb, nv_crtc->head, LVDS_RESET, adjusted_mode->Clock);
328 /* This could use refinement for flatpanels, but it should work this way */
329 if (pNv->NVArch < 0x44)
330 NVWriteRAMDAC(pNv, 0, NV_RAMDAC_TEST_CONTROL + nv_output_ramdac_offset(nv_encoder), 0xf0000000);
332 NVWriteRAMDAC(pNv, 0, NV_RAMDAC_TEST_CONTROL + nv_output_ramdac_offset(nv_encoder), 0x00100000);
336 nv_load_detect(ScrnInfoPtr pScrn, struct nouveau_encoder *nv_encoder)
338 NVPtr pNv = NVPTR(pScrn);
339 uint32_t testval, regoffset = nv_output_ramdac_offset(nv_encoder);
340 uint32_t saved_powerctrl_2 = 0, saved_powerctrl_4 = 0, saved_routput, saved_rtest_ctrl, temp;
343 #define RGB_TEST_DATA(r,g,b) (r << 0 | g << 10 | b << 20)
344 testval = RGB_TEST_DATA(0x140, 0x140, 0x140); /* 0x94050140 */
345 if (pNv->VBIOS.dactestval)
346 testval = pNv->VBIOS.dactestval;
348 saved_rtest_ctrl = NVReadRAMDAC(pNv, 0, NV_RAMDAC_TEST_CONTROL + regoffset);
349 NVWriteRAMDAC(pNv, 0, NV_RAMDAC_TEST_CONTROL + regoffset, saved_rtest_ctrl & ~0x00010000);
351 if (pNv->NVArch >= 0x17) {
352 saved_powerctrl_2 = nvReadMC(pNv, NV_PBUS_POWERCTRL_2);
354 nvWriteMC(pNv, NV_PBUS_POWERCTRL_2, saved_powerctrl_2 & 0xd7ffffff);
355 if (regoffset == 0x68) {
356 saved_powerctrl_4 = nvReadMC(pNv, NV_PBUS_POWERCTRL_4);
357 nvWriteMC(pNv, NV_PBUS_POWERCTRL_4, saved_powerctrl_4 & 0xffffffcf);
363 saved_routput = NVReadRAMDAC(pNv, 0, NV_RAMDAC_OUTPUT + regoffset);
364 /* nv driver and nv31 use 0xfffffeee
365 * nv34 and 6600 use 0xfffffece */
366 NVWriteRAMDAC(pNv, 0, NV_RAMDAC_OUTPUT + regoffset, saved_routput & 0xfffffece);
369 temp = NVReadRAMDAC(pNv, 0, NV_RAMDAC_OUTPUT + regoffset);
370 NVWriteRAMDAC(pNv, 0, NV_RAMDAC_OUTPUT + regoffset, temp | 1);
372 /* no regoffset on purpose */
373 NVWriteRAMDAC(pNv, 0, NV_RAMDAC_TEST_DATA, 1 << 31 | testval);
374 temp = NVReadRAMDAC(pNv, 0, NV_RAMDAC_TEST_CONTROL);
375 NVWriteRAMDAC(pNv, 0, NV_RAMDAC_TEST_CONTROL, temp | 0x1000);
378 present = NVReadRAMDAC(pNv, 0, NV_RAMDAC_TEST_CONTROL + regoffset) & (1 << 28);
380 /* no regoffset on purpose */
381 temp = NVReadRAMDAC(pNv, 0, NV_RAMDAC_TEST_CONTROL);
382 NVWriteRAMDAC(pNv, 0, NV_RAMDAC_TEST_CONTROL, temp & 0xffffefff);
383 NVWriteRAMDAC(pNv, 0, NV_RAMDAC_TEST_DATA, 0);
385 /* bios does something more complex for restoring, but I think this is good enough */
386 NVWriteRAMDAC(pNv, 0, NV_RAMDAC_OUTPUT + regoffset, saved_routput);
387 NVWriteRAMDAC(pNv, 0, NV_RAMDAC_TEST_CONTROL + regoffset, saved_rtest_ctrl);
388 if (pNv->NVArch >= 0x17) {
389 if (regoffset == 0x68)
390 nvWriteMC(pNv, NV_PBUS_POWERCTRL_4, saved_powerctrl_4);
391 nvWriteMC(pNv, NV_PBUS_POWERCTRL_2, saved_powerctrl_2);
395 xf86DrvMsg(pScrn->scrnIndex, X_INFO, "Load detected on output %c\n", '@' + ffs(nv_encoder->dcb->or));
402 static xf86OutputStatus
403 nv_output_detect(xf86OutputPtr output)
405 struct nouveau_connector *nv_connector = to_nouveau_connector(output);
406 ScrnInfoPtr pScrn = output->scrn;
407 NVPtr pNv = NVPTR(pScrn);
408 struct nouveau_encoder *nv_encoder = to_nouveau_encoder(output);
410 xf86DrvMsg(pScrn->scrnIndex, X_INFO, "nv_output_detect is called.\n");
412 if (nv_connector->pDDCBus) {
413 if ((nv_connector->mon = xf86OutputGetEDID(output, nv_connector->pDDCBus)) &&
414 ((nv_connector->mon->features.input_type && nv_encoder->dcb->type == OUTPUT_ANALOG) ||
415 (!nv_connector->mon->features.input_type && nv_encoder->dcb->type == OUTPUT_TMDS))) {
416 xfree(nv_connector->mon);
417 nv_connector->mon = NULL;
419 xf86OutputSetEDID(output, nv_connector->mon);
420 if (nv_connector->mon)
421 return XF86OutputStatusConnected;
424 if (nv_encoder->dcb->type == OUTPUT_ANALOG) {
425 /* we don't have a load det function for early cards */
426 if (!pNv->twoHeads || pNv->NVArch == 0x11)
427 return XF86OutputStatusUnknown;
428 else if (pNv->twoHeads && nv_load_detect(pScrn, nv_encoder))
429 return XF86OutputStatusConnected;
430 } else if (nv_encoder->dcb->type == OUTPUT_LVDS) {
431 if (nv_encoder->dcb->lvdsconf.use_straps_for_mode &&
432 pNv->VBIOS.fp.native_mode)
433 return XF86OutputStatusConnected;
434 if (pNv->VBIOS.fp.edid) {
435 xf86DrvMsg(pScrn->scrnIndex, X_INFO,
436 "Will use hardcoded BIOS FP EDID\n");
437 nv_connector->mon = xf86InterpretEDID(pScrn->scrnIndex,
439 xf86OutputSetEDID(output, nv_connector->mon);
440 return XF86OutputStatusConnected;
444 return XF86OutputStatusDisconnected;
447 static DisplayModePtr
448 get_native_mode_from_edid(xf86OutputPtr output, DisplayModePtr edid_modes)
450 struct nouveau_connector *nv_connector = to_nouveau_connector(output);
451 struct nouveau_encoder *nv_encoder = to_nouveau_encoder(output);
452 ScrnInfoPtr pScrn = output->scrn;
453 int max_h_active = 0, max_v_active = 0;
457 for (i = 0; i < DET_TIMINGS; i++) {
458 /* We only look at detailed timings atm */
459 if (nv_connector->mon->det_mon[i].type != DT)
461 /* Selecting only based on width ok? */
462 if (nv_connector->mon->det_mon[i].section.d_timings.h_active > max_h_active) {
463 max_h_active = nv_connector->mon->det_mon[i].section.d_timings.h_active;
464 max_v_active = nv_connector->mon->det_mon[i].section.d_timings.v_active;
467 if (!(max_h_active && max_v_active)) {
468 xf86DrvMsg(pScrn->scrnIndex, X_ERROR, "No EDID detailed timings available, bailing out.\n");
472 if (nv_encoder->native_mode) {
473 xfree(nv_encoder->native_mode);
474 nv_encoder->native_mode = NULL;
477 for (mode = edid_modes; mode != NULL; mode = mode->next) {
478 if (mode->HDisplay == max_h_active &&
479 mode->VDisplay == max_v_active) {
480 /* Take the preferred mode when it exists. */
481 if (mode->type & M_T_PREFERRED) {
482 nv_encoder->native_mode = xf86DuplicateMode(mode);
485 /* Find the highest refresh mode otherwise. */
486 if (!nv_encoder->native_mode || (mode->VRefresh > nv_encoder->native_mode->VRefresh)) {
487 if (nv_encoder->native_mode)
488 xfree(nv_encoder->native_mode);
489 mode->type |= M_T_PREFERRED;
490 nv_encoder->native_mode = xf86DuplicateMode(mode);
495 return nv_encoder->native_mode;
498 static DisplayModePtr
499 nv_output_get_edid_modes(xf86OutputPtr output)
501 struct nouveau_encoder *nv_encoder = to_nouveau_encoder(output);
502 ScrnInfoPtr pScrn = output->scrn;
503 DisplayModePtr edid_modes;
505 xf86DrvMsg(pScrn->scrnIndex, X_INFO, "nv_output_get_edid_modes is called.\n");
507 if (!(edid_modes = xf86OutputGetEDIDModes(output)))
510 if (nv_encoder->dcb->type == OUTPUT_TMDS || nv_encoder->dcb->type == OUTPUT_LVDS)
511 if (!get_native_mode_from_edid(output, edid_modes))
514 if (nv_encoder->dcb->type == OUTPUT_LVDS) {
515 static bool dual_link_correction_done = false;
517 if (!dual_link_correction_done) {
518 parse_lvds_manufacturer_table(pScrn, &NVPTR(pScrn)->VBIOS, nv_encoder->native_mode->Clock);
519 dual_link_correction_done = true;
527 nv_output_destroy (xf86OutputPtr output)
529 struct nouveau_connector *nv_connector = to_nouveau_connector(output);
530 struct nouveau_encoder *nv_encoder;
531 ScrnInfoPtr pScrn = output->scrn;
533 xf86DrvMsg(pScrn->scrnIndex, X_INFO, "nv_output_destroy is called.\n");
538 if (nv_connector->mon)
539 xfree(nv_connector->mon);
540 nv_encoder = to_nouveau_encoder(output);
541 if (nv_encoder->native_mode)
542 xfree(nv_encoder->native_mode);
546 static void nv_digital_output_prepare_sel_clk(NVPtr pNv, struct nouveau_encoder *nv_encoder, int head)
548 NVRegPtr state = &pNv->ModeReg;
549 uint32_t bits1618 = nv_encoder->dcb->or & OUTPUT_A ? 0x10000 : 0x40000;
551 if (nv_encoder->dcb->location != LOC_ON_CHIP)
554 /* SEL_CLK is only used on the primary ramdac
555 * It toggles spread spectrum PLL output and sets the bindings of PLLs
556 * to heads on digital outputs
559 state->sel_clk |= bits1618;
561 state->sel_clk &= ~bits1618;
564 * bit 0 NVClk spread spectrum on/off
565 * bit 2 MemClk spread spectrum on/off
566 * bit 4 PixClk1 spread spectrum on/off toggle
567 * bit 6 PixClk2 spread spectrum on/off toggle
569 * nv40 (observations from bios behaviour and mmio traces):
570 * bits 4&6 as for nv30
571 * bits 5&7 head dependent as for bits 4&6, but do not appear with 4&6;
572 * maybe a different spread mode
573 * bits 8&10 seen on dual-link dvi outputs, purpose unknown (set by POST scripts)
574 * The logic behind turning spread spectrum on/off in the first place,
575 * and which bit-pair to use, is unclear on nv40 (for earlier cards, the fp table
576 * entry has the necessary info)
578 if (nv_encoder->dcb->type == OUTPUT_LVDS && pNv->SavedReg.sel_clk & 0xf0) {
579 int shift = (pNv->SavedReg.sel_clk & 0x50) ? 0 : 1;
581 state->sel_clk &= ~0xf0;
582 state->sel_clk |= (head ? 0x40 : 0x10) << shift;
587 nv_output_prepare(xf86OutputPtr output)
589 struct nouveau_encoder *nv_encoder = to_nouveau_encoder(output);
590 ScrnInfoPtr pScrn = output->scrn;
591 NVPtr pNv = NVPTR(output->scrn);
592 struct nouveau_crtc *nv_crtc = to_nouveau_crtc(output->crtc);
593 NVCrtcRegPtr regp = &pNv->ModeReg.crtc_reg[nv_crtc->head];
595 xf86DrvMsg(pScrn->scrnIndex, X_INFO, "nv_output_prepare is called.\n");
597 output->funcs->dpms(output, DPMSModeOff);
599 /* calculate some output specific CRTC regs now, so that they can be written in nv_crtc_set_mode */
600 if (nv_encoder->dcb->type == OUTPUT_LVDS || nv_encoder->dcb->type == OUTPUT_TMDS)
601 nv_digital_output_prepare_sel_clk(pNv, nv_encoder, nv_crtc->head);
603 /* Some NV4x have unknown values (0x3f, 0x50, 0x54, 0x6b, 0x79, 0x7f etc.) which we don't alter */
604 if (!(regp->CRTC[NV_VGA_CRTCX_LCD] & 0x44)) {
605 if (nv_encoder->dcb->type == OUTPUT_LVDS || nv_encoder->dcb->type == OUTPUT_TMDS) {
606 regp->CRTC[NV_VGA_CRTCX_LCD] &= ~0x30;
607 regp->CRTC[NV_VGA_CRTCX_LCD] |= 0x3;
608 if (nv_crtc->head == 0)
609 regp->CRTC[NV_VGA_CRTCX_LCD] |= 0x8;
611 regp->CRTC[NV_VGA_CRTCX_LCD] &= ~0x8;
612 if (nv_encoder->dcb->location != LOC_ON_CHIP)
613 regp->CRTC[NV_VGA_CRTCX_LCD] |= (nv_encoder->dcb->or << 4) & 0x30;
615 regp->CRTC[NV_VGA_CRTCX_LCD] = 0;
620 nv_output_commit(xf86OutputPtr output)
622 struct nouveau_encoder *nv_encoder = to_nouveau_encoder(output);
623 ScrnInfoPtr pScrn = output->scrn;
624 xf86CrtcPtr crtc = output->crtc;
625 struct nouveau_crtc *nv_crtc = to_nouveau_crtc(crtc);
627 xf86DrvMsg(pScrn->scrnIndex, X_INFO, "nv_output_commit is called.\n");
629 xf86DrvMsg(pScrn->scrnIndex, X_INFO, "Output %s is running on CRTC %d using output %c\n", output->name, nv_crtc->head, '@' + ffs(nv_encoder->dcb->or));
631 output->funcs->dpms(output, DPMSModeOn);
635 * Several scaling modes exist, let the user choose.
637 #define SCALING_MODE_NAME "SCALING_MODE"
638 static const struct {
640 enum scaling_modes mode;
642 { "panel", SCALE_PANEL },
643 { "fullscreen", SCALE_FULLSCREEN },
644 { "aspect", SCALE_ASPECT },
645 { "noscale", SCALE_NOSCALE },
646 { NULL, SCALE_INVALID}
648 static Atom scaling_mode_atom;
650 #define DITHERING_MODE_NAME "DITHERING"
651 static Atom dithering_atom;
654 nv_output_create_resources(xf86OutputPtr output)
656 struct nouveau_encoder *nv_encoder = to_nouveau_encoder(output);
657 ScrnInfoPtr pScrn = output->scrn;
658 INT32 dithering_range[2] = { 0, 1 };
661 /* no properties for vga */
662 if (nv_encoder->dcb->type == OUTPUT_ANALOG)
666 * Setup scaling mode property.
668 scaling_mode_atom = MakeAtom(SCALING_MODE_NAME, sizeof(SCALING_MODE_NAME) - 1, TRUE);
670 error = RRConfigureOutputProperty(output->randr_output,
671 scaling_mode_atom, TRUE, FALSE, FALSE,
675 xf86DrvMsg(pScrn->scrnIndex, X_ERROR,
676 "RRConfigureOutputProperty error, %d\n", error);
679 char *existing_scale_name = NULL;
680 for (i = 0; scaling_mode[i].name; i++)
681 if (scaling_mode[i].mode == nv_encoder->scaling_mode)
682 existing_scale_name = scaling_mode[i].name;
684 error = RRChangeOutputProperty(output->randr_output, scaling_mode_atom,
685 XA_STRING, 8, PropModeReplace,
686 strlen(existing_scale_name),
687 existing_scale_name, FALSE, TRUE);
690 xf86DrvMsg(pScrn->scrnIndex, X_ERROR,
691 "Failed to set scaling mode, %d\n", error);
695 * Setup dithering property.
697 dithering_atom = MakeAtom(DITHERING_MODE_NAME, sizeof(DITHERING_MODE_NAME) - 1, TRUE);
699 error = RRConfigureOutputProperty(output->randr_output,
700 dithering_atom, TRUE, TRUE, FALSE,
704 xf86DrvMsg(pScrn->scrnIndex, X_ERROR,
705 "RRConfigureOutputProperty error, %d\n", error);
708 /* promote bool into int32 to make RandR DIX and big endian happy */
709 int32_t existing_dither = nv_encoder->dithering;
710 error = RRChangeOutputProperty(output->randr_output, dithering_atom,
711 XA_INTEGER, 32, PropModeReplace, 1,
712 &existing_dither, FALSE, TRUE);
715 xf86DrvMsg(pScrn->scrnIndex, X_ERROR,
716 "Failed to set dithering mode, %d\n", error);
721 nv_output_set_property(xf86OutputPtr output, Atom property,
722 RRPropertyValuePtr value)
724 struct nouveau_encoder *nv_encoder = to_nouveau_encoder(output);
726 if (property == scaling_mode_atom) {
730 if (value->type != XA_STRING || value->format != 8)
733 name = (char *) value->data;
735 /* Match a string to a scaling mode */
736 ret = nv_scaling_mode_lookup(name, value->size);
737 if (ret == SCALE_INVALID)
740 /* LVDS must always use gpu scaling. */
741 if (ret == SCALE_PANEL && nv_encoder->dcb->type == OUTPUT_LVDS)
744 nv_encoder->scaling_mode = ret;
745 } else if (property == dithering_atom) {
746 if (value->type != XA_INTEGER || value->format != 32)
749 int32_t val = *(int32_t *) value->data;
751 if (val < 0 || val > 1)
754 nv_encoder->dithering = val;
760 static const xf86OutputFuncsRec nv_output_funcs = {
761 .dpms = nv_output_dpms,
762 .save = nv_output_save,
763 .restore = nv_output_restore,
764 .mode_valid = nv_output_mode_valid,
765 .mode_fixup = nv_output_mode_fixup,
766 .mode_set = nv_output_mode_set,
767 .detect = nv_output_detect,
768 .get_modes = nv_output_get_edid_modes,
769 .destroy = nv_output_destroy,
770 .prepare = nv_output_prepare,
771 .commit = nv_output_commit,
772 .create_resources = nv_output_create_resources,
773 .set_property = nv_output_set_property,
776 static DisplayModePtr
777 nv_lvds_output_get_modes(xf86OutputPtr output)
779 struct nouveau_encoder *nv_encoder = to_nouveau_encoder(output);
780 ScrnInfoPtr pScrn = output->scrn;
781 NVPtr pNv = NVPTR(pScrn);
782 DisplayModePtr modes;
784 xf86DrvMsg(pScrn->scrnIndex, X_INFO, "nv_lvds_output_get_modes is called.\n");
786 if ((modes = nv_output_get_edid_modes(output)))
789 if (!nv_encoder->dcb->lvdsconf.use_straps_for_mode || pNv->VBIOS.fp.native_mode == NULL)
792 if (nv_encoder->native_mode)
793 xfree(nv_encoder->native_mode);
794 nv_encoder->native_mode = xf86DuplicateMode(pNv->VBIOS.fp.native_mode);
796 return xf86DuplicateMode(pNv->VBIOS.fp.native_mode);
799 static const xf86OutputFuncsRec nv_lvds_output_funcs = {
800 .dpms = nv_output_dpms,
801 .save = nv_output_save,
802 .restore = nv_output_restore,
803 .mode_valid = nv_output_mode_valid,
804 .mode_fixup = nv_output_mode_fixup,
805 .mode_set = nv_output_mode_set,
806 .detect = nv_output_detect,
807 .get_modes = nv_lvds_output_get_modes,
808 .destroy = nv_output_destroy,
809 .prepare = nv_output_prepare,
810 .commit = nv_output_commit,
811 .create_resources = nv_output_create_resources,
812 .set_property = nv_output_set_property,
816 nv_add_output(ScrnInfoPtr pScrn, struct dcb_entry *dcbent, const xf86OutputFuncsRec *output_funcs, char *outputname)
818 NVPtr pNv = NVPTR(pScrn);
819 xf86OutputPtr output;
820 struct nouveau_connector *nv_connector;
821 struct nouveau_encoder *nv_encoder = &pNv->encoders[dcbent->index];
823 if (!(output = xf86OutputCreate(pScrn, output_funcs, outputname)))
825 if (!(nv_connector = xnfcalloc(sizeof (struct nouveau_connector), 1)))
828 output->driver_private = nv_connector;
830 if (dcbent->i2c_index < 0xf && pNv->pI2CBus[dcbent->i2c_index] == NULL)
831 NV_I2CInit(pScrn, &pNv->pI2CBus[dcbent->i2c_index], pNv->dcb_table.i2c_read[dcbent->i2c_index], xstrdup(outputname));
832 nv_connector->pDDCBus = pNv->pI2CBus[dcbent->i2c_index];
833 nv_connector->nv_encoder = nv_encoder;
834 nv_encoder->dcb = dcbent;
835 nv_encoder->last_dpms = NV_DPMS_CLEARED;
837 nv_encoder->dithering = (pNv->FPDither || (nv_encoder->dcb->type == OUTPUT_LVDS && !pNv->VBIOS.fp.if_is_24bit));
838 if (pNv->fpScaler) /* GPU Scaling */
839 nv_encoder->scaling_mode = SCALE_ASPECT;
840 else if (nv_encoder->dcb->type == OUTPUT_LVDS)
841 nv_encoder->scaling_mode = SCALE_NOSCALE;
843 nv_encoder->scaling_mode = SCALE_PANEL;
844 if (xf86GetOptValString(pNv->Options, OPTION_SCALING_MODE)) {
845 nv_encoder->scaling_mode = nv_scaling_mode_lookup(xf86GetOptValString(pNv->Options, OPTION_SCALING_MODE), -1);
846 if (nv_encoder->scaling_mode == SCALE_INVALID)
847 nv_encoder->scaling_mode = SCALE_ASPECT; /* default */
850 output->possible_crtcs = dcbent->heads;
851 if (nv_encoder->dcb->type == OUTPUT_LVDS || nv_encoder->dcb->type == OUTPUT_TMDS) {
852 output->doubleScanAllowed = false;
853 output->interlaceAllowed = false;
855 output->doubleScanAllowed = true;
856 if (pNv->Architecture == NV_ARCH_20 ||
857 (pNv->Architecture == NV_ARCH_10 &&
858 (pNv->Chipset & 0x0ff0) != CHIPSET_NV10 &&
859 (pNv->Chipset & 0x0ff0) != CHIPSET_NV15))
861 output->interlaceAllowed = false;
863 output->interlaceAllowed = true;
867 void NvSetupOutputs(ScrnInfoPtr pScrn)
869 NVPtr pNv = NVPTR(pScrn);
870 int i, i2c_count[MAX_NUM_DCB_ENTRIES];
871 struct dcb_entry *dcbent;
873 int vga_count = 0, tv_count = 0, dvia_count = 0, dvid_count = 0, lvds_count = 0;
875 if (!(pNv->encoders = xnfcalloc(pNv->dcb_table.entries, sizeof (struct nouveau_encoder))))
877 memset(pNv->pI2CBus, 0, sizeof(pNv->pI2CBus));
878 memset(i2c_count, 0, sizeof(i2c_count));
879 for (i = 0 ; i < pNv->dcb_table.entries; i++)
880 i2c_count[pNv->dcb_table.entry[i].i2c_index]++;
882 for (i = 0; i < pNv->dcb_table.entries; i++) {
883 dcbent = &pNv->dcb_table.entry[i];
885 xf86DrvMsg(pScrn->scrnIndex, X_PROBED, "DCB entry %d: type: %d, heads: %d, or: %d\n", i, dcbent->type, dcbent->heads, dcbent->or);
887 switch (dcbent->type) {
889 if (i2c_count[dcbent->i2c_index] == 1)
890 sprintf(outputname, "VGA-%d", vga_count++);
892 sprintf(outputname, "DVI-A-%d", dvia_count++);
893 nv_add_output(pScrn, dcbent, &nv_output_funcs, outputname);
896 sprintf(outputname, "DVI-D-%d", dvid_count++);
897 nv_add_output(pScrn, dcbent, &nv_output_funcs, outputname);
900 sprintf(outputname, "TV-%d", tv_count++);
903 sprintf(outputname, "LVDS-%d", lvds_count++);
904 nv_add_output(pScrn, dcbent, &nv_lvds_output_funcs, outputname);
907 xf86DrvMsg(pScrn->scrnIndex, X_WARNING, "DCB type %d not known\n", dcbent->type);