diff drivers/radeon/hacking @ 3191:0a7eac44c808

Just for volunteers
author nick
date Wed, 28 Nov 2001 18:49:40 +0000
parents
children 9440d478e10d
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/drivers/radeon/hacking	Wed Nov 28 18:49:40 2001 +0000
@@ -0,0 +1,285 @@
+                       ATI chips hacking
+                       =================
+						Dedicated to ATI's hackers.
+
+Preface
+~~~~~~~
+This document will compare ATI chips only from point of DAC and video overlay.
+There are lots of difference from 3D point, dual-head support, tv-out support
+and many other things but it's already perfectly different story.
+This document doesn't include information about ATI AIW (All In Wonder) chips.
+
+What are units on modern ATI chips:
+DAC   - (Digital to Analog Convertor) controls CRTC, LCD, DFP monitor's output
+	Consists from:
+		PLL  - (Programable line length) registers
+		CRTC - CRT controller
+		LCD/DFP scaler
+		surface control
+DAC2  - controls CRTC, LCD, DFP monitor's output on second head
+TVDAC - controls Composite Video and Super Video output ports
+	Consists from:
+		TV_PLL
+		TV scaler & sync unit
+		TV format convertor (PAL/NTSC)
+TVCAP - controls Video-In port
+MPP   - Miscellaneous peripheral port. (includes ImpactTV(2+) - copy
+	protection mechanism)
+OV    - Video overlay (YUV BES) (include subpictures, gamma correction and
+        adaptive deinterlacing)
+CAP0  - Video capturing 
+CAP1  - Video capturing (second unit)
+RT    - Rage theatre: video encoding and mixing
+MUX   - video muxer
+MEM   - PCI/AGP bus mastering
+2D    - GUI engine
+3D    - 3D-OpenGL engine (There are lots of stuff)
+I2C   - I2C Bus control
+
+This document is mainly related only with OV unit ;)
+Video decoding diagram:
+
+RAM memory:   [ App ]    Copies YUV image to overlay memory
+                 |       <-- (It's possible to program DMA here)
+overlay memory:[ OV ]    performs scaling and YUVtoRGB convertion
+                /\
+RGB memory:   /    \
+            /    [ ImpactTV ]  performs copy protection filtering
+          /            \       (unneeded but presented by default thing;)
+ [ CRTC/LCD/DFP DAC ] [ TV DAC ] convert RGB memory to CRTC and NTSC/PAL signals
+          |                |
+ [CRTC/LCD/DFP Monitor] [TV-screen]
+
+History
+~~~~~~~
+  What is history of ATI's chips? I can be wrong but below is my vision
+of this question:
+
+0. I don't know any earlied chips :(
+1. Mach8
+2. Mach16
+3. Mach32
+
+4. Mach64.
+	It's first chip which has support from side of open
+	source drivers. Set of mach64 chips is:
+		mach64GX (ATI888GX00)
+		mach64CX (ATI888CX00)
+		mach64CT (ATI264CT)
+		mach64ET (ATI264ET)
+		mach64VTA3 (ATI264VT)
+		mach64VTA4 (ATI264VT)
+		mach64VTB (ATI264VTB)
+		mach64VT4 (ATI264VT4)
+
+5. 3D rage chips.
+	It seems that these chips have fully compatible by GPU with Mach64
+	which is extended by 3D possibilities. Set of 3D rage chips is:
+		3D RAGE (GT)
+		3D RAGE II+ (GTB)
+		3D RAGE IIC (PCI)
+		3D RAGE IIC (AGP)
+		3D RAGE LT
+		3D RAGE LT-G
+		3D RAGE PRO (BGA, AGP)
+		3D RAGE PRO (BGA, AGP, 1x only)
+		3D RAGE PRO (BGA, PCI)
+		3D RAGE PRO (PQFP, PCI)
+		3D RAGE PRO (PQFP, PCI, limited 3D)
+		3D RAGE (XL)
+		3D RAGE LT PRO (AGP)
+		3D RAGE LT PRO (PCI)
+		3D RAGE Mobility (PCI)
+		3D RAGE Mobility (AGP)
+
+6. Rage128 chips.
+	These chips have perfectly new GPU which supports memory mapped IO
+	space for accelerating port access (It's main cause of incompatibility
+	with mach64). Set of Rage128 chips is:
+		Rage128 GL RE
+		Rage128 GL RF
+		Rage128 GL RG
+		Rage128 GL RH
+		Rage128 GL RI
+		Rage128 VR RK
+		Rage128 VR RL
+		Rage128 VR RM
+		Rage128 VR RN
+		Rage128 VR RO
+		Rage128 Mobility M3 LE
+		Rage128 Mobility M3 LF
+7. Rage128Pro chips.
+	These chips are successors of Rage128 ones.
+		Rage128Pro GL PA
+		Rage128Pro GL PB
+		Rage128Pro GL PC
+		Rage128Pro GL PD
+		Rage128Pro GL PE
+		Rage128Pro GL PF
+		Rage128Pro VR PG
+		Rage128Pro VR PH
+		Rage128Pro VR PI
+		Rage128Pro VR PJ
+		Rage128Pro VR PK
+		Rage128Pro VR PL
+		Rage128Pro VR PM
+		Rage128Pro VR PN
+		Rage128Pro VR PO
+		Rage128Pro VR PP
+		Rage128Pro VR PQ
+		Rage128Pro VR PR
+		Rage128Pro VR TR
+		Rage128Pro VR PS
+		Rage128Pro VR PT
+		Rage128Pro VR PU
+		Rage128Pro VR PV
+		Rage128Pro VR PW
+		Rage128Pro VR PX
+		Rage128Pro Ultra U1
+		Rage128Pro Ultra U2
+		Rage128Pro Ultra U3
+
+8. Radeon chips.
+	Indeed they could be named Rage256 Pro. (With minor changes is fully
+	compatible with Rage128 chips).
+		Radeon QD
+		Radeon QE
+		Radeon QF
+		Radeon QG
+		Radeon VE QY
+		Radeon VE QZ
+		Radeon M6 LY
+		Radeon M6 LZ
+		Radeon M7 LW
+9. Radeon2 chips.
+	Indeed they could be named Rage512 Pro.
+		Radeon2 8500 QL
+		Radeon2 7500 QW
+
+10. Radeon3 and newest are cooming soon, but I hope that they will be fully
+    compatible with Radeon1 chips.
+
+In Radeon famility there were introduced also FX chips: Radeon FX and
+Radeon2 8700 FX. Probably they have the same possibility as other Radeon
+but currently it's unknown for me.
+
+What about video overlay and DAC?
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+Currently it's known that there is only difference between
+Mach64 and Rage128 compatible chips:
+- They have different logic of io ports programming!
+- They are incompatible by port numbers!
+But:
+- They use the same program logic from register's name point.
+(Indeed exists slight difference even between Radeon and Rage128
+chips. AFAIK only Radeon has OV0_SLICE_CNTL register which currently
+is not used by driver. But I know only its name ;). Also there
+is difference in slight adjust of BES position but it's configured
+by #ifdef blocks).
+
+Please compare:
+
+(The piece of Back-End Scaler programming)
+
+ Sample for Mach64 compatible chips:
+ ***********************************
+
+#define SPARSE_IO_BASE		0x03fcu
+#define SPARSE_IO_SELECT	0xfc00u
+
+#define BLOCK_IO_BASE		0xff00u
+#define BLOCK_IO_SELECT		0x00fcu
+
+#define MM_IO_SELECT		0x03fcu
+#define BLOCK_SELECT		0x0400u
+#define DWORD_SELECT		(BLOCK_SELECT | MM_IO_SELECT)
+
+#define IO_BYTE_SELECT		0x0003u
+
+#define SPARSE_IO_PORT		(SPARSE_IO_BASE | IO_BYTE_SELECT)
+#define BLOCK_IO_PORT		(BLOCK_IO_BASE | IO_BYTE_SELECT)
+
+#define IOPortTag(_SparseIOSelect, _BlockIOSelect)	\
+	(SetBits(_SparseIOSelect, SPARSE_IO_SELECT) |	\
+	 SetBits(_BlockIOSelect, BLOCK_SELECT | MM_IO_SELECT))
+#define SparseIOTag(_IOSelect)	IOPortTag(_IOSelect, 0)
+#define BlockIOTag(_IOSelect)	IOPortTag(0, _IOSelect)
+
+...
+
+#define OVERLAY_Y_X_START	BlockIOTag(0x100u)
+#define OVERLAY_Y_X_END		BlockIOTag(0x101u)
+
+...
+
+#define OUTREG(_Register, _Value)                              \
+    MMIO_OUT32(pATI->pBlock[GetBits(_Register, BLOCK_SELECT)], \
+               (_Register) & MM_IO_SELECT, _Value)
+
+...
+
+OUTREG(OVERLAY_Y_X_START,((drw_x)<<16)|(drw_y)|(1<<31));
+OUTREG(OVERLAY_Y_X_END,((drw_x+drw_w)<<16)|(drw_y+drw_h));
+
+
+ Sample for Rage128 compatible chips:
+ ************************************
+
+#define OV0_Y_X_START                          0x0400
+#define OV0_Y_X_END                            0x0404  
+
+...
+
+#define INREG(addr)		readl((rage_mmio_base)+addr)
+#define OUTREG(addr,val)	writel(val, (rage_mmio_base)+addr)
+
+...
+
+rage_mmio_base = ioremap_nocache(pci_resource_start (dev, 2),RAGE_REGSIZE);
+
+...
+
+#ifdef RADEON
+#define X_ADJUST 8
+#else /* rage128 */
+#define X_ADJUST 0
+#endif
+
+OUTREG(OV0_Y_X_START,(drw_x+X_ADJUST)|(drw_y<<16));
+OUTREG(OV0_Y_X_END,(drw_x+drw_w+X_ADJUST)|(drw_y+drw_h)<<16));
+
+Thus - these chips have almost the same logic from register's name point.
+(except the fact that they have swapped 16-bit halfs).
+Yes - programming of Rage128 is much simpler of Mach64.
+
+
+What about other ATI's chips?
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+I suggest you have latest copy of GATOS-CVS:
+http://www.linuxvideo.org
+GATOS was designed and introduced as General ATI TV and Overlay Sowfware.
+You will be able to find out there a lots of useful hacking utilities
+(at location gatos-ati/gatos):
+gfxdump - Program for dumping graphics chips registers on Linux and Windows 9X.
+	  (it's more useful for Win9x to hack their values).
+xatitv  - For working with tv-in (currently is under hard development)
+atitvout- For working with tv-out
+and lot of other stuff.
+BUT: After studing of Gatos and X11 stuffs I've found that they are bad
+optimized for movie playback.
+Please compare:
+ radeon_vid - configures video overlay only once and provides DGA to it.
+	      (doesn't require to be MMX optimized)
+ gatos and X11 - configures video overlay at every slice of frame, then
+              performs unoptimized copying of source stuff to video memory
+	      often with using CopyMungedData (it's C-analog of YV12_to_YUY2)
+	      since there are lacks in yv12 support.
+              (is not MMX optimized that's gladly accepted, but probably
+               will be never optimized due portability).
+
+Conslusion:
+~~~~~~~~~~~
+
+That's all folk!