diff options
| -rw-r--r-- | shared-core/drm_pciids.txt | 5 | ||||
| -rw-r--r-- | shared-core/radeon_cp.c | 108 | ||||
| -rw-r--r-- | shared-core/radeon_drv.h | 20 | 
3 files changed, 95 insertions, 38 deletions
| diff --git a/shared-core/drm_pciids.txt b/shared-core/drm_pciids.txt index 05d32f2e..5ba7da2a 100644 --- a/shared-core/drm_pciids.txt +++ b/shared-core/drm_pciids.txt @@ -135,6 +135,11 @@  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 0x7104 CHIP_R520|RADEON_NEW_MEMMAP "ATI FireGL V7200" +0x1002 0x7142 CHIP_RV515|RADEON_NEW_MEMMAP "ATI Radeon RV515 X1300" +0x1002 0x7183 CHIP_RV515|RADEON_NEW_MEMMAP "ATI Radeon RV515 X1550 Pro" +0x1002 0x7249 CHIP_R580|RADEON_NEW_MEMMAP "ATI Radeon R580 X1900XTX" +0x1002 0x7280 CHIP_RV570|RADEON_NEW_MEMMAP "ATI Radeon X1950 Pro"  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" diff --git a/shared-core/radeon_cp.c b/shared-core/radeon_cp.c index 8f95a077..518b2e75 100644 --- a/shared-core/radeon_cp.c +++ b/shared-core/radeon_cp.c @@ -816,19 +816,44 @@ static const u32 R300_cp_microcode[][2] = {  	{ 0000000000, 0000000000 },  }; +static u32 RADEON_READ_MCIND(drm_radeon_private_t *dev_priv, int addr) +{ +	u32 ret; +	RADEON_WRITE(R520_MC_IND_INDEX, 0x7f0000 | (addr & 0xff)); +	ret = RADEON_READ(R520_MC_IND_DATA); +	RADEON_WRITE(R520_MC_IND_INDEX, 0); +	return ret; +} +  u32 radeon_read_fb_location(drm_radeon_private_t *dev_priv)  { -	return RADEON_READ(RADEON_MC_FB_LOCATION); +	 +	if ((dev_priv->flags & RADEON_FAMILY_MASK) == CHIP_RV515) +		return RADEON_READ_MCIND(dev_priv, RV515_MC_FB_LOCATION); +	else if ((dev_priv->flags & RADEON_FAMILY_MASK) > CHIP_RV515) +		return RADEON_READ_MCIND(dev_priv, R520_MC_FB_LOCATION); +	else +		return RADEON_READ(RADEON_MC_FB_LOCATION);  }  static void radeon_write_fb_location(drm_radeon_private_t *dev_priv, u32 fb_loc)  { -	RADEON_WRITE(RADEON_MC_FB_LOCATION, fb_loc); +	if ((dev_priv->flags & RADEON_FAMILY_MASK) == CHIP_RV515) +		RADEON_WRITE_MCIND(RV515_MC_FB_LOCATION, fb_loc); +	else if ((dev_priv->flags & RADEON_FAMILY_MASK) > CHIP_RV515) +		RADEON_WRITE_MCIND(R520_MC_FB_LOCATION, fb_loc); +	else +		RADEON_WRITE(RADEON_MC_FB_LOCATION, fb_loc);  }  static void radeon_write_agp_location(drm_radeon_private_t *dev_priv, u32 agp_loc)  { -	RADEON_WRITE(RADEON_MC_AGP_LOCATION, agp_loc); +	if ((dev_priv->flags & RADEON_FAMILY_MASK) == CHIP_RV515) +		RADEON_WRITE_MCIND(RV515_MC_AGP_LOCATION, agp_loc); +	else if ((dev_priv->flags & RADEON_FAMILY_MASK) > CHIP_RV515) +		RADEON_WRITE_MCIND(R520_MC_AGP_LOCATION, agp_loc); +	else +		RADEON_WRITE(RADEON_MC_AGP_LOCATION, agp_loc);  }  static int RADEON_READ_PLL(struct drm_device * dev, int addr) @@ -1089,42 +1114,45 @@ static int radeon_do_engine_reset(struct drm_device * dev)  	radeon_do_pixcache_flush(dev_priv); -	clock_cntl_index = RADEON_READ(RADEON_CLOCK_CNTL_INDEX); -	mclk_cntl = RADEON_READ_PLL(dev, RADEON_MCLK_CNTL); - -	RADEON_WRITE_PLL(RADEON_MCLK_CNTL, (mclk_cntl | -					    RADEON_FORCEON_MCLKA | -					    RADEON_FORCEON_MCLKB | -					    RADEON_FORCEON_YCLKA | -					    RADEON_FORCEON_YCLKB | -					    RADEON_FORCEON_MC | -					    RADEON_FORCEON_AIC)); - -	rbbm_soft_reset = RADEON_READ(RADEON_RBBM_SOFT_RESET); - -	RADEON_WRITE(RADEON_RBBM_SOFT_RESET, (rbbm_soft_reset | -					      RADEON_SOFT_RESET_CP | -					      RADEON_SOFT_RESET_HI | -					      RADEON_SOFT_RESET_SE | -					      RADEON_SOFT_RESET_RE | -					      RADEON_SOFT_RESET_PP | -					      RADEON_SOFT_RESET_E2 | -					      RADEON_SOFT_RESET_RB)); -	RADEON_READ(RADEON_RBBM_SOFT_RESET); -	RADEON_WRITE(RADEON_RBBM_SOFT_RESET, (rbbm_soft_reset & -					      ~(RADEON_SOFT_RESET_CP | -						RADEON_SOFT_RESET_HI | -						RADEON_SOFT_RESET_SE | -						RADEON_SOFT_RESET_RE | -						RADEON_SOFT_RESET_PP | -						RADEON_SOFT_RESET_E2 | -						RADEON_SOFT_RESET_RB))); -	RADEON_READ(RADEON_RBBM_SOFT_RESET); - -	RADEON_WRITE_PLL(RADEON_MCLK_CNTL, mclk_cntl); -	RADEON_WRITE(RADEON_CLOCK_CNTL_INDEX, clock_cntl_index); -	RADEON_WRITE(RADEON_RBBM_SOFT_RESET, rbbm_soft_reset); +	if (dev_priv->flags & RADEON_FAMILY_MASK < CHIP_RV515) { +		clock_cntl_index = RADEON_READ(RADEON_CLOCK_CNTL_INDEX); +		mclk_cntl = RADEON_READ_PLL(dev, RADEON_MCLK_CNTL); +		 +		RADEON_WRITE_PLL(RADEON_MCLK_CNTL, (mclk_cntl | +						    RADEON_FORCEON_MCLKA | +						    RADEON_FORCEON_MCLKB | +						    RADEON_FORCEON_YCLKA | +						    RADEON_FORCEON_YCLKB | +						    RADEON_FORCEON_MC | +						    RADEON_FORCEON_AIC)); +		 +		rbbm_soft_reset = RADEON_READ(RADEON_RBBM_SOFT_RESET); +		 +		RADEON_WRITE(RADEON_RBBM_SOFT_RESET, (rbbm_soft_reset | +						      RADEON_SOFT_RESET_CP | +						      RADEON_SOFT_RESET_HI | +						      RADEON_SOFT_RESET_SE | +						      RADEON_SOFT_RESET_RE | +						      RADEON_SOFT_RESET_PP | +						      RADEON_SOFT_RESET_E2 | +						      RADEON_SOFT_RESET_RB)); +		RADEON_READ(RADEON_RBBM_SOFT_RESET); +		RADEON_WRITE(RADEON_RBBM_SOFT_RESET, (rbbm_soft_reset & +						      ~(RADEON_SOFT_RESET_CP | +							RADEON_SOFT_RESET_HI | +							RADEON_SOFT_RESET_SE | +							RADEON_SOFT_RESET_RE | +							RADEON_SOFT_RESET_PP | +							RADEON_SOFT_RESET_E2 | +							RADEON_SOFT_RESET_RB))); +		RADEON_READ(RADEON_RBBM_SOFT_RESET); +		 +		RADEON_WRITE_PLL(RADEON_MCLK_CNTL, mclk_cntl); +		RADEON_WRITE(RADEON_CLOCK_CNTL_INDEX, clock_cntl_index); +		RADEON_WRITE(RADEON_RBBM_SOFT_RESET, rbbm_soft_reset); +	} +reset_cp:  	/* Reset the CP ring */  	radeon_do_cp_reset(dev_priv); @@ -2273,6 +2301,10 @@ int radeon_driver_load(struct drm_device *dev, unsigned long flags)  	case CHIP_R350:  	case CHIP_R420:  	case CHIP_RV410: +	case CHIP_RV515: +	case CHIP_R520: +	case CHIP_RV570: +	case CHIP_R580:  		dev_priv->flags |= RADEON_HAS_HIERZ;  		break;  	default: diff --git a/shared-core/radeon_drv.h b/shared-core/radeon_drv.h index 18a297ca..375e139d 100644 --- a/shared-core/radeon_drv.h +++ b/shared-core/radeon_drv.h @@ -124,6 +124,10 @@ enum radeon_family {  	CHIP_R420,  	CHIP_RV410,  	CHIP_RS400, +	CHIP_RV515, +	CHIP_R520, +	CHIP_RV570, +	CHIP_R580,  	CHIP_LAST,  }; @@ -462,6 +466,15 @@ extern int r300_do_cp_cmdbuf(struct drm_device *dev,  #define RADEON_IGPGART_ENABLE           0x38  #define RADEON_IGPGART_UNK_39           0x39 +#define R520_MC_IND_INDEX 0x70 +#define R520_MC_IND_WR_EN (1<<24) +#define R520_MC_IND_DATA  0x74 + +#define RV515_MC_FB_LOCATION 0x01 +#define RV515_MC_AGP_LOCATION 0x02 + +#define R520_MC_FB_LOCATION 0x04 +#define R520_MC_AGP_LOCATION 0x05  #define RADEON_MPP_TB_CONFIG		0x01c0  #define RADEON_MEM_CNTL			0x0140 @@ -1085,6 +1098,13 @@ do {									\  	RADEON_WRITE( RADEON_PCIE_DATA, (val) );			\  } while (0) +#define RADEON_WRITE_MCIND( addr, val )					\ +	do {								\ +		RADEON_WRITE(R520_MC_IND_INDEX, 0xff0000 | ((addr) & 0xff));	\ +		RADEON_WRITE(R520_MC_IND_DATA, (val));			\ +		RADEON_WRITE(R520_MC_IND_INDEX, 0);	\ +	} while (0) +  #define CP_PACKET0( reg, n )						\  	(RADEON_CP_PACKET0 | ((n) << 16) | ((reg) >> 2))  #define CP_PACKET0_TABLE( reg, n )					\ | 
