Gentoo Websites Logo
Go to: Gentoo Home Documentation Forums Lists Bugs Planet Store Wiki Get Gentoo!
View | Details | Raw Unified | Return to bug 127642 | Differences between
and this patch

Collapse All | Expand All

(-)xf86-video-ati-6.5.8.0/src/Makefile.am (+10 lines)
Lines 91-96 Link Here
91
theatre_drv_la_SOURCES = \
91
theatre_drv_la_SOURCES = \
92
	theatre.c theatre_module.c
92
	theatre.c theatre_module.c
93
93
94
theater_out_drv_la_LTLIBRARIES = theater_out_drv.la
95
theater_out_drv_la_LDFLAGS = -module -avoid-version
96
theater_out_drv_ladir = @moduledir@/multimedia
97
theater_out_drv_la_CFLAGS = \
98
        $(AM_CFLAGS) -DMICROC_DIR=\"$(theater_out_drv_ladir)\"
99
theater_out_drv_la_SOURCES = \
100
        theater_out.c theater_out_module.c
101
102
94
theatre200_drv_la_LTLIBRARIES = theatre200_drv.la
103
theatre200_drv_la_LTLIBRARIES = theatre200_drv.la
95
theatre200_drv_la_LDFLAGS = -module -avoid-version
104
theatre200_drv_la_LDFLAGS = -module -avoid-version
96
theatre200_drv_ladir = @moduledir@/multimedia
105
theatre200_drv_ladir = @moduledir@/multimedia
Lines 185-190 Link Here
185
	radeon_sarea.h \
194
	radeon_sarea.h \
186
	radeon_version.h \
195
	radeon_version.h \
187
	radeon_video.h \
196
	radeon_video.h \
197
	theater_out.h \
188
	theatre200.h \
198
	theatre200.h \
189
	theatre_detect.h \
199
	theatre_detect.h \
190
	theatre.h \
200
	theatre.h \
(-)xf86-video-ati-6.5.8.0/src/Makefile.in (-5 / +129 lines)
Lines 265-270 Link Here
265
	theatre.c theatre_module.c
265
	theatre.c theatre_module.c
266
266
267
267
268
theater_out_drv_la_LTLIBRARIES = theater_out_drv.la
269
theater_out_drv_la_LDFLAGS = -module -avoid-version
270
theater_out_drv_ladir = @moduledir@/multimedia
271
theater_out_drv_la_CFLAGS = \
272
        $(AM_CFLAGS) -DMICROC_DIR=\"$(theater_out_drv_ladir)\"
273
274
theater_out_drv_la_SOURCES = \
275
        theater_out.c theater_out_module.c
276
277
268
theatre200_drv_la_LTLIBRARIES = theatre200_drv.la
278
theatre200_drv_la_LTLIBRARIES = theatre200_drv.la
269
theatre200_drv_la_LDFLAGS = -module -avoid-version
279
theatre200_drv_la_LDFLAGS = -module -avoid-version
270
theatre200_drv_ladir = @moduledir@/multimedia
280
theatre200_drv_ladir = @moduledir@/multimedia
Lines 361-366 Link Here
361
	radeon_sarea.h \
371
	radeon_sarea.h \
362
	radeon_version.h \
372
	radeon_version.h \
363
	radeon_video.h \
373
	radeon_video.h \
374
	theater_out.h \
364
	theatre200.h \
375
	theatre200.h \
365
	theatre_detect.h \
376
	theatre_detect.h \
366
	theatre.h \
377
	theatre.h \
Lines 373-378 Link Here
373
CONFIG_CLEAN_FILES =
384
CONFIG_CLEAN_FILES =
374
LTLIBRARIES = $(ati_drv_la_LTLIBRARIES) $(atimisc_drv_la_LTLIBRARIES) \
385
LTLIBRARIES = $(ati_drv_la_LTLIBRARIES) $(atimisc_drv_la_LTLIBRARIES) \
375
	$(r128_drv_la_LTLIBRARIES) $(radeon_drv_la_LTLIBRARIES) \
386
	$(r128_drv_la_LTLIBRARIES) $(radeon_drv_la_LTLIBRARIES) \
387
	$(theater_out_drv_la_LTLIBRARIES) \
376
	$(theatre200_drv_la_LTLIBRARIES) \
388
	$(theatre200_drv_la_LTLIBRARIES) \
377
	$(theatre_detect_drv_la_LTLIBRARIES) \
389
	$(theatre_detect_drv_la_LTLIBRARIES) \
378
	$(theatre_drv_la_LTLIBRARIES)
390
	$(theatre_drv_la_LTLIBRARIES)
Lines 426-431 Link Here
426
	radeon_bios.lo radeon_mm_i2c.lo radeon_vip.lo radeon_misc.lo \
438
	radeon_bios.lo radeon_mm_i2c.lo radeon_vip.lo radeon_misc.lo \
427
	radeon_exa.lo $(am__objects_6)
439
	radeon_exa.lo $(am__objects_6)
428
radeon_drv_la_OBJECTS = $(am_radeon_drv_la_OBJECTS)
440
radeon_drv_la_OBJECTS = $(am_radeon_drv_la_OBJECTS)
441
theater_out_drv_la_LIBADD =
442
am_theater_out_drv_la_OBJECTS = theater_out_drv_la-theater_out.lo \
443
	theater_out_drv_la-theater_out_module.lo
444
theater_out_drv_la_OBJECTS = $(am_theater_out_drv_la_OBJECTS)
429
theatre200_drv_la_LIBADD =
445
theatre200_drv_la_LIBADD =
430
am_theatre200_drv_la_OBJECTS = theatre200_drv_la-theatre200.lo \
446
am_theatre200_drv_la_OBJECTS = theatre200_drv_la-theatre200.lo \
431
	theatre200_drv_la-theatre200_module.lo
447
	theatre200_drv_la-theatre200_module.lo
Lines 487-493 Link Here
487
@AMDEP_TRUE@	./$(DEPDIR)/radeon_mm_i2c.Plo \
503
@AMDEP_TRUE@	./$(DEPDIR)/radeon_mm_i2c.Plo \
488
@AMDEP_TRUE@	./$(DEPDIR)/radeon_probe.Plo \
504
@AMDEP_TRUE@	./$(DEPDIR)/radeon_probe.Plo \
489
@AMDEP_TRUE@	./$(DEPDIR)/radeon_video.Plo \
505
@AMDEP_TRUE@	./$(DEPDIR)/radeon_video.Plo \
490
@AMDEP_TRUE@	./$(DEPDIR)/radeon_vip.Plo ./$(DEPDIR)/theatre.Plo \
506
@AMDEP_TRUE@	./$(DEPDIR)/radeon_vip.Plo \
507
@AMDEP_TRUE@	./$(DEPDIR)/theater_out_drv_la-theater_out.Plo \
508
@AMDEP_TRUE@	./$(DEPDIR)/theater_out_drv_la-theater_out_module.Plo \
509
@AMDEP_TRUE@	./$(DEPDIR)/theatre.Plo \
491
@AMDEP_TRUE@	./$(DEPDIR)/theatre200_drv_la-theatre200.Plo \
510
@AMDEP_TRUE@	./$(DEPDIR)/theatre200_drv_la-theatre200.Plo \
492
@AMDEP_TRUE@	./$(DEPDIR)/theatre200_drv_la-theatre200_module.Plo \
511
@AMDEP_TRUE@	./$(DEPDIR)/theatre200_drv_la-theatre200_module.Plo \
493
@AMDEP_TRUE@	./$(DEPDIR)/theatre_detect.Plo \
512
@AMDEP_TRUE@	./$(DEPDIR)/theatre_detect.Plo \
Lines 503-512 Link Here
503
DIST_SOURCES = $(am__ati_drv_la_SOURCES_DIST) \
522
DIST_SOURCES = $(am__ati_drv_la_SOURCES_DIST) \
504
	$(am__atimisc_drv_la_SOURCES_DIST) \
523
	$(am__atimisc_drv_la_SOURCES_DIST) \
505
	$(am__r128_drv_la_SOURCES_DIST) \
524
	$(am__r128_drv_la_SOURCES_DIST) \
506
	$(am__radeon_drv_la_SOURCES_DIST) $(theatre200_drv_la_SOURCES) \
525
	$(am__radeon_drv_la_SOURCES_DIST) $(theater_out_drv_la_SOURCES) \
507
	$(theatre_detect_drv_la_SOURCES) $(theatre_drv_la_SOURCES)
526
	$(theatre200_drv_la_SOURCES) $(theatre_detect_drv_la_SOURCES) \
527
	$(theatre_drv_la_SOURCES)
508
DIST_COMMON = $(srcdir)/Makefile.in Makefile.am
528
DIST_COMMON = $(srcdir)/Makefile.in Makefile.am
509
SOURCES = $(ati_drv_la_SOURCES) $(atimisc_drv_la_SOURCES) $(r128_drv_la_SOURCES) $(radeon_drv_la_SOURCES) $(theatre200_drv_la_SOURCES) $(theatre_detect_drv_la_SOURCES) $(theatre_drv_la_SOURCES)
529
SOURCES = $(ati_drv_la_SOURCES) $(atimisc_drv_la_SOURCES) $(r128_drv_la_SOURCES) $(radeon_drv_la_SOURCES) $(theater_out_drv_la_SOURCES) $(theatre200_drv_la_SOURCES) $(theatre_detect_drv_la_SOURCES) $(theatre_drv_la_SOURCES)
510
530
511
all: all-am
531
all: all-am
512
532
Lines 629-634 Link Here
629
	  echo "rm -f \"$${dir}/so_locations\""; \
649
	  echo "rm -f \"$${dir}/so_locations\""; \
630
	  rm -f "$${dir}/so_locations"; \
650
	  rm -f "$${dir}/so_locations"; \
631
	done
651
	done
652
theater_out_drv_laLTLIBRARIES_INSTALL = $(INSTALL)
653
install-theater_out_drv_laLTLIBRARIES: $(theater_out_drv_la_LTLIBRARIES)
654
	@$(NORMAL_INSTALL)
655
	$(mkinstalldirs) $(DESTDIR)$(theater_out_drv_ladir)
656
	@list='$(theater_out_drv_la_LTLIBRARIES)'; for p in $$list; do \
657
	  if test -f $$p; then \
658
	    f="`echo $$p | sed -e 's|^.*/||'`"; \
659
	    echo " $(LIBTOOL) --mode=install $(theater_out_drv_laLTLIBRARIES_INSTALL) $(INSTALL_STRIP_FLAG) $$p $(DESTDIR)$(theater_out_drv_ladir)/$$f"; \
660
	    $(LIBTOOL) --mode=install $(theater_out_drv_laLTLIBRARIES_INSTALL) $(INSTALL_STRIP_FLAG) $$p $(DESTDIR)$(theater_out_drv_ladir)/$$f; \
661
	  else :; fi; \
662
	done
663
664
uninstall-theater_out_drv_laLTLIBRARIES:
665
	@$(NORMAL_UNINSTALL)
666
	@list='$(theater_out_drv_la_LTLIBRARIES)'; for p in $$list; do \
667
	    p="`echo $$p | sed -e 's|^.*/||'`"; \
668
	  echo " $(LIBTOOL) --mode=uninstall rm -f $(DESTDIR)$(theater_out_drv_ladir)/$$p"; \
669
	  $(LIBTOOL) --mode=uninstall rm -f $(DESTDIR)$(theater_out_drv_ladir)/$$p; \
670
	done
671
672
clean-theater_out_drv_laLTLIBRARIES:
673
	-test -z "$(theater_out_drv_la_LTLIBRARIES)" || rm -f $(theater_out_drv_la_LTLIBRARIES)
674
	@list='$(theater_out_drv_la_LTLIBRARIES)'; for p in $$list; do \
675
	  dir="`echo $$p | sed -e 's|/[^/]*$$||'`"; \
676
	  test "$$dir" = "$$p" && dir=.; \
677
	  echo "rm -f \"$${dir}/so_locations\""; \
678
	  rm -f "$${dir}/so_locations"; \
679
	done
632
theatre200_drv_laLTLIBRARIES_INSTALL = $(INSTALL)
680
theatre200_drv_laLTLIBRARIES_INSTALL = $(INSTALL)
633
install-theatre200_drv_laLTLIBRARIES: $(theatre200_drv_la_LTLIBRARIES)
681
install-theatre200_drv_laLTLIBRARIES: $(theatre200_drv_la_LTLIBRARIES)
634
	@$(NORMAL_INSTALL)
682
	@$(NORMAL_INSTALL)
Lines 721-726 Link Here
721
	$(LINK) -rpath $(r128_drv_ladir) $(r128_drv_la_LDFLAGS) $(r128_drv_la_OBJECTS) $(r128_drv_la_LIBADD) $(LIBS)
769
	$(LINK) -rpath $(r128_drv_ladir) $(r128_drv_la_LDFLAGS) $(r128_drv_la_OBJECTS) $(r128_drv_la_LIBADD) $(LIBS)
722
radeon_drv.la: $(radeon_drv_la_OBJECTS) $(radeon_drv_la_DEPENDENCIES) 
770
radeon_drv.la: $(radeon_drv_la_OBJECTS) $(radeon_drv_la_DEPENDENCIES) 
723
	$(LINK) -rpath $(radeon_drv_ladir) $(radeon_drv_la_LDFLAGS) $(radeon_drv_la_OBJECTS) $(radeon_drv_la_LIBADD) $(LIBS)
771
	$(LINK) -rpath $(radeon_drv_ladir) $(radeon_drv_la_LDFLAGS) $(radeon_drv_la_OBJECTS) $(radeon_drv_la_LIBADD) $(LIBS)
772
theater_out_drv.la: $(theater_out_drv_la_OBJECTS) $(theater_out_drv_la_DEPENDENCIES) 
773
	$(LINK) -rpath $(theater_out_drv_ladir) $(theater_out_drv_la_LDFLAGS) $(theater_out_drv_la_OBJECTS) $(theater_out_drv_la_LIBADD) $(LIBS)
724
theatre200_drv.la: $(theatre200_drv_la_OBJECTS) $(theatre200_drv_la_DEPENDENCIES) 
774
theatre200_drv.la: $(theatre200_drv_la_OBJECTS) $(theatre200_drv_la_DEPENDENCIES) 
725
	$(LINK) -rpath $(theatre200_drv_ladir) $(theatre200_drv_la_LDFLAGS) $(theatre200_drv_la_OBJECTS) $(theatre200_drv_la_LIBADD) $(LIBS)
775
	$(LINK) -rpath $(theatre200_drv_ladir) $(theatre200_drv_la_LDFLAGS) $(theatre200_drv_la_OBJECTS) $(theatre200_drv_la_LIBADD) $(LIBS)
