diff --git a/shared-core/radeon_cp.c b/shared-core/radeon_cp.c index 0864c3e..c807c6a 100644 --- a/shared-core/radeon_cp.c +++ b/shared-core/radeon_cp.c @@ -926,8 +926,13 @@ static void rs600_set_igpgart(drm_radeon_private_t * dev_priv, int on) (long)dev_priv->gart_info.bus_addr, dev_priv->gart_size); - temp = IGP_READ_MCIND(dev_priv, RS600_MC_PT0_CNTL); + /* setup the aperture */ + IGP_WRITE_MCIND(RS600_MC_PT0_SYSTEM_APERTURE_LOW_ADDR, + dev_priv->gart_vm_start >> 12); + IGP_WRITE_MCIND(RS600_MC_PT0_SYSTEM_APERTURE_HIGH_ADDR, + (dev_priv->gart_vm_start + dev_priv->gart_size - 1) >> 12); + temp = IGP_READ_MCIND(dev_priv, RS600_MC_PT0_CNTL); IGP_WRITE_MCIND(RS600_MC_PT0_CNTL, (RS600_EFFECTIVE_L2_CACHE_SIZE(6) | RS600_EFFECTIVE_L2_QUEUE_SIZE(6))); @@ -935,14 +940,19 @@ static void rs600_set_igpgart(drm_radeon_private_t * dev_priv, int on) for (i = 0; i < 19; i++) IGP_WRITE_MCIND(RS600_MC_PT0_CLIENT0_CNTL + i, (RS600_ENABLE_TRANSLATION_MODE_OVERRIDE | - RS600_SYSTEM_ACCESS_MODE(0) | //??? + RS600_SYSTEM_ACCESS_MODE_IN_SYS | RS600_SYSTEM_APERTURE_UNMAPPED_ACCESS_PASSTHROUGH | RS600_EFFECTIVE_L1_CACHE_SIZE(3) | + RS600_ENABLE_FRAGMENT_PROCESSING | RS600_EFFECTIVE_L1_QUEUE_SIZE(3))); IGP_WRITE_MCIND(RS600_MC_PT0_CONTEXT0_CNTL, (RS600_ENABLE_PAGE_TABLE | RS600_PAGE_TABLE_TYPE_FLAT)); + /* disable all other contexts */ + for (i = 1; i < 8; i++) + IGP_WRITE_MCIND(RS600_MC_PT0_CONTEXT0_CNTL + i, 0); + IGP_WRITE_MCIND(RS600_MC_PT0_CONTEXT0_FLAT_BASE_ADDR, dev_priv->gart_info.bus_addr >> 12); IGP_WRITE_MCIND(RS600_MC_PT0_CONTEXT0_FLAT_START_ADDR, @@ -951,36 +961,27 @@ static void rs600_set_igpgart(drm_radeon_private_t * dev_priv, int on) (dev_priv->gart_vm_start + dev_priv->gart_size - 1) >> 12); IGP_WRITE_MCIND(RS600_MC_PT0_CONTEXT0_DEFAULT_READ_ADDR, 0); - temp = IGP_READ_MCIND(dev_priv, RS600_MC_FB_LOCATION); - IGP_WRITE_MCIND(RS600_MC_PT0_SYSTEM_APERTURE_LOW_ADDR, - dev_priv->gart_vm_start >> 12); - IGP_WRITE_MCIND(RS600_MC_PT0_SYSTEM_APERTURE_HIGH_ADDR, - (dev_priv->gart_vm_start + dev_priv->gart_size - 1) >> 12); - + /* enable page tables */ temp = IGP_READ_MCIND(dev_priv, RS600_MC_PT0_CNTL); IGP_WRITE_MCIND(RS600_MC_PT0_CNTL, (temp | RS600_ENABLE_PT)); temp = IGP_READ_MCIND(dev_priv, RS600_MC_CNTL1); IGP_WRITE_MCIND(RS600_MC_CNTL1, (temp | RS600_ENABLE_PAGE_TABLES)); - do { - temp = IGP_READ_MCIND(dev_priv, RS600_MC_PT0_CNTL); - if ((temp & (RS600_INVALIDATE_ALL_L1_TLBS | RS600_INVALIDATE_L2_CACHE)) == 0) - break; - DRM_UDELAY(1); - } while(1); + /* invalidate the cache */ + temp = IGP_READ_MCIND(dev_priv, RS600_MC_PT0_CNTL); + temp &= ~(RS600_INVALIDATE_ALL_L1_TLBS | RS600_INVALIDATE_L2_CACHE); + IGP_WRITE_MCIND(RS600_MC_PT0_CNTL, temp); temp = IGP_READ_MCIND(dev_priv, RS600_MC_PT0_CNTL); - IGP_WRITE_MCIND(RS600_MC_PT0_CNTL, (temp | - RS600_INVALIDATE_ALL_L1_TLBS | - RS600_INVALIDATE_L2_CACHE)); - do { - temp = IGP_READ_MCIND(dev_priv, RS600_MC_PT0_CNTL); - if ((temp & (RS600_INVALIDATE_ALL_L1_TLBS | RS600_INVALIDATE_L2_CACHE)) == 0) - break; - DRM_UDELAY(1); - } while(1); + temp |= RS600_INVALIDATE_ALL_L1_TLBS | RS600_INVALIDATE_L2_CACHE; + IGP_WRITE_MCIND(RS600_MC_PT0_CNTL, temp); + temp = IGP_READ_MCIND(dev_priv, RS600_MC_PT0_CNTL); + + temp &= ~(RS600_INVALIDATE_ALL_L1_TLBS | RS600_INVALIDATE_L2_CACHE); + IGP_WRITE_MCIND(RS600_MC_PT0_CNTL, temp); + temp = IGP_READ_MCIND(dev_priv, RS600_MC_PT0_CNTL); } else { IGP_WRITE_MCIND(RS600_MC_PT0_CNTL, 0); diff --git a/shared-core/radeon_drv.h b/shared-core/radeon_drv.h index 212c3be..300cb06 100644 --- a/shared-core/radeon_drv.h +++ b/shared-core/radeon_drv.h @@ -631,11 +631,17 @@ int r600_page_table_init(struct drm_device *dev); #define RS600_MC_PT0_CONTEXT0_FLAT_START_ADDR 0x13c #define RS600_MC_PT0_CONTEXT0_FLAT_END_ADDR 0x14c #define RS600_MC_PT0_CLIENT0_CNTL 0x16c -# define RS600_ENABLE_TRANSLATION_MODE_OVERRIDE (1 << 0) -# define RS600_TRANSLATION_MODE_OVERRIDE (1 << 1) -# define RS600_SYSTEM_ACCESS_MODE(x) ((x) << 8) +# define RS600_ENABLE_TRANSLATION_MODE_OVERRIDE (1 << 0) +# define RS600_TRANSLATION_MODE_OVERRIDE (1 << 1) +# define RS600_SYSTEM_ACCESS_MODE_MASK (3 << 8) +# define RS600_SYSTEM_ACCESS_MODE_PA_ONLY (0 << 8) +# define RS600_SYSTEM_ACCESS_MODE_USE_SYS_MAP (1 << 8) +# define RS600_SYSTEM_ACCESS_MODE_IN_SYS (2 << 8) +# define RS600_SYSTEM_ACCESS_MODE_NOT_IN_SYS (3 << 8) # define RS600_SYSTEM_APERTURE_UNMAPPED_ACCESS_PASSTHROUGH (0 << 10) +# define RS600_SYSTEM_APERTURE_UNMAPPED_ACCESS_DEFAULT_PAGE (1 << 10) # define RS600_EFFECTIVE_L1_CACHE_SIZE(x) ((x) << 11) +# define RS600_ENABLE_FRAGMENT_PROCESSING (1 << 14) # define RS600_EFFECTIVE_L1_QUEUE_SIZE(x) ((x) << 15) # define RS600_INVALIDATE_L1_TLB (1 << 20)