58 #define MAX_HBLANK_OSC 20
64 #define MAX_SAMPLE_PAIRS 10
72 for (i = 0; i < 2; i++) {
73 bool sense_a, sense_b, sense_b_prime;
85 0x00000001, 0x00000000))
89 0x00000001, 0x00000001))
93 0x00000001, 0x00000000))
104 if (sense_a != sense_b) {
107 if (sense_b == sense_b_prime) {
133 uint8_t saved_seq1, saved_pi, saved_rpc1, saved_cr_mode;
134 uint8_t saved_palette0[3], saved_palette_mask;
135 uint32_t saved_rtest_ctrl, saved_rgen_ctrl;
145 if (nv_two_heads(dev))
168 for (i = 0; i < 3; i++)
193 if (sample_load_twice(dev, sense_pair))
195 }
while ((sense_pair[0] != sense_pair[1]) &&
202 sense = sense_pair[0];
208 }
while (++blue < 0x18 && sense);
214 for (i = 0; i < 3; i++)
223 NV_DEBUG(drm,
"Load detected on head A\n");
238 uint32_t saved_powerctrl_2 = 0, saved_powerctrl_4 = 0, saved_routput,
239 saved_rtest_ctrl, saved_gpio0 = 0, saved_gpio1 = 0,
temp, routput;
242 #define RGB_TEST_DATA(r, g, b) (r << 0 | g << 10 | b << 20)
246 if (drm->
vbios.tvdactestval)
247 testval = drm->
vbios.tvdactestval;
251 if (drm->
vbios.dactestval)
252 testval = drm->
vbios.dactestval;
262 if (regoffset == 0x68) {
277 head = (saved_routput & 0x100) >> 8;
284 routput = (saved_routput & 0xfffffece) | head << 8;
286 if (nv_device(drm->
device)->card_type >= NV_40) {
288 routput |= 0x1a << 16;
290 routput &= ~(0x1a << 16);
318 if (regoffset == 0x68)
341 NV_DEBUG(drm,
"Load detected on output %c\n",
349 static bool nv04_dac_mode_fixup(
struct drm_encoder *encoder,
359 static void nv04_dac_prepare(
struct drm_encoder *encoder)
370 static void nv04_dac_mode_set(
struct drm_encoder *encoder,
378 if (nv_gf4_disp_arch(dev)) {
389 if (rebind == encoder
396 (otherdac & ~0x0100) | (head ^ 1) << 8);
401 if (nv_device(drm->
device)->chipset < 0x44)
407 static void nv04_dac_commit(
struct drm_encoder *encoder)
416 NV_DEBUG(drm,
"Output %s is running on CRTC %d using output %c\n",
426 if (nv_gf4_disp_arch(dev)) {
429 uint32_t dacclk = NVReadRAMDAC(dev, 0, dacclk_off);
432 *dac_users |= 1 << dcb->
index;
436 *dac_users &= ~(1 << dcb->
index);
438 NVWriteRAMDAC(dev, 0, dacclk_off,
451 return nv_gf4_disp_arch(encoder->
dev) &&
455 static void nv04_dac_dpms(
struct drm_encoder *encoder,
int mode)
464 NV_DEBUG(drm,
"Setting dpms mode %d on vga encoder (output %d)\n",
465 mode, nv_encoder->
dcb->index);
470 static void nv04_dac_save(
struct drm_encoder *encoder)
475 if (nv_gf4_disp_arch(dev))
480 static void nv04_dac_restore(
struct drm_encoder *encoder)
485 if (nv_gf4_disp_arch(dev))
492 static void nv04_dac_destroy(
struct drm_encoder *encoder)
501 .dpms = nv04_dac_dpms,
502 .save = nv04_dac_save,
503 .restore = nv04_dac_restore,
504 .mode_fixup = nv04_dac_mode_fixup,
505 .prepare = nv04_dac_prepare,
506 .commit = nv04_dac_commit,
507 .mode_set = nv04_dac_mode_set,
508 .detect = nv04_dac_detect
512 .dpms = nv04_dac_dpms,
513 .save = nv04_dac_save,
514 .restore = nv04_dac_restore,
515 .mode_fixup = nv04_dac_mode_fixup,
516 .prepare = nv04_dac_prepare,
517 .commit = nv04_dac_commit,
518 .mode_set = nv04_dac_mode_set,
519 .detect = nv17_dac_detect
523 .destroy = nv04_dac_destroy,
534 nv_encoder = kzalloc(
sizeof(*nv_encoder),
GFP_KERNEL);
538 encoder = to_drm_encoder(nv_encoder);
541 nv_encoder->
or =
ffs(entry->
or) - 1;
543 if (nv_gf4_disp_arch(dev))
544 helper = &nv17_dac_helper_funcs;
546 helper = &nv04_dac_helper_funcs;
549 drm_encoder_helper_add(encoder, helper);