726
theatre_detect_drv.la: $(theatre_detect_drv_la_OBJECTS) $(theatre_detect_drv_la_DEPENDENCIES) 
776
theatre_detect_drv.la: $(theatre_detect_drv_la_OBJECTS) $(theatre_detect_drv_la_DEPENDENCIES) 
Lines 801-806 Link Here
801
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/radeon_probe.Plo@am__quote@
851
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/radeon_probe.Plo@am__quote@
802
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/radeon_video.Plo@am__quote@
852
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/radeon_video.Plo@am__quote@
803
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/radeon_vip.Plo@am__quote@
853
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/radeon_vip.Plo@am__quote@
854
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/theater_out_drv_la-theater_out.Plo@am__quote@
855
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/theater_out_drv_la-theater_out_module.Plo@am__quote@
804
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/theatre.Plo@am__quote@
856
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/theatre.Plo@am__quote@
805
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/theatre200_drv_la-theatre200.Plo@am__quote@
857
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/theatre200_drv_la-theatre200.Plo@am__quote@
806
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/theatre200_drv_la-theatre200_module.Plo@am__quote@
858
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/theatre200_drv_la-theatre200_module.Plo@am__quote@
Lines 841-846 Link Here
841
@AMDEP_TRUE@@am__fastdepCC_FALSE@	$(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
893
@AMDEP_TRUE@@am__fastdepCC_FALSE@	$(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
842
@am__fastdepCC_FALSE@	$(LTCOMPILE) -c -o $@ `test -f '$<' || echo '$(srcdir)/'`$<
894
@am__fastdepCC_FALSE@	$(LTCOMPILE) -c -o $@ `test -f '$<' || echo '$(srcdir)/'`$<
843
895
896
theater_out_drv_la-theater_out.o: theater_out.c
897
@am__fastdepCC_TRUE@	if $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(theater_out_drv_la_CFLAGS) $(CFLAGS) -MT theater_out_drv_la-theater_out.o -MD -MP -MF "$(DEPDIR)/theater_out_drv_la-theater_out.Tpo" \
898
@am__fastdepCC_TRUE@	  -c -o theater_out_drv_la-theater_out.o `test -f 'theater_out.c' || echo '$(srcdir)/'`theater_out.c; \
899
@am__fastdepCC_TRUE@	then mv -f "$(DEPDIR)/theater_out_drv_la-theater_out.Tpo" "$(DEPDIR)/theater_out_drv_la-theater_out.Po"; \
900
@am__fastdepCC_TRUE@	else rm -f "$(DEPDIR)/theater_out_drv_la-theater_out.Tpo"; exit 1; \
901
@am__fastdepCC_TRUE@	fi
902
@AMDEP_TRUE@@am__fastdepCC_FALSE@	source='theater_out.c' object='theater_out_drv_la-theater_out.o' libtool=no @AMDEPBACKSLASH@
903
@AMDEP_TRUE@@am__fastdepCC_FALSE@	depfile='$(DEPDIR)/theater_out_drv_la-theater_out.Po' tmpdepfile='$(DEPDIR)/theater_out_drv_la-theater_out.TPo' @AMDEPBACKSLASH@
904
@AMDEP_TRUE@@am__fastdepCC_FALSE@	$(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
905
@am__fastdepCC_FALSE@	$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(theater_out_drv_la_CFLAGS) $(CFLAGS) -c -o theater_out_drv_la-theater_out.o `test -f 'theater_out.c' || echo '$(srcdir)/'`theater_out.c
906
907
theater_out_drv_la-theater_out.obj: theater_out.c
908
@am__fastdepCC_TRUE@	if $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(theater_out_drv_la_CFLAGS) $(CFLAGS) -MT theater_out_drv_la-theater_out.obj -MD -MP -MF "$(DEPDIR)/theater_out_drv_la-theater_out.Tpo" \
909
@am__fastdepCC_TRUE@	  -c -o theater_out_drv_la-theater_out.obj `if test -f 'theater_out.c'; then $(CYGPATH_W) 'theater_out.c'; else $(CYGPATH_W) '$(srcdir)/theater_out.c'; fi`; \
910
@am__fastdepCC_TRUE@	then mv -f "$(DEPDIR)/theater_out_drv_la-theater_out.Tpo" "$(DEPDIR)/theater_out_drv_la-theater_out.Po"; \
911
@am__fastdepCC_TRUE@	else rm -f "$(DEPDIR)/theater_out_drv_la-theater_out.Tpo"; exit 1; \
912
@am__fastdepCC_TRUE@	fi
913
@AMDEP_TRUE@@am__fastdepCC_FALSE@	source='theater_out.c' object='theater_out_drv_la-theater_out.obj' libtool=no @AMDEPBACKSLASH@
914
@AMDEP_TRUE@@am__fastdepCC_FALSE@	depfile='$(DEPDIR)/theater_out_drv_la-theater_out.Po' tmpdepfile='$(DEPDIR)/theater_out_drv_la-theater_out.TPo' @AMDEPBACKSLASH@
915
@AMDEP_TRUE@@am__fastdepCC_FALSE@	$(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
916
@am__fastdepCC_FALSE@	$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(theater_out_drv_la_CFLAGS) $(CFLAGS) -c -o theater_out_drv_la-theater_out.obj `if test -f 'theater_out.c'; then $(CYGPATH_W) 'theater_out.c'; else $(CYGPATH_W) '$(srcdir)/theater_out.c'; fi`
917
918
theater_out_drv_la-theater_out.lo: theater_out.c
919
@am__fastdepCC_TRUE@	if $(LIBTOOL) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(theater_out_drv_la_CFLAGS) $(CFLAGS) -MT theater_out_drv_la-theater_out.lo -MD -MP -MF "$(DEPDIR)/theater_out_drv_la-theater_out.Tpo" \
920
@am__fastdepCC_TRUE@	  -c -o theater_out_drv_la-theater_out.lo `test -f 'theater_out.c' || echo '$(srcdir)/'`theater_out.c; \
921
@am__fastdepCC_TRUE@	then mv -f "$(DEPDIR)/theater_out_drv_la-theater_out.Tpo" "$(DEPDIR)/theater_out_drv_la-theater_out.Plo"; \
922
@am__fastdepCC_TRUE@	else rm -f "$(DEPDIR)/theater_out_drv_la-theater_out.Tpo"; exit 1; \
923
@am__fastdepCC_TRUE@	fi
924
@AMDEP_TRUE@@am__fastdepCC_FALSE@	source='theater_out.c' object='theater_out_drv_la-theater_out.lo' libtool=yes @AMDEPBACKSLASH@
925
@AMDEP_TRUE@@am__fastdepCC_FALSE@	depfile='$(DEPDIR)/theater_out_drv_la-theater_out.Plo' tmpdepfile='$(DEPDIR)/theater_out_drv_la-theater_out.TPlo' @AMDEPBACKSLASH@
926
@AMDEP_TRUE@@am__fastdepCC_FALSE@	$(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
927
@am__fastdepCC_FALSE@	$(LIBTOOL) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(theater_out_drv_la_CFLAGS) $(CFLAGS) -c -o theater_out_drv_la-theater_out.lo `test -f 'theater_out.c' || echo '$(srcdir)/'`theater_out.c
928
929
theater_out_drv_la-theater_out_module.o: theater_out_module.c
930
@am__fastdepCC_TRUE@	if $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(theater_out_drv_la_CFLAGS) $(CFLAGS) -MT theater_out_drv_la-theater_out_module.o -MD -MP -MF "$(DEPDIR)/theater_out_drv_la-theater_out_module.Tpo" \
931
@am__fastdepCC_TRUE@	  -c -o theater_out_drv_la-theater_out_module.o `test -f 'theater_out_module.c' || echo '$(srcdir)/'`theater_out_module.c; \
932
@am__fastdepCC_TRUE@	then mv -f "$(DEPDIR)/theater_out_drv_la-theater_out_module.Tpo" "$(DEPDIR)/theater_out_drv_la-theater_out_module.Po"; \
933
@am__fastdepCC_TRUE@	else rm -f "$(DEPDIR)/theater_out_drv_la-theater_out_module.Tpo"; exit 1; \
934
@am__fastdepCC_TRUE@	fi
935
@AMDEP_TRUE@@am__fastdepCC_FALSE@	source='theater_out_module.c' object='theater_out_drv_la-theater_out_module.o' libtool=no @AMDEPBACKSLASH@
936
@AMDEP_TRUE@@am__fastdepCC_FALSE@	depfile='$(DEPDIR)/theater_out_drv_la-theater_out_module.Po' tmpdepfile='$(DEPDIR)/theater_out_drv_la-theater_out_module.TPo' @AMDEPBACKSLASH@
937
@AMDEP_TRUE@@am__fastdepCC_FALSE@	$(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
938
@am__fastdepCC_FALSE@	$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(theater_out_drv_la_CFLAGS) $(CFLAGS) -c -o theater_out_drv_la-theater_out_module.o `test -f 'theater_out_module.c' || echo '$(srcdir)/'`theater_out_module.c
939
940
theater_out_drv_la-theater_out_module.obj: theater_out_module.c
941
@am__fastdepCC_TRUE@	if $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(theater_out_drv_la_CFLAGS) $(CFLAGS) -MT theater_out_drv_la-theater_out_module.obj -MD -MP -MF "$(DEPDIR)/theater_out_drv_la-theater_out_module.Tpo" \
942
@am__fastdepCC_TRUE@	  -c -o theater_out_drv_la-theater_out_module.obj `if test -f 'theater_out_module.c'; then $(CYGPATH_W) 'theater_out_module.c'; else $(CYGPATH_W) '$(srcdir)/theater_out_module.c'; fi`; \
943
@am__fastdepCC_TRUE@	then mv -f "$(DEPDIR)/theater_out_drv_la-theater_out_module.Tpo" "$(DEPDIR)/theater_out_drv_la-theater_out_module.Po"; \
944
@am__fastdepCC_TRUE@	else rm -f "$(DEPDIR)/theater_out_drv_la-theater_out_module.Tpo"; exit 1; \
945
@am__fastdepCC_TRUE@	fi
946
@AMDEP_TRUE@@am__fastdepCC_FALSE@	source='theater_out_module.c' object='theater_out_drv_la-theater_out_module.obj' libtool=no @AMDEPBACKSLASH@
947
@AMDEP_TRUE@@am__fastdepCC_FALSE@	depfile='$(DEPDIR)/theater_out_drv_la-theater_out_module.Po' tmpdepfile='$(DEPDIR)/theater_out_drv_la-theater_out_module.TPo' @AMDEPBACKSLASH@
948
@AMDEP_TRUE@@am__fastdepCC_FALSE@	$(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
949
@am__fastdepCC_FALSE@	$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(theater_out_drv_la_CFLAGS) $(CFLAGS) -c -o theater_out_drv_la-theater_out_module.obj `if test -f 'theater_out_module.c'; then $(CYGPATH_W) 'theater_out_module.c'; else $(CYGPATH_W) '$(srcdir)/theater_out_module.c'; fi`
950
951
theater_out_drv_la-theater_out_module.lo: theater_out_module.c
952
@am__fastdepCC_TRUE@	if $(LIBTOOL) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(theater_out_drv_la_CFLAGS) $(CFLAGS) -MT theater_out_drv_la-theater_out_module.lo -MD -MP -MF "$(DEPDIR)/theater_out_drv_la-theater_out_module.Tpo" \
953
@am__fastdepCC_TRUE@	  -c -o theater_out_drv_la-theater_out_module.lo `test -f 'theater_out_module.c' || echo '$(srcdir)/'`theater_out_module.c; \
954
@am__fastdepCC_TRUE@	then mv -f "$(DEPDIR)/theater_out_drv_la-theater_out_module.Tpo" "$(DEPDIR)/theater_out_drv_la-theater_out_module.Plo"; \
955
@am__fastdepCC_TRUE@	else rm -f "$(DEPDIR)/theater_out_drv_la-theater_out_module.Tpo"; exit 1; \
956
@am__fastdepCC_TRUE@	fi
957
@AMDEP_TRUE@@am__fastdepCC_FALSE@	source='theater_out_module.c' object='theater_out_drv_la-theater_out_module.lo' libtool=yes @AMDEPBACKSLASH@
958
@AMDEP_TRUE@@am__fastdepCC_FALSE@	depfile='$(DEPDIR)/theater_out_drv_la-theater_out_module.Plo' tmpdepfile='$(DEPDIR)/theater_out_drv_la-theater_out_module.TPlo' @AMDEPBACKSLASH@
959
@AMDEP_TRUE@@am__fastdepCC_FALSE@	$(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
960
@am__fastdepCC_FALSE@	$(LIBTOOL) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(theater_out_drv_la_CFLAGS) $(CFLAGS) -c -o theater_out_drv_la-theater_out_module.lo `test -f 'theater_out_module.c' || echo '$(srcdir)/'`theater_out_module.c
961
844
theatre200_drv_la-theatre200.o: theatre200.c
962
theatre200_drv_la-theatre200.o: theatre200.c
845
@am__fastdepCC_TRUE@	if $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(theatre200_drv_la_CFLAGS) $(CFLAGS) -MT theatre200_drv_la-theatre200.o -MD -MP -MF "$(DEPDIR)/theatre200_drv_la-theatre200.Tpo" \
963
@am__fastdepCC_TRUE@	if $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(theatre200_drv_la_CFLAGS) $(CFLAGS) -MT theatre200_drv_la-theatre200.o -MD -MP -MF "$(DEPDIR)/theatre200_drv_la-theatre200.Tpo" \
846
@am__fastdepCC_TRUE@	  -c -o theatre200_drv_la-theatre200.o `test -f 'theatre200.c' || echo '$(srcdir)/'`theatre200.c; \
964
@am__fastdepCC_TRUE@	  -c -o theatre200_drv_la-theatre200.o `test -f 'theatre200.c' || echo '$(srcdir)/'`theatre200.c; \
Lines 1007-1013 Link Here
1007
all-am: Makefile $(LTLIBRARIES)
1125
all-am: Makefile $(LTLIBRARIES)
1008
1126
1009
installdirs:
1127
installdirs:
1010
	$(mkinstalldirs) $(DESTDIR)$(ati_drv_ladir) $(DESTDIR)$(atimisc_drv_ladir) $(DESTDIR)$(r128_drv_ladir) $(DESTDIR)$(radeon_drv_ladir) $(DESTDIR)$(theatre200_drv_ladir) $(DESTDIR)$(theatre_detect_drv_ladir) $(DESTDIR)$(theatre_drv_ladir)
1128
	$(mkinstalldirs) $(DESTDIR)$(ati_drv_ladir) $(DESTDIR)$(atimisc_drv_ladir) $(DESTDIR)$(r128_drv_ladir) $(DESTDIR)$(radeon_drv_ladir) $(DESTDIR)$(theater_out_drv_ladir) $(DESTDIR)$(theatre200_drv_ladir) $(DESTDIR)$(theatre_detect_drv_ladir) $(DESTDIR)$(theatre_drv_ladir)
1011
install: install-am
1129
install: install-am
1012
install-exec: install-exec-am
1130
install-exec: install-exec-am
1013
install-data: install-data-am
1131
install-data: install-data-am
Lines 1037-1042 Link Here
1037
clean-am: clean-ati_drv_laLTLIBRARIES clean-atimisc_drv_laLTLIBRARIES \
1155
clean-am: clean-ati_drv_laLTLIBRARIES clean-atimisc_drv_laLTLIBRARIES \
1038
	clean-generic clean-libtool clean-r128_drv_laLTLIBRARIES \
1156
	clean-generic clean-libtool clean-r128_drv_laLTLIBRARIES \
1039
	clean-radeon_drv_laLTLIBRARIES \
1157
	clean-radeon_drv_laLTLIBRARIES \
1158
	clean-theater_out_drv_laLTLIBRARIES \
1040
	clean-theatre200_drv_laLTLIBRARIES \
1159
	clean-theatre200_drv_laLTLIBRARIES \
1041
	clean-theatre_detect_drv_laLTLIBRARIES \
1160
	clean-theatre_detect_drv_laLTLIBRARIES \
1042
	clean-theatre_drv_laLTLIBRARIES mostlyclean-am
1161
	clean-theatre_drv_laLTLIBRARIES mostlyclean-am
Lines 1058-1063 Link Here
1058
install-data-am: install-ati_drv_laLTLIBRARIES \
1177
install-data-am: install-ati_drv_laLTLIBRARIES \
1059
	install-atimisc_drv_laLTLIBRARIES \
1178
	install-atimisc_drv_laLTLIBRARIES \
1060
	install-r128_drv_laLTLIBRARIES install-radeon_drv_laLTLIBRARIES \
1179
	install-r128_drv_laLTLIBRARIES install-radeon_drv_laLTLIBRARIES \
1180
	install-theater_out_drv_laLTLIBRARIES \
1061
	install-theatre200_drv_laLTLIBRARIES \
1181
	install-theatre200_drv_laLTLIBRARIES \
1062
	install-theatre_detect_drv_laLTLIBRARIES \
1182
	install-theatre_detect_drv_laLTLIBRARIES \
1063
	install-theatre_drv_laLTLIBRARIES
1183
	install-theatre_drv_laLTLIBRARIES
Lines 1092-1097 Link Here
1092
	uninstall-atimisc_drv_laLTLIBRARIES uninstall-info-am \
1212
	uninstall-atimisc_drv_laLTLIBRARIES uninstall-info-am \
1093
	uninstall-r128_drv_laLTLIBRARIES \
1213
	uninstall-r128_drv_laLTLIBRARIES \
1094
	uninstall-radeon_drv_laLTLIBRARIES \
1214
	uninstall-radeon_drv_laLTLIBRARIES \
1215
	uninstall-theater_out_drv_laLTLIBRARIES \
1095
	uninstall-theatre200_drv_laLTLIBRARIES \
1216
	uninstall-theatre200_drv_laLTLIBRARIES \
1096
	uninstall-theatre_detect_drv_laLTLIBRARIES \
1217
	uninstall-theatre_detect_drv_laLTLIBRARIES \
1097
	uninstall-theatre_drv_laLTLIBRARIES
1218
	uninstall-theatre_drv_laLTLIBRARIES
Lines 1100-1105 Link Here
1100
	clean-ati_drv_laLTLIBRARIES clean-atimisc_drv_laLTLIBRARIES \
1221
	clean-ati_drv_laLTLIBRARIES clean-atimisc_drv_laLTLIBRARIES \
1101
	clean-generic clean-libtool clean-r128_drv_laLTLIBRARIES \
1222
	clean-generic clean-libtool clean-r128_drv_laLTLIBRARIES \
1102
	clean-radeon_drv_laLTLIBRARIES \
1223
	clean-radeon_drv_laLTLIBRARIES \
1224
	clean-theater_out_drv_laLTLIBRARIES \
1103
	clean-theatre200_drv_laLTLIBRARIES \
1225
	clean-theatre200_drv_laLTLIBRARIES \
1104
	clean-theatre_detect_drv_laLTLIBRARIES \
1226
	clean-theatre_detect_drv_laLTLIBRARIES \
1105
	clean-theatre_drv_laLTLIBRARIES ctags distclean \
1227
	clean-theatre_drv_laLTLIBRARIES ctags distclean \
Lines 1110-1115 Link Here
1110
	install-exec install-exec-am install-info install-info-am \
1232
	install-exec install-exec-am install-info install-info-am \
1111
	install-man install-r128_drv_laLTLIBRARIES \
1233
	install-man install-r128_drv_laLTLIBRARIES \
1112
	install-radeon_drv_laLTLIBRARIES install-strip \
1234
	install-radeon_drv_laLTLIBRARIES install-strip \
1235
	install-theater_out_drv_laLTLIBRARIES \
1113
	install-theatre200_drv_laLTLIBRARIES \
1236
	install-theatre200_drv_laLTLIBRARIES \
1114
	install-theatre_detect_drv_laLTLIBRARIES \
1237
	install-theatre_detect_drv_laLTLIBRARIES \
1115
	install-theatre_drv_laLTLIBRARIES installcheck installcheck-am \
1238
	install-theatre_drv_laLTLIBRARIES installcheck installcheck-am \
Lines 1120-1125 Link Here
1120
	uninstall-atimisc_drv_laLTLIBRARIES uninstall-info-am \
1243
	uninstall-atimisc_drv_laLTLIBRARIES uninstall-info-am \
1121
	uninstall-r128_drv_laLTLIBRARIES \
1244
	uninstall-r128_drv_laLTLIBRARIES \
1122
	uninstall-radeon_drv_laLTLIBRARIES \
1245
	uninstall-radeon_drv_laLTLIBRARIES \
1246
	uninstall-theater_out_drv_laLTLIBRARIES \
1123
	uninstall-theatre200_drv_laLTLIBRARIES \
1247
	uninstall-theatre200_drv_laLTLIBRARIES \
1124
	uninstall-theatre_detect_drv_laLTLIBRARIES \
1248
	uninstall-theatre_detect_drv_laLTLIBRARIES \
1125
	uninstall-theatre_drv_laLTLIBRARIES
1249
	uninstall-theatre_drv_laLTLIBRARIES
(-)xf86-video-ati-6.5.8.0/src/radeon_driver.c (-9 / +204 lines)
Lines 73-78 Link Here
73
#include "radeon_macros.h"
73
#include "radeon_macros.h"
74
#include "radeon_probe.h"
74
#include "radeon_probe.h"
75
#include "radeon_version.h"
75
#include "radeon_version.h"
76
#include "theater_out.h"
76
#include "radeon_mergedfb.h"
77
#include "radeon_mergedfb.h"
77
78
78
#ifdef XF86DRI
79
#ifdef XF86DRI
Lines 184-189 Link Here
184
    OPTION_RAGE_THEATRE_COMPOSITE_PORT,
185
    OPTION_RAGE_THEATRE_COMPOSITE_PORT,
185
    OPTION_RAGE_THEATRE_SVIDEO_PORT,
186
    OPTION_RAGE_THEATRE_SVIDEO_PORT,
186
    OPTION_TUNER_TYPE,
187
    OPTION_TUNER_TYPE,
188
    OPTION_TV_OUTPUT, 
187
    OPTION_RAGE_THEATRE_MICROC_PATH,
189
    OPTION_RAGE_THEATRE_MICROC_PATH,
188
    OPTION_RAGE_THEATRE_MICROC_TYPE,
190
    OPTION_RAGE_THEATRE_MICROC_TYPE,
189
#endif
191
#endif
Lines 247-252 Link Here
247
    { OPTION_RAGE_THEATRE_COMPOSITE_PORT, "RageTheatreCompositePort", OPTV_INTEGER, {0}, FALSE },
249
    { OPTION_RAGE_THEATRE_COMPOSITE_PORT, "RageTheatreCompositePort", OPTV_INTEGER, {0}, FALSE },
248
    { OPTION_RAGE_THEATRE_SVIDEO_PORT,    "RageTheatreSVideoPort",    OPTV_INTEGER, {0}, FALSE },
250
    { OPTION_RAGE_THEATRE_SVIDEO_PORT,    "RageTheatreSVideoPort",    OPTV_INTEGER, {0}, FALSE },
249
    { OPTION_TUNER_TYPE,                  "TunerType",                OPTV_INTEGER, {0}, FALSE },
251
    { OPTION_TUNER_TYPE,                  "TunerType",                OPTV_INTEGER, {0}, FALSE },
252
    { OPTION_TV_OUTPUT,                   "TVOutput",                 OPTV_ANYSTR,  {0}, FALSE },
250
	{ OPTION_RAGE_THEATRE_MICROC_PATH,	"RageTheatreMicrocPath",	 OPTV_STRING, {0}, FALSE },
253
	{ OPTION_RAGE_THEATRE_MICROC_PATH,	"RageTheatreMicrocPath",	 OPTV_STRING, {0}, FALSE },
251
	{ OPTION_RAGE_THEATRE_MICROC_TYPE, 	"RageTheatreMicrocType",	 OPTV_STRING, {0}, FALSE },
254
	{ OPTION_RAGE_THEATRE_MICROC_TYPE, 	"RageTheatreMicrocType",	 OPTV_STRING, {0}, FALSE },
252
#endif
255
#endif
Lines 5689-5694 Link Here
5689
5692
5690
    info->PaletteSavedOnVT = FALSE;
5693
    info->PaletteSavedOnVT = FALSE;
5691
5694
5695
    RADEONTRACE(("Allocating VIP interface"));
5696
    info->VIP = RADEONAllocateVIP(pScrn);
5697
5698
    if ((s = xf86GetOptValString(info->Options , OPTION_TV_OUTPUT)) != NULL && xf86NameCmp(s , "NOLOAD") != 0)
5699
    {
5700
	RADEONTRACE(("TVOutput opt = %s\n" , s));
5701
	if(!xf86LoadSubModule(pScrn , "theater_out"))
5702
	{
5703
		RADEONTRACE(("Failed to find theater_out module\n"));
5704
	        xf86DrvMsg(pScrn->scrnIndex , X_ERROR , "Unable to load TV output module\n");
5705
        	info->theaterOut = NULL;
5706
	}
5707
	else
5708
	{
5709
	    RADEONTRACE(("Found theater_out module\n"));
5710
	    xf86LoaderReqSymbols(THEATER_OUT_SYMBOLS , NULL);
5711
5712
	    info->theaterOut = xf86_detectTheaterOut(pScrn , FALSE,info->VIP);
5713
	    if (info->theaterOut != NULL)
5714
	    	xf86_initTheaterOut(info->theaterOut , s);
5715
	}
5716
5717
    }
5718
5719
5692
    RADEONSave(pScrn);
5720
    RADEONSave(pScrn);
5693
5721
5694
    if ((!info->IsSecondary) && info->IsMobility) {
5722
    if ((!info->IsSecondary) && info->IsMobility) {
Lines 6098-6104 Link Here
6098
6126
6099
    /* Init Xv */
6127
    /* Init Xv */
6100
    RADEONTRACE(("Initializing Xv\n"));
6128
    RADEONTRACE(("Initializing Xv\n"));
6101
    RADEONInitVideo(pScreen);
6129
//    RADEONInitVideo(pScreen);
6130
    RADEONInitVideo(pScreen , info->VIP , TRUE);
6102
6131
6103
    if(info->MergedFB)
6132
    if(info->MergedFB)
6104
	/* need this here to fix up sarea values */
6133
	/* need this here to fix up sarea values */
Lines 6314-6320 Link Here
6314
    OUTREG(RADEON_OVR_WID_TOP_BOTTOM, restore->ovr_wid_top_bottom);
6343
    OUTREG(RADEON_OVR_WID_TOP_BOTTOM, restore->ovr_wid_top_bottom);
6315
    OUTREG(RADEON_OV0_SCALE_CNTL,     restore->ov0_scale_cntl);
6344
    OUTREG(RADEON_OV0_SCALE_CNTL,     restore->ov0_scale_cntl);
6316
    OUTREG(RADEON_SUBPIC_CNTL,        restore->subpic_cntl);
6345
    OUTREG(RADEON_SUBPIC_CNTL,        restore->subpic_cntl);
6317
    OUTREG(RADEON_VIPH_CONTROL,       restore->viph_control);
6346
//    OUTREG(RADEON_VIPH_CONTROL,       restore->viph_control);
6347
  /*
6348
   * fulivi: removed. It messes the VIP access up
6349
   */
6350
6318
    OUTREG(RADEON_I2C_CNTL_1,         restore->i2c_cntl_1);
6351
    OUTREG(RADEON_I2C_CNTL_1,         restore->i2c_cntl_1);
6319
    OUTREG(RADEON_GEN_INT_CNTL,       restore->gen_int_cntl);
6352
    OUTREG(RADEON_GEN_INT_CNTL,       restore->gen_int_cntl);
6320
    OUTREG(RADEON_CAP0_TRIG_CNTL,     restore->cap0_trig_cntl);
6353
    OUTREG(RADEON_CAP0_TRIG_CNTL,     restore->cap0_trig_cntl);
Lines 6400-6405 Link Here
6400
    OUTREG(RADEON_CRTC_OFFSET,          restore->crtc_offset);
6433
    OUTREG(RADEON_CRTC_OFFSET,          restore->crtc_offset);
6401
    OUTREG(RADEON_CRTC_OFFSET_CNTL,     restore->crtc_offset_cntl);
6434
    OUTREG(RADEON_CRTC_OFFSET_CNTL,     restore->crtc_offset_cntl);
6402
    OUTREG(RADEON_CRTC_PITCH,           restore->crtc_pitch);
6435
    OUTREG(RADEON_CRTC_PITCH,           restore->crtc_pitch);
6436
    OUTREG(RADEON_DISP_OUTPUT_CNTL,     restore->disp_output_cntl);
6403
    OUTREG(RADEON_DISP_MERGE_CNTL,      restore->disp_merge_cntl);
6437
    OUTREG(RADEON_DISP_MERGE_CNTL,      restore->disp_merge_cntl);
6404
    OUTREG(RADEON_CRTC_MORE_CNTL,       restore->crtc_more_cntl);
6438
    OUTREG(RADEON_CRTC_MORE_CNTL,       restore->crtc_more_cntl);
6405
6439
Lines 6582-6593 Link Here
6582
	    ~(RADEON_P2PLL_ATOMIC_UPDATE_W));
6616
	    ~(RADEON_P2PLL_ATOMIC_UPDATE_W));
6583
}
6617
}
6584
6618
6619
static CARD8 RADEONComputePLLGain(CARD16 reference_freq,
6620
	                          CARD16 ref_div,
6621
        		          CARD16 fb_div)
6622
{
6623
  unsigned vcoFreq;
6624
6625
  vcoFreq = ((unsigned)reference_freq * fb_div) / ref_div;
6626
6627
  /*
6628
   * This is orribly crude: the VCO frequency range is divided into
6629
   * 3 parts, each part having a fixed PLL gain value.
6630
   */
6631
  if (vcoFreq >= 30000)
6632
    /*
6633
     * [300..max] MHz : 7
6634
     */
6635
    return 7;
6636
  else if (vcoFreq >= 18000)
6637
    /*
6638
     * [180..300) MHz : 4
6639
     */
6640
    return 4;
6641
  else
6642
    /*
6643
     * [0..180) MHz : 1
6644
     */
6645
    return 1;
6646
}
6647
6648
6585
/* Write PLL registers */
6649
/* Write PLL registers */
6586
static void RADEONRestorePLLRegisters(ScrnInfoPtr pScrn,
6650
static void RADEONRestorePLLRegisters(ScrnInfoPtr pScrn,
6587
				      RADEONSavePtr restore)
6651
				      RADEONSavePtr restore)
6588
{
6652
{
6589
    RADEONInfoPtr  info       = RADEONPTR(pScrn);
6653
    RADEONInfoPtr  info       = RADEONPTR(pScrn);
6590
    unsigned char *RADEONMMIO = info->MMIO;
6654
    unsigned char *RADEONMMIO = info->MMIO;
6655
    CARD8 pllGain;
6591
6656
6592
    if (info->IsMobility) {
6657
    if (info->IsMobility) {
6593
        /* A temporal workaround for the occational blanking on certain laptop panels.
6658
        /* A temporal workaround for the occational blanking on certain laptop panels.
Lines 6610-6624 Link Here
6610
    OUTPLLP(pScrn, RADEON_VCLK_ECP_CNTL,
6675
    OUTPLLP(pScrn, RADEON_VCLK_ECP_CNTL,
6611
	    RADEON_VCLK_SRC_SEL_CPUCLK,
6676
	    RADEON_VCLK_SRC_SEL_CPUCLK,
6612
	    ~(RADEON_VCLK_SRC_SEL_MASK));
6677
	    ~(RADEON_VCLK_SRC_SEL_MASK));
6678
    pllGain = RADEONComputePLLGain(info->pll.reference_freq,
6679
                                  restore->ppll_ref_div & RADEON_PPLL_REF_DIV_MASK,
6680
                                  restore->ppll_div_3 & RADEON_PPLL_FB3_DIV_MASK);
6681
6682
6613
6683
6614
    OUTPLLP(pScrn,
6684
    OUTPLLP(pScrn,
6615
	    RADEON_PPLL_CNTL,
6685
	    RADEON_PPLL_CNTL,
6616
	    RADEON_PPLL_RESET
6686
	    RADEON_PPLL_RESET
6617
	    | RADEON_PPLL_ATOMIC_UPDATE_EN
6687
	    | RADEON_PPLL_ATOMIC_UPDATE_EN
6618
	    | RADEON_PPLL_VGA_ATOMIC_UPDATE_EN,
6688
	    | RADEON_PPLL_VGA_ATOMIC_UPDATE_EN
6689
	    | ((CARD32)pllGain << RADEON_PPLL_PVG_SHIFT),
6619
	    ~(RADEON_PPLL_RESET
6690
	    ~(RADEON_PPLL_RESET
6620
	      | RADEON_PPLL_ATOMIC_UPDATE_EN
6691
	      | RADEON_PPLL_ATOMIC_UPDATE_EN
6621
	      | RADEON_PPLL_VGA_ATOMIC_UPDATE_EN));
6692
	      | RADEON_PPLL_VGA_ATOMIC_UPDATE_EN
6693
	      | RADEON_PPLL_PVG_MASK));
6694
6622
6695
6623
    OUTREGP(RADEON_CLOCK_CNTL_INDEX,
6696
    OUTREGP(RADEON_CLOCK_CNTL_INDEX,
6624
	    RADEON_PLL_DIV_SEL,
6697
	    RADEON_PLL_DIV_SEL,
Lines 6678-6686 Link Here
6678
6751
6679
    usleep(50000); /* Let the clock to lock */
6752
    usleep(50000); /* Let the clock to lock */
6680
6753
6681
    OUTPLLP(pScrn, RADEON_VCLK_ECP_CNTL,
6754
    OUTPLL(pScrn, RADEON_VCLK_ECP_CNTL , restore->vclk_ecp_cntl);
6682
	    RADEON_VCLK_SRC_SEL_PPLLCLK,
6755
6683
	    ~(RADEON_VCLK_SRC_SEL_MASK));
6756
    RADEONTRACE(("VCLK_ECP_CNTL = %08X\n" , restore->vclk_ecp_cntl));
6757
6684
}
6758
}
6685
6759
6686
6760
Lines 7093-7098 Link Here
7093
    save->crtc_offset          = INREG(RADEON_CRTC_OFFSET);
7167
    save->crtc_offset          = INREG(RADEON_CRTC_OFFSET);
7094
    save->crtc_offset_cntl     = INREG(RADEON_CRTC_OFFSET_CNTL);
7168
    save->crtc_offset_cntl     = INREG(RADEON_CRTC_OFFSET_CNTL);
7095
    save->crtc_pitch           = INREG(RADEON_CRTC_PITCH);
7169
    save->crtc_pitch           = INREG(RADEON_CRTC_PITCH);
7170
    save->disp_output_cntl     = INREG(RADEON_DISP_OUTPUT_CNTL);
7096
    save->disp_merge_cntl      = INREG(RADEON_DISP_MERGE_CNTL);
7171
    save->disp_merge_cntl      = INREG(RADEON_DISP_MERGE_CNTL);
7097
    save->crtc_more_cntl       = INREG(RADEON_CRTC_MORE_CNTL);
7172
    save->crtc_more_cntl       = INREG(RADEON_CRTC_MORE_CNTL);
7098
7173
Lines 7162-7167 Link Here
7162
    save->ppll_ref_div = INPLL(pScrn, RADEON_PPLL_REF_DIV);
7237
    save->ppll_ref_div = INPLL(pScrn, RADEON_PPLL_REF_DIV);
7163
    save->ppll_div_3   = INPLL(pScrn, RADEON_PPLL_DIV_3);
7238
    save->ppll_div_3   = INPLL(pScrn, RADEON_PPLL_DIV_3);
7164
    save->htotal_cntl  = INPLL(pScrn, RADEON_HTOTAL_CNTL);
7239
    save->htotal_cntl  = INPLL(pScrn, RADEON_HTOTAL_CNTL);
7240
    save->vclk_ecp_cntl= INPLL(pScrn, RADEON_VCLK_ECP_CNTL);
7165
7241
7166
    RADEONTRACE(("Read: 0x%08x 0x%08x 0x%08x\n",
7242
    RADEONTRACE(("Read: 0x%08x 0x%08x 0x%08x\n",
7167
		 save->ppll_ref_div,
7243
		 save->ppll_ref_div,
Lines 7171-7176 Link Here
7171
		 save->ppll_ref_div & RADEON_PPLL_REF_DIV_MASK,
7247
		 save->ppll_ref_div & RADEON_PPLL_REF_DIV_MASK,
7172
		 save->ppll_div_3 & RADEON_PPLL_FB3_DIV_MASK,
7248
		 save->ppll_div_3 & RADEON_PPLL_FB3_DIV_MASK,
7173
		 (save->ppll_div_3 & RADEON_PPLL_POST3_DIV_MASK) >> 16));
7249
		 (save->ppll_div_3 & RADEON_PPLL_POST3_DIV_MASK) >> 16));
7250
    RADEONTRACE(("Read VCLK_ECP_CNTL = %08x\n" , save->vclk_ecp_cntl));
7174
}
7251
}
7175
7252
7176
/* Read PLL registers */
7253
/* Read PLL registers */
Lines 7279-7284 Link Here
7279
    RADEONSaveMode(pScrn, save);
7356
    RADEONSaveMode(pScrn, save);
7280
    if (!info->IsSecondary)
7357
    if (!info->IsSecondary)
7281
	RADEONSaveSurfaces(pScrn, save);
7358
	RADEONSaveSurfaces(pScrn, save);
7359
7360
    /*
7361
     * Save initial RT state
7362
     */
7363
    if(info->theaterOut != NULL)
7364
      xf86_theaterOutSave(info->theaterOut , pScrn);
7282
}
7365
}
7283
7366
7284
/* Restore the original (text) mode */
7367
/* Restore the original (text) mode */
Lines 7321-7326 Link Here
7321
    if (!info->IsSecondary)
7404
    if (!info->IsSecondary)
7322
	RADEONRestoreSurfaces(pScrn, restore);
7405
	RADEONRestoreSurfaces(pScrn, restore);
7323
7406
7407
    /*
7408
     * Restore RT state
7409
     */
7410
    if (info->theaterOut != NULL)
7411
      xf86_theaterOutRestore(info->theaterOut , pScrn);
7324
#if 0
7412
#if 0
7325
    /* Temp fix to "solve" VT switch problems.  When switching VTs on
7413
    /* Temp fix to "solve" VT switch problems.  When switching VTs on
7326
     * some systems, the console can either hang or the fonts can be
7414
     * some systems, the console can either hang or the fonts can be
Lines 8072-8078 Link Here
8072
	save->crtc2_gen_cntl      = (RADEON_CRTC2_EN | (format << 8));
8160
	save->crtc2_gen_cntl      = (RADEON_CRTC2_EN | (format << 8));
8073
	save->fp2_h_sync_strt_wid = save->crtc2_h_sync_strt_wid;
8161
	save->fp2_h_sync_strt_wid = save->crtc2_h_sync_strt_wid;
8074
	save->fp2_v_sync_strt_wid = save->crtc2_v_sync_strt_wid;
8162
	save->fp2_v_sync_strt_wid = save->crtc2_v_sync_strt_wid;
8075
	save->fp2_gen_cntl        = info->SavedReg.fp2_gen_cntl | RADEON_FP2_ON;
8163
	save->fp2_gen_cntl        = info->SavedReg.fp2_gen_cntl
8164
				    | RADEON_FP2_SRC_SEL_CRTC2
8165
				    | RADEON_FP2_ON;
8166
8076
	save->fp2_gen_cntl	  &= ~(RADEON_FP2_BLANK_EN);
8167
	save->fp2_gen_cntl	  &= ~(RADEON_FP2_BLANK_EN);
8077
8168
8078
	if ((info->ChipFamily == CHIP_FAMILY_R200) ||
8169
	if ((info->ChipFamily == CHIP_FAMILY_R200) ||
Lines 8418-8432 Link Here
8418
				     pll->reference_freq);
8509
				     pll->reference_freq);
8419
    save->post_div       = post_div->divider;
8510
    save->post_div       = post_div->divider;
8420
8511
8421
    RADEONTRACE(("dc=%d, of=%d, fd=%d, pd=%d\n",
8512
/*    RADEONTRACE(("dc=%d, of=%d, fd=%d, pd=%d\n",
8422
	       save->dot_clock_freq,
8513
	       save->dot_clock_freq,
8423
	       save->pll_output_freq,
8514
	       save->pll_output_freq,
8424
	       save->feedback_div,
8515
	       save->feedback_div,
8425
	       save->post_div));
8516
	       save->post_div));
8517
*/
8426
8518
8427
    save->ppll_ref_div   = pll->reference_div;
8519
    save->ppll_ref_div   = pll->reference_div;
8428
    save->ppll_div_3     = (save->feedback_div | (post_div->bitvalue << 16));
8520
    save->ppll_div_3     = (save->feedback_div | (post_div->bitvalue << 16));
8429
    save->htotal_cntl    = 0;
8521
    save->htotal_cntl    = 0;
8522
    save->vclk_ecp_cntl  = (save->vclk_ecp_cntl & ~RADEON_VCLK_SRC_SEL_MASK) | RADEON_VCLK_SRC_SEL_PPLLCLK;
8430
}
8523
}
8431
8524
8432
/* Define PLL2 registers for requested video mode */
8525
/* Define PLL2 registers for requested video mode */
Lines 8480-8490 Link Here
8480
				       pll->reference_freq);
8573
				       pll->reference_freq);
8481
    save->post_div_2       = post_div->divider;
8574
    save->post_div_2       = post_div->divider;
8482
8575
8576
/*
8483
    RADEONTRACE(("dc=%d, of=%d, fd=%d, pd=%d\n",
8577
    RADEONTRACE(("dc=%d, of=%d, fd=%d, pd=%d\n",
8484
	       save->dot_clock_freq_2,
8578
	       save->dot_clock_freq_2,
8485
	       save->pll_output_freq_2,
8579
	       save->pll_output_freq_2,
8486
	       save->feedback_div_2,
8580
	       save->feedback_div_2,
8487
	       save->post_div_2));
8581
	       save->post_div_2));
8582
*/
8488
8583
8489
    save->p2pll_ref_div    = pll->reference_div;
8584
    save->p2pll_ref_div    = pll->reference_div;
8490
    save->p2pll_div_0      = (save->feedback_div_2 |
8585
    save->p2pll_div_0      = (save->feedback_div_2 |
Lines 8559-8564 Link Here
8559
#endif
8654
#endif
8560
8655
8561
    info->Flags = mode->Flags;
8656
    info->Flags = mode->Flags;
8657
    /*
8658
     * Some registers are initialized from text mode state
8659
     */
8660
    save->disp_output_cntl = RADEONPTR(pScrn)->SavedReg.disp_output_cntl;
8661
    save->vclk_ecp_cntl    = RADEONPTR(pScrn)->SavedReg.vclk_ecp_cntl;
8662
8562
8663
8563
    RADEONInitMemMapRegisters(pScrn, save, info);
8664
    RADEONInitMemMapRegisters(pScrn, save, info);
8564
    RADEONInitCommonRegisters(save, info);
8665
    RADEONInitCommonRegisters(save, info);
Lines 8627-8635 Link Here
8627
8728
8628
    if (!RADEONInit(pScrn, mode, &info->ModeReg)) return FALSE;
8729
    if (!RADEONInit(pScrn, mode, &info->ModeReg)) return FALSE;
8629
8730
8731
    /*
8732
     * Define RT state
8733
     */
8734
    if (info->theaterOut != NULL)
8735
      {
8736
         Bool res = xf86_theaterOutInit(info->theaterOut , mode , &info->ModeReg);
8737
         RADEONTRACE(("theaterOutInit returns %d\n" , res));
8738
      }
8739
8630
    pScrn->vtSema = TRUE;
8740
    pScrn->vtSema = TRUE;
8631
    RADEONBlank(pScrn);
8741
    RADEONBlank(pScrn);
8632
    RADEONRestoreMode(pScrn, &info->ModeReg);
8742
    RADEONRestoreMode(pScrn, &info->ModeReg);
8743
8744
    /*
8745
     * Set RT to new mode
8746
     */
8747
    if (info->theaterOut != NULL)
8748
      xf86_theaterOutRestoreMode(info->theaterOut , pScrn);
8749
8633
    RADEONUnblank(pScrn);
8750
    RADEONUnblank(pScrn);
8634
8751
8635
    info->CurrentLayout.mode = mode;
8752
    info->CurrentLayout.mode = mode;
Lines 9985-9987 Link Here
9985
    pScrn->FreeScreen    = RADEONFreeScreen;
10102
    pScrn->FreeScreen    = RADEONFreeScreen;
9986
    pScrn->ValidMode     = RADEONValidMode;
10103
    pScrn->ValidMode     = RADEONValidMode;
9987
}
10104
}
10105
10106
10107
/*
10108
 * fulivi: interface functions between RADEONSet/GetPortAttribute (in radeon_video.c) and
10109
 * theater_out module.
10110
 */
10111
static void RADEONRedoSwitchMode(ScrnInfoPtr pScrn)
10112
{
10113
  int scrnIndex = pScrn->scrnIndex;
10114
10115
  /*
10116
   * It seems that last parameter (flags) is not used
10117
   */
10118
  RADEONSwitchMode(scrnIndex , pScrn->currentMode , 0);
10119
}
10120
10121
void RADEONTheaterOutSetStandard(ScrnInfoPtr pScrn,
10122
                        	 TVStd std)
