diff options
Diffstat (limited to 'shared-core')
| -rw-r--r-- | shared-core/drm.h | 3 | ||||
| -rw-r--r-- | shared-core/drm_pciids.txt | 177 | ||||
| -rw-r--r-- | shared-core/i915_dma.c | 8 | ||||
| -rw-r--r-- | shared-core/i915_irq.c | 9 | ||||
| -rw-r--r-- | shared-core/mach64_dma.c | 234 | ||||
| -rw-r--r-- | shared-core/mach64_drm.h | 2 | ||||
| -rw-r--r-- | shared-core/mach64_drv.h | 7 | ||||
| -rw-r--r-- | shared-core/mach64_state.c | 205 | ||||
| -rw-r--r-- | shared-core/radeon_cp.c | 46 | ||||
| -rw-r--r-- | shared-core/radeon_drv.h | 23 | ||||
| -rw-r--r-- | shared-core/radeon_state.c | 25 | 
11 files changed, 379 insertions, 360 deletions
| diff --git a/shared-core/drm.h b/shared-core/drm.h index 4a6a370e..440af836 100644 --- a/shared-core/drm.h +++ b/shared-core/drm.h @@ -423,7 +423,8 @@ typedef struct drm_buf_desc {  		_DRM_PAGE_ALIGN = 0x01,	/**< Align on page boundaries for DMA */  		_DRM_AGP_BUFFER = 0x02,	/**< Buffer is in AGP space */  		_DRM_SG_BUFFER  = 0x04,	/**< Scatter/gather memory buffer */ -		_DRM_FB_BUFFER  = 0x08  /**< Buffer is in frame buffer */ +		_DRM_FB_BUFFER  = 0x08, /**< Buffer is in frame buffer */ +		_DRM_PCI_BUFFER_RO = 0x10 /**< Map PCI DMA buffer read-only */  	} flags;  	unsigned long agp_start; /**<  				  * Start address of where the AGP buffers are diff --git a/shared-core/drm_pciids.txt b/shared-core/drm_pciids.txt index 9ef2c001..c597708d 100644 --- a/shared-core/drm_pciids.txt +++ b/shared-core/drm_pciids.txt @@ -1,11 +1,11 @@  [radeon] -0x1002 0x3150 CHIP_RV380|CHIP_IS_MOBILITY "ATI Radeon Mobility X600 M24" -0x1002 0x3152 CHIP_RV380|CHIP_IS_MOBILITY|CHIP_NEW_MEMMAP "ATI Radeon Mobility X300 M24" -0x1002 0x3154 CHIP_RV380|CHIP_IS_MOBILITY|CHIP_NEW_MEMMAP "ATI FireGL M24 GL" -0x1002 0x3E50 CHIP_RV380|CHIP_NEW_MEMMAP "ATI Radeon RV380 X600" -0x1002 0x3E54 CHIP_RV380|CHIP_NEW_MEMMAP "ATI FireGL V3200 RV380" -0x1002 0x4136 CHIP_RS100|CHIP_IS_IGP "ATI Radeon RS100 IGP 320" -0x1002 0x4137 CHIP_RS200|CHIP_IS_IGP "ATI Radeon RS200 IGP 340" +0x1002 0x3150 CHIP_RV380|RADEON_IS_MOBILITY "ATI Radeon Mobility X600 M24" +0x1002 0x3152 CHIP_RV380|RADEON_IS_MOBILITY|RADEON_NEW_MEMMAP "ATI Radeon Mobility X300 M24" +0x1002 0x3154 CHIP_RV380|RADEON_IS_MOBILITY|RADEON_NEW_MEMMAP "ATI FireGL M24 GL" +0x1002 0x3E50 CHIP_RV380|RADEON_NEW_MEMMAP "ATI Radeon RV380 X600" +0x1002 0x3E54 CHIP_RV380|RADEON_NEW_MEMMAP "ATI FireGL V3200 RV380" +0x1002 0x4136 CHIP_RS100|RADEON_IS_IGP "ATI Radeon RS100 IGP 320" +0x1002 0x4137 CHIP_RS200|RADEON_IS_IGP "ATI Radeon RS200 IGP 340"  0x1002 0x4144 CHIP_R300 "ATI Radeon AD 9500"  0x1002 0x4145 CHIP_R300 "ATI Radeon AE 9700 Pro"  0x1002 0x4146 CHIP_R300 "ATI Radeon AF R300 9600TX" @@ -21,35 +21,35 @@  0x1002 0x4154 CHIP_RV350 "ATI FireGL AT T2"  0x1002 0x4155 CHIP_RV350 "ATI Radeon 9650"  0x1002 0x4156 CHIP_RV350 "ATI FireGL AV RV360 T2" -0x1002 0x4237 CHIP_RS200|CHIP_IS_IGP "ATI Radeon RS250 IGP" +0x1002 0x4237 CHIP_RS200|RADEON_IS_IGP "ATI Radeon RS250 IGP"  0x1002 0x4242 CHIP_R200 "ATI Radeon BB R200 AIW 8500DV"  0x1002 0x4243 CHIP_R200 "ATI Radeon BC R200" -0x1002 0x4336 CHIP_RS100|CHIP_IS_IGP|CHIP_IS_MOBILITY "ATI Radeon RS100 Mobility U1" -0x1002 0x4337 CHIP_RS200|CHIP_IS_IGP|CHIP_IS_MOBILITY "ATI Radeon RS200 Mobility IGP 340M" -0x1002 0x4437 CHIP_RS200|CHIP_IS_IGP|CHIP_IS_MOBILITY "ATI Radeon RS250 Mobility IGP" +0x1002 0x4336 CHIP_RS100|RADEON_IS_IGP|RADEON_IS_MOBILITY "ATI Radeon RS100 Mobility U1" +0x1002 0x4337 CHIP_RS200|RADEON_IS_IGP|RADEON_IS_MOBILITY "ATI Radeon RS200 Mobility IGP 340M" +0x1002 0x4437 CHIP_RS200|RADEON_IS_IGP|RADEON_IS_MOBILITY "ATI Radeon RS250 Mobility IGP"  0x1002 0x4966 CHIP_RV250 "ATI Radeon If RV250 9000"  0x1002 0x4967 CHIP_RV250 "ATI Radeon Ig RV250 9000" -0x1002 0x4A48 CHIP_R420|CHIP_NEW_MEMMAP "ATI Radeon JH R420 X800" -0x1002 0x4A49 CHIP_R420|CHIP_NEW_MEMMAP "ATI Radeon JI R420 X800 Pro" -0x1002 0x4A4A CHIP_R420|CHIP_NEW_MEMMAP "ATI Radeon JJ R420 X800 SE" -0x1002 0x4A4B CHIP_R420|CHIP_NEW_MEMMAP "ATI Radeon JK R420 X800 XT" -0x1002 0x4A4C CHIP_R420|CHIP_NEW_MEMMAP "ATI Radeon JL R420 X800" -0x1002 0x4A4D CHIP_R420|CHIP_NEW_MEMMAP "ATI FireGL JM X3-256" -0x1002 0x4A4E CHIP_R420|CHIP_IS_MOBILITY|CHIP_NEW_MEMMAP "ATI Radeon JN R420 Mobility M18" -0x1002 0x4A4F CHIP_R420|CHIP_NEW_MEMMAP "ATI Radeon JO R420 X800 SE" -0x1002 0x4A50 CHIP_R420|CHIP_NEW_MEMMAP "ATI Radeon JP R420 X800 XT PE" -0x1002 0x4A54 CHIP_R420|CHIP_NEW_MEMMAP "ATI Radeon JT R420 AIW X800 VE" -0x1002 0x4B49 CHIP_R420|CHIP_NEW_MEMMAP "ATI Radeon R481 X850 XT" -0x1002 0x4B4A CHIP_R420|CHIP_NEW_MEMMAP "ATI Radeon R481 X850 SE" -0x1002 0x4B4B CHIP_R420|CHIP_NEW_MEMMAP "ATI Radeon R481 X850 Pro" -0x1002 0x4B4C CHIP_R420|CHIP_NEW_MEMMAP "ATI Radeon R481 X850 XT PE" -0x1002 0x4C57 CHIP_RV200|CHIP_IS_MOBILITY "ATI Radeon LW RV200 Mobility 7500 M7" -0x1002 0x4C58 CHIP_RV200|CHIP_IS_MOBILITY "ATI Radeon LX RV200 Mobility FireGL 7800 M7" -0x1002 0x4C59 CHIP_RV100|CHIP_IS_MOBILITY "ATI Radeon LY RV100 Mobility M6" -0x1002 0x4C5A CHIP_RV100|CHIP_IS_MOBILITY "ATI Radeon LZ RV100 Mobility M6" -0x1002 0x4C64 CHIP_RV250|CHIP_IS_MOBILITY "ATI Radeon Ld RV250 Mobility 9000 M9" +0x1002 0x4A48 CHIP_R420|RADEON_NEW_MEMMAP "ATI Radeon JH R420 X800" +0x1002 0x4A49 CHIP_R420|RADEON_NEW_MEMMAP "ATI Radeon JI R420 X800 Pro" +0x1002 0x4A4A CHIP_R420|RADEON_NEW_MEMMAP "ATI Radeon JJ R420 X800 SE" +0x1002 0x4A4B CHIP_R420|RADEON_NEW_MEMMAP "ATI Radeon JK R420 X800 XT" +0x1002 0x4A4C CHIP_R420|RADEON_NEW_MEMMAP "ATI Radeon JL R420 X800" +0x1002 0x4A4D CHIP_R420|RADEON_NEW_MEMMAP "ATI FireGL JM X3-256" +0x1002 0x4A4E CHIP_R420|RADEON_IS_MOBILITY|RADEON_NEW_MEMMAP "ATI Radeon JN R420 Mobility M18" +0x1002 0x4A4F CHIP_R420|RADEON_NEW_MEMMAP "ATI Radeon JO R420 X800 SE" +0x1002 0x4A50 CHIP_R420|RADEON_NEW_MEMMAP "ATI Radeon JP R420 X800 XT PE" +0x1002 0x4A54 CHIP_R420|RADEON_NEW_MEMMAP "ATI Radeon JT R420 AIW X800 VE" +0x1002 0x4B49 CHIP_R420|RADEON_NEW_MEMMAP "ATI Radeon R481 X850 XT" +0x1002 0x4B4A CHIP_R420|RADEON_NEW_MEMMAP "ATI Radeon R481 X850 SE" +0x1002 0x4B4B CHIP_R420|RADEON_NEW_MEMMAP "ATI Radeon R481 X850 Pro" +0x1002 0x4B4C CHIP_R420|RADEON_NEW_MEMMAP "ATI Radeon R481 X850 XT PE" +0x1002 0x4C57 CHIP_RV200|RADEON_IS_MOBILITY "ATI Radeon LW RV200 Mobility 7500 M7" +0x1002 0x4C58 CHIP_RV200|RADEON_IS_MOBILITY "ATI Radeon LX RV200 Mobility FireGL 7800 M7" +0x1002 0x4C59 CHIP_RV100|RADEON_IS_MOBILITY "ATI Radeon LY RV100 Mobility M6" +0x1002 0x4C5A CHIP_RV100|RADEON_IS_MOBILITY "ATI Radeon LZ RV100 Mobility M6" +0x1002 0x4C64 CHIP_RV250|RADEON_IS_MOBILITY "ATI Radeon Ld RV250 Mobility 9000 M9"  0x1002 0x4C66 CHIP_RV250 "ATI Radeon Lf RV250 Mobility 9000 M9 / FireMV 2400 PCI" -0x1002 0x4C67 CHIP_RV250|CHIP_IS_MOBILITY "ATI Radeon Lg RV250 Mobility 9000 M9" +0x1002 0x4C67 CHIP_RV250|RADEON_IS_MOBILITY "ATI Radeon Lg RV250 Mobility 9000 M9"  0x1002 0x4E44 CHIP_R300 "ATI Radeon ND R300 9700 Pro"  0x1002 0x4E45 CHIP_R300 "ATI Radeon NE R300 9500 Pro / 9700"  0x1002 0x4E46 CHIP_R300 "ATI Radeon NF R300 9600TX" @@ -58,16 +58,16 @@  0x1002 0x4E49 CHIP_R350 "ATI Radeon NI R350 9800"  0x1002 0x4E4A CHIP_R350 "ATI Radeon NJ R360 9800 XT"  0x1002 0x4E4B CHIP_R350 "ATI FireGL NK X2" -0x1002 0x4E50 CHIP_RV350|CHIP_IS_MOBILITY "ATI Radeon RV350 Mobility 9600 M10 NP" -0x1002 0x4E51 CHIP_RV350|CHIP_IS_MOBILITY "ATI Radeon RV350 Mobility 9600 M10 NQ" -0x1002 0x4E52 CHIP_RV350|CHIP_IS_MOBILITY "ATI Radeon RV350 Mobility 9600 M11 NR" -0x1002 0x4E53 CHIP_RV350|CHIP_IS_MOBILITY "ATI Radeon RV350 Mobility 9600 M10 NS" -0x1002 0x4E54 CHIP_RV350|CHIP_IS_MOBILITY "ATI FireGL T2/T2e" -0x1002 0x4E56 CHIP_RV350|CHIP_IS_MOBILITY "ATI Radeon Mobility 9550" -0x1002 0x5144 CHIP_R100|CHIP_SINGLE_CRTC "ATI Radeon QD R100" -0x1002 0x5145 CHIP_R100|CHIP_SINGLE_CRTC "ATI Radeon QE R100" -0x1002 0x5146 CHIP_R100|CHIP_SINGLE_CRTC "ATI Radeon QF R100" -0x1002 0x5147 CHIP_R100|CHIP_SINGLE_CRTC "ATI Radeon QG R100" +0x1002 0x4E50 CHIP_RV350|RADEON_IS_MOBILITY "ATI Radeon RV350 Mobility 9600 M10 NP" +0x1002 0x4E51 CHIP_RV350|RADEON_IS_MOBILITY "ATI Radeon RV350 Mobility 9600 M10 NQ" +0x1002 0x4E52 CHIP_RV350|RADEON_IS_MOBILITY "ATI Radeon RV350 Mobility 9600 M11 NR" +0x1002 0x4E53 CHIP_RV350|RADEON_IS_MOBILITY "ATI Radeon RV350 Mobility 9600 M10 NS" +0x1002 0x4E54 CHIP_RV350|RADEON_IS_MOBILITY "ATI FireGL T2/T2e" +0x1002 0x4E56 CHIP_RV350|RADEON_IS_MOBILITY "ATI Radeon Mobility 9550" +0x1002 0x5144 CHIP_R100|RADEON_SINGLE_CRTC "ATI Radeon QD R100" +0x1002 0x5145 CHIP_R100|RADEON_SINGLE_CRTC "ATI Radeon QE R100" +0x1002 0x5146 CHIP_R100|RADEON_SINGLE_CRTC "ATI Radeon QF R100" +0x1002 0x5147 CHIP_R100|RADEON_SINGLE_CRTC "ATI Radeon QG R100"  0x1002 0x5148 CHIP_R200 "ATI Radeon QH R200 8500"  0x1002 0x514C CHIP_R200 "ATI Radeon QL R200 8500 LE"  0x1002 0x514D CHIP_R200 "ATI Radeon QM R200 9100" @@ -76,59 +76,59 @@  0x1002 0x5159 CHIP_RV100 "ATI Radeon QY RV100 7000/VE"  0x1002 0x515A CHIP_RV100 "ATI Radeon QZ RV100 7000/VE"  0x1002 0x515E CHIP_RV100 "ATI ES1000 RN50" -0x1002 0x5460 CHIP_RV380|CHIP_IS_MOBILITY "ATI Radeon Mobility X300 M22" -0x1002 0x5462 CHIP_RV380|CHIP_IS_MOBILITY "ATI Radeon Mobility X600 SE M24C" -0x1002 0x5464 CHIP_RV380|CHIP_IS_MOBILITY "ATI FireGL M22 GL 5464" -0x1002 0x5548 CHIP_R420|CHIP_NEW_MEMMAP "ATI Radeon R423 X800" -0x1002 0x5549 CHIP_R420|CHIP_NEW_MEMMAP "ATI Radeon R423 X800 Pro" -0x1002 0x554A CHIP_R420|CHIP_NEW_MEMMAP "ATI Radeon R423 X800 XT PE" -0x1002 0x554B CHIP_R420|CHIP_NEW_MEMMAP "ATI Radeon R423 X800 SE" -0x1002 0x554C CHIP_R420|CHIP_NEW_MEMMAP "ATI Radeon R430 X800 XTP" -0x1002 0x554D CHIP_R420|CHIP_NEW_MEMMAP "ATI Radeon R430 X800 XL" -0x1002 0x554E CHIP_R420|CHIP_NEW_MEMMAP "ATI Radeon R430 X800 SE" -0x1002 0x554F CHIP_R420|CHIP_NEW_MEMMAP "ATI Radeon R430 X800" -0x1002 0x5550 CHIP_R420|CHIP_NEW_MEMMAP "ATI FireGL V7100 R423" -0x1002 0x5551 CHIP_R420|CHIP_NEW_MEMMAP "ATI FireGL V5100 R423 UQ" -0x1002 0x5552 CHIP_R420|CHIP_NEW_MEMMAP "ATI FireGL unknown R423 UR" -0x1002 0x5554 CHIP_R420|CHIP_NEW_MEMMAP "ATI FireGL unknown R423 UT" -0x1002 0x564A CHIP_RV410|CHIP_IS_MOBILITY|CHIP_NEW_MEMMAP "ATI Mobility FireGL V5000 M26" -0x1002 0x564B CHIP_RV410|CHIP_IS_MOBILITY|CHIP_NEW_MEMMAP "ATI Mobility FireGL V5000 M26" -0x1002 0x564F CHIP_RV410|CHIP_IS_MOBILITY|CHIP_NEW_MEMMAP "ATI Radeon Mobility X700 XL M26" -0x1002 0x5652 CHIP_RV410|CHIP_IS_MOBILITY|CHIP_NEW_MEMMAP "ATI Radeon Mobility X700 M26" -0x1002 0x5653 CHIP_RV410|CHIP_IS_MOBILITY|CHIP_NEW_MEMMAP "ATI Radeon Mobility X700 M26" -0x1002 0x5834 CHIP_RS300|CHIP_IS_IGP "ATI Radeon RS300 9100 IGP" -0x1002 0x5835 CHIP_RS300|CHIP_IS_IGP|CHIP_IS_MOBILITY "ATI Radeon RS300 Mobility IGP" +0x1002 0x5460 CHIP_RV380|RADEON_IS_MOBILITY "ATI Radeon Mobility X300 M22" +0x1002 0x5462 CHIP_RV380|RADEON_IS_MOBILITY "ATI Radeon Mobility X600 SE M24C" +0x1002 0x5464 CHIP_RV380|RADEON_IS_MOBILITY "ATI FireGL M22 GL 5464" +0x1002 0x5548 CHIP_R420|RADEON_NEW_MEMMAP "ATI Radeon R423 X800" +0x1002 0x5549 CHIP_R420|RADEON_NEW_MEMMAP "ATI Radeon R423 X800 Pro" +0x1002 0x554A CHIP_R420|RADEON_NEW_MEMMAP "ATI Radeon R423 X800 XT PE" +0x1002 0x554B CHIP_R420|RADEON_NEW_MEMMAP "ATI Radeon R423 X800 SE" +0x1002 0x554C CHIP_R420|RADEON_NEW_MEMMAP "ATI Radeon R430 X800 XTP" +0x1002 0x554D CHIP_R420|RADEON_NEW_MEMMAP "ATI Radeon R430 X800 XL" +0x1002 0x554E CHIP_R420|RADEON_NEW_MEMMAP "ATI Radeon R430 X800 SE" +0x1002 0x554F CHIP_R420|RADEON_NEW_MEMMAP "ATI Radeon R430 X800" +0x1002 0x5550 CHIP_R420|RADEON_NEW_MEMMAP "ATI FireGL V7100 R423" +0x1002 0x5551 CHIP_R420|RADEON_NEW_MEMMAP "ATI FireGL V5100 R423 UQ" +0x1002 0x5552 CHIP_R420|RADEON_NEW_MEMMAP "ATI FireGL unknown R423 UR" +0x1002 0x5554 CHIP_R420|RADEON_NEW_MEMMAP "ATI FireGL unknown R423 UT" +0x1002 0x564A CHIP_RV410|RADEON_IS_MOBILITY|RADEON_NEW_MEMMAP "ATI Mobility FireGL V5000 M26" +0x1002 0x564B CHIP_RV410|RADEON_IS_MOBILITY|RADEON_NEW_MEMMAP "ATI Mobility FireGL V5000 M26" +0x1002 0x564F CHIP_RV410|RADEON_IS_MOBILITY|RADEON_NEW_MEMMAP "ATI Radeon Mobility X700 XL M26" +0x1002 0x5652 CHIP_RV410|RADEON_IS_MOBILITY|RADEON_NEW_MEMMAP "ATI Radeon Mobility X700 M26" +0x1002 0x5653 CHIP_RV410|RADEON_IS_MOBILITY|RADEON_NEW_MEMMAP "ATI Radeon Mobility X700 M26" +0x1002 0x5834 CHIP_RS300|RADEON_IS_IGP "ATI Radeon RS300 9100 IGP" +0x1002 0x5835 CHIP_RS300|RADEON_IS_IGP|RADEON_IS_MOBILITY "ATI Radeon RS300 Mobility IGP"  0x1002 0x5960 CHIP_RV280 "ATI Radeon RV280 9250"  0x1002 0x5961 CHIP_RV280 "ATI Radeon RV280 9200"  0x1002 0x5962 CHIP_RV280 "ATI Radeon RV280 9200"  0x1002 0x5964 CHIP_RV280 "ATI Radeon RV280 9200 SE"  0x1002 0x5965 CHIP_RV280 "ATI FireMV 2200 PCI"  0x1002 0x5969 CHIP_RV100 "ATI ES1000 RN50" -0x1002 0x5b60 CHIP_RV380|CHIP_NEW_MEMMAP "ATI Radeon RV370 X300 SE" -0x1002 0x5b62 CHIP_RV380|CHIP_NEW_MEMMAP "ATI Radeon RV370 X600 Pro" -0x1002 0x5b63 CHIP_RV380|CHIP_NEW_MEMMAP "ATI Radeon RV370 X550" -0x1002 0x5b64 CHIP_RV380|CHIP_NEW_MEMMAP "ATI FireGL V3100 (RV370) 5B64" -0x1002 0x5b65 CHIP_RV380|CHIP_NEW_MEMMAP "ATI FireMV 2200 PCIE (RV370) 5B65" -0x1002 0x5c61 CHIP_RV280|CHIP_IS_MOBILITY "ATI Radeon RV280 Mobility" -0x1002 0x5c63 CHIP_RV280|CHIP_IS_MOBILITY "ATI Radeon RV280 Mobility" -0x1002 0x5d48 CHIP_R420|CHIP_IS_MOBILITY|CHIP_NEW_MEMMAP "ATI Mobility Radeon X800 XT M28" -0x1002 0x5d49 CHIP_R420|CHIP_IS_MOBILITY|CHIP_NEW_MEMMAP "ATI Mobility FireGL V5100 M28" -0x1002 0x5d4a CHIP_R420|CHIP_IS_MOBILITY|CHIP_NEW_MEMMAP "ATI Mobility Radeon X800 M28" -0x1002 0x5d4c CHIP_R420|CHIP_NEW_MEMMAP "ATI Radeon R480 X850" -0x1002 0x5d4d CHIP_R420|CHIP_NEW_MEMMAP "ATI Radeon R480 X850 XT PE" -0x1002 0x5d4e CHIP_R420|CHIP_NEW_MEMMAP "ATI Radeon R480 X850 SE" -0x1002 0x5d4f CHIP_R420|CHIP_NEW_MEMMAP "ATI Radeon R480 X850 Pro" -0x1002 0x5d50 CHIP_R420|CHIP_NEW_MEMMAP "ATI unknown Radeon / FireGL R480" -0x1002 0x5d52 CHIP_R420|CHIP_NEW_MEMMAP "ATI Radeon R480 X850 XT" -0x1002 0x5d57 CHIP_R420|CHIP_NEW_MEMMAP "ATI Radeon R423 X800 XT" -0x1002 0x5e48 CHIP_RV410|CHIP_NEW_MEMMAP "ATI FireGL V5000 RV410" -0x1002 0x5e4a CHIP_RV410|CHIP_NEW_MEMMAP "ATI Radeon RV410 X700 XT" -0x1002 0x5e4b CHIP_RV410|CHIP_NEW_MEMMAP "ATI Radeon RV410 X700 Pro" -0x1002 0x5e4c CHIP_RV410|CHIP_NEW_MEMMAP "ATI Radeon RV410 X700 SE" -0x1002 0x5e4d CHIP_RV410|CHIP_NEW_MEMMAP "ATI Radeon RV410 X700" -0x1002 0x5e4f CHIP_RV410|CHIP_NEW_MEMMAP "ATI Radeon RV410 X700 SE" -0x1002 0x7834 CHIP_RS300|CHIP_IS_IGP|CHIP_NEW_MEMMAP "ATI Radeon RS350 9000/9100 IGP" -0x1002 0x7835 CHIP_RS300|CHIP_IS_IGP|CHIP_IS_MOBILITY|CHIP_NEW_MEMMAP "ATI Radeon RS350 Mobility IGP" +0x1002 0x5b60 CHIP_RV380|RADEON_NEW_MEMMAP "ATI Radeon RV370 X300 SE" +0x1002 0x5b62 CHIP_RV380|RADEON_NEW_MEMMAP "ATI Radeon RV370 X600 Pro" +0x1002 0x5b63 CHIP_RV380|RADEON_NEW_MEMMAP "ATI Radeon RV370 X550" +0x1002 0x5b64 CHIP_RV380|RADEON_NEW_MEMMAP "ATI FireGL V3100 (RV370) 5B64" +0x1002 0x5b65 CHIP_RV380|RADEON_NEW_MEMMAP "ATI FireMV 2200 PCIE (RV370) 5B65" +0x1002 0x5c61 CHIP_RV280|RADEON_IS_MOBILITY "ATI Radeon RV280 Mobility" +0x1002 0x5c63 CHIP_RV280|RADEON_IS_MOBILITY "ATI Radeon RV280 Mobility" +0x1002 0x5d48 CHIP_R420|RADEON_IS_MOBILITY|RADEON_NEW_MEMMAP "ATI Mobility Radeon X800 XT M28" +0x1002 0x5d49 CHIP_R420|RADEON_IS_MOBILITY|RADEON_NEW_MEMMAP "ATI Mobility FireGL V5100 M28" +0x1002 0x5d4a CHIP_R420|RADEON_IS_MOBILITY|RADEON_NEW_MEMMAP "ATI Mobility Radeon X800 M28" +0x1002 0x5d4c CHIP_R420|RADEON_NEW_MEMMAP "ATI Radeon R480 X850" +0x1002 0x5d4d CHIP_R420|RADEON_NEW_MEMMAP "ATI Radeon R480 X850 XT PE" +0x1002 0x5d4e CHIP_R420|RADEON_NEW_MEMMAP "ATI Radeon R480 X850 SE" +0x1002 0x5d4f CHIP_R420|RADEON_NEW_MEMMAP "ATI Radeon R480 X850 Pro" +0x1002 0x5d50 CHIP_R420|RADEON_NEW_MEMMAP "ATI unknown Radeon / FireGL R480" +0x1002 0x5d52 CHIP_R420|RADEON_NEW_MEMMAP "ATI Radeon R480 X850 XT" +0x1002 0x5d57 CHIP_R420|RADEON_NEW_MEMMAP "ATI Radeon R423 X800 XT" +0x1002 0x5e48 CHIP_RV410|RADEON_NEW_MEMMAP "ATI FireGL V5000 RV410" +0x1002 0x5e4a CHIP_RV410|RADEON_NEW_MEMMAP "ATI Radeon RV410 X700 XT" +0x1002 0x5e4b CHIP_RV410|RADEON_NEW_MEMMAP "ATI Radeon RV410 X700 Pro" +0x1002 0x5e4c CHIP_RV410|RADEON_NEW_MEMMAP "ATI Radeon RV410 X700 SE" +0x1002 0x5e4d CHIP_RV410|RADEON_NEW_MEMMAP "ATI Radeon RV410 X700" +0x1002 0x5e4f CHIP_RV410|RADEON_NEW_MEMMAP "ATI Radeon RV410 X700 SE" +0x1002 0x7834 CHIP_RS300|RADEON_IS_IGP|RADEON_NEW_MEMMAP "ATI Radeon RS350 9000/9100 IGP" +0x1002 0x7835 CHIP_RS300|RADEON_IS_IGP|RADEON_IS_MOBILITY|RADEON_NEW_MEMMAP "ATI Radeon RS350 Mobility IGP"  [r128]  0x1002 0x4c45 0 "ATI Rage 128 Mobility LE (PCI)" @@ -186,6 +186,7 @@  0x1002 0x4c51 0 "3D Rage LT Pro"  0x1002 0x4c42 0 "3D Rage LT Pro AGP-133"  0x1002 0x4c44 0 "3D Rage LT Pro AGP-66" +0x1002 0x4759 0 "Rage 3D IICATI 3D RAGE IIC AGP(A12/A13)  0x1002 0x474c 0 "Rage XC"  0x1002 0x474f 0 "Rage XL"  0x1002 0x4752 0 "Rage XL" diff --git a/shared-core/i915_dma.c b/shared-core/i915_dma.c index 8c701b4d..60e3e945 100644 --- a/shared-core/i915_dma.c +++ b/shared-core/i915_dma.c @@ -31,10 +31,10 @@  #include "i915_drm.h"  #include "i915_drv.h" -#define IS_I965G(dev)  (dev->pdev->device == 0x2972 || \ -			dev->pdev->device == 0x2982 || \ -			dev->pdev->device == 0x2992 || \ -			dev->pdev->device == 0x29A2) +#define IS_I965G(dev)  (dev->pci_device == 0x2972 || \ +			dev->pci_device == 0x2982 || \ +			dev->pci_device == 0x2992 || \ +			dev->pci_device == 0x29A2)  /* Really want an OS-independent resettable timer.  Would like to have diff --git a/shared-core/i915_irq.c b/shared-core/i915_irq.c index bc52a95c..a48e1ff8 100644 --- a/shared-core/i915_irq.c +++ b/shared-core/i915_irq.c @@ -346,7 +346,7 @@ static void i915_enable_interrupt (drm_device_t *dev)  {  	drm_i915_private_t *dev_priv = (drm_i915_private_t *) dev->dev_private; -	dev_priv->irq_enable_reg = USER_INT_FLAG; //&= ~(VSYNC_PIPEA_FLAG | VSYNC_PIPEB_FLAG); +	dev_priv->irq_enable_reg = USER_INT_FLAG;   	if (dev_priv->vblank_pipe & DRM_I915_VBLANK_PIPE_A)  		dev_priv->irq_enable_reg |= VSYNC_PIPEA_FLAG;  	if (dev_priv->vblank_pipe & DRM_I915_VBLANK_PIPE_B) @@ -539,6 +539,13 @@ void i915_driver_irq_postinstall(drm_device_t * dev)  	INIT_LIST_HEAD(&dev_priv->vbl_swaps.head);  	dev_priv->swaps_pending = 0; +	if (!dev_priv->vblank_pipe) +		dev_priv->vblank_pipe = DRM_I915_VBLANK_PIPE_A; + +	dev_priv->swaps_lock = SPIN_LOCK_UNLOCKED; +	INIT_LIST_HEAD(&dev_priv->vbl_swaps.head); +	dev_priv->swaps_pending = 0; +  	dev_priv->user_irq_lock = SPIN_LOCK_UNLOCKED;  	dev_priv->user_irq_refcount = 0; diff --git a/shared-core/mach64_dma.c b/shared-core/mach64_dma.c index 4c8edeab..3a5fdee8 100644 --- a/shared-core/mach64_dma.c +++ b/shared-core/mach64_dma.c @@ -815,17 +815,18 @@ static int mach64_do_dma_init(drm_device_t * dev, drm_mach64_init_t * init)  		return DRM_ERR(EINVAL);  	} +	dev_priv->ring_map = drm_core_findmap(dev, init->ring_offset); +	if (!dev_priv->ring_map) { +		DRM_ERROR("can not find ring map!\n"); +		dev->dev_private = (void *)dev_priv; +		mach64_do_cleanup_dma(dev); +		return DRM_ERR(EINVAL); +	} +  	dev_priv->sarea_priv = (drm_mach64_sarea_t *)  	    ((u8 *) dev_priv->sarea->handle + init->sarea_priv_offset);  	if (!dev_priv->is_pci) { -		dev_priv->ring_map = drm_core_findmap(dev, init->ring_offset); -		if (!dev_priv->ring_map) { -			DRM_ERROR("can not find ring map!\n"); -			dev->dev_private = (void *)dev_priv; -			mach64_do_cleanup_dma(dev); -			return DRM_ERR(EINVAL); -		}  		drm_core_ioremap(dev_priv->ring_map, dev);  		if (!dev_priv->ring_map->handle) {  			DRM_ERROR("can not ioremap virtual address for" @@ -834,6 +835,7 @@ static int mach64_do_dma_init(drm_device_t * dev, drm_mach64_init_t * init)  			mach64_do_cleanup_dma(dev);  			return DRM_ERR(ENOMEM);  		} +		dev->agp_buffer_token = init->buffers_offset;  		dev->agp_buffer_map =  		    drm_core_findmap(dev, init->buffers_offset);  		if (!dev->agp_buffer_map) { @@ -890,27 +892,9 @@ static int mach64_do_dma_init(drm_device_t * dev, drm_mach64_init_t * init)  		}  	} -	/* allocate descriptor memory from pci pool */ -	DRM_DEBUG("Allocating dma descriptor ring\n");  	dev_priv->ring.size = 0x4000;	/* 16KB */ - -	if (dev_priv->is_pci) { -		dev_priv->ring.dmah = drm_pci_alloc(dev, dev_priv->ring.size, -						     dev_priv->ring.size, -						     0xfffffffful); - -		if (!dev_priv->ring.dmah) { -			DRM_ERROR("Allocating dma descriptor ring failed\n"); -			return DRM_ERR(ENOMEM); -		} else { -			dev_priv->ring.start = dev_priv->ring.dmah->vaddr; -			dev_priv->ring.start_addr = -			    (u32) dev_priv->ring.dmah->busaddr; -		} -	} else { -		dev_priv->ring.start = dev_priv->ring_map->handle; -		dev_priv->ring.start_addr = (u32) dev_priv->ring_map->offset; -	} +	dev_priv->ring.start = dev_priv->ring_map->handle; +	dev_priv->ring.start_addr = (u32) dev_priv->ring_map->offset;  	memset(dev_priv->ring.start, 0, dev_priv->ring.size);  	DRM_INFO("descriptor ring: cpu addr %p, bus addr: 0x%08x\n", @@ -1148,18 +1132,14 @@ int mach64_do_cleanup_dma(drm_device_t * dev)  	if (dev->dev_private) {  		drm_mach64_private_t *dev_priv = dev->dev_private; -		if (dev_priv->is_pci) { -			if (dev_priv->ring.dmah) { -				drm_pci_free(dev, dev_priv->ring.dmah); -			} -		} else { +		if (!dev_priv->is_pci) {  			if (dev_priv->ring_map)  				drm_core_ioremapfree(dev_priv->ring_map, dev); -		} -		if (dev->agp_buffer_map) { -			drm_core_ioremapfree(dev->agp_buffer_map, dev); -			dev->agp_buffer_map = NULL; +			if (dev->agp_buffer_map) { +				drm_core_ioremapfree(dev->agp_buffer_map, dev); +				dev->agp_buffer_map = NULL; +			}  		}  		mach64_destroy_freelist(dev); @@ -1328,17 +1308,88 @@ int mach64_do_release_used_buffers(drm_mach64_private_t * dev_priv)  	return 0;  } +static int mach64_do_reclaim_completed(drm_mach64_private_t * dev_priv) +{ +	drm_mach64_descriptor_ring_t *ring = &dev_priv->ring; +	struct list_head *ptr; +	struct list_head *tmp; +	drm_mach64_freelist_t *entry; +	u32 head, tail, ofs; + +	mach64_ring_tick(dev_priv, ring); +	head = ring->head; +	tail = ring->tail; + +	if (head == tail) { +#if MACH64_EXTRA_CHECKING +		if (MACH64_READ(MACH64_GUI_STAT) & MACH64_GUI_ACTIVE) { +			DRM_ERROR("Empty ring with non-idle engine!\n"); +			mach64_dump_ring_info(dev_priv); +			return -1; +		} +#endif +		/* last pass is complete, so release everything */ +		mach64_do_release_used_buffers(dev_priv); +		DRM_DEBUG("%s: idle engine, freed all buffers.\n", +		     __FUNCTION__); +		if (list_empty(&dev_priv->free_list)) { +			DRM_ERROR("Freelist empty with idle engine\n"); +			return -1; +		} +		return 0; +	} +	/* Look for a completed buffer and bail out of the loop +	 * as soon as we find one -- don't waste time trying +	 * to free extra bufs here, leave that to do_release_used_buffers +	 */ +	list_for_each_safe(ptr, tmp, &dev_priv->pending) { +		entry = list_entry(ptr, drm_mach64_freelist_t, list); +		ofs = entry->ring_ofs; +		if (entry->discard && +		    ((head < tail && (ofs < head || ofs >= tail)) || +		     (head > tail && (ofs < head && ofs >= tail)))) { +#if MACH64_EXTRA_CHECKING +			int i; + +			for (i = head; i != tail; i = (i + 4) & ring->tail_mask) +			{ +				u32 o1 = le32_to_cpu(((u32 *) ring-> +						 start)[i + 1]); +				u32 o2 = GETBUFADDR(entry->buf); + +				if (o1 == o2) { +					DRM_ERROR +					    ("Attempting to free used buffer: " +					     "i=%d  buf=0x%08x\n", +					     i, o1); +					mach64_dump_ring_info(dev_priv); +					return -1; +				} +			} +#endif +			/* found a processed buffer */ +			entry->buf->pending = 0; +			list_del(ptr); +			list_add_tail(ptr, &dev_priv->free_list); +			DRM_DEBUG +			    ("%s: freed processed buffer (head=%d tail=%d " +			     "buf ring ofs=%d).\n", +			     __FUNCTION__, head, tail, ofs); +			return 0; +		} +	} + +	return 1; +} +  drm_buf_t *mach64_freelist_get(drm_mach64_private_t * dev_priv)  {  	drm_mach64_descriptor_ring_t *ring = &dev_priv->ring;  	drm_mach64_freelist_t *entry;  	struct list_head *ptr; -	struct list_head *tmp;  	int t;  	if (list_empty(&dev_priv->free_list)) { -		u32 head, tail, ofs; -  		if (list_empty(&dev_priv->pending)) {  			DRM_ERROR  			    ("Couldn't get buffer - pending and free lists empty\n"); @@ -1350,81 +1401,15 @@ drm_buf_t *mach64_freelist_get(drm_mach64_private_t * dev_priv)  			return NULL;  		} -		tail = ring->tail;  		for (t = 0; t < dev_priv->usec_timeout; t++) { -			mach64_ring_tick(dev_priv, ring); -			head = ring->head; +			int ret; -			if (head == tail) { -#if MACH64_EXTRA_CHECKING -				if (MACH64_READ(MACH64_GUI_STAT) & -				    MACH64_GUI_ACTIVE) { -					DRM_ERROR -					    ("Empty ring with non-idle engine!\n"); -					mach64_dump_ring_info(dev_priv); -					return NULL; -				} -#endif -				/* last pass is complete, so release everything */ -				mach64_do_release_used_buffers(dev_priv); -				DRM_DEBUG -				    ("%s: idle engine, freed all buffers.\n", -				     __FUNCTION__); -				if (list_empty(&dev_priv->free_list)) { -					DRM_ERROR -					    ("Freelist empty with idle engine\n"); -					return NULL; -				} +			ret = mach64_do_reclaim_completed(dev_priv); +			if (ret == 0)  				goto _freelist_entry_found; -			} -			/* Look for a completed buffer and bail out of the loop -			 * as soon as we find one -- don't waste time trying -			 * to free extra bufs here, leave that to do_release_used_buffers -			 */ -			list_for_each_safe(ptr, tmp, &dev_priv->pending) { -				entry = -				    list_entry(ptr, drm_mach64_freelist_t, -					       list); -				ofs = entry->ring_ofs; -				if (entry->discard && -				    ((head < tail -				      && (ofs < head || ofs >= tail)) -				     || (head > tail -					 && (ofs < head && ofs >= tail)))) { -#if MACH64_EXTRA_CHECKING -					int i; - -					for (i = head; i != tail; -					     i = (i + 4) & ring->tail_mask) { -						u32 o1 = -						    le32_to_cpu(((u32 *) ring-> -								 start)[i + 1]); -						u32 o2 = GETBUFADDR(entry->buf); - -						if (o1 == o2) { -							DRM_ERROR -							    ("Attempting to free used buffer: " -							     "i=%d  buf=0x%08x\n", -							     i, o1); -							mach64_dump_ring_info -							    (dev_priv); -							return NULL; -						} -					} -#endif -					/* found a processed buffer */ -					entry->buf->pending = 0; -					list_del(ptr); -					entry->buf->used = 0; -					list_add_tail(ptr, -						      &dev_priv->placeholders); -					DRM_DEBUG -					    ("%s: freed processed buffer (head=%d tail=%d " -					     "buf ring ofs=%d).\n", -					     __FUNCTION__, head, tail, ofs); -					return entry->buf; -				} -			} +			if (ret < 0) +				return NULL; +  			DRM_UDELAY(1);  		}  		mach64_dump_ring_info(dev_priv); @@ -1443,6 +1428,33 @@ drm_buf_t *mach64_freelist_get(drm_mach64_private_t * dev_priv)  	return entry->buf;  } +int mach64_freelist_put(drm_mach64_private_t * dev_priv, drm_buf_t * copy_buf) +{ +	struct list_head *ptr; +	drm_mach64_freelist_t *entry; + +#if MACH64_EXTRA_CHECKING +	list_for_each(ptr, &dev_priv->pending) { +		entry = list_entry(ptr, drm_mach64_freelist_t, list); +		if (copy_buf == entry->buf) { +			DRM_ERROR("%s: Trying to release a pending buf\n", +			     __FUNCTION__); +			return DRM_ERR(EFAULT); +		} +	} +#endif +	ptr = dev_priv->placeholders.next; +	entry = list_entry(ptr, drm_mach64_freelist_t, list); +	copy_buf->pending = 0; +	copy_buf->used = 0; +	entry->buf = copy_buf; +	entry->discard = 1; +	list_del(ptr); +	list_add_tail(ptr, &dev_priv->free_list); + +	return 0; +} +  /*@}*/ diff --git a/shared-core/mach64_drm.h b/shared-core/mach64_drm.h index 1fd8c002..083f959d 100644 --- a/shared-core/mach64_drm.h +++ b/shared-core/mach64_drm.h @@ -237,7 +237,7 @@ typedef struct drm_mach64_vertex {  } drm_mach64_vertex_t;  typedef struct drm_mach64_blit { -	int idx; +	void *buf;  	int pitch;  	int offset;  	int format; diff --git a/shared-core/mach64_drv.h b/shared-core/mach64_drv.h index 2a5f2ff9..bb8b309e 100644 --- a/shared-core/mach64_drv.h +++ b/shared-core/mach64_drv.h @@ -42,9 +42,9 @@  #define DRIVER_NAME		"mach64"  #define DRIVER_DESC		"DRM module for the ATI Rage Pro" -#define DRIVER_DATE		"20020904" +#define DRIVER_DATE		"20060718" -#define DRIVER_MAJOR		1 +#define DRIVER_MAJOR		2  #define DRIVER_MINOR		0  #define DRIVER_PATCHLEVEL	0 @@ -61,7 +61,6 @@ typedef struct drm_mach64_freelist {  } drm_mach64_freelist_t;  typedef struct drm_mach64_descriptor_ring { -	drm_dma_handle_t *dmah;	/* Handle to pci dma memory */  	void *start;		/* write pointer (cpu address) to start of descriptor ring */  	u32 start_addr;		/* bus address of beginning of descriptor ring */  	int size;		/* size of ring in bytes */ @@ -123,6 +122,8 @@ extern void mach64_driver_lastclose(drm_device_t * dev);  extern int mach64_init_freelist(drm_device_t * dev);  extern void mach64_destroy_freelist(drm_device_t * dev);  extern drm_buf_t *mach64_freelist_get(drm_mach64_private_t * dev_priv); +extern int mach64_freelist_put(drm_mach64_private_t * dev_priv, +			       drm_buf_t * copy_buf);  extern int mach64_do_wait_for_fifo(drm_mach64_private_t * dev_priv,  				   int entries); diff --git a/shared-core/mach64_state.c b/shared-core/mach64_state.c index ce44f0d5..38cefca9 100644 --- a/shared-core/mach64_state.c +++ b/shared-core/mach64_state.c @@ -480,16 +480,16 @@ static int mach64_do_get_frames_queued(drm_mach64_private_t * dev_priv)  /* Copy and verify a client submited buffer.   * FIXME: Make an assembly optimized version   */ -static __inline__ int copy_and_verify_from_user(u32 *to, -						const u32 __user *ufrom, -						unsigned long bytes) +static __inline__ int copy_from_user_vertex(u32 *to, +					    const u32 __user *ufrom, +					    unsigned long bytes)  {  	unsigned long n = bytes;	/* dwords remaining in buffer */  	u32 *from, *orig_from;  	from = drm_alloc(bytes, DRM_MEM_DRIVER);  	if (from == NULL) -		return ENOMEM; +		return DRM_ERR(ENOMEM);  	if (DRM_COPY_FROM_USER(from, ufrom, bytes)) {  		drm_free(from, bytes, DRM_MEM_DRIVER); @@ -546,12 +546,15 @@ static __inline__ int copy_and_verify_from_user(u32 *to,  }  static int mach64_dma_dispatch_vertex(DRMFILE filp, drm_device_t * dev, -				      int prim, void *buf, unsigned long used, -				      int discard) +				      drm_mach64_vertex_t * vertex)  {  	drm_mach64_private_t *dev_priv = dev->dev_private;  	drm_mach64_sarea_t *sarea_priv = dev_priv->sarea_priv;  	drm_buf_t *copy_buf; +	void *buf = vertex->buf; +	unsigned long used = vertex->used; +	int ret = 0; +	int i = 0;  	int done = 0;  	int verify_ret = 0;  	DMALOCALS; @@ -559,100 +562,92 @@ static int mach64_dma_dispatch_vertex(DRMFILE filp, drm_device_t * dev,  	DRM_DEBUG("%s: buf=%p used=%lu nbox=%d\n",  		  __FUNCTION__, buf, used, sarea_priv->nbox); -	if (used) { -		int ret = 0; -		int i = 0; +	if (!used) +		goto _vertex_done; -		copy_buf = mach64_freelist_get(dev_priv); -		if (copy_buf == NULL) { -			DRM_ERROR("%s: couldn't get buffer in DMAGETPTR\n", -				  __FUNCTION__); -			return DRM_ERR(EAGAIN); -		} +	copy_buf = mach64_freelist_get(dev_priv); +	if (copy_buf == NULL) { +		DRM_ERROR("%s: couldn't get buffer\n", __FUNCTION__); +		return DRM_ERR(EAGAIN); +	} + +	verify_ret = copy_from_user_vertex(GETBUFPTR(copy_buf), buf, used); -		if ((verify_ret = -		     copy_and_verify_from_user(GETBUFPTR(copy_buf), buf, -					       used)) == 0) { +	if (verify_ret != 0) { +		mach64_freelist_put(dev_priv, copy_buf); +		goto _vertex_done; +	} -			copy_buf->used = used; +	copy_buf->used = used; -			DMASETPTR(copy_buf); +	DMASETPTR(copy_buf); -			if (sarea_priv->dirty & ~MACH64_UPLOAD_CLIPRECTS) { -				ret = mach64_emit_state(filp, dev_priv); -				if (ret < 0) -					return ret; -			} +	if (sarea_priv->dirty & ~MACH64_UPLOAD_CLIPRECTS) { +		ret = mach64_emit_state(filp, dev_priv); +		if (ret < 0) +			return ret; +	} -			do { -				/* Emit the next cliprect */ -				if (i < sarea_priv->nbox) { -					ret = -					    mach64_emit_cliprect(filp, dev_priv, -								 &sarea_priv-> -								 boxes[i]); -					if (ret < 0) { -						/* failed to get buffer */ -						return ret; -					} else if (ret != 0) { -						/* null intersection with scissor */ -						continue; -					} -				} -				if ((i >= sarea_priv->nbox - 1)) -					done = 1; - -				/* Add the buffer to the DMA queue */ -				DMAADVANCE(dev_priv, done); - -			} while (++i < sarea_priv->nbox); +	do { +		/* Emit the next cliprect */ +		if (i < sarea_priv->nbox) { +			ret = mach64_emit_cliprect(filp, dev_priv, +						   &sarea_priv->boxes[i]); +			if (ret < 0) { +				/* failed to get buffer */ +				return ret; +			} else if (ret != 0) { +				/* null intersection with scissor */ +				continue; +			}  		} +		if ((i >= sarea_priv->nbox - 1)) +			done = 1; + +		/* Add the buffer to the DMA queue */ +		DMAADVANCE(dev_priv, done); + +	} while (++i < sarea_priv->nbox); -		if (copy_buf->pending && !done) { +	if (!done) { +		if (copy_buf->pending) {  			DMADISCARDBUF(); -		} else if (!done) { -			/* This buffer wasn't used (no cliprects or verify failed), so place it back -			 * on the free list +		} else { +			/* This buffer wasn't used (no cliprects), so place it +			 * back on the free list  			 */ -			struct list_head *ptr; -			drm_mach64_freelist_t *entry; -#if MACH64_EXTRA_CHECKING -			list_for_each(ptr, &dev_priv->pending) { -				entry = -				    list_entry(ptr, drm_mach64_freelist_t, -					       list); -				if (copy_buf == entry->buf) { -					DRM_ERROR -					    ("%s: Trying to release a pending buf\n", -					     __FUNCTION__); -					return DRM_ERR(EFAULT); -				} -			} -#endif -			ptr = dev_priv->placeholders.next; -			entry = list_entry(ptr, drm_mach64_freelist_t, list); -			copy_buf->pending = 0; -			copy_buf->used = 0; -			entry->buf = copy_buf; -			entry->discard = 1; -			list_del(ptr); -			list_add_tail(ptr, &dev_priv->free_list); +			mach64_freelist_put(dev_priv, copy_buf);  		}  	} +_vertex_done:  	sarea_priv->dirty &= ~MACH64_UPLOAD_CLIPRECTS;  	sarea_priv->nbox = 0;  	return verify_ret;  } +static __inline__ int copy_from_user_blit(u32 *to, +					  const u32 __user *ufrom, +					  unsigned long bytes) +{ +	to = (u32 *)((char *)to + MACH64_HOSTDATA_BLIT_OFFSET); + +	if (DRM_COPY_FROM_USER(to, ufrom, bytes)) { +		return DRM_ERR(EFAULT); +	} + +	return 0; +} +  static int mach64_dma_dispatch_blit(DRMFILE filp, drm_device_t * dev,  				    drm_mach64_blit_t * blit)  {  	drm_mach64_private_t *dev_priv = dev->dev_private; -	drm_device_dma_t *dma = dev->dma;  	int dword_shift, dwords; -	drm_buf_t *buf; +	unsigned long used; +	drm_buf_t *copy_buf; +	int verify_ret = 0;  	DMALOCALS;  	/* The compiler won't optimize away a division by a variable, @@ -679,34 +674,34 @@ static int mach64_dma_dispatch_blit(DRMFILE filp, drm_device_t * dev,  		return DRM_ERR(EINVAL);  	} -	/* Dispatch the blit buffer. -	 */ -	buf = dma->buflist[blit->idx]; - -	if (buf->filp != filp) { -		DRM_ERROR("process %d (filp %p) using buffer with filp %p\n", -			  DRM_CURRENTPID, filp, buf->filp); -		return DRM_ERR(EINVAL); -	} - -	if (buf->pending) { -		DRM_ERROR("sending pending buffer %d\n", blit->idx); -		return DRM_ERR(EINVAL); -	} -  	/* Set buf->used to the bytes of blit data based on the blit dimensions  	 * and verify the size.  When the setup is emitted to the buffer with  	 * the DMA* macros below, buf->used is incremented to include the bytes  	 * used for setup as well as the blit data.  	 */  	dwords = (blit->width * blit->height) >> dword_shift; -	buf->used = dwords << 2; -	if (buf->used <= 0 || -	    buf->used > MACH64_BUFFER_SIZE - MACH64_HOSTDATA_BLIT_OFFSET) { -		DRM_ERROR("Invalid blit size: %d bytes\n", buf->used); +	used = dwords << 2; +	if (used <= 0 || +	    used > MACH64_BUFFER_SIZE - MACH64_HOSTDATA_BLIT_OFFSET) { +		DRM_ERROR("Invalid blit size: %lu bytes\n", used);  		return DRM_ERR(EINVAL);  	} +	copy_buf = mach64_freelist_get(dev_priv); +	if (copy_buf == NULL) { +		DRM_ERROR("%s: couldn't get buffer\n", __FUNCTION__); +		return DRM_ERR(EAGAIN); +	} + +	verify_ret = copy_from_user_blit(GETBUFPTR(copy_buf), blit->buf, used); + +	if (verify_ret != 0) { +		mach64_freelist_put(dev_priv, copy_buf); +		goto _blit_done; +	} + +	copy_buf->used = used; +  	/* FIXME: Use a last buffer flag and reduce the state emitted for subsequent,  	 * continuation buffers?  	 */ @@ -715,7 +710,7 @@ static int mach64_dma_dispatch_blit(DRMFILE filp, drm_device_t * dev,  	 * a register command every 16 dwords.  State setup is added at the start of the  	 * buffer -- the client leaves space for this based on MACH64_HOSTDATA_BLIT_OFFSET  	 */ -	DMASETPTR(buf); +	DMASETPTR(copy_buf);  	DMAOUTREG(MACH64_Z_CNTL, 0);  	DMAOUTREG(MACH64_SCALE_3D_CNTL, 0); @@ -745,12 +740,13 @@ static int mach64_dma_dispatch_blit(DRMFILE filp, drm_device_t * dev,  	DMAOUTREG(MACH64_DST_X_Y, (blit->y << 16) | blit->x);  	DMAOUTREG(MACH64_DST_WIDTH_HEIGHT, (blit->height << 16) | blit->width); -	DRM_DEBUG("%s: %d bytes\n", __FUNCTION__, buf->used); +	DRM_DEBUG("%s: %lu bytes\n", __FUNCTION__, used);  	/* Add the buffer to the queue */  	DMAADVANCEHOSTDATA(dev_priv); -	return 0; +_blit_done: +	return verify_ret;  }  /* ================================================================ @@ -842,14 +838,12 @@ int mach64_dma_vertex(DRM_IOCTL_ARGS)  	if (sarea_priv->nbox > MACH64_NR_SAREA_CLIPRECTS)  		sarea_priv->nbox = MACH64_NR_SAREA_CLIPRECTS; -	return mach64_dma_dispatch_vertex(filp, dev, vertex.prim, vertex.buf, -					  vertex.used, vertex.discard); +	return mach64_dma_dispatch_vertex(filp, dev, &vertex);  }  int mach64_dma_blit(DRM_IOCTL_ARGS)  {  	DRM_DEVICE; -	drm_device_dma_t *dma = dev->dma;  	drm_mach64_private_t *dev_priv = dev->dev_private;  	drm_mach64_sarea_t *sarea_priv = dev_priv->sarea_priv;  	drm_mach64_blit_t blit; @@ -860,15 +854,6 @@ int mach64_dma_blit(DRM_IOCTL_ARGS)  	DRM_COPY_FROM_USER_IOCTL(blit, (drm_mach64_blit_t *) data,  				 sizeof(blit)); -	DRM_DEBUG("%s: pid=%d index=%d\n", -		  __FUNCTION__, DRM_CURRENTPID, blit.idx); - -	if (blit.idx < 0 || blit.idx >= dma->buf_count) { -		DRM_ERROR("buffer index %d (of %d max)\n", -			  blit.idx, dma->buf_count - 1); -		return DRM_ERR(EINVAL); -	} -  	ret = mach64_dma_dispatch_blit(filp, dev, &blit);  	/* Make sure we restore the 3D state next time. diff --git a/shared-core/radeon_cp.c b/shared-core/radeon_cp.c index 4e7b2823..4135f4d5 100644 --- a/shared-core/radeon_cp.c +++ b/shared-core/radeon_cp.c @@ -1130,7 +1130,7 @@ static void radeon_cp_init_ring_buffer(drm_device_t * dev,  			     | (dev_priv->fb_location >> 16));  #if __OS_HAS_AGP -	if (dev_priv->flags & CHIP_IS_AGP) { +	if (dev_priv->flags & RADEON_IS_AGP) {  		RADEON_WRITE(RADEON_AGP_BASE, (unsigned int)dev->agp->base);  		RADEON_WRITE(RADEON_MC_AGP_LOCATION,  			     (((dev_priv->gart_vm_start - 1 + @@ -1158,7 +1158,7 @@ static void radeon_cp_init_ring_buffer(drm_device_t * dev,  	dev_priv->ring.tail = cur_read_ptr;  #if __OS_HAS_AGP -	if (dev_priv->flags & CHIP_IS_AGP) { +	if (dev_priv->flags & RADEON_IS_AGP) {  		RADEON_WRITE(RADEON_CP_RB_RPTR_ADDR,  			     dev_priv->ring_rptr->offset  			     - dev->agp->base + dev_priv->gart_vm_start); @@ -1301,7 +1301,7 @@ static void radeon_set_pcigart(drm_radeon_private_t * dev_priv, int on)  {  	u32 tmp; -	if (dev_priv->flags & CHIP_IS_PCIE) { +	if (dev_priv->flags & RADEON_IS_PCIE) {  		radeon_set_pciegart(dev_priv, on);  		return;  	} @@ -1339,26 +1339,26 @@ static int radeon_do_init_cp(drm_device_t * dev, drm_radeon_init_t * init)  	DRM_DEBUG("\n");  	/* if we require new memory map but we don't have it fail */ -	if ((dev_priv->flags & CHIP_NEW_MEMMAP) && !dev_priv->new_memmap) +	if ((dev_priv->flags & RADEON_NEW_MEMMAP) && !dev_priv->new_memmap)  	{  		DRM_ERROR("Cannot initialise DRM on this card\nThis card requires a new X.org DDX for 3D\n");  		radeon_do_cleanup_cp(dev);  		return DRM_ERR(EINVAL);  	} -	if (init->is_pci && (dev_priv->flags & CHIP_IS_AGP)) +	if (init->is_pci && (dev_priv->flags & RADEON_IS_AGP))  	{  		DRM_DEBUG("Forcing AGP card to PCI mode\n"); -		dev_priv->flags &= ~CHIP_IS_AGP; +		dev_priv->flags &= ~RADEON_IS_AGP;  	} -	else if (!(dev_priv->flags & (CHIP_IS_AGP | CHIP_IS_PCI | CHIP_IS_PCIE)) +	else if (!(dev_priv->flags & (RADEON_IS_AGP | RADEON_IS_PCI | RADEON_IS_PCIE))  		 && !init->is_pci)  	{  		DRM_DEBUG("Restoring AGP flag\n"); -		dev_priv->flags |= CHIP_IS_AGP; +		dev_priv->flags |= RADEON_IS_AGP;  	} -	if ((!(dev_priv->flags & CHIP_IS_AGP)) && !dev->sg) { +	if ((!(dev_priv->flags & RADEON_IS_AGP)) && !dev->sg) {  		DRM_ERROR("PCI GART memory not allocated!\n");  		radeon_do_cleanup_cp(dev);  		return DRM_ERR(EINVAL); @@ -1501,7 +1501,7 @@ static int radeon_do_init_cp(drm_device_t * dev, drm_radeon_init_t * init)  				    init->sarea_priv_offset);  #if __OS_HAS_AGP -	if (dev_priv->flags & CHIP_IS_AGP) { +	if (dev_priv->flags & RADEON_IS_AGP) {  		drm_core_ioremap(dev_priv->cp_ring, dev);  		drm_core_ioremap(dev_priv->ring_rptr, dev);  		drm_core_ioremap(dev->agp_buffer_map, dev); @@ -1560,7 +1560,7 @@ static int radeon_do_init_cp(drm_device_t * dev, drm_radeon_init_t * init)  		 * align it down.  		 */  #if __OS_HAS_AGP -		if (dev_priv->flags & CHIP_IS_AGP) { +		if (dev_priv->flags & RADEON_IS_AGP) {  			base = dev->agp->base;  			/* Check if valid */  			if ((base + dev_priv->gart_size) > dev_priv->fb_location && @@ -1590,7 +1590,7 @@ static int radeon_do_init_cp(drm_device_t * dev, drm_radeon_init_t * init)  	}  #if __OS_HAS_AGP -	if (dev_priv->flags & CHIP_IS_AGP) +	if (dev_priv->flags & RADEON_IS_AGP)  		dev_priv->gart_buffers_offset = (dev->agp_buffer_map->offset  						 - dev->agp->base  						 + dev_priv->gart_vm_start); @@ -1616,7 +1616,7 @@ static int radeon_do_init_cp(drm_device_t * dev, drm_radeon_init_t * init)  	dev_priv->ring.high_mark = RADEON_RING_HIGH_MARK;  #if __OS_HAS_AGP -	if (dev_priv->flags & CHIP_IS_AGP) { +	if (dev_priv->flags & RADEON_IS_AGP) {  		/* Turn off PCI GART */  		radeon_set_pcigart(dev_priv, 0);  	} else @@ -1636,7 +1636,7 @@ static int radeon_do_init_cp(drm_device_t * dev, drm_radeon_init_t * init)  			    dev_priv->gart_info.mapping.handle;  			dev_priv->gart_info.is_pcie = -			    !!(dev_priv->flags & CHIP_IS_PCIE); +			    !!(dev_priv->flags & RADEON_IS_PCIE);  			dev_priv->gart_info.gart_table_location =  			    DRM_ATI_GART_FB; @@ -1648,7 +1648,7 @@ static int radeon_do_init_cp(drm_device_t * dev, drm_radeon_init_t * init)  			    DRM_ATI_GART_MAIN;  			dev_priv->gart_info.addr = NULL;  			dev_priv->gart_info.bus_addr = 0; -			if (dev_priv->flags & CHIP_IS_PCIE) { +			if (dev_priv->flags & RADEON_IS_PCIE) {  				DRM_ERROR  				    ("Cannot use PCI Express without GART in FB memory\n");  				radeon_do_cleanup_cp(dev); @@ -1690,7 +1690,7 @@ static int radeon_do_cleanup_cp(drm_device_t * dev)  		drm_irq_uninstall(dev);  #if __OS_HAS_AGP -	if (dev_priv->flags & CHIP_IS_AGP) { +	if (dev_priv->flags & RADEON_IS_AGP) {  		if (dev_priv->cp_ring != NULL) {  			drm_core_ioremapfree(dev_priv->cp_ring, dev);  			dev_priv->cp_ring = NULL; @@ -1745,7 +1745,7 @@ static int radeon_do_resume_cp(drm_device_t * dev)  	DRM_DEBUG("Starting radeon_do_resume_cp()\n");  #if __OS_HAS_AGP -	if (dev_priv->flags & CHIP_IS_AGP) { +	if (dev_priv->flags & RADEON_IS_AGP) {  		/* Turn off PCI GART */  		radeon_set_pcigart(dev_priv, 0);  	} else @@ -2194,7 +2194,7 @@ int radeon_driver_load(struct drm_device *dev, unsigned long flags)  	dev->dev_private = (void *)dev_priv;  	dev_priv->flags = flags; -	switch (flags & CHIP_FAMILY_MASK) { +	switch (flags & RADEON_FAMILY_MASK) {  	case CHIP_R100:  	case CHIP_RV200:  	case CHIP_R200: @@ -2202,7 +2202,7 @@ int radeon_driver_load(struct drm_device *dev, unsigned long flags)  	case CHIP_R350:  	case CHIP_R420:  	case CHIP_RV410: -		dev_priv->flags |= CHIP_HAS_HIERZ; +		dev_priv->flags |= RADEON_HAS_HIERZ;  		break;  	default:  		/* all other chips have no hierarchical z buffer */ @@ -2210,14 +2210,14 @@ int radeon_driver_load(struct drm_device *dev, unsigned long flags)  	}  	if (drm_device_is_agp(dev)) -		dev_priv->flags |= CHIP_IS_AGP; +		dev_priv->flags |= RADEON_IS_AGP;  	else if (drm_device_is_pcie(dev)) -		dev_priv->flags |= CHIP_IS_PCIE; +		dev_priv->flags |= RADEON_IS_PCIE;  	else -		dev_priv->flags |= CHIP_IS_PCI; +		dev_priv->flags |= RADEON_IS_PCI;  	DRM_DEBUG("%s card detected\n", -		  ((dev_priv->flags & CHIP_IS_AGP) ? "AGP" : (((dev_priv->flags & CHIP_IS_PCIE) ? "PCIE" : "PCI")))); +		  ((dev_priv->flags & RADEON_IS_AGP) ? "AGP" : (((dev_priv->flags & RADEON_IS_PCIE) ? "PCIE" : "PCI"))));  	return ret;  } diff --git a/shared-core/radeon_drv.h b/shared-core/radeon_drv.h index 5fa8254a..6ea2a175 100644 --- a/shared-core/radeon_drv.h +++ b/shared-core/radeon_drv.h @@ -134,16 +134,16 @@ enum radeon_cp_microcode_version {   * Chip flags   */  enum radeon_chip_flags { -	CHIP_FAMILY_MASK = 0x0000ffffUL, -	CHIP_FLAGS_MASK = 0xffff0000UL, -	CHIP_IS_MOBILITY = 0x00010000UL, -	CHIP_IS_IGP = 0x00020000UL, -	CHIP_SINGLE_CRTC = 0x00040000UL, -	CHIP_IS_AGP = 0x00080000UL, -	CHIP_HAS_HIERZ = 0x00100000UL, -	CHIP_IS_PCIE = 0x00200000UL, -	CHIP_NEW_MEMMAP = 0x00400000UL, -	CHIP_IS_PCI = 0x00800000UL, +	RADEON_FAMILY_MASK = 0x0000ffffUL, +	RADEON_FLAGS_MASK = 0xffff0000UL, +	RADEON_IS_MOBILITY = 0x00010000UL, +	RADEON_IS_IGP = 0x00020000UL, +	RADEON_SINGLE_CRTC = 0x00040000UL, +	RADEON_IS_AGP = 0x00080000UL, +	RADEON_HAS_HIERZ = 0x00100000UL, +	RADEON_IS_PCIE = 0x00200000UL, +	RADEON_NEW_MEMMAP = 0x00400000UL, +	RADEON_IS_PCI = 0x00800000UL,  };  #define GET_RING_HEAD(dev_priv)	(dev_priv->writeback_works ? \ @@ -423,6 +423,8 @@ extern int r300_do_cp_cmdbuf(drm_device_t *dev, DRMFILE filp,  #define RADEON_RB3D_COLOROFFSET		0x1c40  #define RADEON_RB3D_COLORPITCH		0x1c48 +#define	RADEON_SRC_X_Y			0x1590 +  #define RADEON_DP_GUI_MASTER_CNTL	0x146c  #	define RADEON_GMC_SRC_PITCH_OFFSET_CNTL	(1 << 0)  #	define RADEON_GMC_DST_PITCH_OFFSET_CNTL	(1 << 1) @@ -440,6 +442,7 @@ extern int r300_do_cp_cmdbuf(drm_device_t *dev, DRMFILE filp,  #	define RADEON_ROP3_S			0x00cc0000  #	define RADEON_ROP3_P			0x00f00000  #define RADEON_DP_WRITE_MASK		0x16cc +#define RADEON_SRC_PITCH_OFFSET		0x1428  #define RADEON_DST_PITCH_OFFSET		0x142c  #define RADEON_DST_PITCH_OFFSET_C	0x1c80  #	define RADEON_DST_TILE_LINEAR		(0 << 30) diff --git a/shared-core/radeon_state.c b/shared-core/radeon_state.c index 8c1a4065..b4478019 100644 --- a/shared-core/radeon_state.c +++ b/shared-core/radeon_state.c @@ -174,6 +174,14 @@ static __inline__ int radeon_check_and_fixup_packets(drm_radeon_private_t *  		}  		break; +	case R200_EMIT_VAP_CTL: { +			RING_LOCALS; +			BEGIN_RING(2); +			OUT_RING_REG(RADEON_SE_TCL_STATE_FLUSH, 0); +			ADVANCE_RING(); +		} +		break; +  	case RADEON_EMIT_RB3D_COLORPITCH:  	case RADEON_EMIT_RE_LINE_PATTERN:  	case RADEON_EMIT_SE_LINE_WIDTH: @@ -201,7 +209,6 @@ static __inline__ int radeon_check_and_fixup_packets(drm_radeon_private_t *  	case R200_EMIT_TCL_LIGHT_MODEL_CTL_0:  	case R200_EMIT_TFACTOR_0:  	case R200_EMIT_VTX_FMT_0: -	case R200_EMIT_VAP_CTL:  	case R200_EMIT_MATRIX_SELECT_0:  	case R200_EMIT_TEX_PROC_CTL_2:  	case R200_EMIT_TCL_UCP_VERT_BLEND_CTL: @@ -861,7 +868,7 @@ static void radeon_cp_dispatch_clear(drm_device_t * dev,  		 */  		dev_priv->sarea_priv->ctx_owner = 0; -		if ((dev_priv->flags & CHIP_HAS_HIERZ) +		if ((dev_priv->flags & RADEON_HAS_HIERZ)  		    && (flags & RADEON_USE_HIERZ)) {  			/* FIXME : reverse engineer that for Rx00 cards */  			/* FIXME : the mask supposedly contains low-res z values. So can't set @@ -906,7 +913,7 @@ static void radeon_cp_dispatch_clear(drm_device_t * dev,  		for (i = 0; i < nbox; i++) {  			int tileoffset, nrtilesx, nrtilesy, j;  			/* it looks like r200 needs rv-style clears, at least if hierz is not enabled? */ -			if ((dev_priv->flags & CHIP_HAS_HIERZ) +			if ((dev_priv->flags & RADEON_HAS_HIERZ)  			    && !(dev_priv->microcode_version == UCODE_R200)) {  				/* FIXME : figure this out for r200 (when hierz is enabled). Or  				   maybe r200 actually doesn't need to put the low-res z value into @@ -990,7 +997,7 @@ static void radeon_cp_dispatch_clear(drm_device_t * dev,  		}  		/* TODO don't always clear all hi-level z tiles */ -		if ((dev_priv->flags & CHIP_HAS_HIERZ) +		if ((dev_priv->flags & RADEON_HAS_HIERZ)  		    && (dev_priv->microcode_version == UCODE_R200)  		    && (flags & RADEON_USE_HIERZ))  			/* r100 and cards without hierarchical z-buffer have no high-level z-buffer */ @@ -1262,9 +1269,9 @@ static void radeon_cp_dispatch_swap(drm_device_t * dev)  		DRM_DEBUG("dispatch swap %d,%d-%d,%d\n", x, y, w, h); -		BEGIN_RING(7); +		BEGIN_RING(9); -		OUT_RING(CP_PACKET3(RADEON_CNTL_BITBLT_MULTI, 5)); +		OUT_RING(CP_PACKET0(RADEON_DP_GUI_MASTER_CNTL, 0));  		OUT_RING(RADEON_GMC_SRC_PITCH_OFFSET_CNTL |  			 RADEON_GMC_DST_PITCH_OFFSET_CNTL |  			 RADEON_GMC_BRUSH_NONE | @@ -1276,6 +1283,7 @@ static void radeon_cp_dispatch_swap(drm_device_t * dev)  		/* Make this work even if front & back are flipped:  		 */ +		OUT_RING(CP_PACKET0(RADEON_SRC_PITCH_OFFSET, 1));  		if (dev_priv->current_page == 0) {  			OUT_RING(dev_priv->back_pitch_offset);  			OUT_RING(dev_priv->front_pitch_offset); @@ -1284,6 +1292,7 @@ static void radeon_cp_dispatch_swap(drm_device_t * dev)  			OUT_RING(dev_priv->back_pitch_offset);  		} +		OUT_RING(CP_PACKET0(RADEON_SRC_X_Y, 2));  		OUT_RING((x << 16) | y);  		OUT_RING((x << 16) | y);  		OUT_RING((w << 16) | h); @@ -3031,9 +3040,9 @@ static int radeon_cp_getparam(DRM_IOCTL_ARGS)  		break;  	case RADEON_PARAM_CARD_TYPE: -		if (dev_priv->flags & CHIP_IS_PCIE) +		if (dev_priv->flags & RADEON_IS_PCIE)  			value = RADEON_CARD_PCIE; -		else if (dev_priv->flags & CHIP_IS_AGP) +		else if (dev_priv->flags & RADEON_IS_AGP)  			value = RADEON_CARD_AGP;  		else  			value = RADEON_CARD_PCI; | 
