diff options
Diffstat (limited to 'drivers/gpu/drm/radeon/r600.c')
| -rw-r--r-- | drivers/gpu/drm/radeon/r600.c | 62 |
1 files changed, 51 insertions, 11 deletions
diff --git a/drivers/gpu/drm/radeon/r600.c b/drivers/gpu/drm/radeon/r600.c index 1a08008c978b..0e5341695922 100644 --- a/drivers/gpu/drm/radeon/r600.c +++ b/drivers/gpu/drm/radeon/r600.c | |||
| @@ -1046,6 +1046,24 @@ int r600_mc_wait_for_idle(struct radeon_device *rdev) | |||
| 1046 | return -1; | 1046 | return -1; |
| 1047 | } | 1047 | } |
| 1048 | 1048 | ||
| 1049 | uint32_t rs780_mc_rreg(struct radeon_device *rdev, uint32_t reg) | ||
| 1050 | { | ||
| 1051 | uint32_t r; | ||
| 1052 | |||
| 1053 | WREG32(R_0028F8_MC_INDEX, S_0028F8_MC_IND_ADDR(reg)); | ||
| 1054 | r = RREG32(R_0028FC_MC_DATA); | ||
| 1055 | WREG32(R_0028F8_MC_INDEX, ~C_0028F8_MC_IND_ADDR); | ||
| 1056 | return r; | ||
| 1057 | } | ||
| 1058 | |||
| 1059 | void rs780_mc_wreg(struct radeon_device *rdev, uint32_t reg, uint32_t v) | ||
| 1060 | { | ||
| 1061 | WREG32(R_0028F8_MC_INDEX, S_0028F8_MC_IND_ADDR(reg) | | ||
| 1062 | S_0028F8_MC_IND_WR_EN(1)); | ||
| 1063 | WREG32(R_0028FC_MC_DATA, v); | ||
| 1064 | WREG32(R_0028F8_MC_INDEX, 0x7F); | ||
| 1065 | } | ||
| 1066 | |||
| 1049 | static void r600_mc_program(struct radeon_device *rdev) | 1067 | static void r600_mc_program(struct radeon_device *rdev) |
| 1050 | { | 1068 | { |
| 1051 | struct rv515_mc_save save; | 1069 | struct rv515_mc_save save; |
| @@ -1181,6 +1199,8 @@ static int r600_mc_init(struct radeon_device *rdev) | |||
| 1181 | { | 1199 | { |
| 1182 | u32 tmp; | 1200 | u32 tmp; |
| 1183 | int chansize, numchan; | 1201 | int chansize, numchan; |
| 1202 | uint32_t h_addr, l_addr; | ||
| 1203 | unsigned long long k8_addr; | ||
| 1184 | 1204 | ||
| 1185 | /* Get VRAM informations */ | 1205 | /* Get VRAM informations */ |
| 1186 | rdev->mc.vram_is_ddr = true; | 1206 | rdev->mc.vram_is_ddr = true; |
| @@ -1221,7 +1241,30 @@ static int r600_mc_init(struct radeon_device *rdev) | |||
| 1221 | if (rdev->flags & RADEON_IS_IGP) { | 1241 | if (rdev->flags & RADEON_IS_IGP) { |
| 1222 | rs690_pm_info(rdev); | 1242 | rs690_pm_info(rdev); |
| 1223 | rdev->mc.igp_sideport_enabled = radeon_atombios_sideport_present(rdev); | 1243 | rdev->mc.igp_sideport_enabled = radeon_atombios_sideport_present(rdev); |
| 1244 | |||
| 1245 | if (rdev->family == CHIP_RS780 || rdev->family == CHIP_RS880) { | ||
| 1246 | /* Use K8 direct mapping for fast fb access. */ | ||
| 1247 | rdev->fastfb_working = false; | ||
| 1248 | h_addr = G_000012_K8_ADDR_EXT(RREG32_MC(R_000012_MC_MISC_UMA_CNTL)); | ||
| 1249 | l_addr = RREG32_MC(R_000011_K8_FB_LOCATION); | ||
| 1250 | k8_addr = ((unsigned long long)h_addr) << 32 | l_addr; | ||
| 1251 | #if defined(CONFIG_X86_32) && !defined(CONFIG_X86_PAE) | ||
| 1252 | if (k8_addr + rdev->mc.visible_vram_size < 0x100000000ULL) | ||
| 1253 | #endif | ||
| 1254 | { | ||
| 1255 | /* FastFB shall be used with UMA memory. Here it is simply disabled when sideport | ||
| 1256 | * memory is present. | ||
| 1257 | */ | ||
| 1258 | if (rdev->mc.igp_sideport_enabled == false && radeon_fastfb == 1) { | ||
| 1259 | DRM_INFO("Direct mapping: aper base at 0x%llx, replaced by direct mapping base 0x%llx.\n", | ||
| 1260 | (unsigned long long)rdev->mc.aper_base, k8_addr); | ||
| 1261 | rdev->mc.aper_base = (resource_size_t)k8_addr; | ||
| 1262 | rdev->fastfb_working = true; | ||
| 1263 | } | ||
| 1264 | } | ||
| 1265 | } | ||
| 1224 | } | 1266 | } |
| 1267 | |||
| 1225 | radeon_update_bandwidth_info(rdev); | 1268 | radeon_update_bandwidth_info(rdev); |
| 1226 | return 0; | 1269 | return 0; |
| 1227 | } | 1270 | } |
| @@ -3202,6 +3245,12 @@ static int r600_startup(struct radeon_device *rdev) | |||
| 3202 | } | 3245 | } |
| 3203 | 3246 | ||
| 3204 | /* Enable IRQ */ | 3247 | /* Enable IRQ */ |
| 3248 | if (!rdev->irq.installed) { | ||
| 3249 | r = radeon_irq_kms_init(rdev); | ||
| 3250 | if (r) | ||
| 3251 | return r; | ||
| 3252 | } | ||
| 3253 | |||
| 3205 | r = r600_irq_init(rdev); | 3254 | r = r600_irq_init(rdev); |
| 3206 | if (r) { | 3255 | if (r) { |
| 3207 | DRM_ERROR("radeon: IH init failed (%d).\n", r); | 3256 | DRM_ERROR("radeon: IH init failed (%d).\n", r); |
| @@ -3356,10 +3405,6 @@ int r600_init(struct radeon_device *rdev) | |||
| 3356 | if (r) | 3405 | if (r) |
| 3357 | return r; | 3406 | return r; |
| 3358 | 3407 | ||
| 3359 | r = radeon_irq_kms_init(rdev); | ||
| 3360 | if (r) | ||
| 3361 | return r; | ||
| 3362 | |||
| 3363 | rdev->ring[RADEON_RING_TYPE_GFX_INDEX].ring_obj = NULL; | 3408 | rdev->ring[RADEON_RING_TYPE_GFX_INDEX].ring_obj = NULL; |
| 3364 | r600_ring_init(rdev, &rdev->ring[RADEON_RING_TYPE_GFX_INDEX], 1024 * 1024); | 3409 | r600_ring_init(rdev, &rdev->ring[RADEON_RING_TYPE_GFX_INDEX], 1024 * 1024); |
| 3365 | 3410 | ||
| @@ -4631,8 +4676,6 @@ static void r600_pcie_gen2_enable(struct radeon_device *rdev) | |||
| 4631 | { | 4676 | { |
| 4632 | u32 link_width_cntl, lanes, speed_cntl, training_cntl, tmp; | 4677 | u32 link_width_cntl, lanes, speed_cntl, training_cntl, tmp; |
| 4633 | u16 link_cntl2; | 4678 | u16 link_cntl2; |
| 4634 | u32 mask; | ||
| 4635 | int ret; | ||
| 4636 | 4679 | ||
| 4637 | if (radeon_pcie_gen2 == 0) | 4680 | if (radeon_pcie_gen2 == 0) |
| 4638 | return; | 4681 | return; |
| @@ -4651,11 +4694,8 @@ static void r600_pcie_gen2_enable(struct radeon_device *rdev) | |||
| 4651 | if (rdev->family <= CHIP_R600) | 4694 | if (rdev->family <= CHIP_R600) |
| 4652 | return; | 4695 | return; |
| 4653 | 4696 | ||
| 4654 | ret = drm_pcie_get_speed_cap_mask(rdev->ddev, &mask); | 4697 | if ((rdev->pdev->bus->max_bus_speed != PCIE_SPEED_5_0GT) && |
| 4655 | if (ret != 0) | 4698 | (rdev->pdev->bus->max_bus_speed != PCIE_SPEED_8_0GT)) |
| 4656 | return; | ||
| 4657 | |||
| 4658 | if (!(mask & DRM_PCIE_SPEED_50)) | ||
| 4659 | return; | 4699 | return; |
| 4660 | 4700 | ||
| 4661 | speed_cntl = RREG32_PCIE_PORT(PCIE_LC_SPEED_CNTL); | 4701 | speed_cntl = RREG32_PCIE_PORT(PCIE_LC_SPEED_CNTL); |