10123
{
10124
  RADEONInfoPtr info = RADEONPTR(pScrn);
10125
10126
  RADEONTRACE(("RADEONTheaterOutSetStandard std = %d" , std));
10127
10128
  if (info->theaterOut != NULL && xf86_theaterOutSetStandard(info->theaterOut , std))
10129
    RADEONRedoSwitchMode(pScrn);
10130
}
10131
10132
TVStd RADEONTheaterOutGetStandard(ScrnInfoPtr pScrn)
10133
{
10134
  RADEONInfoPtr info = RADEONPTR(pScrn);
10135
10136
  if (info->theaterOut != NULL)
10137
    return xf86_theaterOutGetStandard(info->theaterOut);
10138
  else
10139
    return TV_STD_KEEP_OFF;
10140
}
10141
10142
Bool RADEONTheaterOutGetCompatMode(ScrnInfoPtr pScrn)
10143
{
10144
  RADEONInfoPtr info = RADEONPTR(pScrn);
10145
10146
  if (info->theaterOut != NULL)
10147
    return xf86_theaterOutGetCompatMode(info->theaterOut);
10148
  else
10149
    return FALSE;
10150
}
10151
10152
void RADEONTheaterOutSetAttr(ScrnInfoPtr pScrn,
10153
                    	     TheaterOutAttr attr,
10154
                    	     int value)
10155
{
10156
  RADEONInfoPtr info = RADEONPTR(pScrn);
10157
10158
  if (info->theaterOut != NULL)
10159
    xf86_theaterOutSetAttr(info->theaterOut , attr , value);
10160
}
10161
10162
int RADEONTheaterOutGetAttr(ScrnInfoPtr pScrn,
10163
                	    TheaterOutAttr attr)
10164
{
10165
  RADEONInfoPtr info = RADEONPTR(pScrn);
10166
10167
  if (info->theaterOut != NULL)
10168
    return xf86_theaterOutGetAttr(info->theaterOut , attr);
10169
  else
10170
    return 0;
10171
}
10172
10173
void RADEONTheaterOutGetAttrLimits(ScrnInfoPtr pScrn,
10174
                                   TheaterOutAttr attr,
10175
                                   int *maxValue,
10176
                                   int *minValue)
10177
{
10178
  RADEONInfoPtr info = RADEONPTR(pScrn);
10179
10180
  if (info->theaterOut != NULL)
10181
    xf86_theaterOutGetAttrLimits(info->theaterOut , attr , maxValue , minValue);
10182
}
(-)xf86-video-ati-6.5.8.0/src/radeon.h (-1 / +18 lines)
Lines 38-48 Link Here
38
#ifndef _RADEON_H_
38
#ifndef _RADEON_H_
39
#define _RADEON_H_
39
#define _RADEON_H_
40
40
41
#include "radeon_version.h"
41
#include "xf86str.h"
42
#include "xf86str.h"
42
#include "xf86_ansic.h"
43
#include "xf86_ansic.h"
43
#include "compiler.h"
44
#include "compiler.h"
44
#include "xf86fbman.h"
45
#include "xf86fbman.h"
45
46
47
#include "generic_bus.h"
46
				/* PCI support */
48
				/* PCI support */
47
#include "xf86Pci.h"
49
#include "xf86Pci.h"
48
50
Lines 223-228 Link Here
223
    unsigned          ppll_div_3;
225
    unsigned          ppll_div_3;
224
    CARD32            htotal_cntl;
226
    CARD32            htotal_cntl;
225
227
228
    CARD32            vclk_ecp_cntl;
229
226
				/* Computed values for PLL2 */
230
				/* Computed values for PLL2 */
227
    CARD32            dot_clock_freq_2;
231
    CARD32            dot_clock_freq_2;
228
    CARD32            pll_output_freq_2;
232
    CARD32            pll_output_freq_2;
Lines 638-643 Link Here
638
	char*			RageTheatreMicrocPath;
642
	char*			RageTheatreMicrocPath;
639
	char*			RageTheatreMicrocType;
643
	char*			RageTheatreMicrocType;
640
    Bool               MM_TABLE_valid;
644
    Bool               MM_TABLE_valid;
645
    GENERIC_BUS_Ptr   VIP;
646
    struct TheaterOut *theaterOut;
641
    struct {
647
    struct {
642
    	CARD8 table_revision;
648
    	CARD8 table_revision;
643
	CARD8 table_size;
649
	CARD8 table_size;
Lines 729-734 Link Here
729
    info->fifo_slots -= entries;					\
735
    info->fifo_slots -= entries;					\
730
} while (0)
736
} while (0)
731
737
738
#include "theater_out.h"
739
732
extern RADEONEntPtr RADEONEntPriv(ScrnInfoPtr pScrn);
740
extern RADEONEntPtr RADEONEntPriv(ScrnInfoPtr pScrn);
733
extern void        RADEONWaitForFifoFunction(ScrnInfoPtr pScrn, int entries);
741
extern void        RADEONWaitForFifoFunction(ScrnInfoPtr pScrn, int entries);
734
extern void        RADEONWaitForIdleMMIO(ScrnInfoPtr pScrn);
742
extern void        RADEONWaitForIdleMMIO(ScrnInfoPtr pScrn);
Lines 739-744 Link Here
739
extern void        RADEONDoAdjustFrame(ScrnInfoPtr pScrn, int x, int y,
747
extern void        RADEONDoAdjustFrame(ScrnInfoPtr pScrn, int x, int y,
740
				       int clone);
748
				       int clone);
741
749
750
extern void        RADEONTheaterOutSetStandard(ScrnInfoPtr, TVStd);
751
extern TVStd       RADEONTheaterOutGetStandard(ScrnInfoPtr);
752
extern Bool        RADEONTheaterOutGetCompatMode(ScrnInfoPtr);
753
extern void        RADEONTheaterOutSetAttr(ScrnInfoPtr, TheaterOutAttr, int);
754
extern int         RADEONTheaterOutGetAttr(ScrnInfoPtr, TheaterOutAttr);
755
extern void        RADEONTheaterOutGetAttrLimits(ScrnInfoPtr, TheaterOutAttr, int *, int *);
756
742
extern void        RADEONEngineReset(ScrnInfoPtr pScrn);
757
extern void        RADEONEngineReset(ScrnInfoPtr pScrn);
743
extern void        RADEONEngineFlush(ScrnInfoPtr pScrn);
758
extern void        RADEONEngineFlush(ScrnInfoPtr pScrn);
744
extern void        RADEONEngineRestore(ScrnInfoPtr pScrn);
759
extern void        RADEONEngineRestore(ScrnInfoPtr pScrn);
Lines 770-776 Link Here
770
785
771
extern int         RADEONMinBits(int val);
786
extern int         RADEONMinBits(int val);
772
787
773
extern void        RADEONInitVideo(ScreenPtr pScreen);
788
extern GENERIC_BUS_Ptr RADEONAllocateVIP(ScrnInfoPtr pScrn);
789
790
extern void        RADEONInitVideo(ScreenPtr pScreen , GENERIC_BUS_Ptr VIP , Bool loadTheatre);
774
extern void        RADEONResetVideo(ScrnInfoPtr pScrn);
791
extern void        RADEONResetVideo(ScrnInfoPtr pScrn);
775
extern void        R300CGWorkaround(ScrnInfoPtr pScrn);
792
extern void        R300CGWorkaround(ScrnInfoPtr pScrn);
776
793
(-)xf86-video-ati-6.5.8.0/src/radeon_reg.h (+3 lines)
Lines 1223-1228 Link Here
1223
#       define RADEON_PPLL_SLEEP                (1 <<  1)
1223
#       define RADEON_PPLL_SLEEP                (1 <<  1)
1224
#       define RADEON_PPLL_ATOMIC_UPDATE_EN     (1 << 16)
1224
#       define RADEON_PPLL_ATOMIC_UPDATE_EN     (1 << 16)
1225
#       define RADEON_PPLL_VGA_ATOMIC_UPDATE_EN (1 << 17)
1225
#       define RADEON_PPLL_VGA_ATOMIC_UPDATE_EN (1 << 17)
1226
#       define RADEON_PPLL_PVG_MASK             (7 << 11)
1227
#       define RADEON_PPLL_PVG_SHIFT            11
1228
1226
#       define RADEON_PPLL_ATOMIC_UPDATE_VSYNC  (1 << 18)
1229
#       define RADEON_PPLL_ATOMIC_UPDATE_VSYNC  (1 << 18)
1227
#define RADEON_PPLL_DIV_0                   0x0004 /* PLL */
1230
#define RADEON_PPLL_DIV_0                   0x0004 /* PLL */
1228
#define RADEON_PPLL_DIV_1                   0x0005 /* PLL */
1231
#define RADEON_PPLL_DIV_1                   0x0005 /* PLL */
(-)xf86-video-ati-6.5.8.0/src/radeon_video.c (-12 / +103 lines)
Lines 77-83 Link Here
77
77
78
static void RADEONInitOffscreenImages(ScreenPtr);
78
static void RADEONInitOffscreenImages(ScreenPtr);
79
79
80
static XF86VideoAdaptorPtr RADEONSetupImageVideo(ScreenPtr);
80
static XF86VideoAdaptorPtr RADEONSetupImageVideo(ScreenPtr , GENERIC_BUS_Ptr , Bool);
81
static int  RADEONSetPortAttribute(ScrnInfoPtr, Atom, INT32, pointer);
81
static int  RADEONSetPortAttribute(ScrnInfoPtr, Atom, INT32, pointer);
82
static int  RADEONGetPortAttribute(ScrnInfoPtr, Atom ,INT32 *, pointer);
82
static int  RADEONGetPortAttribute(ScrnInfoPtr, Atom ,INT32 *, pointer);
83
static void RADEONStopVideo(ScrnInfoPtr, pointer, Bool);
83
static void RADEONStopVideo(ScrnInfoPtr, pointer, Bool);
Lines 118-123 Link Here
118
	     
118
	     
119
static Atom xvOvAlpha, xvGrAlpha, xvAlphaMode;
119
static Atom xvOvAlpha, xvGrAlpha, xvAlphaMode;
120
120
121
static Atom xvTvoStandard , xvTvoModeCompat;
122
123
typedef struct
124
{
125
  char *name;
126
  TheaterOutAttr attr;
127
  Atom atom;
128
} TVOAttr;
129
130
static
131
TVOAttr theaterOutAttrs[] =
132
{
133
  {"XV_TVO_HPOS" , THEATER_OUT_HPOS , 0 },
134
  {"XV_TVO_VPOS" , THEATER_OUT_VPOS , 0 },
135
  {"XV_TVO_HSIZE" , THEATER_OUT_HSIZE , 0 }
136
};
137
#define N_TVO_ATTRS (sizeof(theaterOutAttrs) / sizeof(theaterOutAttrs[ 0 ]))
121
138
122
#define GET_PORT_PRIVATE(pScrn) \
139
#define GET_PORT_PRIVATE(pScrn) \
123
   (RADEONPortPrivPtr)((RADEONPTR(pScrn))->adaptor->pPortPrivates[0].ptr)
140
   (RADEONPortPrivPtr)((RADEONPTR(pScrn))->adaptor->pPortPrivates[0].ptr)
Lines 136-149 Link Here
136
}
153
}
137
#endif /* USE_EXA */
154
#endif /* USE_EXA */
138
155
139
void RADEONInitVideo(ScreenPtr pScreen)
156
void RADEONInitVideo(ScreenPtr pScreen , GENERIC_BUS_Ptr VIP , Bool loadTheatre)
140
{
157
{
141
    ScrnInfoPtr pScrn = xf86Screens[pScreen->myNum];
158
    ScrnInfoPtr pScrn = xf86Screens[pScreen->myNum];
142
    XF86VideoAdaptorPtr *adaptors, *newAdaptors = NULL;
159
    XF86VideoAdaptorPtr *adaptors, *newAdaptors = NULL;
143
    XF86VideoAdaptorPtr newAdaptor = NULL;
160
    XF86VideoAdaptorPtr newAdaptor = NULL;
144
    int num_adaptors;
161
    int num_adaptors;
145
162
146
    newAdaptor = RADEONSetupImageVideo(pScreen);
163
    newAdaptor = RADEONSetupImageVideo(pScreen , VIP , loadTheatre);
147
    RADEONInitOffscreenImages(pScreen);
164
    RADEONInitOffscreenImages(pScreen);
148
    num_adaptors = xf86XVListGenericAdaptors(pScrn, &adaptors);
165
    num_adaptors = xf86XVListGenericAdaptors(pScrn, &adaptors);
149
166
Lines 236-242 Link Here
236
253
237
#endif
254
#endif
238
255
239
#define NUM_ATTRIBUTES 22
256
//#define NUM_ATTRIBUTES 22
257
#define NUM_ATTRIBUTES 22+5
240
#define NUM_DEC_ATTRIBUTES (NUM_ATTRIBUTES+12)
258
#define NUM_DEC_ATTRIBUTES (NUM_ATTRIBUTES+12)
241
259
242
static XF86AttributeRec Attributes[NUM_DEC_ATTRIBUTES+1] =
260
static XF86AttributeRec Attributes[NUM_DEC_ATTRIBUTES+1] =
Lines 252-257 Link Here
252
   {XvSettable | XvGettable,     0,  255, "XV_OVERLAY_ALPHA"},
270
   {XvSettable | XvGettable,     0,  255, "XV_OVERLAY_ALPHA"},
253
   {XvSettable | XvGettable,     0,  255, "XV_GRAPHICS_ALPHA"},
271
   {XvSettable | XvGettable,     0,  255, "XV_GRAPHICS_ALPHA"},
254
   {XvSettable | XvGettable,     0,    1, "XV_ALPHA_MODE"},
272
   {XvSettable | XvGettable,     0,    1, "XV_ALPHA_MODE"},
273
274
   {XvSettable | XvGettable,     0, TV_STD_N_STANDARDS-1, "XV_TVO_STANDARD"},
275
   {             XvGettable,     0,   ~0,   "XV_TVO_MODE_COMPAT"},
276
   {XvSettable | XvGettable, -1000, 1000, "XV_TVO_HPOS"},
277
   {XvSettable | XvGettable, -1000, 1000, "XV_TVO_VPOS"},
278
   {XvSettable | XvGettable, -1000, 1000, "XV_TVO_HSIZE"},
279
255
   {XvSettable | XvGettable, -1000, 1000, "XV_BRIGHTNESS"},
280
   {XvSettable | XvGettable, -1000, 1000, "XV_BRIGHTNESS"},
256
   {XvSettable | XvGettable, -1000, 1000, "XV_CONTRAST"},
281
   {XvSettable | XvGettable, -1000, 1000, "XV_CONTRAST"},
257
   {XvSettable | XvGettable, -1000, 1000, "XV_SATURATION"},
282
   {XvSettable | XvGettable, -1000, 1000, "XV_SATURATION"},
Lines 1057-1062 Link Here
1057
    RADEONPortPrivPtr pPriv = info->adaptor->pPortPrivates[0].ptr;
1082
    RADEONPortPrivPtr pPriv = info->adaptor->pPortPrivates[0].ptr;
1058
    char tmp[200];
1083
    char tmp[200];
1059
1084
1085
    unsigned i;
1060
    /* this function is called from ScreenInit. pScreen is used 
1086
    /* this function is called from ScreenInit. pScreen is used 
1061
       by XAA internally, but not valid until ScreenInit finishs.
1087
       by XAA internally, but not valid until ScreenInit finishs.
1062
    */
1088
    */
Lines 1070-1075 Link Here
1070
    xvLocationID = MAKE_ATOM("XV_LOCATION_ID");
1096
    xvLocationID = MAKE_ATOM("XV_LOCATION_ID");
1071
    xvDumpStatus = MAKE_ATOM("XV_DUMP_STATUS");
1097
    xvDumpStatus = MAKE_ATOM("XV_DUMP_STATUS");
1072
 
1098
 
1099
    xvTvoStandard = MAKE_ATOM("XV_TVO_STANDARD");
1100
    xvTvoModeCompat = MAKE_ATOM("XV_TVO_MODE_COMPAT");
1101
1102
    for (i = 0; i < N_TVO_ATTRS; i++)
1103
    {
1104
        char *name;
1105
        name = theaterOutAttrs[ i ].name;
1106
        theaterOutAttrs[ i ].atom = MakeAtom(name, strlen(name), TRUE);
1107
1108
        RADEONTRACE(("RADEONResetVideo,name=%s,atom=%d\n",name,theaterOutAttrs[ i ].atom));
1109
    }
1110
1073
    xvBrightness   = MAKE_ATOM("XV_BRIGHTNESS");
1111
    xvBrightness   = MAKE_ATOM("XV_BRIGHTNESS");
1074
    xvSaturation   = MAKE_ATOM("XV_SATURATION");
1112
    xvSaturation   = MAKE_ATOM("XV_SATURATION");
1075
    xvColor        = MAKE_ATOM("XV_COLOR");
1113
    xvColor        = MAKE_ATOM("XV_COLOR");
Lines 1271-1277 Link Here
1271
}
1309
}
1272
1310
1273
static XF86VideoAdaptorPtr
1311
static XF86VideoAdaptorPtr
1274
RADEONAllocAdaptor(ScrnInfoPtr pScrn)
1312
RADEONAllocAdaptor(ScrnInfoPtr pScrn, GENERIC_BUS_Ptr VIP)
1275
{
1313
{
1276
    XF86VideoAdaptorPtr adapt;
1314
    XF86VideoAdaptorPtr adapt;
1277
    RADEONInfoPtr info = RADEONPTR(pScrn);
1315
    RADEONInfoPtr info = RADEONPTR(pScrn);
Lines 1397-1403 Link Here
1397
    #endif
1435
    #endif
1398
1436
1399
    /* Initialize VIP bus */
1437
    /* Initialize VIP bus */
1400
    RADEONVIP_init(pScrn, pPriv);
1438
//    RADEONVIP_init(pScrn, pPriv);
1439
    pPriv->VIP = VIP;
1440
1401
    info->adaptor = adapt;
1441
    info->adaptor = adapt;
1402
1442
1403
	if(!xf86LoadSubModule(pScrn,"theatre_detect")) 
1443
	if(!xf86LoadSubModule(pScrn,"theatre_detect")) 
Lines 1479-1491 Link Here
1479
}
1519
}
1480
1520
1481
static XF86VideoAdaptorPtr
1521
static XF86VideoAdaptorPtr
1482
RADEONSetupImageVideo(ScreenPtr pScreen)
1522
RADEONSetupImageVideo(ScreenPtr pScreen , GENERIC_BUS_Ptr VIP , Bool loadTheatre)
1483
{
1523
{
1484
    ScrnInfoPtr pScrn = xf86Screens[pScreen->myNum];
1524
    ScrnInfoPtr pScrn = xf86Screens[pScreen->myNum];
1485
    RADEONPortPrivPtr pPriv;
1525
    RADEONPortPrivPtr pPriv;
1486
    XF86VideoAdaptorPtr adapt;
1526
    XF86VideoAdaptorPtr adapt;
1527
    unsigned i;
1487
1528
1488
    if(!(adapt = RADEONAllocAdaptor(pScrn)))
1529
    if(!(adapt = RADEONAllocAdaptor(pScrn, VIP)))
1489
	return NULL;
1530
	return NULL;
1490
1531
1491
    adapt->type = XvWindowMask | XvInputMask | XvImageMask;
1532
    adapt->type = XvWindowMask | XvInputMask | XvImageMask;
Lines 1511-1516 Link Here
1511
    adapt->PutImage = RADEONPutImage;
1552
    adapt->PutImage = RADEONPutImage;
1512
    adapt->QueryImageAttributes = RADEONQueryImageAttributes;
1553
    adapt->QueryImageAttributes = RADEONQueryImageAttributes;
1513
1554
1555
    /*
1556
     * fulivi: set limits of theater_out attributes
1557
     */
1558
    for (i = 0; i < N_TVO_ATTRS; i++)
1559
      {
1560
        int maxValue;
1561
        int minValue;
1562
        unsigned j;
1563
1564
        RADEONTheaterOutGetAttrLimits(pScrn , theaterOutAttrs[ i ].attr , &maxValue , &minValue);
1565
1566
        for (j = 0; i < NUM_DEC_ATTRIBUTES; j++)
1567
          if (strcmp(theaterOutAttrs[ i ].name , Attributes[ j ].name) == 0)
1568
            {
1569
              Attributes[ j ].min_value = minValue;
1570
              Attributes[ j ].max_value = maxValue;
1571
              break;
1572
            }
1573
      }
1574
1514
    pPriv = (RADEONPortPrivPtr)(adapt->pPortPrivates[0].ptr);
1575
    pPriv = (RADEONPortPrivPtr)(adapt->pPortPrivates[0].ptr);
1515
    REGION_NULL(pScreen, &(pPriv->clip));
1576
    REGION_NULL(pScreen, &(pPriv->clip));
1516
1577
Lines 1813-1820 Link Here
1813
		RADEON_TDA9885_SetEncoding(pPriv);
1874
		RADEON_TDA9885_SetEncoding(pPriv);
1814
		}
1875
		}
1815
   }
1876
   }
1816
   else 
1877
   else if (attribute == xvTvoStandard)
1817
	return BadMatch;
1878
      {
1879
        value = ClipValue(value , 0 , TV_STD_N_STANDARDS-1);
1880
        RADEONTheaterOutSetStandard(pScrn , (TVStd)value);
1881
      }
1882
    else
1883
      {
1884
        unsigned i;
1885
1886
	for (i = 0; i < N_TVO_ATTRS; i++)
1887
        if (theaterOutAttrs[ i ].atom == attribute)
1888
          {
1889
            RADEONTheaterOutSetAttr(pScrn , theaterOutAttrs[ i ].attr , value);
1890
            break;
1891
          }
1892
      if (i == N_TVO_ATTRS)
1893
 	return BadMatch;
1894
    }
1818
1895
1819
    if (setTransform)
1896
    if (setTransform)
1820
    {
1897
    {
Lines 1918-1925 Link Here
1918
        *value = pPriv->instance_id;
1995
        *value = pPriv->instance_id;
1919
    else if(attribute == xvAdjustment)
1996
    else if(attribute == xvAdjustment)
1920
  	*value = pPriv->adjustment;
1997
  	*value = pPriv->adjustment;
1921
    else
1998
    else if(attribute == xvTvoStandard)
1922
	return BadMatch;
1999
        *value = (INT32)RADEONTheaterOutGetStandard(pScrn);
2000
    else if(attribute == xvTvoModeCompat)
2001
        *value = (INT32)RADEONTheaterOutGetCompatMode(pScrn);
2002
    else {
2003
        unsigned i;
2004
2005
        for (i = 0; i < N_TVO_ATTRS; i++) {
2006
            if (theaterOutAttrs[ i ].atom == attribute) {
2007
                *value = (INT32)RADEONTheaterOutGetAttr(pScrn , theaterOutAttrs[ i].attr);
2008
                break;
2009
            }
2010
        }
2011
        if (i == N_TVO_ATTRS)
2012
	    return BadMatch;
2013
    }
1923
2014
1924
    return Success;
2015
    return Success;
1925
}
2016
}
(-)xf86-video-ati-6.5.8.0/src/radeon_video.h (+2 lines)
Lines 47-52 Link Here
47
   GENERIC_BUS_Ptr  VIP;
47
   GENERIC_BUS_Ptr  VIP;
48
   TheatrePtr       theatre;   
48
   TheatrePtr       theatre;   
49
49
50
/*    TheaterOutPtr theaterOut; */
51
50
   Bool          video_stream_active;
52
   Bool          video_stream_active;
51
   int           encoding;
53
   int           encoding;
52
   CARD32        frequency;
54
   CARD32        frequency;
(-)xf86-video-ati-6.5.8.0/src/radeon_vip.c (-1 / +29 lines)
Lines 340-345 Link Here
340
340
341
void RADEONVIP_init(ScrnInfoPtr pScrn, RADEONPortPrivPtr pPriv)
341
void RADEONVIP_init(ScrnInfoPtr pScrn, RADEONPortPrivPtr pPriv)
342
{
342
{
343
/*
343
    pPriv->VIP=xcalloc(1,sizeof(GENERIC_BUS_Rec));
344
    pPriv->VIP=xcalloc(1,sizeof(GENERIC_BUS_Rec));
344
    pPriv->VIP->scrnIndex=pScrn->scrnIndex;
345
    pPriv->VIP->scrnIndex=pScrn->scrnIndex;
345
    pPriv->VIP->DriverPrivate.ptr=pPriv;
346
    pPriv->VIP->DriverPrivate.ptr=pPriv;
Lines 348-353 Link Here
348
    pPriv->VIP->write=RADEONVIP_write;
349
    pPriv->VIP->write=RADEONVIP_write;
349
    pPriv->VIP->fifo_read=RADEONVIP_fifo_read;
350
    pPriv->VIP->fifo_read=RADEONVIP_fifo_read;
350
    pPriv->VIP->fifo_write=RADEONVIP_fifo_write;
351
    pPriv->VIP->fifo_write=RADEONVIP_fifo_write;
351
   
352
    RADEONVIP_reset(pScrn, pPriv);
352
    RADEONVIP_reset(pScrn, pPriv);
353
*/
354
pPriv->VIP = RADEONAllocateVIP(pScrn);
353
}
355
}
356
357
/*
358
 * fulivi: This new function was created because I needed VIP access from radeon_driver module
359
 * (where port private data doesn't exist)
360
 */
361
GENERIC_BUS_Ptr
362
RADEONAllocateVIP(
363
               ScrnInfoPtr pScrn
364
               )
365
{
366
  GENERIC_BUS_Ptr VIP=NULL;
367
368
  VIP = xcalloc(1 , sizeof(GENERIC_BUS_Rec));
369
  VIP->DriverPrivate.ptr = NULL;        /* Nobody seems to use this */
370
  VIP->scrnIndex = pScrn->scrnIndex;
371
  VIP->ioctl = RADEONVIP_ioctl;
372
  VIP->read = RADEONVIP_read;
373
  VIP->write = RADEONVIP_write;
374
  VIP->fifo_read=RADEONVIP_fifo_read;
375
  VIP->fifo_write=RADEONVIP_fifo_write;
376
377
  RADEONVIP_reset(pScrn,NULL);
378
379
  return VIP;
380
}
381
 
(-)xf86-video-ati-6.5.8.0/src/README.tvout (+236 lines)
Line 0 Link Here
1
2
      *******************************************************
3
      **  XFree86 driver for TV output on ATI Radeon cards **
4
      *******************************************************
5
6
Copyright (c) 2003-2004, by Federico Ulivi <fulivi@lycos.com>
7
Released under the GNU General Public License, version 2.
8
9
1. About this driver
10
--------------------
11
12
This driver was developped as a part of ati.2 project. Its purpose
13
is to enable the TV output of ATI Radeon cards when running the
14
XFree86 graphical environment.
15
16
2. Status of the driver
17
-----------------------
18
19
The driver is in early development stage. It currently works with
20
those cards having a Rage Theater chip for TV output or with cards
21
having the tv module inside the Radeon chip (ERT, Embedded Rage
22
Theater, is my name for the latter).
23
The driver was successfully tested on these cards:
24
- Radeon 7200 / European model (TV out hw: RT 100)
25
- Radeon 9000 (TV out hw: ERT)
26
- Radeon 9200SE (TV out hw: ERT)
27
- Radeon 7000 (TV out hw: ERT)
28
29
3. Making it work
30
-----------------
31
32
The driver is always loaded by the Radeon driver. If you need to
33
disable this auto-loading mechanism, just set the "TVOutput" option
34
(see below) to "NOLOAD".
35
In principle the driver should coexist with video grabbing functions,
36
especially on those AIW cards where TV output is done by ERT
37
inside Radeon.
38
39
Principle of operation of the driver is very simple. Driver enables 
40
tv output whenever the current screen resolution and tv standard match
41
one of a set of pre-computed combinations. In all other cases tv output
42
is simply kept disabled.
43
The driver currently works in the so-called "clone" mode only. This means
44
that the image on the TV screen is exactly the same as the one on the
45
monitor.
46
47
The driver is enabled by adding a "TVOutput" line in the "device"
48
section of XF86Config-4 file (this file is usually located in /etc/X11
49
directory). Syntax of this option is very simple:
50
51
Section "Device"
52
 ..
53
 ..
54
 Option "TVOuput" "<name of tv standard>"
55
EndSection
56
57
Names of recognized TV standards are:
58
"NTSC"
59
"NTSC-J"
60
"PAL"
61
"PAL-CN"
62
"PAL-M"
63
"PAL-N"
64
"PAL-60"
65
66
If "TVOutput" is not present or its value is invalid, TV output is kept disabled.
67
68
In the current version of the driver these are the recognized TV standard &
69
resolution combinations:
70
71
PAL	800x600
72
NTSC	800x600
73
74
More combinations will be added in future releases.
75
76
4. XV Interface
77
---------------
78
79
The driver has an external interface through some Xv attributes. 
80
You can change the value of these attributes by using the tvo_set utility
81
(see below).
82
83
XV_TVO_STANDARD		Settable/Gettable
84
	This is the tv standard in use by the driver. Its value is encoded
85
	according to this table:
86
87
	0	NTSC
88
	1	PAL
89
	2	PAL-M
90
	3	PAL-60
91
	4	NTSC-J
92
	5	PAL-CN
93
	6	PAL-N
94
	7	Keep TV off
95
96
XV_TVO_MODE_COMPAT	Gettable
97
	This attribute is set to 1 whenever TV output is enabled, i.e.
98
	whenever the current resolution & tv standard combination is 
99
	recognized by the driver. 
100
101
XV_TVO_HPOS	Settable/Gettable
102
	Horizontal position, valid range is [-5..+5]. 
103
	This attribute defines the horizontal position of the TV image.
104
	Higher values shift the image to the right, lower values to the left.
105
106
XV_TVO_VPOS	Settable/Gettable
107
	Vertical position, valid range is [-5..+5]. 
