diff options
| -rw-r--r-- | drivers/gpu/drm/radeon/r600.c | 43 | ||||
| -rw-r--r-- | drivers/gpu/drm/radeon/r600d.h | 8 | ||||
| -rw-r--r-- | drivers/gpu/drm/radeon/radeon_asic.c | 4 | ||||
| -rw-r--r-- | drivers/gpu/drm/radeon/radeon_asic.h | 2 |
4 files changed, 57 insertions, 0 deletions
diff --git a/drivers/gpu/drm/radeon/r600.c b/drivers/gpu/drm/radeon/r600.c index 0f30d0df1e07..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 | } |
diff --git a/drivers/gpu/drm/radeon/r600d.h b/drivers/gpu/drm/radeon/r600d.h index acb146c06973..79df558f8c40 100644 --- a/drivers/gpu/drm/radeon/r600d.h +++ b/drivers/gpu/drm/radeon/r600d.h | |||
| @@ -1342,6 +1342,14 @@ | |||
| 1342 | #define PACKET3_STRMOUT_BASE_UPDATE 0x72 /* r7xx */ | 1342 | #define PACKET3_STRMOUT_BASE_UPDATE 0x72 /* r7xx */ |
| 1343 | #define PACKET3_SURFACE_BASE_UPDATE 0x73 | 1343 | #define PACKET3_SURFACE_BASE_UPDATE 0x73 |
| 1344 | 1344 | ||
| 1345 | #define R_000011_K8_FB_LOCATION 0x11 | ||
| 1346 | #define R_000012_MC_MISC_UMA_CNTL 0x12 | ||
| 1347 | #define G_000012_K8_ADDR_EXT(x) (((x) >> 0) & 0xFF) | ||
| 1348 | #define R_0028F8_MC_INDEX 0x28F8 | ||
| 1349 | #define S_0028F8_MC_IND_ADDR(x) (((x) & 0x1FF) << 0) | ||
| 1350 | #define C_0028F8_MC_IND_ADDR 0xFFFFFE00 | ||
| 1351 | #define S_0028F8_MC_IND_WR_EN(x) (((x) & 0x1) << 9) | ||
| 1352 | #define R_0028FC_MC_DATA 0x28FC | ||
| 1345 | 1353 | ||
| 1346 | #define R_008020_GRBM_SOFT_RESET 0x8020 | 1354 | #define R_008020_GRBM_SOFT_RESET 0x8020 |
| 1347 | #define S_008020_SOFT_RESET_CP(x) (((x) & 1) << 0) | 1355 | #define S_008020_SOFT_RESET_CP(x) (((x) & 1) << 0) |
diff --git a/drivers/gpu/drm/radeon/radeon_asic.c b/drivers/gpu/drm/radeon/radeon_asic.c index 06b8c19ab19e..a2802b47ee95 100644 --- a/drivers/gpu/drm/radeon/radeon_asic.c +++ b/drivers/gpu/drm/radeon/radeon_asic.c | |||
| @@ -122,6 +122,10 @@ static void radeon_register_accessor_init(struct radeon_device *rdev) | |||
| 122 | rdev->mc_rreg = &rs600_mc_rreg; | 122 | rdev->mc_rreg = &rs600_mc_rreg; |
| 123 | rdev->mc_wreg = &rs600_mc_wreg; | 123 | rdev->mc_wreg = &rs600_mc_wreg; |
| 124 | } | 124 | } |
| 125 | if (rdev->family == CHIP_RS780 || rdev->family == CHIP_RS880) { | ||
| 126 | rdev->mc_rreg = &rs780_mc_rreg; | ||
| 127 | rdev->mc_wreg = &rs780_mc_wreg; | ||
| 128 | } | ||
| 125 | if (rdev->family >= CHIP_R600) { | 129 | if (rdev->family >= CHIP_R600) { |
| 126 | rdev->pciep_rreg = &r600_pciep_rreg; | 130 | rdev->pciep_rreg = &r600_pciep_rreg; |
| 127 | rdev->pciep_wreg = &r600_pciep_wreg; | 131 | rdev->pciep_wreg = &r600_pciep_wreg; |
diff --git a/drivers/gpu/drm/radeon/radeon_asic.h b/drivers/gpu/drm/radeon/radeon_asic.h index 2c87365d345f..a72759ede753 100644 --- a/drivers/gpu/drm/radeon/radeon_asic.h +++ b/drivers/gpu/drm/radeon/radeon_asic.h | |||
| @@ -347,6 +347,8 @@ extern bool r600_gui_idle(struct radeon_device *rdev); | |||
| 347 | extern void r600_pm_misc(struct radeon_device *rdev); | 347 | extern void r600_pm_misc(struct radeon_device *rdev); |
| 348 | extern void r600_pm_init_profile(struct radeon_device *rdev); | 348 | extern void r600_pm_init_profile(struct radeon_device *rdev); |
| 349 | extern void rs780_pm_init_profile(struct radeon_device *rdev); | 349 | extern void rs780_pm_init_profile(struct radeon_device *rdev); |
| 350 | extern uint32_t rs780_mc_rreg(struct radeon_device *rdev, uint32_t reg); | ||
| 351 | extern void rs780_mc_wreg(struct radeon_device *rdev, uint32_t reg, uint32_t v); | ||
| 350 | extern void r600_pm_get_dynpm_state(struct radeon_device *rdev); | 352 | extern void r600_pm_get_dynpm_state(struct radeon_device *rdev); |
| 351 | extern void r600_set_pcie_lanes(struct radeon_device *rdev, int lanes); | 353 | extern void r600_set_pcie_lanes(struct radeon_device *rdev, int lanes); |
| 352 | extern int r600_get_pcie_lanes(struct radeon_device *rdev); | 354 | extern int r600_get_pcie_lanes(struct radeon_device *rdev); |