108
	This attribute defines the vertical position of the TV image.
109
	Higher values shift the image upward, lower values downward.
110
111
XV_TVO_HSIZE	Settable/Gettable
112
	Horizontal size, valid range is [-5..+5]. 
113
	This attribute is used to set the horizontal size of TV image.
114
	Higher values enlarge TV lines, lower values reduce them.
115
116
Default value for XV_TVO_HPOS, XV_TVO_VPOS & XV_TVO_HSIZE just after
117
X Window start is 0.
118
119
You might ask where a vertical size attribute has gone. It was not included
120
because it's quite hard to implement (it requires changing many timings in
121
the CRTC). For the moment I'm not planning to work on it.
122
123
5. tvo_set utility
124
------------------
125
126
tvo_set is a command line utility that is used to change TV output
127
attributes while X Window is running. It offers a somewhat more
128
friendly interface to XV_TVO_* attributes.
129
130
This is how to compile tvo_set:
131
- cd to tvo_set directory
132
- xmkmf
133
- make
134
- make install
135
Last step should place the executable (tvo_set) in /usr/X11R6/bin.
136
137
This is the invocation syntax:
138
tvo_set [-display host:dpy] [<cmd> <attribute> [<value>]]
139
140
tvo_set is not case sensitive for <cmd>, <attribute> & <value>
141
fields.
142
When no <cmd> is given, tvo_set just dumps the current state of
143
TV attributes.
144
145
Recognized commands:
146
set <attribute> <value>   Set <attribute> to <value>
147
inc <attribute>           Increment <attribute> by 1
148
dec <attribute>           Decrement <attribute> by 1
149
zero <attribute>          Set <attribute> to 0
150
151
Recognized values for <attribute> field:
152
hpos	Horizontal position
153
vpos	Vertical position
154
hsize	Horizontal size
155
std	TV Standard
156
157
When setting "std" attribute, both the numeric value and the name of the 
158
standard are valid, see following table.
159
160
Table of TV standards:
161
0	NTSC
162
1	PAL
163
2	PAL-M
164
3	PAL-60
165
4	NTSC-J
166
5	PAL-CN
167
6	PAL-N
168
7	OFF
169
170
Examples:
171
"tvo_set set std ntsc"
172
	Set standard to NTSC
173
174
"tvo_set set std off"
175
	Turn off TV output
176
177
"tvo_set set hsize 5"
178
	Set hsize to 5
179
180
"tvo_set inc hpos"
181
	Shift image a bit to the right (increment hpos by 1)
182
183
"tvo_set zero vpos"
184
	Restore default value for vpos
185
186
187
6. WARNING
188
----------
189
190
It's important that you are aware of the fact that, when TV output is active,
191
the monitor is driven at the same vertical refresh frequency as that of the
192
TV output. This means 50 or 60 Hz according to the standard you're using.
193
NO CHECK IS DONE IN THE DRIVER ABOUT THE CAPABILITY OF THE MONITOR TO
194
SUSTAIN THESE FREQUENCIES. You should look up in the monitor manual
195
and check that 50/60 Hz is within the limits. IT IS POTENTIALLY HARMFUL
196
TO THE MONITOR TO BE DRIVEN AT A FREQUENCY OUTSIDE ITS OPERATING RANGE.
197
198
Note, however, that most monitors should accept a 60 Hz vertical frequency,
199
since this is used in standard VGA modes. You should really check for 50 Hz 
200
compatibility if you are going to use any related standard (PAL mostly).
201
ATI manuals recommend checking for 50 Hz compatibility (they take
202
60 Hz for granted).
203
204
One last thing: I did no testing on cards having DVI/LCD outputs
205
so I'm not sure about the driver behaviour with this kind of displays. 
206
Be warned.
207
208
6. Credits
209
----------
210
211
Vladimir Dergachev	For leading the GATOS project, for all the good
212
			advices he gave me about dealing with ATI and for
213
			all his precious technical hints.
214
215
ATI external developer office
216
			For providing me the Rage Theater documentation.
217
218
7.  Revision history
219
--------------------
220
221
222
2003-09-23
223
==========
224
225
Initial release
226
227
2003-11-26
228
==========
229
230
Support for ERT added
231
232
2004-01-27
233
==========
234
235
Support for sizing/positioning of TV image added
236
(-)xf86-video-ati-6.5.8.0/src/theater_out.c (+2804 lines)
Line 0 Link Here
1
/*********************************************************************
2
 *
3
 * $Id: theater_out.c,v 1.1.2.3 2004/01/27 22:50:35 fulivi Exp $
4
 *
5
 * Main file for tv output handling of ATI Rage Theater chip 
6
 *
7
 * Copyright (C) 2003 Federico Ulivi
8
 *
9
 * This program is free software; you can redistribute it and/or modify
10
 * it under the terms of the GNU General Public License as published by
11
 * the Free Software Foundation; either version 2 of the License, or
12
 * (at your option) any later version.
13
 *
14
 * This program is distributed in the hope that it will be useful,
15
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
16
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
17
 * GNU General Public License for more details.
18
 *
19
 * You should have received a copy of the GNU General Public License
20
 * along with this program; if not, write to the Free Software
21
 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
22
 *
23
 * AUTHORS: F.Ulivi
24
 * NOTES:
25
 * $Log: theater_out.c,v $
26
 * Revision 1.1.2.3  2004/01/27 22:50:35  fulivi
27
 * Support for positioning/sizing of image added
28
 *
29
 * Revision 1.1.1.1.2.12  2004/01/18 22:59:29  fede
30
 * hSize handling added
31
 * Functions for get/setting h/v pos/size replaced by
32
 * theaterOutSetAttr/theaterOutGetAttr/theaterOutGetAttrLimits
33
 *
34
 * Revision 1.1.1.1.2.11  2004/01/11 21:29:04  fede
35
 * Fixes in H/V position handling
36
 *
37
 * Revision 1.1.1.1.2.10  2004/01/05 00:08:16  fede
38
 * Functions for setting H/V position added
39
 * Functions for setting/getting on/off attribute removed
40
 *
41
 * Revision 1.1.2.2  2003/11/26 19:50:10  fulivi
42
 * Support for ERT added
43
 *
44
 * Revision 1.1.1.1.2.9  2003/11/25 20:46:44  fede
45
 * "enabled" state removed
46
 * Handling of disabled tv output fixed
47
 *
48
 * Revision 1.1.1.1.2.8  2003/11/23 00:47:28  fede
49
 * Major cleanup of #define names
50
 *
51
 * Revision 1.1.1.1.2.7  2003/11/17 22:26:12  fede
52
 * Support for tv standards added
53
 * Support for NTSC added
54
 *
55
 * Revision 1.1.1.1.2.6  2003/10/14 18:40:34  fede
56
 * Autodetection of ERT moved to front
57
 * Some minor cleanups
58
 *
59
 * Revision 1.1.1.1.2.5  2003/10/11 12:29:50  fede
60
 * Support for ERT added
61
 *
62
 * Revision 1.1  2003/09/28 21:42:37  fulivi
63
 * Theater_out module added
64
 *
65
 * Revision 1.1.1.1.2.4  2003/09/28 15:11:57  fede
66
 * Some minor aesthetic changes
67
 *
68
 * Revision 1.1.1.1.2.2  2003/08/31 13:35:58  fede
69
 * Adapted for XFree86
70
 *
71
 * Revision 1.1.1.1.2.1  2003/08/09 23:20:46  fede
72
 * Switched to memory mapped IO
73
 * Some magic numbers turned into named constants
74
 *
75
 * Revision 1.1.1.1  2003/07/24 15:37:27  fede
76
 * Initial version
77
 *
78
 *
79
 *********************************************************************/
80
81
#include "xf86.h"
82
#include "generic_bus.h"
83
#include "theatre_reg.h"
84
#include "radeon_reg.h"
85
#include "radeon_macros.h"
86
#include "theater_out.h"
87
#define RADEON_NAME "RADEON"
88
89
#undef read
90
#undef write
91
#undef ioctl
92
93
#if RADEON_DEBUG
94
#define RTTRACE(x)							\
95
do {									\
96
    ErrorF("(**) %s(%d): ", RADEON_NAME, 0);		\
97
    ErrorF x;								\
98
} while (0);
99
#else
100
#define RTTRACE(x)
101
#endif
102
103
/**********************************************************************
104
 *
105
 * MASK_N_BIT
106
 *
107
 **********************************************************************/
108
109
#define MASK_N_BIT(n)	(1UL << (n))
110
111
/**********************************************************************
112
 *
113
 * Constants
114
 *
115
 **********************************************************************/
116
117
/*
118
 * Reference frequency
119
 * FIXME: This should be extracted from BIOS data
120
 */
121
#define REF_FREQUENCY		27000
122
123
#define TV_PLL_FINE_INI			0X10000000
124
125
/*
126
 * VIP_TV_PLL_CNTL
127
 */
128
#define VIP_TV_PLL_CNTL_M_SHIFT		0
129
#define VIP_TV_PLL_CNTL_NLO		0x1ff
130
#define VIP_TV_PLL_CNTL_NLO_SHIFT	8
131
#define VIP_TV_PLL_CNTL_NHI		0x600
132
#define VIP_TV_PLL_CNTL_NHI_SHIFT	(21-9)
133
#define VIP_TV_PLL_CNTL_P_SHIFT		24
134
135
/*
136
 * VIP_CRT_PLL_CNTL
137
 */
138
#define VIP_CRT_PLL_CNTL_M		0xff
139
#define VIP_CRT_PLL_CNTL_M_SHIFT	0
140
#define VIP_CRT_PLL_CNTL_NLO		0x1ff
141
#define VIP_CRT_PLL_CNTL_NLO_SHIFT	8
142
#define VIP_CRT_PLL_CNTL_NHI		0x600
143
#define VIP_CRT_PLL_CNTL_NHI_SHIFT	(21-9)
144
#define VIP_CRT_PLL_CNTL_CLKBY2		MASK_N_BIT(25)
145
146
/*
147
 * Value for VIP_PLL_CNTL0
148
 */
149
#define VIP_PLL_CNTL0_INI		0x00acac18
150
#define VIP_PLL_CNTL0_TVSLEEPB		MASK_N_BIT(3)
151
#define VIP_PLL_CNTL0_CRTSLEEPB		MASK_N_BIT(4)
152
153
/*
154
 * Value for VIP_PLL_TEST_CNTL
155
 */
156
#define VIP_PLL_TEST_CNTL_INI		0
157
158
/*
159
 * VIP_CLOCK_SEL_CNTL
160
 */
161
#define VIP_CLOCK_SEL_CNTL_INI		0x33
162
#define VIP_CLOCK_SEL_CNTL_BYTCLK_SHIFT	2
163
#define VIP_CLOCK_SEL_CNTL_BYTCLK	0xc
164
#define VIP_CLOCK_SEL_CNTL_REGCLK	MASK_N_BIT(5)
165
#define VIP_CLOCK_SEL_CNTL_BYTCLKD_SHIFT 8
166
167
/*
168
 * Value for VIP_CLKOUT_CNTL
169
 */
170
#define VIP_CLKOUT_CNTL_INI		0x29
171
172
/*
173
 * Value for VIP_SYNC_LOCK_CNTL
174
 */
175
#define VIP_SYNC_LOCK_CNTL_INI		0x01000000
176
177
/*
178
 * Value for VIP_TVO_SYNC_PAT_EXPECT
179
 */
180
#define VIP_TVO_SYNC_PAT_EXPECT_INI	0x00000001
181
182
/*
183
 * VIP_RGB_CNTL
184
 */
185
#define VIP_RGB_CNTL_RGB_IS_888_PACK	MASK_N_BIT(0)
186
187
/*
188
 * Value for VIP_VSCALER_CNTL2
189
 */
190
#define VIP_VSCALER_CNTL2_INI		0x10000000
191
192
/*
193
 * Value for VIP_Y_FALL_CNTL
194
 */
195
/* #define VIP_Y_FALL_CNTL_INI		0x00010200 */
196
#define VIP_Y_FALL_CNTL_INI		0x80030400
197
198
/*
199
 * VIP_UV_ADR
200
 */
201
#define VIP_UV_ADR_INI			0xc8
202
#define VIP_UV_ADR_HCODE_TABLE_SEL	0x06000000
203
#define VIP_UV_ADR_HCODE_TABLE_SEL_SHIFT 25
204
#define VIP_UV_ADR_VCODE_TABLE_SEL	0x18000000
205
#define VIP_UV_ADR_VCODE_TABLE_SEL_SHIFT 27
206
#define VIP_UV_ADR_MAX_UV_ADR		0x000000ff
207
#define VIP_UV_ADR_MAX_UV_ADR_SHIFT	0
208
#define VIP_UV_ADR_TABLE1_BOT_ADR	0x0000ff00
209
#define VIP_UV_ADR_TABLE1_BOT_ADR_SHIFT	8
210
#define VIP_UV_ADR_TABLE3_TOP_ADR	0x00ff0000
211
#define VIP_UV_ADR_TABLE3_TOP_ADR_SHIFT	16
212
#define MAX_FIFO_ADDR_RT		0x1a7
213
#define MAX_FIFO_ADDR_ERT		0x1ff
214
215
/*
216
 * VIP_HOST_RD_WT_CNTL
217
 */
218
#define VIP_HOST_RD_WT_CNTL_RD		MASK_N_BIT(12)
219
#define VIP_HOST_RD_WT_CNTL_RD_ACK	MASK_N_BIT(13)
220
#define VIP_HOST_RD_WT_CNTL_WT		MASK_N_BIT(14)
221
#define VIP_HOST_RD_WT_CNTL_WT_ACK	MASK_N_BIT(15)
222
223
/*
224
 * Value for VIP_SYNC_CNTL
225
 */
226
#define VIP_SYNC_CNTL_INI		0x28
227
228
/*
229
 * VIP_VSCALER_CNTL1
230
 */
231
#define VIP_VSCALER_CNTL1_UV_INC	0xffff
232
#define VIP_VSCALER_CNTL1_UV_INC_SHIFT	0
233
234
/*
235
 * VIP_TIMING_CNTL
236
 */
237
#define VIP_TIMING_CNTL_UV_OUT_POST_SCALE_SHIFT	24
238
#define VIP_TIMING_CNTL_INI		0x000b0000
239
#define VIP_TIMING_CNTL_H_INC_SHIFT	0
240
#define VIP_TIMING_CNTL_H_INC		0xfff
241
242
/*
243
 * Value for VIP_PRE_DAC_MUX_CNTL
244
 */
245
#define VIP_PRE_DAC_MUX_CNTL_INI	0x0000000f
246
247
/*
248
 * VIP_TV_DAC_CNTL
249
 */
250
#define VIP_TV_DAC_CNTL_NBLANK		MASK_N_BIT(0)
251
#define VIP_TV_DAC_CNTL_DASLEEP		MASK_N_BIT(3)
252
#define VIP_TV_DAC_CNTL_BGSLEEP		MASK_N_BIT(6)
253
254
/*
255
 * Value for VIP_FRAME_LOCK_CNTL
256
 */
257
#define VIP_FRAME_LOCK_CNTL_INI		0x0000000f
258
259
/*
260
 * Value for VIP_HW_DEBUG
261
 */
262
#define VIP_HW_DEBUG_INI 		0x00000200
263
264
/*
265
 * VIP_MASTER_CNTL
266
 */
267
#define VIP_MASTER_CNTL_TV_ASYNC_RST	MASK_N_BIT(0)
268
#define VIP_MASTER_CNTL_CRT_ASYNC_RST	MASK_N_BIT(1)
269
#define VIP_MASTER_CNTL_RESTART_PHASE_FIX	MASK_N_BIT(3)
270
#define VIP_MASTER_CNTL_TV_FIFO_ASYNC_RST	MASK_N_BIT(4)
271
#define VIP_MASTER_CNTL_VIN_ASYNC_RST	MASK_N_BIT(5)
272
#define VIP_MASTER_CNTL_AUD_ASYNC_RST	MASK_N_BIT(6)
273
#define VIP_MASTER_CNTL_DVS_ASYNC_RST	MASK_N_BIT(7)
274
#define VIP_MASTER_CNTL_CRT_FIFO_CE_EN	MASK_N_BIT(9)
275
#define VIP_MASTER_CNTL_TV_FIFO_CE_EN	MASK_N_BIT(10)
276
#define VIP_MASTER_CNTL_ON_INI		(VIP_MASTER_CNTL_RESTART_PHASE_FIX | \
277
					 VIP_MASTER_CNTL_VIN_ASYNC_RST | \
278
					 VIP_MASTER_CNTL_AUD_ASYNC_RST | \
279
					 VIP_MASTER_CNTL_DVS_ASYNC_RST | \
280
					 VIP_MASTER_CNTL_CRT_FIFO_CE_EN | \
281
					 VIP_MASTER_CNTL_TV_FIFO_CE_EN)
282
#define VIP_MASTER_CNTL_OFF_INI		(VIP_MASTER_CNTL_TV_ASYNC_RST | \
283
					 VIP_MASTER_CNTL_CRT_ASYNC_RST | \
284
					 VIP_MASTER_CNTL_RESTART_PHASE_FIX | \
285
					 VIP_MASTER_CNTL_TV_FIFO_ASYNC_RST | \
286
					 VIP_MASTER_CNTL_VIN_ASYNC_RST | \
287
					 VIP_MASTER_CNTL_AUD_ASYNC_RST | \
288
					 VIP_MASTER_CNTL_DVS_ASYNC_RST | \
289
					 VIP_MASTER_CNTL_CRT_FIFO_CE_EN | \
290
					 VIP_MASTER_CNTL_TV_FIFO_CE_EN)
291
292
/*
293
 * Value for VIP_LINEAR_GAIN_SETTINGS
294
 */
295
#define VIP_LINEAR_GAIN_SETTINGS_INI	0x01000100
296
297
/*
298
 * Value for VIP_GAIN_LIMIT_SETTINGS_INI
299
 */
300
#define VIP_GAIN_LIMIT_SETTINGS_INI	0x017f05ff
301
302
/*
303
 * Value for VIP_UPSAMP_AND_GAIN_CNTL 
304
 */
305
#define VIP_UPSAMP_AND_GAIN_CNTL_INI	0x00000005
306
307
/*
308
 * RADEON_VCLK_ECP_CNTL
309
 */
310
#define RADEON_VCLK_ECP_CNTL_BYTECLK_POSTDIV	0x00030000
311
#define RADEON_VCLK_ECP_CNTL_BYTECLK_NODIV	0x00000000
312
313
/*
314
 * RADEON_PLL_TEST_CNTL
315
 */
316
#define RADEON_PLL_TEST_CNTL_PLL_MASK_READ_B	MASK_N_BIT(9)
317
318
/*
319
 * RADEON_DAC_CNTL
320
 */
321
#define RADEON_DAC_CNTL_DAC_TVO_EN	MASK_N_BIT(10)
322
323
#define RADEON_PPLL_POST3_DIV_BY_2	0x10000
324
#define RADEON_PPLL_POST3_DIV_BY_3	0x40000
325
#define RADEON_PPLL_FB3_DIV_SHIFT	0
326
#define RADEON_PPLL_POST3_DIV_SHIFT	16
327
328
/*
329
 * RADEON_DISP_MERGE_CNTL
330
 */
331
//#define RADEON_DISP_MERGE_CNTL		0xd60
332
#define	RADEON_DISP_MERGE_CNTL_INI	0xffff0000
333
334
/*
335
 * RADEON_HTOTAL_CNTL
336
 */
337
#define RADEON_HTOTAL_CNTL_HTOT_PIX_SLIP_SHIFT	0
338
#define RADEON_HTOTAL_CNTL_HTOT_CNTL_VGA_EN	MASK_N_BIT(28)
339
340
/*
341
 * RADEON_DISP_OUTPUT_CNTL
342
 */
343
#define RADEON_DISP_TV_SOURCE		MASK_N_BIT(16)
344
#define RADEON_DISP_TV_MODE_MASK	(3 << 17)
345
#define RADEON_DISP_TV_MODE_888		(0 << 17)
346
#define RADEON_DISP_TV_MODE_565		(1 << 17)
347
#define RADEON_DISP_TV_YG_DITH_EN	MASK_N_BIT(19)
348
#define RADEON_DISP_TV_CBB_CRR_DITH_EN	MASK_N_BIT(20)
349
#define RADEON_DISP_TV_BIT_WIDTH	MASK_N_BIT(21)
350
#define RADEON_DISP_TV_SYNC_MODE_MASK	(3 << 22)
351
#define RADEON_DISP_TV_SYNC_COLOR_MASK	(3 << 25)
352
353
/*
354
 * ERT registers
355
 */
356
#define TV_MASTER_CNTL		0x0800
357
#define		TV_MASTER_CNTL_TVCLK_ALWAYS_ON	MASK_N_BIT(30)
358
#define		TV_MASTER_CNTL_TV_ON	MASK_N_BIT(31)
359
#define		TV_MASTER_CNTL_ON_INI	(VIP_MASTER_CNTL_VIN_ASYNC_RST | \
360
					 VIP_MASTER_CNTL_CRT_FIFO_CE_EN | \
361
					 VIP_MASTER_CNTL_TV_FIFO_CE_EN | \
362
					 TV_MASTER_CNTL_TVCLK_ALWAYS_ON | \
363
					 TV_MASTER_CNTL_TV_ON)
364
#define		TV_MASTER_CNTL_OFF_INI	(VIP_MASTER_CNTL_TV_ASYNC_RST | \
365
					 VIP_MASTER_CNTL_CRT_ASYNC_RST | \
366
					 VIP_MASTER_CNTL_TV_FIFO_ASYNC_RST | \
367
					 VIP_MASTER_CNTL_CRT_FIFO_CE_EN | \
368
					 VIP_MASTER_CNTL_TV_FIFO_CE_EN | \
369
					 TV_MASTER_CNTL_TVCLK_ALWAYS_ON)
370
#define TV_RGB_CNTL		0x0804
371
#define		TV_RGB_CNTL_INI	0x007b0004
372
#define TV_SYNC_CNTL		0x0808
373
#define TV_HTOTAL		0x080c
374
#define TV_HDISP		0x0810
375
#define TV_HSTART		0x0818
376
#define TV_HCOUNT		0x081c
377
#define TV_VTOTAL		0x0820
378
#define TV_VDISP		0x0824
379
#define TV_VCOUNT		0x0828
380
#define TV_FTOTAL		0x082c
381
#define TV_FCOUNT		0x0830
382
#define TV_FRESTART		0x0834
383
#define TV_HRESTART		0x0838
384
#define TV_VRESTART		0x083c
385
#define TV_HOST_READ_DATA	0x0840
386
#define TV_HOST_WRITE_DATA	0x0844
387
#define TV_HOST_RD_WT_CNTL	0x0848
388
#define TV_VSCALER_CNTL1	0x084c
389
#define		TV_VSCALER_CNTL1_RESTART_FIELD	MASK_N_BIT(29)
390
#define TV_TIMING_CNTL		0x0850
391
#define TV_VSCALER_CNTL2	0x0854
392
#define TV_Y_FALL_CNTL		0x0858
393
#define TV_Y_RISE_CNTL		0x085c
394
#define TV_Y_SAWTOOTH_CNTL	0x0860
395
#define TV_UPSAMP_AND_GAIN_CNTL 0x0864
396
#define TV_GAIN_LIMIT_SETTINGS	0x0868
397
#define TV_LINEAR_GAIN_SETTINGS 0x086c
398
#define TV_MODULATOR_CNTL1	0x0870
399
#define TV_MODULATOR_CNTL2	0x0874
400
#define TV_PRE_DAC_MUX_CNTL	0x0888
401
#define TV_DAC_CNTL		0x088c
402
#define		TV_DAC_CNTL_NBLANK	MASK_N_BIT(0)
403
#define		TV_DAC_CNTL_NHOLD	MASK_N_BIT(1)
404
#define		TV_DAC_CNTL_BGSLEEP	MASK_N_BIT(6)
405
#define		TV_DAC_CNTL_RDACPD	MASK_N_BIT(24)
406
#define		TV_DAC_CNTL_GDACPD	MASK_N_BIT(25)
407
#define		TV_DAC_CNTL_BDACPD	MASK_N_BIT(26)
408
#define TV_CRC_CNTL		0x0890
409
#define TV_UV_ADR		0x08ac
410
411
/*
412
 * ERT PLL registers
413
 */
414
#define TV_PLL_CNTL		0x21
415
#define TV_PLL_CNTL1		0x22
416
#define		TV_PLL_CNTL1_TVPLL_RESET	MASK_N_BIT(1)
417
#define		TV_PLL_CNTL1_TVPLL_SLEEP	MASK_N_BIT(3)
418
#define		TV_PLL_CNTL1_TVPDC_SHIFT	14
419
#define		TV_PLL_CNTL1_TVPDC_MASK		(3 << 14)
420
#define		TV_PLL_CNTL1_TVCLK_SRC_SEL	MASK_N_BIT(30)
421
422
/*
423
 * Constant upsampler coefficients
424
 */
425
static
426
const
427
CARD32 upsamplerCoeffs[] =
428
{
429
  0x3f010000,
430
  0x7b008002,
431
  0x00003f01,
432
  0x341b7405,
433
  0x7f3a7617,
434
  0x00003d04,
435
  0x2d296c0a,
436
  0x0e316c2c,
437
  0x00003e7d,
438
  0x2d1f7503,
439
  0x2927643b,
440
  0x0000056f,
441
  0x29257205,
442
  0x25295050,
443
  0x00000572
444
};
445
#define N_UPSAMPLER_COEFFS	(sizeof(upsamplerCoeffs) / sizeof(upsamplerCoeffs[ 0 ]))
446
447
/*
448
 * Maximum length of horizontal/vertical code timing tables for state storage
449
 */
450
#define MAX_H_CODE_TIMING_LEN	32
451
#define MAX_V_CODE_TIMING_LEN	32
452
453
/*
454
 * Type of VIP bus
455
 */
456
#define VIP_TYPE	"ATI VIP BUS"
457
458
/*
459
 * Limits of h/v positions (hPos & vPos in TheaterOutRec)
460
 */
461
#define MAX_H_POSITION		5	/* Range: [-5..5], negative is on the left, 0 is default, positive is on the right */
462
#define MAX_V_POSITION		5	/* Range: [-5..5], negative is up, 0 is default, positive is down */
463
464
/*
465
 * Unit for hPos (in TV clock periods)
466
 */
467
#define H_POS_UNIT		10
468
469
/*
470
 * Indexes in h. code timing table for horizontal line position adjustment
471
 */
472
#define H_TABLE_POS1		6
473
#define H_TABLE_POS2		8
474
475
/*
476
 * Limits of hor. size (hSize in TheaterOutRec)
477
 */
478
#define MAX_H_SIZE		5	/* Range: [-5..5], negative is smaller, positive is larger */
479
480
/**********************************************************************
481
 *
482
 * TimingTableEl
483
 *
484
 * Elements of H/V code timing tables
485
 *
486
 **********************************************************************/
487
488
typedef CARD16 TimingTableEl;	/* Bits 0 to 13 only are actually used */
489
490
/**********************************************************************
491
 *
492
 * ModeConstants
493
 *
494
 * Storage of constants related to a single video mode
495
 *
496
 **********************************************************************/
497
498
typedef struct
499
{
500
  CARD16 horResolution;	
501
  CARD16 verResolution;
502
  TVStd  standard;
503
  CARD16 horTotal;
504
  CARD16 verTotal;
505
  CARD16 horStart;
506
  CARD16 horSyncStart;
507
  CARD16 verSyncStart;
508
  unsigned defRestart;
509
  CARD32 vScalerCntl1;
510
  CARD32 yRiseCntl;
511
  CARD32 ySawtoothCntl;
512
  CARD16 crtcPLL_N;
513
  CARD8  crtcPLL_M;
514
  Bool   crtcPLL_divBy2;
515
  CARD8  crtcPLL_byteClkDiv;
516
  CARD8	 crtcPLL_postDiv;
517
  Bool   use888RGB;		/* False: RGB data is 565 packed (2 bytes/pixel) */
518
				/* True : RGB data is 888 packed (3 bytes/pixel) */
519
  unsigned pixToTV;
520
  CARD8	 byteClkDelay;
521
  CARD32 tvoDataDelayA;
522
  CARD32 tvoDataDelayB;
523
  const TimingTableEl *horTimingTable;
524
  const TimingTableEl *verTimingTable;
525
} ModeConstants;
526
527
/**********************************************************************
528
 *
529
 * TheaterState
530
 *
531
 * Storage of RT state
532
 *
533
 **********************************************************************/
534
535
typedef struct
536
{
537
  CARD32 clkout_cntl;
538
  CARD32 clock_sel_cntl;
539
  CARD32 crc_cntl;
540
  CARD32 crt_pll_cntl;
541
  CARD32 dfrestart;
542
  CARD32 dhrestart;
543
  CARD32 dvrestart;
544
  CARD32 frame_lock_cntl;
545
  CARD32 gain_limit_settings;
546
  CARD32 hdisp;
547
  CARD32 hstart;
548
  CARD32 htotal;
549
  CARD32 hw_debug;
550
  CARD32 linear_gain_settings;
551
  CARD32 master_cntl;
552
  CARD32 modulator_cntl1;
553
  CARD32 modulator_cntl2;
554
  CARD32 pll_cntl0;
555
  CARD32 pll_test_cntl;
556
  CARD32 pre_dac_mux_cntl;
557
  CARD32 rgb_cntl;
558
  CARD32 sync_cntl;
559
  CARD32 sync_lock_cntl;
560
  CARD32 sync_size;
561
  CARD32 timing_cntl;
562
  CARD32 tvo_data_delay_a;
563
  CARD32 tvo_data_delay_b;
564
  CARD32 tvo_sync_pat_expect;
565
  CARD32 tvo_sync_threshold;
566
  CARD32 tv_dac_cntl;
567
  CARD32 tv_pll_cntl;
568
  CARD32 tv_pll_fine_cntl;
569
  CARD32 upsamp_and_gain_cntl;
570
  CARD32 upsamp_coeffs[ N_UPSAMPLER_COEFFS ];
571
  CARD32 uv_adr;
572
  CARD32 vdisp;
573
  CARD32 vftotal;
574
  CARD32 vscaler_cntl1;
575
  CARD32 vscaler_cntl2;
576
  CARD32 vtotal;
577
  CARD32 y_fall_cntl;
578
  CARD32 y_rise_cntl;
579
  CARD32 y_saw_tooth_cntl;
580
  CARD32 disp_merge_cntl;
581
582
  TimingTableEl h_code_timing[ MAX_H_CODE_TIMING_LEN ];
583
  TimingTableEl v_code_timing[ MAX_V_CODE_TIMING_LEN ];
584
} TheaterState , *TheaterStatePtr;
585
586
/**********************************************************************
587
 *
588
 * TheaterOutRec , TheaterOutPtr
589
 *
590
 * Global state of module
591
 *
592
 **********************************************************************/
593
594
typedef struct TheaterOut
595
{
596
  GENERIC_BUS_Ptr VIP;
597
  unsigned char   *MMIO;
598
599
  int theatre_num;	/* Negative when driving an ERT */
600
			/* Positive or null: index of RT on VIP bus */
601
  
602
  TVStd standard;
603
  Bool compatibleMode;
604
605
  const ModeConstants *currentMode;
606
    
607
  int hPos;
608
  int vPos;
609
  int hSize;
610
611
  TheaterState savedState;
612
  TheaterState modeState;
613
} TheaterOutRec;
614
615
/**********************************************************************
616
 *
617
 * TVConstants
618
 *
619
 * Constants that depend on tv standard only
620
 *
621
 **********************************************************************/
622
623
typedef struct
624
{
625
  CARD8  tvPLL_M;
626
  CARD16 tvPLL_N;
627
  CARD8  tvPLL_postDiv;
628
  CARD32 tvClockT;	/* Period of TV clock (unit = 100 psec) */
629
  CARD32 modulatorCntl1;
630
  CARD32 modulatorCntl2;
631
  CARD32 vip_tvDAC_Cntl;
632
  CARD32 ert_tvDAC_Cntl;
633
  CARD32 vftotal;
634
  unsigned linesFrame;
635
  unsigned zeroHSize;	/* Length of the picture part of a hor. line for hSize = 0 (unit = 100 psec) */
636
  unsigned hSizeUnit;	/* Value of hSize = 1 (unit = 100 psec) */
637
} TVConstants;
638
639
/**********************************************************************
640
 *
641
 * tvStdConsts
642
 *
643
 * Table of constants for tv standards (index is a TVStd)
644
 *
645
 **********************************************************************/
646
647
static
648
const
649
TVConstants tvStdConsts[] =
650
  {
651
    /*
652
     * NTSC
653
     */
654
    {
655
      22,	/* tvPLL_M */
656
      175,	/* tvPLL_N */
657
      5,	/* tvPLL_postDiv */
658
      233,	/* tvClockT */
659
      0x60bb468c, /* modulatorCntl1 */
660
      0x00000191, /* modulatorCntl2 */
661
      0x00000113, /* vip_tvDAC_Cntl */
662
      0x00680113, /* ert_tvDAC_Cntl */
663
      1,	/* vftotal */
664
      525,	/* linesFrame */
665
      479166,	/* zeroHSize */
666
      9478	/* hSizeUnit */
667
    },
668
    /*
669
     * PAL
670
     */
671
    {
672
      113,	/* tvPLL_M */
673
      668,	/* tvPLL_N */
674
      3,	/* tvPLL_postDiv */
675
      188,	/* tvClockT */
676
      0x60bb3bcc, /* modulatorCntl1 */
677
      0x003e01b2, /* modulatorCntl2 */
678
      0x00000013, /* vip_tvDAC_Cntl */
679
      0x00680013, /* ert_tvDAC_Cntl */
680
      3,	/* vftotal */
681
      625,	/* linesFrame */
682
      473200,	/* zeroHSize */
683
      9360	/* hSizeUnit */
684
    }
685
  };
686
687
/**********************************************************************
688
 *
689
 * availableModes
690
 *
691
 * Table of all allowed modes for tv output
692
 *
693
 **********************************************************************/
694
695
static
696
const
697
TimingTableEl horTimingNTSC_BIOS[] =
698
  {
699
    0x0007,
700
    0x003f,
701
    0x0263,
702
    0x0a24,
703
    0x2a6b,
704
    0x0a36,
705
    0x126d,	/* H_TABLE_POS1 */
706
    0x1bfe,
707
    0x1a8f,	/* H_TABLE_POS2 */
708
    0x1ec7,
709
    0x3863,
710
    0x1bfe,
711
    0x1bfe,
712
    0x1a2a,
713
    0x1e95,
714
    0x0e31,
715
    0x201b,
716
    0
717
  };
718
719
static
720
const
721
TimingTableEl verTimingNTSC_BIOS[] =
722
  {
723
    0x2001,
724
    0x200d,
725
    0x1006,
726
    0x0c06,
727
    0x1006,
728
    0x1818,
729
    0x21e3,
730
    0x1006,
731
    0x0c06,
732
    0x1006,
733
    0x1817,
734
    0x21d4,
735
    0x0002,
736
    0
737
  };
738
739
static
740
const
741
TimingTableEl horTimingPAL_BIOS[] =
742
  {
743
    0x0007,
744
    0x0058,
745
    0x027c,
746
    0x0a31,
747
    0x2a77,
748
    0x0a95,
749
    0x124f,	/* H_TABLE_POS1 */
750
    0x1bfe,
751
    0x1b22,	/* H_TABLE_POS2 */
752
    0x1ef9,
753
    0x387c,
754
    0x1bfe,
755
    0x1bfe,
756
    0x1b31,
757
    0x1eb5,
758
    0x0e43,
759
    0x201b,
760
    0
761
  };
762
763
static
764
const
765
TimingTableEl verTimingPAL_BIOS[] =
766
  {
767
    0x2001,
768
    0x200c,
769
    0x1005,
770
    0x0c05,
771
    0x1005,
772
    0x1401,
773
    0x1821,
774
    0x2240,
775
    0x1005,
776
    0x0c05,
777
    0x1005,
778
    0x1401,
779
    0x1822,
780
    0x2230,
781
    0x0002,
782
    0
783
  };
784
785
static
786
const
787
ModeConstants availableModes[] =
788
  {
789
    { 
790
      800,		/* horResolution */
791
      600,		/* verResolution */
792
      TV_STD_NTSC,	/* standard */
793
      990,		/* horTotal */
794
      740,		/* verTotal */
795
      813,		/* horStart */
796
      824,		/* horSyncStart */
797
      632,		/* verSyncStart */
798
      625592,		/* defRestart */
799
      0x0900b46b,	/* vScalerCntl1 */
800
      0x00012c00,	/* yRiseCntl */
801
      0x10002d1a,	/* ySawtoothCntl */
802
      592,		/* crtcPLL_N */
803
      91,		/* crtcPLL_M */
804
      TRUE,		/* crtcPLL_divBy2 */
805
      0,		/* crtcPLL_byteClkDiv */
806
      4,		/* crtcPLL_postDiv */
807
      FALSE,		/* use888RGB */
808
      1022,		/* pixToTV */
809
      1,		/* byteClkDelay */
810
      0x0a0b0907,	/* tvoDataDelayA */
811
      0x060a090a,	/* tvoDataDelayB */
812
      horTimingNTSC_BIOS,/* horTimingTable */
813
      verTimingNTSC_BIOS/* verTimingTable */
814
    },
815
    { 
816
      800,		/* horResolution */
817
      600,		/* verResolution */
818
      TV_STD_PAL,	/* standard */
819
      1144,		/* horTotal */
820
      706,		/* verTotal */
821
      812,		/* horStart */
822
      824,		/* horSyncStart */
823
      669,		/* verSyncStart */
824
      696700,		/* defRestart */
825
      0x09009097,	/* vScalerCntl1 */
826
      0x000007da,	/* yRiseCntl */
827
      0x10002426,	/* ySawtoothCntl */
828
      1382,		/* crtcPLL_N */
829
      231,		/* crtcPLL_M */
830
      TRUE,		/* crtcPLL_divBy2 */
831
      0,		/* crtcPLL_byteClkDiv */
832
      4,		/* crtcPLL_postDiv */
833
      FALSE,		/* use888RGB */
834
      759,		/* pixToTV */
835
      1,		/* byteClkDelay */
836
      0x0a0b0907,	/* tvoDataDelayA */
837
      0x060a090a,	/* tvoDataDelayB */
838
      horTimingPAL_BIOS,/* horTimingTable */
839
      verTimingPAL_BIOS	/* verTimingTable */
840
    }
841
  };
842
843
#define N_AVAILABLE_MODES	(sizeof(availableModes) / sizeof(availableModes[ 0 ]))
844
845
/**********************************************************************
846
 *
847
 * theatre_read
848
 *
849
 * Read from a RT register
850
 *
851
 **********************************************************************/
852
853
static 
854
Bool 
855
theatre_read(
856
	     TheaterOutPtr t,
857
	     CARD32 reg,
858
	     CARD32 *data
859
	     )
860
{
861
  if (t->theatre_num < 0)
862
    return FALSE;
863
  
864
  return t->VIP->read(t->VIP, ((t->theatre_num & 0x3) << 14) | reg , 4 , (CARD8*)data);
865
}
866
867
/**********************************************************************
868
 *
869
 * theatre_write
870
 *
871
 * Write to a RT register
872
 *
873
 **********************************************************************/
874
875
static
876
Bool 
877
theatre_write(
878
	      TheaterOutPtr t,
879
	      CARD32 reg,
880
	      CARD32 data
881
	      )
882
{
883
  if (t->theatre_num < 0)
884
    return FALSE;
885
886
  return t->VIP->write(t->VIP , ((t->theatre_num & 0x03) << 14) | reg , 4 , (CARD8*)&data);
887
}
888
889
/**********************************************************************
890
 *
891
 * ert_read
892
 *
893
 * Read from an ERT register
894
 *
895
 **********************************************************************/
896
897
static 
898
void 
899
ert_read(
900
	 TheaterOutPtr t,
901
	 CARD32 reg,
902
	 CARD32 *data
903
	 )
904
{
905
  unsigned char *RADEONMMIO = t->MMIO;
906
907
  if (t->theatre_num < 0)
908
    *data = INREG(reg);
909
}
910
911
/**********************************************************************
912
 *
913
 * ert_write
914
 *
915
 * Write to an ERT register
916
 *
917
 **********************************************************************/
918
static
919
void 
920
ert_write(
921
	  TheaterOutPtr t,
922
	  CARD32 reg,
923
	  CARD32 data
924
	  )
925
{
926
  unsigned char *RADEONMMIO = t->MMIO;
927
928
  if (t->theatre_num < 0)
929
    OUTREG(reg , data);
930
}
931
932
/**********************************************************************
933
 *
934
 * waitPLL_lock
935
 *
936
 * Wait for PLLs to lock
937
 *
938
 **********************************************************************/
939
940
static
941
void
942
waitPLL_lock(
943
	     TheaterOutPtr t,
944
	     ScrnInfoPtr pScrn,
945
	     unsigned nTests,
946
	     unsigned nWaitLoops,
947
	     unsigned cntThreshold
948
	     )
949
{
950
  unsigned char *RADEONMMIO = t->MMIO;
951
  CARD32 savePLLTest;
952
  unsigned i;
953
  unsigned j;
954
955
  OUTREG(RADEON_TEST_DEBUG_MUX , (INREG(RADEON_TEST_DEBUG_MUX) & 0xffff60ff) | 0x100);
956
957
  savePLLTest = INPLL(pScrn , RADEON_PLL_TEST_CNTL);
958
959
  OUTPLL(pScrn , RADEON_PLL_TEST_CNTL , savePLLTest & ~RADEON_PLL_TEST_CNTL_PLL_MASK_READ_B);
960
961
  OUTREG8(RADEON_CLOCK_CNTL_INDEX , RADEON_PLL_TEST_CNTL);
962
963
  for (i = 0; i < nTests; i++)
964
    {
965
      OUTREG8(RADEON_CLOCK_CNTL_DATA + 3 , 0);
966
      
967
      for (j = 0; j < nWaitLoops; j++)
968
	if (INREG8(RADEON_CLOCK_CNTL_DATA + 3) >= cntThreshold)
969
	  break;
970
    }
971
972
  OUTPLL(pScrn , RADEON_PLL_TEST_CNTL , savePLLTest);
973
974
  OUTREG(RADEON_TEST_DEBUG_MUX , INREG(RADEON_TEST_DEBUG_MUX) & 0xffffe0ff);
975
}
976
977
/**********************************************************************
978
 *
979
 * restorePLL
980
 *
981
 * Set PLLs for CRTC pixel clock & TV color burst generation
982
 *
983
 **********************************************************************/
984
985
static
986
void
987
restorePLL(
988
	   TheaterOutPtr t,
989
	   ScrnInfoPtr pScrn,
990
	   TheaterStatePtr restore
991
	   )
992
{
993
  unsigned i;
994
995
  /*
996
   * Set TV PLL
997
   */
998
  RTTRACE(("restorePLL: TV_PLL_CNTL = %08x\n" , restore->tv_pll_cntl));
999
  theatre_write(t , VIP_TV_PLL_CNTL , restore->tv_pll_cntl);
1000
  theatre_write(t , VIP_TV_PLL_FINE_CNTL , restore->tv_pll_fine_cntl);
1001
1002
  /*
1003
   * Set CRT PLL (for byte and pixel clock generation)
1004
   */
1005
  RTTRACE(("restorePLL: CRT_PLL_CNTL = %08x\n" , restore->crt_pll_cntl));
1006
  theatre_write(t , VIP_CRT_PLL_CNTL , restore->crt_pll_cntl);
1007
  
1008
  theatre_write(t , VIP_PLL_CNTL0 , restore->pll_cntl0);
1009
1010
  theatre_write(t , VIP_PLL_TEST_CNTL , restore->pll_test_cntl);
1011
1012
  /*
1013
   * Set coefficients for upsampler
1014
   */
1015
  for (i = 0; i < N_UPSAMPLER_COEFFS; i++)
1016
    theatre_write(t , VIP_UPSAMP_COEFF0_0 + i * 4 , restore->upsamp_coeffs[ i ]);
1017
1018
  /*
1019
   * Waiting for PLLs to settle is skipped when restoring a state with stopped PLLs
1020
   */
1021
  if ((~restore->pll_cntl0 & (VIP_PLL_CNTL0_TVSLEEPB | VIP_PLL_CNTL0_CRTSLEEPB)) == 0)
1022
    {
1023
      waitPLL_lock(t , pScrn , 3000 , 160 , 27);
1024
1025
      theatre_write(t , VIP_CLOCK_SEL_CNTL , restore->clock_sel_cntl & ~VIP_CLOCK_SEL_CNTL_REGCLK);
1026
1027
      waitPLL_lock(t , pScrn , 3000 , 160 , 27);
1028
    }
1029
1030
  RTTRACE(("restorePLL: CLOCK_SEL_CNTL = %08x\n" , restore->clock_sel_cntl));
1031
  theatre_write(t , VIP_CLOCK_SEL_CNTL , restore->clock_sel_cntl);
1032
1033
  theatre_write(t , VIP_CLKOUT_CNTL , restore->clkout_cntl);
1034
}
1035
1036
/**********************************************************************
1037
 *
1038
 * restoreTVO_SYNC
1039
 *
1040
 * Set TVO_SYNC_* registers
1041
 *
1042
 **********************************************************************/
1043
1044
static
1045
void
1046
restoreTVO_SYNC(
1047
		TheaterOutPtr t,
1048
		TheaterStatePtr restore
1049
		)
1050
{
1051
  theatre_write(t , VIP_SYNC_LOCK_CNTL , restore->sync_lock_cntl);
1052
  theatre_write(t , VIP_TVO_SYNC_THRESHOLD , restore->tvo_sync_threshold);
1053
  theatre_write(t , VIP_TVO_SYNC_PAT_EXPECT , restore->tvo_sync_pat_expect);
1054
}
1055
1056
/**********************************************************************
1057
 *
1058
 * restoreTVO_DataDelay
1059
 *
1060
 * Set TVO_DATA_DELAY_* registers
1061
 *
1062
 **********************************************************************/
1063
1064
static
1065
void
1066
restoreTVO_DataDelay(
1067
		     TheaterOutPtr t,
1068
		     TheaterStatePtr restore
1069
		     )
1070
{
1071
  theatre_write(t , VIP_TVO_DATA_DELAY_A , restore->tvo_data_delay_a);
1072
  theatre_write(t , VIP_TVO_DATA_DELAY_B , restore->tvo_data_delay_b);
1073
}
1074
1075
/**********************************************************************
1076
 *
1077
 * restoreRT_HV
1078
 *
1079
 * Set RT horizontal/vertical settings
1080
 *
1081
 **********************************************************************/
1082
1083
static
1084
void
1085
restoreRT_HV(
1086
	     TheaterOutPtr t,
1087
	     TheaterStatePtr restore
1088
	     )
1089
{
1090
  theatre_write(t , VIP_RGB_CNTL , restore->rgb_cntl);
1091
1092
  theatre_write(t , VIP_HTOTAL , restore->htotal);
1093
  theatre_write(t , VIP_HDISP  , restore->hdisp);
1094
  theatre_write(t , VIP_HSTART , restore->hstart);
1095
  
1096
  theatre_write(t , VIP_VTOTAL , restore->vtotal);
1097
  theatre_write(t , VIP_VDISP  , restore->vdisp);
1098
  
1099
  theatre_write(t , VIP_VFTOTAL , restore->vftotal);
1100
1101
  theatre_write(t , VIP_SYNC_SIZE , restore->sync_size);
1102
1103
  theatre_write(t , VIP_VSCALER_CNTL1 , restore->vscaler_cntl1);
1104
  theatre_write(t , VIP_VSCALER_CNTL2 , restore->vscaler_cntl2);
1105
  
1106
  theatre_write(t , VIP_Y_FALL_CNTL , restore->y_fall_cntl);
1107
  theatre_write(t , VIP_Y_RISE_CNTL , restore->y_rise_cntl);
1108
  theatre_write(t , VIP_Y_SAW_TOOTH_CNTL , restore->y_saw_tooth_cntl);
1109
}
1110
1111
/**********************************************************************
1112
 *
1113
 * restoreRestarts
1114
 *
1115
 * Set RT D*RESTART registers
1116
 *
1117
 **********************************************************************/
1118
1119
static
1120
void
1121
restoreRestarts(	 
1122
		TheaterOutPtr t,
1123
		TheaterStatePtr restore
1124
		)
1125
{
1126
  theatre_write(t , VIP_DFRESTART , restore->dfrestart);
1127
  theatre_write(t , VIP_DHRESTART , restore->dhrestart);
1128
  theatre_write(t , VIP_DVRESTART , restore->dvrestart);
1129
}
1130
1131
/**********************************************************************
1132
 *
1133
 * writeFIFO
1134
 *
1135
 * Write to RT FIFO RAM
1136
 *
1137
 **********************************************************************/
1138
1139
static
1140
void
1141
writeFIFO(
1142
	  TheaterOutPtr t,
1143
	  CARD16 addr,
1144
	  CARD32 value
1145
	  )
1146
{
1147
  CARD32 tmp;
1148
1149
  if (t->theatre_num >= 0)
1150
    {
1151
      theatre_write(t , VIP_HOST_WRITE_DATA , value);
1152
1153
      theatre_write(t , VIP_HOST_RD_WT_CNTL , addr | VIP_HOST_RD_WT_CNTL_WT);
1154
1155
      do
1156
	{
1157
	  if (!theatre_read(t , VIP_HOST_RD_WT_CNTL , &tmp))
1158
	    break;
1159
	} 
1160
      while ((tmp & VIP_HOST_RD_WT_CNTL_WT_ACK) == 0);
1161
1162
      theatre_write(t , VIP_HOST_RD_WT_CNTL , 0);
1163
    }
1164
  else
1165
    {
1166
      ert_write(t , TV_HOST_WRITE_DATA , value);
1167
1168
      ert_write(t , TV_HOST_RD_WT_CNTL , addr | VIP_HOST_RD_WT_CNTL_WT);
1169
1170
      do
1171
	{
1172
	  ert_read(t , TV_HOST_RD_WT_CNTL , &tmp);
1173
	} 
1174
      while ((tmp & VIP_HOST_RD_WT_CNTL_WT_ACK) == 0);
1175
1176
      ert_write(t , TV_HOST_RD_WT_CNTL , 0);
1177
    }
1178
}
1179
1180
/**********************************************************************
1181
 *
1182
 * readFIFO
1183
 *
1184
 * Read from RT FIFO RAM
1185
 *
1186
 **********************************************************************/
1187
1188
static
1189
void
1190
readFIFO(
1191
	 TheaterOutPtr t,
1192
	 CARD16 addr,
1193
	 CARD32 *value
1194
	 )
1195
{
1196
  CARD32 tmp;
1197
  
1198
  if (t->theatre_num >= 0)
1199
    {
1200
      theatre_write(t , VIP_HOST_RD_WT_CNTL , addr | VIP_HOST_RD_WT_CNTL_RD);
1201
1202
      do
1203
	{
1204
	  if (!theatre_read(t , VIP_HOST_RD_WT_CNTL , &tmp))
1205
	    break;
1206
	} 
1207
      while ((tmp & VIP_HOST_RD_WT_CNTL_RD_ACK) == 0);
1208
1209
      theatre_write(t , VIP_HOST_RD_WT_CNTL , 0);
1210
1211
      theatre_read(t , VIP_HOST_READ_DATA , value);
1212
    }
1213
  else
1214
    {
1215
      ert_write(t , TV_HOST_RD_WT_CNTL , addr | VIP_HOST_RD_WT_CNTL_RD);
1216
1217
      do
1218
	{
1219
	  ert_read(t , TV_HOST_RD_WT_CNTL , &tmp);
1220
	} 
1221
      while ((tmp & VIP_HOST_RD_WT_CNTL_RD_ACK) == 0);
1222
1223
      ert_write(t , TV_HOST_RD_WT_CNTL , 0);
1224
1225
      ert_read(t , TV_HOST_READ_DATA , value);
1226
    }
1227
}
1228
1229
/**********************************************************************
1230
 *
1231
 * getTimingTablesAddr
1232
 *
1233
 * Get FIFO addresses of horizontal & vertical code timing tables from
1234
 * settings of uv_adr register.
1235
 *
1236
 **********************************************************************/
1237
1238
static
1239
void
1240
getTimingTablesAddr(
1241
		    CARD32 uv_adr,
1242
		    Bool isERT,
1243
		    CARD16 *hTable,
1244
		    CARD16 *vTable
1245
		    )
1246
{
1247
  switch ((uv_adr & VIP_UV_ADR_HCODE_TABLE_SEL) >> VIP_UV_ADR_HCODE_TABLE_SEL_SHIFT)
1248
    {
1249
    case 0:
1250
      *hTable = isERT ? MAX_FIFO_ADDR_ERT : MAX_FIFO_ADDR_RT;
1251
      break;
1252
1253
    case 1:
1254
      *hTable = ((uv_adr & VIP_UV_ADR_TABLE1_BOT_ADR) >> VIP_UV_ADR_TABLE1_BOT_ADR_SHIFT) * 2;
1255
      break;
1256
1257
    case 2:
1258
      *hTable = ((uv_adr & VIP_UV_ADR_TABLE3_TOP_ADR) >> VIP_UV_ADR_TABLE3_TOP_ADR_SHIFT) * 2;
1259
      break;
1260
1261
    default:
1262
      /*
1263
       * Of course, this should never happen
1264
       */
1265
      *hTable = 0;
1266
      break;
1267
    }
1268
1269
  switch ((uv_adr & VIP_UV_ADR_VCODE_TABLE_SEL) >> VIP_UV_ADR_VCODE_TABLE_SEL_SHIFT)
1270
    {
1271
    case 0:
1272
      *vTable = ((uv_adr & VIP_UV_ADR_MAX_UV_ADR) >> VIP_UV_ADR_MAX_UV_ADR_SHIFT) * 2 + 1;
1273
      break;
1274
1275
    case 1:
1276
      *vTable = ((uv_adr & VIP_UV_ADR_TABLE1_BOT_ADR) >> VIP_UV_ADR_TABLE1_BOT_ADR_SHIFT) * 2 + 1;
1277
      break;
1278
1279
    case 2:
1280
      *vTable = ((uv_adr & VIP_UV_ADR_TABLE3_TOP_ADR) >> VIP_UV_ADR_TABLE3_TOP_ADR_SHIFT) * 2 + 1;
1281
      break;
1282
1283
    default:
1284
      /*
1285
       * Of course, this should never happen
1286
       */
1287
      *vTable = 0;
1288
      break;
1289
    }
1290
}
1291
1292
/**********************************************************************
1293
 *
1294
 * saveTimingTables
1295
 *
1296
 * Save horizontal/vertical timing code tables
1297
 *
1298
 **********************************************************************/
1299
static
1300
void
1301
saveTimingTables(
1302
		 TheaterOutPtr t,
1303
		 TheaterStatePtr save
1304
		 )
1305
{
1306
  CARD16 hTable;
1307
  CARD16 vTable;
1308
  CARD32 tmp;
1309
  unsigned i;
1310
1311
  if (t->theatre_num >= 0)
1312
    {
1313
      theatre_read(t , VIP_UV_ADR , &save->uv_adr);
1314
      getTimingTablesAddr(save->uv_adr , FALSE , &hTable , &vTable);
1315
    }
1316
  else
1317
    {
1318
      ert_read(t , TV_UV_ADR , &save->uv_adr);
1319
      getTimingTablesAddr(save->uv_adr , TRUE , &hTable , &vTable);
1320
    }
1321
1322
  /*
1323
   * Reset FIFO arbiter in order to be able to access FIFO RAM
1324
   */
1325
  if (t->theatre_num >= 0)
1326
    {
1327
      theatre_write(t , 
1328
		    VIP_MASTER_CNTL , 
1329
		    save->master_cntl | 
1330
		    VIP_MASTER_CNTL_CRT_ASYNC_RST |
1331
		    VIP_MASTER_CNTL_TV_FIFO_ASYNC_RST |
1332
		    VIP_MASTER_CNTL_TV_ASYNC_RST);
1333
      theatre_write(t , 
1334
		    VIP_MASTER_CNTL , 
1335
		    save->master_cntl |
1336
		    VIP_MASTER_CNTL_TV_ASYNC_RST |
1337
		    VIP_MASTER_CNTL_CRT_ASYNC_RST);
1338
    }
1339
  else
1340
    {
1341
      ert_write(t , 
1342
		TV_MASTER_CNTL , 
1343
		save->master_cntl | TV_MASTER_CNTL_TV_ON);
1344
    }
1345
1346
  RTTRACE(("saveTimingTables: reading timing tables\n"));
1347
1348
  for (i = 0; i < MAX_H_CODE_TIMING_LEN; i += 2)
1349
    {
1350
      readFIFO(t , hTable-- , &tmp);
1351
      save->h_code_timing[ i     ] = (CARD16)((tmp >> 14) & 0x3fff);
1352
      save->h_code_timing[ i + 1 ] = (CARD16)(tmp & 0x3fff);
1353
1354
      if (save->h_code_timing[ i ] == 0 || save->h_code_timing[ i + 1 ] == 0)
1355
	break;
1356
    }
1357
1358
  for (i = 0; i < MAX_V_CODE_TIMING_LEN; i += 2)
1359
    {
1360
      readFIFO(t , vTable++ , &tmp);
1361
      save->v_code_timing[ i     ] = (CARD16)(tmp & 0x3fff);
1362
      save->v_code_timing[ i + 1 ] = (CARD16)((tmp >> 14) & 0x3fff);
1363
1364
      if (save->v_code_timing[ i ] == 0 || save->v_code_timing[ i + 1 ] == 0)
1365
	break;
1366
    }
1367
}
1368
		 
1369
/**********************************************************************
1370
 *
1371
 * restoreTimingTables
1372
 *
1373
 * Load horizontal/vertical timing code tables
1374
 *
1375
 **********************************************************************/
1376
1377
static
1378
void
1379
restoreTimingTables(
1380
		    TheaterOutPtr t,
1381
		    TheaterStatePtr restore
1382
		    )
1383
{
1384
  CARD16 hTable;
1385
  CARD16 vTable;
1386
  CARD32 tmp;
1387
  unsigned i;
1388
1389
  if (t->theatre_num >= 0)
1390
    {
1391
      theatre_write(t , VIP_UV_ADR , restore->uv_adr);
1392
      getTimingTablesAddr(restore->uv_adr , FALSE , &hTable , &vTable);
1393
    }
1394
  else
1395
    {
1396
      ert_write(t , TV_UV_ADR , restore->uv_adr);
1397
      getTimingTablesAddr(restore->uv_adr , TRUE , &hTable , &vTable);
1398
    }
1399
1400
  for (i = 0; i < MAX_H_CODE_TIMING_LEN; i += 2 , hTable--)
1401
    {
1402
      tmp = ((CARD32)restore->h_code_timing[ i ] << 14) | ((CARD32)restore->h_code_timing[ i + 1 ]);
1403
      writeFIFO(t , hTable , tmp);
1404
      if (restore->h_code_timing[ i ] == 0 || restore->h_code_timing[ i + 1 ] == 0)
1405
	break;
1406
    }
1407
1408
  for (i = 0; i < MAX_V_CODE_TIMING_LEN; i += 2 , vTable++)
1409
    {
1410
      tmp = ((CARD32)restore->v_code_timing[ i + 1 ] << 14) | ((CARD32)restore->v_code_timing[ i ]);
1411
      writeFIFO(t , vTable , tmp);
1412
      if (restore->v_code_timing[ i ] == 0 || restore->v_code_timing[ i + 1 ] == 0)
1413
	break;
1414
    }
1415
}
1416
1417
/**********************************************************************
1418
 *
1419
 * restoreOutputStd
1420
 *
1421
 * Set tv standard & output muxes
1422
 *
1423
 **********************************************************************/
1424
1425
static
1426
void
1427
restoreOutputStd(
1428
		 TheaterOutPtr t,
1429
		 TheaterStatePtr restore
1430
		 )
1431
{
1432
  theatre_write(t , VIP_SYNC_CNTL , restore->sync_cntl);
1433
  
1434
  theatre_write(t , VIP_TIMING_CNTL , restore->timing_cntl);
1435
1436
  theatre_write(t , VIP_MODULATOR_CNTL1 , restore->modulator_cntl1);
1437
  theatre_write(t , VIP_MODULATOR_CNTL2 , restore->modulator_cntl2);
1438
 
1439
  theatre_write(t , VIP_PRE_DAC_MUX_CNTL , restore->pre_dac_mux_cntl);
1440
1441
  theatre_write(t , VIP_CRC_CNTL , restore->crc_cntl);
1442
1443
  theatre_write(t , VIP_FRAME_LOCK_CNTL , restore->frame_lock_cntl);
1444
1445
  theatre_write(t , VIP_HW_DEBUG , restore->hw_debug);
1446
}
1447
1448
/**********************************************************************
1449
 *
1450
 * enableTV_DAC
1451
 *
1452
 * Enable/disable tv output DAC
1453
 *
1454
 **********************************************************************/
1455
1456
static
1457
void
1458
enableTV_DAC(
1459
	     TheaterOutPtr t,
1460
	     Bool enable
1461
	     )
1462
{
1463
  CARD32 tmp;
1464
1465
  theatre_read(t , VIP_TV_DAC_CNTL , &tmp);
1466
1467
  if (enable)
1468
    {
1469
      tmp |= VIP_TV_DAC_CNTL_NBLANK;
1470
      tmp &= ~VIP_TV_DAC_CNTL_DASLEEP;
1471
      tmp &= ~VIP_TV_DAC_CNTL_BGSLEEP;
1472
    }
1473
  else
1474
    {
1475
      tmp &= ~VIP_TV_DAC_CNTL_NBLANK;
1476
      tmp |= VIP_TV_DAC_CNTL_DASLEEP;
1477
      tmp |= VIP_TV_DAC_CNTL_BGSLEEP;
1478
    }
1479
1480
  theatre_write(t , VIP_TV_DAC_CNTL , tmp);
1481
}
1482
1483
/**********************************************************************
1484
 *
1485
 * ERT_RestorePLL
1486
 *
1487
 * Set ERT PLLs
1488
 *
1489
 **********************************************************************/
1490
static
1491
void
1492
ERT_RestorePLL(
1493
	       TheaterOutPtr t,
1494
	       ScrnInfoPtr pScrn,
1495
	       TheaterStatePtr restore
1496
	       )
1497
{
1498
  unsigned char *RADEONMMIO = t->MMIO;
1499
1500
  OUTPLLP(pScrn , TV_PLL_CNTL1 , 0 , ~TV_PLL_CNTL1_TVCLK_SRC_SEL);
1501
  OUTPLL(pScrn , TV_PLL_CNTL , restore->tv_pll_cntl);
1502
  OUTPLLP(pScrn , TV_PLL_CNTL1 , TV_PLL_CNTL1_TVPLL_RESET , ~TV_PLL_CNTL1_TVPLL_RESET);
1503
1504
  waitPLL_lock(t , pScrn , 200 , 800 , 135);
1505
  
1506
  OUTPLLP(pScrn , TV_PLL_CNTL1 , 0 , ~TV_PLL_CNTL1_TVPLL_RESET);
1507
1508
  waitPLL_lock(t , pScrn , 300 , 160 , 27);
1509
  waitPLL_lock(t , pScrn , 200 , 800 , 135);
1510
  
1511
  OUTPLLP(pScrn , TV_PLL_CNTL1 , 0 , ~0xf);
1512
  OUTPLLP(pScrn , TV_PLL_CNTL1 , TV_PLL_CNTL1_TVCLK_SRC_SEL , ~TV_PLL_CNTL1_TVCLK_SRC_SEL);
1513
  
1514
  OUTPLLP(pScrn , TV_PLL_CNTL1 , (1 << TV_PLL_CNTL1_TVPDC_SHIFT) , ~TV_PLL_CNTL1_TVPDC_MASK);
1515
  OUTPLLP(pScrn , TV_PLL_CNTL1 , 0 , ~TV_PLL_CNTL1_TVPLL_SLEEP);
1516
}
1517
1518
/**********************************************************************
1519
 *
1520
 * ERT_RestoreHV
1521
 *
1522
 * Set ERT horizontal/vertical settings
1523
 *
1524
 **********************************************************************/
1525
1526
static
1527
void
1528
ERT_RestoreHV(
1529
	      TheaterOutPtr t,
1530
	      TheaterStatePtr restore
1531
	      )
1532
{
1533
  ert_write(t , TV_RGB_CNTL , restore->rgb_cntl);
1534
1535
  ert_write(t , TV_HTOTAL , restore->htotal);
1536
  ert_write(t , TV_HDISP  , restore->hdisp);
1537
  ert_write(t , TV_HSTART , restore->hstart);
1538
1539
  ert_write(t , TV_VTOTAL , restore->vtotal);
1540
  ert_write(t , TV_VDISP  , restore->vdisp);
1541
1542
  ert_write(t , TV_FTOTAL , restore->vftotal);
1543
1544
  ert_write(t , TV_VSCALER_CNTL1 , restore->vscaler_cntl1);
1545
  ert_write(t , TV_VSCALER_CNTL2 , restore->vscaler_cntl2);
1546
1547
  ert_write(t , TV_Y_FALL_CNTL , restore->y_fall_cntl);
1548
  ert_write(t , TV_Y_RISE_CNTL , restore->y_rise_cntl);
1549
  ert_write(t , TV_Y_SAWTOOTH_CNTL , restore->y_saw_tooth_cntl);
1550
}
1551
1552
/**********************************************************************
1553
 *
1554
 * ERT_RestoreRestarts
1555
 *
1556
 * Set ERT TV_*RESTART registers
1557
 *
1558
 **********************************************************************/
1559
1560
static
1561
void
1562
ERT_RestoreRestarts(	 
1563
		    TheaterOutPtr t,
1564
		    TheaterStatePtr restore
1565
		    )
1566
{
1567
  ert_write(t , TV_FRESTART , restore->dfrestart);
1568
  ert_write(t , TV_HRESTART , restore->dhrestart);
1569
  ert_write(t , TV_VRESTART , restore->dvrestart);
1570
}
1571
1572
/**********************************************************************
1573
 *
1574
 * ERT_RestoreOutputStd
1575
 *
1576
 * Set tv standard & output muxes
1577
 *
1578
 **********************************************************************/
1579
static
1580
void
1581
ERT_RestoreOutputStd(
1582
		     TheaterOutPtr t,
1583
		     TheaterStatePtr restore
1584
		     )
1585
{
1586
  ert_write(t , TV_SYNC_CNTL , restore->sync_cntl);
1587
  
1588
  ert_write(t , TV_TIMING_CNTL , restore->timing_cntl);
1589
1590
  ert_write(t , TV_MODULATOR_CNTL1 , restore->modulator_cntl1);
1591
  ert_write(t , TV_MODULATOR_CNTL2 , restore->modulator_cntl2);
1592
 
1593
  ert_write(t , TV_PRE_DAC_MUX_CNTL , restore->pre_dac_mux_cntl);
1594
1595
  ert_write(t , TV_CRC_CNTL , restore->crc_cntl);
1596
}
1597
1598
/**********************************************************************
1599
 *
1600
 * ERT_IsOn
1601
 *
1602
 * Test if tv output would be enabled with a given value in TV_DAC_CNTL
1603
 *
1604
 **********************************************************************/
1605
static
1606
Bool
1607
ERT_IsOn(
1608
	 CARD32 tv_dac_cntl
1609
	 )
1610
{
1611
  if (tv_dac_cntl & TV_DAC_CNTL_BGSLEEP)
1612
    return FALSE;
1613
  else if ((tv_dac_cntl & (TV_DAC_CNTL_RDACPD | TV_DAC_CNTL_GDACPD | TV_DAC_CNTL_BDACPD)) ==
1614
	   (TV_DAC_CNTL_RDACPD | TV_DAC_CNTL_GDACPD | TV_DAC_CNTL_BDACPD))
1615
    return FALSE;
1616
  else
1617
    return TRUE;
1618
}
1619
1620
/**********************************************************************
1621
 *
1622
 * ERT_Restore
1623
 *
1624
 * Restore state of ERT
1625
 *
1626
 **********************************************************************/
1627
static
1628
void
1629
ERT_Restore(
1630
	    TheaterOutPtr t,
1631
	    ScrnInfoPtr pScrn,
1632
	    TheaterStatePtr restore
1633
	    )
1634
{
1635
  RTTRACE(("Entering ERT_Restore\n"));
1636
1637
  ert_write(t , 
1638
	    TV_MASTER_CNTL , 
1639
	    restore->master_cntl | TV_MASTER_CNTL_TV_ON);
1640
1641
  ert_write(t,
1642
	    TV_MASTER_CNTL ,
1643
	    restore->master_cntl | 
1644
	    VIP_MASTER_CNTL_TV_ASYNC_RST |
1645
	    VIP_MASTER_CNTL_CRT_ASYNC_RST |
1646
	    VIP_MASTER_CNTL_RESTART_PHASE_FIX |
1647
	    VIP_MASTER_CNTL_TV_FIFO_ASYNC_RST);
1648
1649
  /*
1650
   * Temporarily turn the TV DAC off
1651
   */
1652
  ert_write(t ,
1653
	    TV_DAC_CNTL ,
1654
	    (restore->tv_dac_cntl & ~TV_DAC_CNTL_NBLANK) |
1655
	    TV_DAC_CNTL_BGSLEEP |
1656
	    TV_DAC_CNTL_RDACPD |
1657
	    TV_DAC_CNTL_GDACPD |
1658
	    TV_DAC_CNTL_BDACPD);
1659
1660
  RTTRACE(("ERT_Restore: checkpoint 1\n"));
1661
  ERT_RestorePLL(t , pScrn , restore);
1662
1663
  RTTRACE(("ERT_Restore: checkpoint 2\n"));
1664
  ERT_RestoreHV(t , restore);
1665
1666
  ert_write(t,
1667
	    TV_MASTER_CNTL ,
1668
	    restore->master_cntl | 
1669
	    VIP_MASTER_CNTL_TV_ASYNC_RST |
1670
	    VIP_MASTER_CNTL_CRT_ASYNC_RST |
1671
	    VIP_MASTER_CNTL_RESTART_PHASE_FIX);
1672
1673
  RTTRACE(("ERT_Restore: checkpoint 3\n"));
1674
  ERT_RestoreRestarts(t , restore);
1675
  
1676
  RTTRACE(("ERT_Restore: checkpoint 4\n"));
1677
1678
  /*
1679
   * Timing tables are only restored when tv output is active
1680
   */
1681
  if (ERT_IsOn(restore->tv_dac_cntl))
1682
    restoreTimingTables(t , restore);
1683
  
1684
  ert_write(t,
1685
	    TV_MASTER_CNTL ,
1686
	    restore->master_cntl | 
1687
	    VIP_MASTER_CNTL_TV_ASYNC_RST |
1688
	    VIP_MASTER_CNTL_RESTART_PHASE_FIX);
1689
1690
  RTTRACE(("ERT_Restore: checkpoint 5\n"));
1691
  ERT_RestoreOutputStd(t , restore);
1692
1693
  ert_write(t , 
1694
	    TV_MASTER_CNTL , 
1695
	    restore->master_cntl);
1696
1697
  ert_write(t , RADEON_DISP_MERGE_CNTL , restore->disp_merge_cntl);
1698
1699
  ert_write(t , TV_GAIN_LIMIT_SETTINGS , restore->gain_limit_settings);
1700
  ert_write(t , TV_LINEAR_GAIN_SETTINGS , restore->linear_gain_settings);
1701
1702
  ert_write(t , TV_DAC_CNTL , restore->tv_dac_cntl);
1703
1704
  RTTRACE(("Leaving ERT_Restore\n"));
1705
}
1706
1707
/**********************************************************************
1708
 *
1709
 * RT_Restore
1710
 *
1711
 * Restore state of RT
1712
 *
1713
 **********************************************************************/
1714
1715
static
1716
void
1717
RT_Restore(
1718
	   TheaterOutPtr t,
1719
	   ScrnInfoPtr pScrn,
1720
	   TheaterStatePtr restore
1721
	   )
1722
{
1723
  if (t->theatre_num < 0)
1724
    {
1725
      ERT_Restore(t , pScrn , restore);
1726
      return;
1727
    }
1728
1729
  RTTRACE(("Entering RT_Restore\n"));
1730
1731
  theatre_write(t , 
1732
		VIP_MASTER_CNTL , 
1733
		restore->master_cntl | 
1734
		VIP_MASTER_CNTL_TV_ASYNC_RST |
1735
		VIP_MASTER_CNTL_CRT_ASYNC_RST |
1736
		VIP_MASTER_CNTL_TV_FIFO_ASYNC_RST);
1737
1738
  /*
1739
   * Temporarily turn the TV DAC off
1740
   */
1741
  theatre_write(t ,
1742
		VIP_TV_DAC_CNTL ,
1743
		(restore->tv_dac_cntl & ~VIP_TV_DAC_CNTL_NBLANK) |
1744
		VIP_TV_DAC_CNTL_DASLEEP | 
1745
		VIP_TV_DAC_CNTL_BGSLEEP);
1746
1747
  RTTRACE(("RT_Restore: checkpoint 1\n"));
1748
  restoreTVO_SYNC(t , restore);
1749
1750
  RTTRACE(("RT_Restore: checkpoint 2\n"));
1751
  restorePLL(t , pScrn , restore);
1752
1753
  RTTRACE(("RT_Restore: checkpoint 3\n"));
1754
  restoreTVO_DataDelay(t , restore);
1755
1756
  RTTRACE(("RT_Restore: checkpoint 4\n"));
1757
  restoreRT_HV(t , restore);
1758
  
1759
  theatre_write(t , 
1760
		VIP_MASTER_CNTL , 
1761
		restore->master_cntl |
1762
		VIP_MASTER_CNTL_TV_ASYNC_RST |
1763
		VIP_MASTER_CNTL_CRT_ASYNC_RST);
1764
1765
  RTTRACE(("RT_Restore: checkpoint 5\n"));
1766
  restoreRestarts(t , restore);
1767
1768
  RTTRACE(("RT_Restore: checkpoint 6\n"));
1769
1770
  /*
1771
   * Timing tables are restored when tv output is active
1772
   */
1773
  if ((restore->tv_dac_cntl & (VIP_TV_DAC_CNTL_DASLEEP | VIP_TV_DAC_CNTL_BGSLEEP)) == 0)
1774
    restoreTimingTables(t , restore);
1775
  
1776
  theatre_write(t , 
1777
		VIP_MASTER_CNTL , 
1778
		restore->master_cntl |
1779
		VIP_MASTER_CNTL_TV_ASYNC_RST);
1780
1781
  RTTRACE(("RT_Restore: checkpoint 7\n"));
1782
  restoreOutputStd(t , restore);
1783
1784
  theatre_write(t , 
1785
		VIP_MASTER_CNTL , 
1786
		restore->master_cntl);
1787
1788
  theatre_write(t , VIP_GAIN_LIMIT_SETTINGS , restore->gain_limit_settings);
1789
  theatre_write(t , VIP_LINEAR_GAIN_SETTINGS , restore->linear_gain_settings);
1790
1791
  theatre_write(t , VIP_TV_DAC_CNTL , restore->tv_dac_cntl);
1792
1793
  RTTRACE(("Leaving RT_Restore\n"));
1794
}
1795
1796
/**********************************************************************
1797
 *
1798
 * RT_Save
1799
 *
1800
 * Save state of RT
1801
 *
1802
 **********************************************************************/
1803
1804
static
1805
void
1806
RT_Save(
1807
	TheaterOutPtr t,
1808
	ScrnInfoPtr pScrn,
1809
	TheaterStatePtr save
1810
	)
1811
{
1812
  unsigned i;
1813
1814
  RTTRACE(("Entering RT_Save\n"));
1815
1816
  if (t->theatre_num >= 0)
1817
    {
1818
      theatre_read(t , VIP_CLKOUT_CNTL         , &save->clkout_cntl);
1819
      theatre_read(t , VIP_CLOCK_SEL_CNTL      , &save->clock_sel_cntl);
1820
      theatre_read(t , VIP_CRC_CNTL            , &save->crc_cntl);
1821
      theatre_read(t , VIP_CRT_PLL_CNTL        , &save->crt_pll_cntl);
1822
      theatre_read(t , VIP_DFRESTART           , &save->dfrestart);
1823
      theatre_read(t , VIP_DHRESTART           , &save->dhrestart);
1824
      theatre_read(t , VIP_DVRESTART           , &save->dvrestart);
1825
      theatre_read(t , VIP_FRAME_LOCK_CNTL     , &save->frame_lock_cntl);
1826
      theatre_read(t , VIP_GAIN_LIMIT_SETTINGS , &save->gain_limit_settings);
1827
      theatre_read(t , VIP_HDISP               , &save->hdisp);
1828
      theatre_read(t , VIP_HSTART              , &save->hstart);
1829
      theatre_read(t , VIP_HTOTAL              , &save->htotal);
1830
      theatre_read(t , VIP_HW_DEBUG            , &save->hw_debug);
1831
      theatre_read(t , VIP_LINEAR_GAIN_SETTINGS, &save->linear_gain_settings);
1832
      theatre_read(t , VIP_MASTER_CNTL         , &save->master_cntl);
1833
      theatre_read(t , VIP_MODULATOR_CNTL1     , &save->modulator_cntl1);
1834
      theatre_read(t , VIP_MODULATOR_CNTL2     , &save->modulator_cntl2);
1835
      theatre_read(t , VIP_PLL_CNTL0           , &save->pll_cntl0);
1836
      theatre_read(t , VIP_PLL_TEST_CNTL       , &save->pll_test_cntl);
1837
      theatre_read(t , VIP_PRE_DAC_MUX_CNTL    , &save->pre_dac_mux_cntl);
1838
      theatre_read(t , VIP_RGB_CNTL            , &save->rgb_cntl);
1839
      theatre_read(t , VIP_SYNC_CNTL           , &save->sync_cntl);
1840
      theatre_read(t , VIP_SYNC_LOCK_CNTL      , &save->sync_lock_cntl);
1841
      theatre_read(t , VIP_SYNC_SIZE           , &save->sync_size);
1842
      theatre_read(t , VIP_TIMING_CNTL         , &save->timing_cntl);
1843
      theatre_read(t , VIP_TVO_DATA_DELAY_A    , &save->tvo_data_delay_a);
1844
      theatre_read(t , VIP_TVO_DATA_DELAY_B    , &save->tvo_data_delay_b);
1845
      theatre_read(t , VIP_TVO_SYNC_PAT_EXPECT , &save->tvo_sync_pat_expect);
1846
      theatre_read(t , VIP_TVO_SYNC_THRESHOLD  , &save->tvo_sync_threshold);
1847
      theatre_read(t , VIP_TV_DAC_CNTL         , &save->tv_dac_cntl);
1848
      theatre_read(t , VIP_TV_PLL_CNTL         , &save->tv_pll_cntl);
1849
      theatre_read(t , VIP_TV_PLL_FINE_CNTL    , &save->tv_pll_fine_cntl);
1850
      theatre_read(t , VIP_UPSAMP_AND_GAIN_CNTL, &save->upsamp_and_gain_cntl);
1851
      theatre_read(t , VIP_VDISP               , &save->vdisp);
1852
      theatre_read(t , VIP_VFTOTAL             , &save->vftotal);
1853
      theatre_read(t , VIP_VSCALER_CNTL1       , &save->vscaler_cntl1);
1854
      theatre_read(t , VIP_VSCALER_CNTL2       , &save->vscaler_cntl2);
1855
      theatre_read(t , VIP_VTOTAL              , &save->vtotal);
1856
      theatre_read(t , VIP_Y_FALL_CNTL         , &save->y_fall_cntl);
1857
      theatre_read(t , VIP_Y_RISE_CNTL         , &save->y_rise_cntl);
1858
      theatre_read(t , VIP_Y_SAW_TOOTH_CNTL    , &save->y_saw_tooth_cntl);
1859
1860
      for (i = 0; i < N_UPSAMPLER_COEFFS; i++)
1861
	theatre_read(t , VIP_UPSAMP_COEFF0_0 + i * 4 , &save->upsamp_coeffs[ i ]);
1862
1863
      /*
1864
       * Read H/V code timing tables (current tables only are saved)
1865
       * This step is skipped when tv output is disabled in current RT state
1866
       * (see RT_Restore)
1867
       */
1868
      if ((save->tv_dac_cntl & (VIP_TV_DAC_CNTL_DASLEEP | VIP_TV_DAC_CNTL_BGSLEEP)) == 0)
1869
	saveTimingTables(t , save);
1870
    }
1871
  else
1872
    {
1873
      /*
1874
       * ERT
1875
       */
1876
      ert_read(t , TV_CRC_CNTL             , &save->crc_cntl);
1877
      ert_read(t , TV_FRESTART             , &save->dfrestart);
1878
      ert_read(t , TV_HRESTART             , &save->dhrestart);
1879
      ert_read(t , TV_VRESTART             , &save->dvrestart);
1880
      ert_read(t , TV_GAIN_LIMIT_SETTINGS  , &save->gain_limit_settings);
1881
      ert_read(t , TV_HDISP                , &save->hdisp);
1882
      ert_read(t , TV_HSTART               , &save->hstart);
1883
      ert_read(t , TV_HTOTAL               , &save->htotal);
1884
      ert_read(t , TV_LINEAR_GAIN_SETTINGS , &save->linear_gain_settings);
1885
      ert_read(t , TV_MASTER_CNTL          , &save->master_cntl);
1886
      ert_read(t , TV_RGB_CNTL             , &save->rgb_cntl);
1887
      ert_read(t , TV_MODULATOR_CNTL1      , &save->modulator_cntl1);
1888
      ert_read(t , TV_MODULATOR_CNTL2      , &save->modulator_cntl2);
1889
      ert_read(t , TV_PRE_DAC_MUX_CNTL     , &save->pre_dac_mux_cntl);
1890
      ert_read(t , TV_SYNC_CNTL            , &save->sync_cntl);
1891
      ert_read(t , TV_TIMING_CNTL          , &save->timing_cntl);
1892
      ert_read(t , TV_DAC_CNTL             , &save->tv_dac_cntl);
1893
      ert_read(t , TV_UPSAMP_AND_GAIN_CNTL , &save->upsamp_and_gain_cntl);
1894
      ert_read(t , TV_VDISP                , &save->vdisp);
1895
      ert_read(t , TV_FTOTAL               , &save->vftotal);
1896
      ert_read(t , TV_VSCALER_CNTL1        , &save->vscaler_cntl1);
1897
      ert_read(t , TV_VSCALER_CNTL2        , &save->vscaler_cntl2);
1898
      ert_read(t , TV_VTOTAL               , &save->vtotal);
1899
      ert_read(t , TV_Y_FALL_CNTL          , &save->y_fall_cntl);
1900
      ert_read(t , TV_Y_RISE_CNTL          , &save->y_rise_cntl);
1901
      ert_read(t , TV_Y_SAWTOOTH_CNTL      , &save->y_saw_tooth_cntl);
1902
1903
      ert_read(t , RADEON_DISP_MERGE_CNTL  , &save->disp_merge_cntl);
1904
1905
      save->tv_pll_cntl = INPLL(pScrn , TV_PLL_CNTL);
1906
      
1907
      /*
1908
       * Read H/V code timing tables (current tables only are saved)
1909
       * This step is skipped when tv output is disabled in current RT state
1910
       * (see RT_Restore)
1911
       */
1912
      if (ERT_IsOn(save->tv_dac_cntl))
1913
	saveTimingTables(t , save);
1914
    }
1915
1916
1917
  RTTRACE(("RT_Save returning\n"));
1918
}
1919
1920
/**********************************************************************
1921
 *
1922
 * computeRestarts
1923
 *
1924
 * Compute F,V,H restarts from default restart position and 
1925
 * hPos & vPos
1926
 * Return TRUE when code timing table was changed
1927
 *
1928
 **********************************************************************/
1929
1930
static
1931
Bool
1932
computeRestarts(
1933
		const ModeConstants *constPtr,
1934
		TVStd tvStd,
1935
		int hPos,
1936
		int vPos,
1937
		int hSize,
1938
		TheaterStatePtr save
1939
		)
1940
{
1941
  int restart;
1942
  const TVConstants *pTvStd = &tvStdConsts[ tvStd ];
1943
  unsigned hTotal;
1944
  unsigned vTotal;
1945
  unsigned fTotal;
1946
  int vOffset;
1947
  int hOffset;
1948
  TimingTableEl p1;
1949
  TimingTableEl p2;
1950
  Bool hChanged;
1951
  CARD16 hInc;
1952
1953
  hTotal = constPtr->horTotal;
1954
  vTotal = constPtr->verTotal;
1955
  fTotal = pTvStd->vftotal + 1;
1956
1957
  /*
1958
   * Adjust positions 1&2 in hor. code timing table
1959
   */
1960
  hOffset = hPos * H_POS_UNIT;
1961
1962
  p1 = constPtr->horTimingTable[ H_TABLE_POS1 ];
1963
  p2 = constPtr->horTimingTable[ H_TABLE_POS2 ];
1964
1965
  p1 = (TimingTableEl)((int)p1 + hOffset);
1966
  p2 = (TimingTableEl)((int)p2 - hOffset);
1967
1968
  hChanged = (p1 != save->h_code_timing[ H_TABLE_POS1 ] || 
1969
	      p2 != save->h_code_timing[ H_TABLE_POS2 ]);
1970
1971
  save->h_code_timing[ H_TABLE_POS1 ] = p1;
1972
  save->h_code_timing[ H_TABLE_POS2 ] = p2;
1973
1974
  /*
1975
   * Convert hOffset from n. of TV clock periods to n. of CRTC clock periods (CRTC pixels)
1976
   */
1977
  hOffset = (hOffset * (int)(constPtr->pixToTV)) / 1000;
1978
1979
  /*
1980
   * Adjust restart
1981
   */
1982
  restart = constPtr->defRestart;
1983
 
1984
  /*
1985
   * Convert vPos TV lines to n. of CRTC pixels
1986
   * Be verrrrry careful when mixing signed & unsigned values in C..
1987
   */
1988
  vOffset = ((int)(vTotal * hTotal) * 2 * vPos) / (int)(pTvStd->linesFrame);
1989
1990
  restart -= vOffset + hOffset;
1991
1992
  RTTRACE(("computeRestarts: def = %u, h = %d , v = %d , p1=%04x , p2=%04x , restart = %d\n" , constPtr->defRestart , hPos , vPos , p1 , p2 , restart));
1993
1994
  save->dhrestart = restart % hTotal;
1995
  restart /= hTotal;
1996
  save->dvrestart = restart % vTotal;
1997
  restart /= vTotal;
1998
  save->dfrestart = restart % fTotal;
1999
2000
  RTTRACE(("computeRestarts: F/H/V=%u,%u,%u\n" , save->dfrestart , save->dvrestart , save->dhrestart));
2001
2002
  /*
2003
   * Compute H_INC from hSize
2004
   */
2005
  hInc = (CARD16)((int)(constPtr->horResolution * 4096 * pTvStd->tvClockT) / 
2006
		  (hSize * (int)(pTvStd->hSizeUnit) + (int)(pTvStd->zeroHSize)));
2007
  save->timing_cntl = (save->timing_cntl & ~VIP_TIMING_CNTL_H_INC) |
2008
    ((CARD32)hInc << VIP_TIMING_CNTL_H_INC_SHIFT);
2009
2010
  RTTRACE(("computeRestarts: hSize=%d,hInc=%u\n" , hSize , hInc));
2011
2012
  return hChanged;
2013
}
2014
2015
/**********************************************************************
2016
 *
2017
 * RT_Init
2018
 *
2019
 * Define RT state for a given standard/resolution combination
2020
 *
2021
 **********************************************************************/
2022
2023
static
2024
void
2025
RT_Init(
2026
	const ModeConstants *constPtr,
2027
	TVStd tvStd,
2028
	Bool isErt,
2029
	Bool enable,
2030
	int hPos,
2031
	int vPos,
2032
	int hSize,
2033
	TheaterStatePtr save
2034
	)
2035
{
2036
  unsigned i;
2037
  CARD32 tmp;
2038
  const TVConstants *pTvStd = &tvStdConsts[ tvStd ];
2039
2040
  save->clkout_cntl = VIP_CLKOUT_CNTL_INI;
2041
2042
  save->clock_sel_cntl = VIP_CLOCK_SEL_CNTL_INI |  
2043
    (constPtr->crtcPLL_byteClkDiv << VIP_CLOCK_SEL_CNTL_BYTCLK_SHIFT) |
2044
    (constPtr->byteClkDelay << VIP_CLOCK_SEL_CNTL_BYTCLKD_SHIFT);
2045
2046
  save->crc_cntl = 0;
2047
2048
  tmp = ((CARD32)constPtr->crtcPLL_M << VIP_CRT_PLL_CNTL_M_SHIFT) |
2049
    (((CARD32)constPtr->crtcPLL_N & VIP_CRT_PLL_CNTL_NLO) << VIP_CRT_PLL_CNTL_NLO_SHIFT) |
2050
    (((CARD32)constPtr->crtcPLL_N & VIP_CRT_PLL_CNTL_NHI) << VIP_CRT_PLL_CNTL_NHI_SHIFT);
2051
  if (constPtr->crtcPLL_divBy2)
2052
    tmp |= VIP_CRT_PLL_CNTL_CLKBY2;
2053
  save->crt_pll_cntl = tmp;
2054
2055
  save->frame_lock_cntl = VIP_FRAME_LOCK_CNTL_INI;
2056
2057
  save->gain_limit_settings = VIP_GAIN_LIMIT_SETTINGS_INI;
2058
2059
  save->hdisp = constPtr->horResolution - 1;
2060
  save->hstart = constPtr->horStart;
2061
  save->htotal = constPtr->horTotal - 1;
2062
2063
  save->hw_debug = VIP_HW_DEBUG_INI;
2064
2065
  save->linear_gain_settings = VIP_LINEAR_GAIN_SETTINGS_INI;
2066
2067
  /*
2068
   * TEST   TEST   TEST   TEST   TEST   TEST   TEST   TEST   TEST   
2069
   */
2070
  if (isErt)
2071
    save->master_cntl = enable ? TV_MASTER_CNTL_ON_INI : TV_MASTER_CNTL_OFF_INI;
2072
  else
2073
    save->master_cntl = enable ? VIP_MASTER_CNTL_ON_INI : VIP_MASTER_CNTL_OFF_INI;
2074
2075
  save->modulator_cntl1 = pTvStd->modulatorCntl1;
2076
  save->modulator_cntl2 = pTvStd->modulatorCntl2;
2077
2078
  save->pll_cntl0 = VIP_PLL_CNTL0_INI;
2079
  save->pll_test_cntl = VIP_PLL_TEST_CNTL_INI;
2080
2081
  save->pre_dac_mux_cntl = VIP_PRE_DAC_MUX_CNTL_INI;
2082
2083
  if (isErt)
2084
    save->rgb_cntl = TV_RGB_CNTL_INI;
2085
  else
2086
    /*
2087
     * Instruct RT to accept either 565 or 888 packed pixels
2088
     */
2089
    save->rgb_cntl = constPtr->use888RGB ? VIP_RGB_CNTL_RGB_IS_888_PACK : 0;
2090
2091
  save->sync_cntl = VIP_SYNC_CNTL_INI;
2092
2093
  save->sync_lock_cntl = VIP_SYNC_LOCK_CNTL_INI;
2094
2095
  save->sync_size = constPtr->horResolution + 8;
2096
  
2097
  tmp = (constPtr->vScalerCntl1 >> VIP_VSCALER_CNTL1_UV_INC_SHIFT) & VIP_VSCALER_CNTL1_UV_INC;
2098
  tmp = ((16384 * 256 * 10) / tmp + 5) / 10;
2099
  tmp = (tmp << VIP_TIMING_CNTL_UV_OUT_POST_SCALE_SHIFT) | 
2100
    VIP_TIMING_CNTL_INI;
2101
  save->timing_cntl = tmp;
2102
2103
  save->tvo_data_delay_a = constPtr->tvoDataDelayA;
2104
  save->tvo_data_delay_b = constPtr->tvoDataDelayB;
2105
2106
  save->tvo_sync_pat_expect = VIP_TVO_SYNC_PAT_EXPECT_INI;
2107
2108
  if (constPtr->use888RGB)
2109
    save->tvo_sync_threshold = constPtr->horResolution + constPtr->horResolution / 2;
2110
  else
2111
    save->tvo_sync_threshold = constPtr->horResolution;
2112
2113
  if (isErt)
2114
    {
2115
      if (enable)
2116
	save->tv_dac_cntl = pTvStd->ert_tvDAC_Cntl;
2117
      else
2118
	save->tv_dac_cntl = (pTvStd->ert_tvDAC_Cntl & ~(TV_DAC_CNTL_NBLANK | TV_DAC_CNTL_NHOLD)) |
2119
	  (TV_DAC_CNTL_BGSLEEP | TV_DAC_CNTL_RDACPD | TV_DAC_CNTL_GDACPD | TV_DAC_CNTL_BDACPD);
2120
    }
2121
  else
2122
    {
2123
      if (enable)
2124
	save->tv_dac_cntl = pTvStd->vip_tvDAC_Cntl;
2125
      else
2126
	save->tv_dac_cntl = (pTvStd->vip_tvDAC_Cntl & ~VIP_TV_DAC_CNTL_NBLANK) | 
2127
	  (VIP_TV_DAC_CNTL_DASLEEP | VIP_TV_DAC_CNTL_BGSLEEP);
2128
    }
2129
2130
  tmp = ((CARD32)(pTvStd->tvPLL_M) << VIP_TV_PLL_CNTL_M_SHIFT) |
2131
    (((CARD32)(pTvStd->tvPLL_N) & VIP_TV_PLL_CNTL_NLO) << VIP_TV_PLL_CNTL_NLO_SHIFT) |
2132
    (((CARD32)(pTvStd->tvPLL_N) & VIP_TV_PLL_CNTL_NHI) << VIP_TV_PLL_CNTL_NHI_SHIFT) |
2133
    ((CARD32)(pTvStd->tvPLL_postDiv) << VIP_TV_PLL_CNTL_P_SHIFT);
2134
  save->tv_pll_cntl = tmp;
2135
  save->tv_pll_fine_cntl = TV_PLL_FINE_INI;
2136
2137
  save->upsamp_and_gain_cntl = VIP_UPSAMP_AND_GAIN_CNTL_INI;
2138
2139
  memcpy(&save->upsamp_coeffs[ 0 ] , upsamplerCoeffs , sizeof(save->upsamp_coeffs));
2140
2141
  save->uv_adr = VIP_UV_ADR_INI;
2142
2143
  save->vdisp = constPtr->verResolution - 1;
2144
  save->vftotal = pTvStd->vftotal;
2145
2146
  save->vscaler_cntl1 = constPtr->vScalerCntl1;
2147
  if (isErt)
2148
    save->vscaler_cntl1 |= TV_VSCALER_CNTL1_RESTART_FIELD;
2149
  save->vscaler_cntl2 = VIP_VSCALER_CNTL2_INI;
2150
2151
  save->vtotal = constPtr->verTotal - 1;
2152
2153
  save->y_fall_cntl = VIP_Y_FALL_CNTL_INI;
2154
  save->y_rise_cntl = constPtr->yRiseCntl;
2155
  save->y_saw_tooth_cntl = constPtr->ySawtoothCntl;
2156
2157
  save->disp_merge_cntl = RADEON_DISP_MERGE_CNTL_INI;
2158
2159
  for (i = 0; i < MAX_H_CODE_TIMING_LEN; i++)
2160
    {
2161
      if ((save->h_code_timing[ i ] = constPtr->horTimingTable[ i ]) == 0)
2162
	break;
2163
    }
2164
2165
  for (i = 0; i < MAX_V_CODE_TIMING_LEN; i++)
2166
    {
2167
      if ((save->v_code_timing[ i ] = constPtr->verTimingTable[ i ]) == 0)
2168
	break;
2169
    }
2170
2171
  /*
2172
   * This must be called AFTER loading timing tables as they are modified by this function
2173
   */
2174
  computeRestarts(constPtr , tvStd , hPos , vPos , hSize , save);
2175
}
2176
2177
/**********************************************************************
2178
 *
2179
 * RT_InitCRTC
2180
 *
2181
 **********************************************************************/
2182
static
2183
void
2184
RT_InitCRTC(
2185
	    const ModeConstants *constPtr,
2186
	    Bool isErt,
2187
	    RADEONSavePtr save
2188
	    )
2189
{
2190
  save->crtc_h_total_disp = (((constPtr->horResolution / 8) - 1) << RADEON_CRTC_H_DISP_SHIFT) |
2191
    (((constPtr->horTotal / 8) - 1) << RADEON_CRTC_H_TOTAL_SHIFT);
2192
2193
  save->crtc_h_sync_strt_wid = (save->crtc_h_sync_strt_wid & ~(RADEON_CRTC_H_SYNC_STRT_PIX | RADEON_CRTC_H_SYNC_STRT_CHAR)) |
2194
    (((constPtr->horSyncStart / 8) - 1) << RADEON_CRTC_H_SYNC_STRT_CHAR_SHIFT) |
2195
    (constPtr->horSyncStart & 7);
2196
2197
  save->crtc_v_total_disp = ((constPtr->verResolution - 1) << RADEON_CRTC_V_DISP_SHIFT) |
2198
    ((constPtr->verTotal - 1) << RADEON_CRTC_V_TOTAL_SHIFT);
2199
2200
  save->crtc_v_sync_strt_wid = (save->crtc_v_sync_strt_wid & ~RADEON_CRTC_V_SYNC_STRT) |
2201
    ((constPtr->verSyncStart - 1) << RADEON_CRTC_V_SYNC_STRT_SHIFT);
2202
2203
  save->htotal_cntl = ((constPtr->horTotal & 7) << RADEON_HTOTAL_CNTL_HTOT_PIX_SLIP_SHIFT) | RADEON_HTOTAL_CNTL_HTOT_CNTL_VGA_EN;
2204
2205
  if (isErt)
2206
    {
2207
      unsigned postDiv;
2208
2209
      save->ppll_ref_div = constPtr->crtcPLL_M;
2210
2211
      switch (constPtr->crtcPLL_postDiv)
2212
	{
2213
	case 1:
2214
	  postDiv = 0;
2215
	  break;
2216
2217
	case 2:
2218
	  postDiv = 1;
2219
	  break;
2220
2221
	case 3:
2222
	  postDiv = 4;
2223
	  break;
2224
2225
	case 4:
2226
	  postDiv = 2;
2227
	  break;
2228
2229
	case 6:
2230
	  postDiv = 6;
2231
	  break;
2232
2233
	case 8:
2234
	  postDiv = 3;
2235
	  break;
2236
2237
	case 12:
2238
	  postDiv = 7;
2239
	  break;
2240
2241
	case 16:
2242
	default:
2243
	  postDiv = 5;
2244
	  break;
2245
	}
2246
2247
      save->ppll_div_3 = (constPtr->crtcPLL_N << RADEON_PPLL_FB3_DIV_SHIFT) | 
2248
	(postDiv << RADEON_PPLL_POST3_DIV_SHIFT);
2249
2250
      save->vclk_ecp_cntl &= ~RADEON_VCLK_SRC_SEL_MASK;
2251
      save->vclk_ecp_cntl |= RADEON_VCLK_SRC_SEL_PPLLCLK;
2252
    }
2253
  else
2254
    {
2255
      save->ppll_div_3 &= ~RADEON_PPLL_POST3_DIV_MASK;
2256
      save->ppll_div_3 |= (constPtr->use888RGB ? RADEON_PPLL_POST3_DIV_BY_3 : RADEON_PPLL_POST3_DIV_BY_2);
2257
2258
      /*
2259
       * Set Radeon to be clocked from RT
2260
       */
2261
      save->vclk_ecp_cntl &= ~RADEON_VCLK_SRC_SEL_MASK;
2262
      save->vclk_ecp_cntl |= RADEON_VCLK_SRC_SEL_BYTECLK;
2263
2264
      save->vclk_ecp_cntl &= ~RADEON_VCLK_ECP_CNTL_BYTECLK_POSTDIV;
2265
      save->vclk_ecp_cntl |= RADEON_VCLK_ECP_CNTL_BYTECLK_NODIV;
2266
2267
      /*
2268
       * Instruct Radeon to output either 565 or 888 packed pixels
2269
       */
2270
      save->disp_output_cntl &= 
2271
	~(RADEON_DISP_TV_SOURCE |
2272
	  RADEON_DISP_TV_MODE_MASK |
2273
	  RADEON_DISP_TV_CBB_CRR_DITH_EN |
2274
	  RADEON_DISP_TV_BIT_WIDTH |
2275
	  RADEON_DISP_TV_SYNC_MODE_MASK |
2276
	  RADEON_DISP_TV_SYNC_COLOR_MASK);
2277
      save->disp_output_cntl |= (constPtr->use888RGB ? 
2278
				 RADEON_DISP_TV_YG_DITH_EN | RADEON_DISP_TV_MODE_888 : 
2279
				 RADEON_DISP_TV_YG_DITH_EN | RADEON_DISP_TV_MODE_565);
2280
2281
      save->crtc_ext_cntl |= RADEON_CRTC_VGA_XOVERSCAN;
2282
      save->dac_cntl |= RADEON_DAC_CNTL_DAC_TVO_EN;
2283
    }
2284
}
2285
2286
/**********************************************************************
2287
 *
2288
 * ERTAutoDetect
2289
 *
2290
 **********************************************************************/
2291
static
2292
Bool
2293
ERTAutoDetect(
2294
	      ScrnInfoPtr pScrn
2295
	      )
2296
{
2297
  RADEONInfoPtr  info       = RADEONPTR(pScrn);
2298
  unsigned char *RADEONMMIO = info->MMIO;
2299
  CARD32 saveReg = INREG(TV_LINEAR_GAIN_SETTINGS);
2300
  Bool detected = FALSE;
2301
2302
  /*
2303
   * Ultra-dumb way of detecting an ERT: check that a register is present 
2304
   * @ TV_LINEAR_GAIN_SETTINGS (this is probably one of the most harmless
2305
   * register to touch)
2306
   */
2307
  OUTREG(TV_LINEAR_GAIN_SETTINGS , 0x15500aa);
2308
2309
  if (INREG(TV_LINEAR_GAIN_SETTINGS) == 0x15500aa)
2310
    {
2311
      OUTREG(TV_LINEAR_GAIN_SETTINGS , 0x0aa0155);
2312
      if (INREG(TV_LINEAR_GAIN_SETTINGS) == 0x0aa0155)
2313
	detected = TRUE;
2314
    }
2315
2316
  OUTREG(TV_LINEAR_GAIN_SETTINGS , saveReg);
2317
  
2318
  return detected;
2319
}
2320
2321
/**********************************************************************
2322
 *
2323
 * detectTheaterOut
2324
 *
2325
 * Detect presence of a RT chip
2326
 *
2327
 **********************************************************************/
2328
2329
TheaterOutPtr 
2330
detectTheaterOut(
2331
		 ScrnInfoPtr pScrn,
2332
		 Bool forceVIP,
2333
		GENERIC_BUS_Ptr b
2334
		 )
2335
{
2336
  RADEONInfoPtr info = RADEONPTR(pScrn);
2337
  //GENERIC_BUS_Ptr b = info->VIP;
2338
  TheaterOutPtr t;  
2339
  int i;
2340
  CARD32 val;
2341
  char s[20];
2342
   
2343
  b->ioctl(b , GB_IOCTL_GET_TYPE , 20 , s);
2344
2345
  if (strcmp(VIP_TYPE , s))
2346
    {
2347
      xf86DrvMsg(b->scrnIndex , X_ERROR , "detectTheaterOut must be called with bus of type \"%s\", not \"%s\"\n",
2348
		 VIP_TYPE , s);
2349
      return NULL;
2350
    }
2351
   
2352
  t = xcalloc(1 , sizeof(TheaterOutRec));
2353
  t->theatre_num = -1;
2354
  t->MMIO = info->MMIO;
2355
  t->VIP = b;
2356
2357
  if (!forceVIP && ERTAutoDetect(pScrn))
2358
    xf86DrvMsg(b->scrnIndex , X_INFO , "Embedded Rage Theater detected\n");
2359
  else
2360
    {
2361
      //
2362
      // Is this really needed?
2363
      // 
2364
      b->read(b , VIP_VIP_VENDOR_DEVICE_ID , 4 , (CARD8*)&val);
2365
2366
      for (i = 0; i < 4; i++)
2367
	{
2368
	  if(b->read(b , ((i & 0x03) << 14) | VIP_VIP_VENDOR_DEVICE_ID , 4 , (CARD8*)&val))
2369
	    {
2370
	      if (val)
2371
		xf86DrvMsg(b->scrnIndex , X_INFO , "Device %d on VIP bus ids as 0x%08x\n" , i , (int)val);
2372
	      if (t->theatre_num >= 0)
2373
		continue;	// already found one instance
2374
	      if (val == RT100_ATI_ID)
2375
		t->theatre_num = i;
2376
	    } 
2377
	  else 
2378
	    {
2379
	      xf86DrvMsg(b->scrnIndex , X_INFO , "No response from device %d on VIP bus\n" , i);	
2380
	    }
2381
	}
2382
      if (t->theatre_num >= 0)
2383
	{
2384
	  xf86DrvMsg(b->scrnIndex , X_INFO , 
2385
		     "Detected Rage Theatre as device %d on VIP bus\n" , t->theatre_num);
2386
	  theatre_read(t , VIP_VIP_REVISION_ID , &val);
2387
	  xf86DrvMsg(b->scrnIndex , X_INFO , "Detected Rage Theatre revision %8.8X\n" , (int)val);
2388
	}
2389
      else
2390
	{
2391
	  xfree(t);
2392
	  return NULL;
2393
	}
2394
    }
2395
    
2396
  return t;
2397
}
2398
2399
/**********************************************************************
2400
 *
2401
 * initTheaterOut
2402
 *
2403
 * Initialization of module
2404
 *
2405
 * 's' should be the value of TV_Output option (i.e. the initial TV
2406
 * standard)
2407
 *
2408
 **********************************************************************/
2409
2410
void
2411
initTheaterOut(
2412
	       TheaterOutPtr t,
2413
	       const char *s
2414
	       )
2415
{
2416
  RTTRACE(("Entering initTheaterOut, s = %s\n" , s));
2417
  /*
2418
   * TEST   TEST   TEST   TEST   TEST   TEST   TEST   TEST   TEST   
2419
   */
2420
  if (xf86NameCmp(s , "NTSC") == 0)
2421
    t->standard = TV_STD_NTSC;
2422
  else if (xf86NameCmp(s , "PAL") == 0)
2423
    t->standard = TV_STD_PAL;
2424
  else if (xf86NameCmp(s , "PAL-M") == 0)
2425
    t->standard = TV_STD_PAL_M;
2426
  else if (xf86NameCmp(s , "PAL-60") == 0)
2427
    t->standard = TV_STD_PAL_60;
2428
  else if (xf86NameCmp(s , "NTSC-J") == 0)
2429
    t->standard = TV_STD_NTSC_J;
2430
  else if (xf86NameCmp(s , "PAL-CN") == 0)
2431
    t->standard = TV_STD_PAL_CN;
2432
  else if (xf86NameCmp(s , "PAL-N") == 0)
2433
    t->standard = TV_STD_PAL_N;
2434
  else
2435
    {
2436
      xf86DrvMsg(0 , X_WARNING , "Unrecognized TV standard in TVOutput option (%s), TV output is disabled\n" , s);
2437
      t->standard = TV_STD_KEEP_OFF;
2438
    }
2439
  t->compatibleMode = FALSE;
2440
2441
  t->hPos = 0;
2442
  t->vPos = 0;
2443
  t->hSize = 0;
2444
}
2445
2446
/**********************************************************************
2447
 *
2448
 * theaterOutSave
2449
 *
2450
 * Save current state of RT as initial state (the one that is restored
2451
 * when switching back to text mode)
2452
 *
2453
 **********************************************************************/
2454
2455
void
2456
theaterOutSave(
2457
	       TheaterOutPtr t,
2458
	       ScrnInfoPtr pScrn
2459
	       )
2460
{
2461
  RTTRACE(("Entering theaterOutSave\n"));
2462
  RT_Save(t , pScrn , &t->savedState);
2463
}
2464
2465
/**********************************************************************
2466
 *
2467
 * theaterOutRestore
2468
 *
2469
 * Restore state of RT from initial state (the one saved through 
2470
 * theaterOutSave)
2471
 *
2472
 **********************************************************************/
2473
2474
void
2475
theaterOutRestore(
2476
		  TheaterOutPtr t,
2477
		  ScrnInfoPtr pScrn
2478
		  )
2479
{
2480
  RTTRACE(("Entering theaterOutRestore\n"));
2481
  RT_Restore(t , pScrn , &t->savedState);
2482
}
2483
		  
2484
/**********************************************************************
2485
 *
2486
 * theaterOutInit
2487
 *
2488
 * Define state for cloning current CRTC mode on TV output
2489
 * It works in this way:
2490
 * 1. It checks if resolution in "mode" parameter is one of those 
2491
 *    allowing tv output
2492
 * 2. If resolution is OK, define RT state according to resolution and
2493
 *    and current settings (tv standard etc.)
2494
 *    If resolution is not ok, define RT state to turn tv output off
2495
 * 3. If resolution is OK, modify Radeon state to make it correct for 
2496
 *    tv output (this is needed,e.g., to set vertical frequency to 50/60 Hz)
2497
 *
2498
 * Return value is TRUE when mode is OK for cloning on tv and tv output
2499
 * is enabled, FALSE otherwise
2500
 *
2501
 **********************************************************************/
2502
2503
Bool
2504
theaterOutInit(
2505
	       TheaterOutPtr t,
2506
	       DisplayModePtr mode,
2507
	       RADEONSavePtr save
2508
	       )
2509
{
2510
  const ModeConstants *p;
2511
  Bool isErt = t->theatre_num < 0;
2512
2513
  RTTRACE(("Entering theaterOutInit: std=%u h=%u v=%u\n" , t->standard , mode->HDisplay , mode->VDisplay));
2514
2515
  t->compatibleMode = FALSE;
2516
2517
  if (t->standard != TV_STD_KEEP_OFF)
2518
    {
2519
      /*
2520
       * Search mode among available ones
2521
       */
2522
      for (p = availableModes; p < (availableModes + N_AVAILABLE_MODES); p++)
2523
	{
2524
	  if (p->horResolution == mode->HDisplay &&
2525
	      p->verResolution == mode->VDisplay &&
2526
	      p->standard == t->standard)
2527
	    {
2528
	      /*
2529
	       * Match found
2530
	       */
2531
	      t->compatibleMode = TRUE;
2532
	      t->currentMode = p;
2533
2534
	      RT_Init(p , t->standard , isErt , TRUE , t->hPos , t->vPos , t->hSize , &t->modeState);
2535
	      RT_InitCRTC(p , isErt , save);
2536
2537
	      return TRUE;
2538
	    }
2539
	}
2540
    }
2541
2542
  /*
2543
   * Match not found or tv output disabled
2544
   * First parameter is dummy when setting for no tv output, so any mode
2545
   * will do (here first mode in table is passed).
2546
   */
2547
  RT_Init(availableModes , TV_STD_NTSC , isErt , FALSE , t->hPos , t->vPos , t->hSize , &t->modeState);
2548
  return FALSE;
2549
}
2550
	       
2551
/**********************************************************************
2552
 *
2553
 * theaterOutRestoreMode
2554
 *
2555
 * Set state of RT to the one defined by last call to theaterOutInit
2556
 *
2557
 **********************************************************************/
2558
2559
void
2560
theaterOutRestoreMode(
2561
		      TheaterOutPtr t,
2562
		      ScrnInfoPtr pScrn
2563
		      )
2564
{
2565
  RTTRACE(("Entering theaterOutRestoreMode\n"));
2566
  RT_Restore(t , pScrn , &t->modeState);
2567
}
2568
2569
/**********************************************************************
2570
 *
2571
 * theaterOutSetStandard
2572
 *
2573
 * Set TV output standard
2574
 *
2575
 * Return value is TRUE when video mode should be set again
2576
 *
2577
 **********************************************************************/
2578
Bool
2579
theaterOutSetStandard(
2580
		      TheaterOutPtr t,
2581
		      TVStd std
2582
		      )
2583
{
2584
  TVStd oldStd = t->standard;
2585
2586
  RTTRACE(("Entering theaterOutSetStandard\n"));
2587
2588
  if (std >= TV_STD_N_STANDARDS)
2589
    std = TV_STD_KEEP_OFF;
2590
2591
  t->standard = std;
2592
2593
  if (t->compatibleMode)
2594
    return oldStd != std;
2595
  else 
2596
    return std != TV_STD_KEEP_OFF && oldStd == TV_STD_KEEP_OFF;
2597
}
2598
		      
2599
/**********************************************************************
2600
 *
2601
 * theaterOutGetStandard
2602
 *
2603
 * Get current TV output standard
2604
 *
2605
 **********************************************************************/
2606
TVStd
2607
theaterOutGetStandard(
2608
		      TheaterOutPtr t
2609
		      )
2610
{
2611
  return t->standard;
2612
}
2613
2614
/**********************************************************************
2615
 *
2616
 * theaterOutGetCompatMode
2617
 *
2618
 * Return whether the current mode is compatible with tv output or not
2619
 *
2620
 **********************************************************************/
2621
Bool
2622
theaterOutGetCompatMode(
2623
			TheaterOutPtr t
2624
			)
2625
{
2626
  return t->compatibleMode;
2627
}
2628
2629
/**********************************************************************
2630
 *
2631
 * updateHVPosition
2632
 *
2633
 * Set hw registers for a new h/v position & h size
2634
 *
2635
 **********************************************************************/
2636
static
2637
void
2638
updateHVPosition(
2639
		 TheaterOutPtr t
2640
		 )
2641
{
2642
  Bool reloadTable;
2643
2644
  reloadTable = computeRestarts(t->currentMode , t->standard , t->hPos , t->vPos , t->hSize , &t->modeState);
2645
2646
  if (t->theatre_num < 0)
2647
    {
2648
      ERT_RestoreRestarts(t , &t->modeState);
2649
      ert_write(t , TV_TIMING_CNTL , t->modeState.timing_cntl);
2650
2651
      if (reloadTable)
2652
	{
2653
	  ert_write(t,
2654
		    TV_MASTER_CNTL ,
2655
		    t->modeState.master_cntl | 
2656
		    VIP_MASTER_CNTL_TV_ASYNC_RST |
2657
		    VIP_MASTER_CNTL_CRT_ASYNC_RST |
2658
		    VIP_MASTER_CNTL_RESTART_PHASE_FIX);
2659
2660
	  restoreTimingTables(t , &t->modeState);
2661
	
2662
	  ert_write(t , 
2663
		    TV_MASTER_CNTL , 
2664
		    t->modeState.master_cntl);
2665
	}
2666
    }
2667
  else
2668
    {
2669
      restoreRestarts(t , &t->modeState);
2670
      theatre_write(t , VIP_TIMING_CNTL , t->modeState.timing_cntl);
2671
2672
      if (reloadTable)
2673
	{
2674
	  theatre_write(t , 
2675
			VIP_MASTER_CNTL , 
2676
			t->modeState.master_cntl |
2677
			VIP_MASTER_CNTL_TV_ASYNC_RST |
2678
			VIP_MASTER_CNTL_CRT_ASYNC_RST);
2679
2680
	  restoreTimingTables(t , &t->modeState);
2681
	
2682
	  theatre_write(t , 
2683
			VIP_MASTER_CNTL , 
2684
			t->modeState.master_cntl);
2685
	}
2686
    }
2687
}
2688
2689
/**********************************************************************
2690
 *
2691
 * theaterOutSetAttr
2692
 *
2693
 * Set an attribute
2694
 *
2695
 **********************************************************************/
2696
void
2697
theaterOutSetAttr(
2698
		  TheaterOutPtr t,
2699
		  TheaterOutAttr attr,
2700
		  int value
2701
		  )
2702
{
2703
  switch (attr)
2704
    {
2705
    case THEATER_OUT_HPOS:
2706
      if (value < -MAX_H_POSITION)
2707
	t->hPos = -MAX_H_POSITION;
2708
      else if (value > MAX_H_POSITION)
2709
	t->hPos = MAX_H_POSITION;
2710
      else
2711
	t->hPos = value;
2712
      break;
2713
	
2714
    case THEATER_OUT_VPOS:
2715
      if (value < -MAX_V_POSITION)
2716
	t->vPos = -MAX_V_POSITION;
2717
      else if (value > MAX_V_POSITION)
2718
	t->vPos = MAX_V_POSITION;
2719
      else
2720
	t->vPos = value;
2721
      break;
2722
	
2723
    case THEATER_OUT_HSIZE:
2724
      if (value < -MAX_H_SIZE)
2725
	t->hSize = -MAX_H_SIZE;
2726
      else if (value > MAX_H_SIZE)
2727
	t->hSize = MAX_H_SIZE;
2728
      else
2729
	t->hSize = value;
2730
      break;
2731
2732
    default:
2733
      return;
2734
    }
2735
2736
  if (t->compatibleMode)
2737
    updateHVPosition(t);
2738
}
2739
		      
2740
/**********************************************************************
2741
 *
2742
 * theaterOutGetAttr
2743
 *
2744
 * Get an attribute
2745
 *
2746
 **********************************************************************/
2747
int
2748
theaterOutGetAttr(
2749
		  TheaterOutPtr t,
2750
		  TheaterOutAttr attr
2751
		  )
2752
{
2753
  switch (attr)
2754
    {
2755
    case THEATER_OUT_HPOS:
2756
      return t->hPos;
2757
	
2758
    case THEATER_OUT_VPOS:
2759
      return t->vPos;
2760
	
2761
    case THEATER_OUT_HSIZE:
2762
      return t->hSize;
2763
2764
    default:
2765
      return 0;
2766
    }
2767
}
2768
		      
2769
/**********************************************************************
2770
 *
2771
 * theaterOutGetAttrLimits
2772
 *
2773
 * Get limits for an attribute value
2774
 *
2775
 **********************************************************************/
2776
void
2777
theaterOutGetAttrLimits(
2778
			TheaterOutPtr t,
2779
			TheaterOutAttr attr,
2780
			int *maxValue,
2781
			int *minValue
2782
			)
2783
{
2784
  switch (attr)
2785
    {
2786
    case THEATER_OUT_HPOS:
2787
      *maxValue = MAX_H_POSITION;
2788
      *minValue = -MAX_H_POSITION;
2789
      break;
2790
	
2791
    case THEATER_OUT_VPOS:
2792
      *maxValue = MAX_V_POSITION;
2793
      *minValue = -MAX_V_POSITION;
2794
      break;
2795
	
2796
    case THEATER_OUT_HSIZE:
2797
      *maxValue = MAX_H_SIZE;
2798
      *minValue = -MAX_H_SIZE;
2799
      break;
2800
2801
    default:
2802
      break;
2803
    }
2804
}
(-)xf86-video-ati-6.5.8.0/src/theater_out.h (+370 lines)
Line 0 Link Here
1
/*********************************************************************
2
 *
3
 * $Id: theater_out.h,v 1.1.2.2 2004/01/27 22:50:35 fulivi Exp $
4
 *
5
 * Interface file for theater_out module
6
 *
7
 * Copyright (C) 2003 Federico Ulivi
8
 *
9
 * This program is free software; you can redistribute it and/or modify
10
 * it under the terms of the GNU General Public License as published by
11
 * the Free Software Foundation; either version 2 of the License, or
12
 * (at your option) any later version.
13
 *
14
 * This program is distributed in the hope that it will be useful,
15
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
16
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
17
 * GNU General Public License for more details.
18
 *
19
 * You should have received a copy of the GNU General Public License
20
 * along with this program; if not, write to the Free Software
21
 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
22
 *
23
 * AUTHORS: F.Ulivi
24
 * NOTES:
25
 * $Log: theater_out.h,v $
26
 * Revision 1.1.2.2  2004/01/27 22:50:35  fulivi
27
 * Support for positioning/sizing of image added
28
 *
29
 * Revision 1.1.2.9  2004/01/18 23:01:12  fede
30
 * Functions for get/setting h/v pos/size replaced by
31
 * theaterOutSetAttr/theaterOutGetAttr/theaterOutGetAttrLimits
32
 * Circular inclusion with radeon.h fixed
33
 *
34
 * Revision 1.1.2.8  2004/01/11 21:43:32  fede
35
 * Fixed problem with definition of TVStd
36
 *
37
 * Revision 1.1.2.7  2004/01/05 00:09:59  fede
38
 * Functions for setting/getting H/V position added
39
 * Functions for setting/getting on/off attribute removed
40
 *
41
 * Revision 1.1.2.1  2003/11/26 19:50:10  fulivi
42
 * Support for ERT added
43
 *
44
 * Revision 1.1.2.6  2003/11/25 20:44:00  fede
45
 * TV_STD_KEEP_OFF added
46
 *
47
 * Revision 1.1.2.5  2003/10/14 18:41:32  fede
48
 * forceERT changed to forceVIP
49
 *
50
 * Revision 1.1.2.4  2003/10/11 12:30:30  fede
51
 * Support for ERT added
52
 *
53
 * Revision 1.1  2003/09/28 21:42:37  fulivi
54
 * Theater_out module added
55
 *
56
 * Revision 1.1.2.3  2003/09/28 15:26:09  fede
57
 * Minor aesthetic changes
58
 *
59
 * Revision 1.1.2.1  2003/08/31 13:36:35  fede
60
 * *** empty log message ***
61
 *
62
 *
63
 *********************************************************************/
64
65
#ifndef _THEATER_OUT_H
66
#define _THEATER_OUT_H
67
68
/**********************************************************************
69
 *
70
 * TheaterOutPtr
71
 *
72
 * Pointer to TheaterOut struct. Actual definition is in theater_out.c
73
 *
74
 **********************************************************************/
75
typedef struct TheaterOut *TheaterOutPtr;
76
77
/**********************************************************************
78
 *
79
 * TVStd
80
 *
81
 * Tv standard
82
 *
83
 **********************************************************************/
84
typedef enum
85
  {
86
    TV_STD_NTSC,
87
    TV_STD_PAL,
88
    TV_STD_PAL_M,
89
    TV_STD_PAL_60,
90
    TV_STD_NTSC_J,
91
    TV_STD_PAL_CN,
92
    TV_STD_PAL_N,
93
    TV_STD_KEEP_OFF,
94
    TV_STD_N_STANDARDS	/* Must be last */
95
  } TVStd;
96
97
/**********************************************************************
98
 *
99
 * TheaterOutAttr
100
 *
101
 * Integer-valued attributes of this module
102
 *
103
 **********************************************************************/
104
typedef enum
105
  {
106
    THEATER_OUT_HPOS,	/* Horizontal position */
107
    THEATER_OUT_VPOS,	/* Vertical position */
108
    THEATER_OUT_HSIZE	/* Horizontal size */
109
  } TheaterOutAttr;
110
111
#ifndef _RADEON_H_
112
#include "radeon.h"
113
#endif
114
115
/**********************************************************************
116
 *
117
 * detectTheaterOut
118
 *
119
 * Detect presence of a RT chip
120
 *
121
 **********************************************************************/
122
123
extern
124
TheaterOutPtr 
125
detectTheaterOut(
126
		 ScrnInfoPtr pScrn,
127
		 Bool forceVIP,
128
GENERIC_BUS_Ptr b
129
		 );
130
131
/**********************************************************************
132
 *
133
 * initTheaterOut
134
 *
135
 * Initialization of module
136
 *
137
 * 's' should be the value of TV_Output option (i.e. the initial TV
138
 * standard)
139
 *
140
 **********************************************************************/
141
142
extern
143
void
144
initTheaterOut(
145
	       TheaterOutPtr t,
146
	       const char *s
147
	       );
148
149
/**********************************************************************
150
 *
151
 * theaterOutSave
152
 *
153
 * Save current state of RT as initial state (the one that is restored
154
 * when switching back to text mode)
155
 *
156
 **********************************************************************/
157
158
extern
159
void
160
theaterOutSave(
161
	       TheaterOutPtr t,
162
	       ScrnInfoPtr pScrn
163
	       );
164
165
/**********************************************************************
166
 *
167
 * theaterOutRestore
168
 *
169
 * Restore state of RT from initial state (the one saved through 
170
 * theaterOutSave)
171
 *
172
 **********************************************************************/
173
174
extern
175
void
176
theaterOutRestore(
177
		  TheaterOutPtr t,
178
		  ScrnInfoPtr pScrn
179
		  );
180
		  
181
/**********************************************************************
182
 *
183
 * theaterOutInit
184
 *
185
 * Define state for cloning current CRTC mode on TV output
186
 * It works in this way:
187
 * 1. It checks if resolution in "mode" parameter is one of those 
188
 *    allowing tv output
189
 * 2. If resolution is OK, define RT state according to resolution and
190
 *    and current settings (tv standard etc.)
191
 *    If resolution is not ok, define RT state to turn tv output off
192
 * 3. If resolution is OK, modify Radeon state to make it correct for 
193
 *    tv output (this is needed,e.g., to set vertical frequency to 50/60 Hz)
194
 *
195
 * Return value is TRUE when mode is OK for cloning on tv and tv output
196
 * is enabled, FALSE otherwise
197
 *
198
 **********************************************************************/
199
200
extern
201
Bool
202
theaterOutInit(
203
	       TheaterOutPtr t,
204
	       DisplayModePtr mode,
205
	       RADEONSavePtr save
206
	       );
207
	       
208
/**********************************************************************
209
 *
210
 * theaterOutRestoreMode
211
 *
212
 * Set state of RT to the one defined by last call to theaterOutInit
213
 *
214
 **********************************************************************/
215
216
extern
217
void
218
theaterOutRestoreMode(
219
		      TheaterOutPtr t,
220
		      ScrnInfoPtr pScrn
221
		      );
222
223
/**********************************************************************
224
 *
225
 * theaterOutSetStandard
226
 *
227
 * Set TV output standard
228
 *
229
 * Return value is TRUE when video mode should be set again
230
 *
231
 **********************************************************************/
232
233
extern
234
Bool
235
theaterOutSetStandard(
236
		      TheaterOutPtr t,
237
		      TVStd std
238
		      );
239
		      
240
/**********************************************************************
241
 *
242
 * theaterOutGetStandard
243
 *
244
 * Get current TV output standard
245
 *
246
 **********************************************************************/
247
extern
248
TVStd
249
theaterOutGetStandard(
250
		      TheaterOutPtr t
251
		      );
252
253
/**********************************************************************
254
 *
255
 * theaterOutGetCompatMode
256
 *
257
 * Return whether the current mode is compatible with tv output or not
258
 *
259
 **********************************************************************/
260
extern
261
Bool
262
theaterOutGetCompatMode(
263
			TheaterOutPtr t
264
			);
265
266
/**********************************************************************
267
 *
268
 * theaterOutSetAttr
269
 *
270
 * Set an attribute
271
 *
272
 **********************************************************************/
273
extern
274
void
275
theaterOutSetAttr(
276
		  TheaterOutPtr t,
277
		  TheaterOutAttr attr,
278
		  int value
279
		  );
280
281
/**********************************************************************
282
 *
283
 * theaterOutGetAttr
284
 *
285
 * Get an attribute
286
 *
287
 **********************************************************************/
288
extern
289
int
290
theaterOutGetAttr(
291
		  TheaterOutPtr t,
292
		  TheaterOutAttr attr
293
		  );
294
295
/**********************************************************************
296
 *
297
 * theaterOutGetAttrLimits
298
 *
299
 * Get limits for an attribute value
300
 *
301
 **********************************************************************/
302
extern
303
void
304
theaterOutGetAttrLimits(
305
			TheaterOutPtr t,
306
			TheaterOutAttr attr,
307
			int *maxValue,
308
			int *minValue
309
			);
310
311
/**********************************************************************
312
 *
313
 * THEATER_OUT_SYMBOLS
314
 *
315
 * Symbol list for module loading
316
 *
317
 **********************************************************************/
318
319
#define THEATER_OUT_SYMBOLS	"detectTheaterOut", \
320
				"initTheaterOut", \
321
				"theaterOutSave", \
322
				"theaterOutRestore", \
323
				"theaterOutInit", \
324
				"theaterOutRestoreMode", \
325
				"theaterOutSetStandard", \
326
				"theaterOutGetStandard", \
327
				"theaterOutGetCompatMode", \
328
				"theaterOutSetAttr", \
329
				"theaterOutGetAttr", \
330
				"theaterOutGetAttrLimits"
331
332
/**********************************************************************
333
 *
334
 * External access to module functions
335
 *
336
 **********************************************************************/
337
338
#ifdef XFree86LOADER
339
340
#define xf86_detectTheaterOut	((TheaterOutPtr (*)(ScrnInfoPtr , Bool,GENERIC_BUS_Ptr))LoaderSymbol("detectTheaterOut"))
341
#define xf86_initTheaterOut	((void (*)(TheaterOutPtr , const char*))LoaderSymbol("initTheaterOut"))
342
#define xf86_theaterOutSave	((void (*)(TheaterOutPtr , ScrnInfoPtr))LoaderSymbol("theaterOutSave"))
343
#define xf86_theaterOutRestore	((void (*)(TheaterOutPtr , ScrnInfoPtr))LoaderSymbol("theaterOutRestore"))
344
#define xf86_theaterOutInit	((Bool (*)(TheaterOutPtr , DisplayModePtr , RADEONSavePtr))LoaderSymbol("theaterOutInit"))
345
#define xf86_theaterOutRestoreMode	((void (*)(TheaterOutPtr , ScrnInfoPtr))LoaderSymbol("theaterOutRestoreMode"))
346
#define xf86_theaterOutSetStandard	((Bool (*)(TheaterOutPtr , TVStd))LoaderSymbol("theaterOutSetStandard"))
347
#define xf86_theaterOutGetStandard	((TVStd (*)(TheaterOutPtr))LoaderSymbol("theaterOutGetStandard"))
348
#define xf86_theaterOutGetCompatMode	((Bool (*)(TheaterOutPtr))LoaderSymbol("theaterOutGetCompatMode"))
349
#define xf86_theaterOutSetAttr	((void (*)(TheaterOutPtr , TheaterOutAttr , int))LoaderSymbol("theaterOutSetAttr"))
350
#define xf86_theaterOutGetAttr	((int (*)(TheaterOutPtr , TheaterOutAttr))LoaderSymbol("theaterOutGetAttr"))
351
#define xf86_theaterOutGetAttrLimits	((void (*)(TheaterOutPtr , TheaterOutAttr , int * , int *))LoaderSymbol("theaterOutGetAttrLimits"))
352
353
#else
354
355
#define xf86_detectTheaterOut	detectTheaterOut
356
#define xf86_initTheaterOut	initTheaterOut
357
#define xf86_theaterOutSave	theaterOutSave
358
#define xf86_theaterOutRestore	theaterOutRestore
359
#define xf86_theaterOutInit	theaterOutInit
360
#define xf86_theaterOutRestoreMode	theaterOutRestoreMode
361
#define xf86_theaterOutSetStandard	theaterOutSetStandard
362
#define xf86_theaterOutGetStandard	theaterOutGetStandard
363
#define xf86_theaterOutGetCompatMode	theaterOutGetCompatMode
364
#define xf86_theaterOutSetAttr	theaterOutSetAttr	
365
#define xf86_theaterOutGetAttr	theaterOutGetAttr	
366
#define xf86_theaterOutGetAttrLimits	theaterOutGetAttrLimits
367
368
#endif	/* XFree86LOADER */
369
370
#endif  /* _THEATER_OUT_H */
(-)xf86-video-ati-6.5.8.0/src/theater_out_module.c (+45 lines)
Line 0 Link Here
1
#ifdef HAVE_CONFIG_H
2
#include "config.h"
3
#endif
4
5
#include "xf86Module.h"
6
7
static MODULESETUPPROTO(theaterOutSetup);
8
9
static 
10
XF86ModuleVersionInfo 
11
theaterVersRec =
12
{
13
  "theater_out",	/* modname */
14
  MODULEVENDORSTRING,	/* vendor */
15
  MODINFOSTRING1,	/* _modinfo1_ */
16
  MODINFOSTRING2,	/* _modinfo2_ */
17
  XORG_VERSION_CURRENT,	/* xf86version */
18
  1,			/* majorversion */
19
  0,			/* minorversion */
20
  0,			/* patchlevel */
21
  ABI_CLASS_VIDEODRV,	/* abiclass */
22
  ABI_VIDEODRV_VERSION,	/* abiversion */
23
  MOD_CLASS_NONE,	/* moduleclass */
24
  { 0 , 0 , 0 , 0 }	/* checksum */
25
};
26
 
27
_X_EXPORT XF86ModuleData 
28
theater_outModuleData = 
29
  { 
30
    &theaterVersRec, 
31
    theaterOutSetup, 
32
    NULL 
33
  }; 
34
35
static
36
pointer
37
theaterOutSetup(
38
		pointer module, 
39
		pointer opts, 
40
		int *errmaj, 
41
		int *errmin
42
		)
43
{
44
  return (pointer)1;
45
}
(-)xf86-video-ati-6.5.8.0/src/tvo_set/Imakefile (+37 lines)
Line 0 Link Here
1
XCOMM $Id: Imakefile,v 1.1.2.1 2004/01/27 22:55:40 fulivi Exp $
2
XCOMM
3
XCOMM Imakefile for tvo_set utility
4
XCOMM
5
XCOMM Copyright (C) 2004 Federico Ulivi
6
XCOMM
7
XCOMM This program is free software; you can redistribute it and/or modify
8
XCOMM it under the terms of the GNU General Public License as published by
9
XCOMM the Free Software Foundation; either version 2 of the License, or
10
XCOMM (at your option) any later version.
11
XCOMM
12
XCOMM This program is distributed in the hope that it will be useful,
13
XCOMM but WITHOUT ANY WARRANTY; without even the implied warranty of
14
XCOMM MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
15
XCOMM GNU General Public License for more details.
16
XCOMM
17
XCOMM You should have received a copy of the GNU General Public License
18
XCOMM along with this program; if not, write to the Free Software
19
XCOMM Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
20
XCOMM
21
XCOMM AUTHORS: F.Ulivi
22
XCOMM NOTES:
23
XCOMM $Log: Imakefile,v $
24
XCOMM Revision 1.1.2.1  2004/01/27 22:55:40  fulivi
25
XCOMM Initial release
26
XCOMM
27
XCOMM Revision 1.1.2.1  2004/01/25 23:07:31  fede
28
XCOMM *** empty log message ***
29
XCOMM
30
XCOMM
31
32
        DEPLIBS = $(DEPXVLIB) $(DEPXLIB)
33
LOCAL_LIBRARIES = $(XVLIB) $(XLIB)
34
           SRCS = tvo_set.c
35
           OBJS = tvo_set.o
36
37
ComplexProgramTargetNoMan(tvo_set)
(-)xf86-video-ati-6.5.8.0/src/tvo_set/tvo_set.c (+472 lines)
Line 0 Link Here
1
/*********************************************************************
2
 *
3
 * $Id: tvo_set.c,v 1.1.2.1 2004/01/27 22:55:40 fulivi Exp $
4
 *
5
 * Main (and only) module of tvo_set utility. 
6
 * The purpose of this utility is to set various parameters of
7
 * tv output module.
8
 *
9
 * Copyright (C) 2004 Federico Ulivi
10
 *
11
 * This program is free software; you can redistribute it and/or modify
12
 * it under the terms of the GNU General Public License as published by
13
 * the Free Software Foundation; either version 2 of the License, or
14
 * (at your option) any later version.
15
 *
16
 * This program is distributed in the hope that it will be useful,
17
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
18
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
19
 * GNU General Public License for more details.
20
 *
21
 * You should have received a copy of the GNU General Public License
22
 * along with this program; if not, write to the Free Software
23
 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
24
 *
25
 * AUTHORS: F.Ulivi
26
 * NOTES:
27
 * $Log: tvo_set.c,v $
28
 * Revision 1.1.2.1  2004/01/27 22:55:40  fulivi
29
 * Initial release
30
 *
31
 * Revision 1.1.2.2  2004/01/25 23:07:47  fede
32
 * GPL notice added
33
 *
34
 * Revision 1.1.2.1  2004/01/25 15:09:42  fede
35
 * First version
36
 *
37
 *
38
 *********************************************************************/
39
40
#include <X11/X.h>
41
#include <X11/Xlib.h>
42
#include <X11/extensions/Xvlib.h>
43
#include <stdio.h>
44
#include <stdlib.h>
45
#include <errno.h>
46
#include <string.h>
47
48
/**********************************************************************
49
 *
50
 * program_name
51
 *
52
 **********************************************************************/
53
static
54
const char *program_name;
55
56
/**********************************************************************
57
 *
58
 * Action
59
 *
60
 **********************************************************************/
61
typedef enum
62
  {
63
    ACT_FULL_DUMP,
64
    ACT_SET,
65
    ACT_INC,
66
    ACT_DEC,
67
    ACT_ZERO
68
  } Action;
69
70
/**********************************************************************
71
 *
72
 * attrNames / attrData
73
 *
74
 **********************************************************************/
75
typedef struct
76
{
77
  Atom atom;
78
  int minValue;
79
  int maxValue;
80
} AttrData;
81
82
typedef struct
83
{
84
  char* extName;
85
  char* attrName;
86
  char* description;
87
} AttrName;
88
89
static
90
const AttrName attrNames[] =
91
  {
92
    { "hpos" , "XV_TVO_HPOS" , "Horizontal position" },
93
    { "vpos" , "XV_TVO_VPOS" , "Vertical position" },
94
    { "hsize" , "XV_TVO_HSIZE" , "Horizontal size" },
95
    { "std" , "XV_TVO_STANDARD" , "TV Standard" }
96
  };
97
98
#define N_ATTRS (sizeof(attrNames) / sizeof(attrNames[ 0 ]))
99
/*
100
 * Index of TV standard attribute
101
 */
102
#define STD_ATTR        3
103
104
static
105
AttrData attrData[ N_ATTRS ];
106
107
/**********************************************************************
108
 *
109
 * stdNames
110
 *
111
 **********************************************************************/
112
static
113
const char *stdNames[] = 
114
  {
115
    "NTSC",
116
    "PAL",
117
    "PAL-M",
118
    "PAL-60",
119
    "NTSC-J",
120
    "PAL-CN",
121
    "PAL-N",
122
    "OFF"
123
  };
124
#define N_STDS  (sizeof(stdNames) / sizeof(stdNames[ 0 ]))
125
126
/**********************************************************************
127
 *
128
 * scanAttributes
129
 *
130
 **********************************************************************/
131
static
132
Bool
133
subScanAttributes(
134
                  Display *dpy,
135
                  XvAttribute *pAttributes,
136
                  int nAttributes
137
                  )
138
{
139
  unsigned i;
140
  unsigned j;
141
  Atom theAtom;
142
143
  for (i = 0; i < N_ATTRS; i++)
144
    {
145
      const char* name = attrNames[ i ].attrName;
146
147
      for (j = 0; j < nAttributes; j++)
148
        {
149
          if (strcmp(name , pAttributes[ j ].name) == 0)
150
            {
151
              attrData[ i ].minValue = pAttributes[ j ].min_value;
152
              attrData[ i ].maxValue = pAttributes[ j ].max_value;
153
              if ((pAttributes[ j ].flags & (XvGettable | XvSettable)) != (XvGettable | XvSettable))
154
                return False;
155
              
156
              theAtom = XInternAtom(dpy , name , True);
157
              if (theAtom == None)
158
                return False;
159
160
              attrData[ i ].atom = theAtom;
161
162
              break;
163
            }
164
        }
165
      if (j == nAttributes)
166
        return False;
167
    }
168
169
  return True;
170
}
171
172
static
173
Bool
174
scanAttributes(
175
               Display *dpy,
176
               XvPortID portID
177
               )
178
{
179
  XvAttribute *pAttributes;
180
  int nAttributes;
181
  Bool res = False;
182
183
  if ((pAttributes = XvQueryPortAttributes(dpy , portID , &nAttributes)) == 0)
184
    return False;
185
186
  if (nAttributes > 0)
187
    res = subScanAttributes(dpy , pAttributes , nAttributes);
188
189
  XFree(pAttributes);
190
  return res;
191
}
192
               
193
/**********************************************************************
194
 *
195
 * getAttribute
196
 *
197
 **********************************************************************/
198
static
199
void
200
getAttribute(
201
             Display *dpy,
202
             XvPortID portID,
203
             int attribute,
204
             int *value
205
             )
206
{
207
  if (XvGetPortAttribute(dpy , 
208
                         portID , 
209
                         attrData[ attribute ].atom ,
210
                         value) == Success)
211
    return;
212
213
  fprintf(stderr , "%s: Unable to get value of attribute %s\n" , program_name , attrNames[ attribute ].attrName);
214
  exit(2);
215
}
216
217
/**********************************************************************
218
 *
219
 * setAttribute
220
 *
221
 **********************************************************************/
222
static
223
void
224
setAttribute(
225
             Display *dpy,
226
             XvPortID portID,
227
             int attribute,
228
             int value
229
             )
230
{
231
  int dummy;
232
233
  if (XvSetPortAttribute(dpy , portID , attrData[ attribute ].atom , value) != Success)
234
    {
235
      fprintf(stderr , "%s: Unable to set value of attribute %s\n" , program_name , attrNames[ attribute ].attrName);
236
      exit(2);
237
    }
238
239
  getAttribute(dpy , portID , attribute , &dummy);
240
}
241
242
/**********************************************************************
243
 *
244
 * parseAttribute
245
 *
246
 **********************************************************************/
247
static
248
int
249
parseAttribute(
250
               const char *name
251
               )
252
{
253
  int i;
254
255
  for (i = 0; i < N_ATTRS; i++)
256
    if (strcasecmp(name , attrNames[ i ].extName) == 0)
257
      return i;
258
259
  return -1;
260
}
261
262
/**********************************************************************
263
 *
264
 * parseStd
265
 *
266
 **********************************************************************/
267
static
268
int
269
parseStd(
270
         const char *name
271
         )
272
{
273
  int i;
274
275
  for (i = 0; i < N_STDS; i++)
276
    if (strcasecmp(name , stdNames[ i ]) == 0)
277
      return i;
278
279
  return -1;
280
}
281
282
/**********************************************************************
283
 *
284
 * printUsage
285
 *
286
 **********************************************************************/
287
static
288
void
289
printUsage(void)
290
{
291
  unsigned i;
292
293
  fprintf(stderr , "Usage:\n"
294
          "%s [-display host:dpy] [<cmd> <attribute> [<value>]]\n\n" , program_name);
295
  fprintf(stderr , "When <cmd> is absent, a dump of all attributes is done\n");
296
  fprintf(stderr , "Allowed <cmd>s:\n"
297
                   "set <attribute> <value>   Set <attribute> to <value>\n"
298
                   "inc <attribute>           Increment <attribute> by 1\n"
299
                   "dec <attribute>           Decrement <attribute> by 1\n"
300
                   "zero <attribute>          Set <attribute> to 0\n"
301
                   "\nAllowed <attribute>s:\n");
302
303
  for (i = 0; i < N_ATTRS; i++)
304
    fprintf(stderr , "%-6s  %s\n" , attrNames[ i ].extName , attrNames[ i ].description);
305
306
  fprintf(stderr , "\nFor %s attribute, both the numeric value and the name of the standard are valid.\n" ,
307
          attrNames[ STD_ATTR ].extName);
308
309
  fprintf(stderr , "\nAllowed standards:\n");
310
  
311
  for (i = 0; i < N_STDS; i++)
312
    fprintf(stderr , "%d %s\n" , i , stdNames[ i ]);
313
314
  exit(1);
315
}
316
317
/**********************************************************************
318
 *
319
 * main
320
 *
321
 **********************************************************************/
322
int 
323
main(
324
     int argc, 
325
     char *argv[]
326
     )
327
{
328
  Action action;
329
  Display *dpy;
330
  char *disname = NULL;
331
  unsigned argIdx = 1;
332
  int attribute;
333
  int value;
334
  unsigned ver, rev, eventB, reqB, errorB; 
335
  XvAdaptorInfo *ainfo;
336
  unsigned nadaptors;
337
  unsigned i;
338
  XvPortID portID;
339
340
  program_name = argv[ 0 ];
341
342
  if (argc >= 3 && 
343
      strcmp(argv[ argIdx ] , "-display") == 0)
344
    {
345
      argIdx++;
346
      disname = argv[ argIdx++ ];
347
    }
348
349
  if (argIdx < argc)
350
    {
351
      if (strcasecmp(argv[ argIdx ] , "set") == 0)
352
        action = ACT_SET;
353
      else if (strcasecmp(argv[ argIdx ] , "inc") == 0)
354
        action = ACT_INC;
355
      else if (strcasecmp(argv[ argIdx ] , "dec") == 0)
356
        action = ACT_DEC;
357
      else if (strcasecmp(argv[ argIdx ] , "zero") == 0)
358
        action = ACT_ZERO;
359
      else
360
        printUsage();
361
362
      argIdx++;
363
      if (argIdx >= argc)
364
        printUsage();
365
366
      if ((attribute = parseAttribute(argv[ argIdx ])) < 0)
367
        {
368
          fprintf(stderr , "%s: Unrecognized attribute name (%s)\n" , program_name , argv[ argIdx ]);
369
          printUsage();
370
        }
371
      argIdx++;
372
373
      if (action == ACT_SET)
374
        {
375
          if (argIdx >= argc)
376
            printUsage();
377
          if (sscanf(argv[ argIdx ] , "%d" , &value) != 1 &&
378
              (attribute != STD_ATTR || (value = parseStd(argv[ argIdx ])) < 0))
379
            printUsage();
380
        }
381
    }
382
  else 
383
    action = ACT_FULL_DUMP;
384
385
  /*
386
   * Open display
387
   */
388
  if (!(dpy = XOpenDisplay(disname))) 
389
    {
390
      fprintf(stderr , "%s: Unable to open display %s\n" , program_name , 
391
              (disname != NULL) ? disname : XDisplayName(NULL));
392
      return -1;
393
    }
394
395
  if (XvQueryExtension(dpy, &ver, &rev, &reqB, &eventB, &errorB) != Success) 
396
    {
397
      fprintf(stderr , "%s: No XV Extension on %s\n" , program_name ,
398
              (disname != NULL) ? disname : XDisplayName(NULL));
399
      return 0;
400
    } 
401
  
402
  /*
403
   * Use screen #0
404
   */
405
  XvQueryAdaptors(dpy , RootWindow(dpy , 0) , &nadaptors , &ainfo);
406
  
407
  if (!nadaptors)
408
    {
409
      fprintf(stderr , "%s: No adaptors present\n" , program_name);
410
      return 0;
411
    } 
412
413
  /*
414
   * Use adaptor #0
415
   */
416
  portID = ainfo[ 0 ].base_id;
417
  if (!scanAttributes(dpy , portID))
418
    {
419
      fprintf(stderr , "%s: Invalid attributes in XV adaptor\n" , program_name);
420
      return 0;
421
    }
422
423
  switch (action)
424
    {
425
    case ACT_FULL_DUMP:
426
      for(i = 0; i < nadaptors; i++)
427
        {
428
          printf("Adaptor #%d: \"%s\"\n" , i , ainfo[ i ].name);
429
          printf("  number of ports   : %d\n" , ainfo[ i ].num_ports);
430
          printf("  port base         : %d\n" , ainfo[ i ].base_id);
431
          printf("  number of adaptors: %u\n" , ainfo[ i ].num_adaptors);
432
        }
433
      for (i = 0; i < N_ATTRS; i++)
434
        {
435
          getAttribute(dpy , portID , i , &value);
436
          if (i == STD_ATTR)
437
            if (value < 0 || value >= N_STDS)
438
              printf ("%s = ??? (%d)\n" , attrNames[ i ].extName , value);
439
            else
440
              printf ("%s = %s (%d)\n" , attrNames[ i ].extName , stdNames[ value ] , value);
441
          else
442
            printf("%s = %d\n" , attrNames[ i ].extName , value);
443
        }
444
      break;
445
446
    case ACT_SET:
447
      setAttribute(dpy , portID , attribute , value);
448
      break;
449
450
    case ACT_INC:
451
      getAttribute(dpy , portID , attribute , &value);
452
      value++;
453
      if (value > attrData[ attribute ].maxValue)
454
        value = attrData[ attribute ].minValue;
455
      setAttribute(dpy , portID , attribute , value);
456
      break;
457
458
    case ACT_DEC:
459
      getAttribute(dpy , portID , attribute , &value);
460
      value--;
461
      if (value < attrData[ attribute ].minValue)
462
        value = attrData[ attribute ].maxValue;
463
      setAttribute(dpy , portID , attribute , value);
464
      break;
465
466
    case ACT_ZERO:
467
      setAttribute(dpy , portID , attribute , 0);
468
      break;
469
    }
470
471
  return 0;
472
}

Return to bug 127642