diff options
27 files changed, 258 insertions, 122 deletions
diff --git a/arch/ia64/mm/tlb.c b/arch/ia64/mm/tlb.c index 5dfd916e9ea6..7b3cdc6c6d91 100644 --- a/arch/ia64/mm/tlb.c +++ b/arch/ia64/mm/tlb.c | |||
| @@ -121,7 +121,7 @@ static inline void down_spin(struct spinaphore *ss) | |||
| 121 | ia64_invala(); | 121 | ia64_invala(); |
| 122 | 122 | ||
| 123 | for (;;) { | 123 | for (;;) { |
| 124 | asm volatile ("ld4.c.nc %0=[%1]" : "=r"(serve) : "r"(&ss->serve) : "memory"); | 124 | asm volatile ("ld8.c.nc %0=[%1]" : "=r"(serve) : "r"(&ss->serve) : "memory"); |
| 125 | if (time_before(t, serve)) | 125 | if (time_before(t, serve)) |
| 126 | return; | 126 | return; |
| 127 | cpu_relax(); | 127 | cpu_relax(); |
diff --git a/drivers/char/agp/generic.c b/drivers/char/agp/generic.c index 4b51982fd23a..d2abf5143983 100644 --- a/drivers/char/agp/generic.c +++ b/drivers/char/agp/generic.c | |||
| @@ -97,20 +97,18 @@ EXPORT_SYMBOL(agp_flush_chipset); | |||
| 97 | void agp_alloc_page_array(size_t size, struct agp_memory *mem) | 97 | void agp_alloc_page_array(size_t size, struct agp_memory *mem) |
| 98 | { | 98 | { |
| 99 | mem->pages = NULL; | 99 | mem->pages = NULL; |
| 100 | mem->vmalloc_flag = false; | ||
| 101 | 100 | ||
| 102 | if (size <= 2*PAGE_SIZE) | 101 | if (size <= 2*PAGE_SIZE) |
| 103 | mem->pages = kmalloc(size, GFP_KERNEL | __GFP_NORETRY); | 102 | mem->pages = kmalloc(size, GFP_KERNEL | __GFP_NOWARN); |
| 104 | if (mem->pages == NULL) { | 103 | if (mem->pages == NULL) { |
| 105 | mem->pages = vmalloc(size); | 104 | mem->pages = vmalloc(size); |
| 106 | mem->vmalloc_flag = true; | ||
| 107 | } | 105 | } |
| 108 | } | 106 | } |
| 109 | EXPORT_SYMBOL(agp_alloc_page_array); | 107 | EXPORT_SYMBOL(agp_alloc_page_array); |
| 110 | 108 | ||
| 111 | void agp_free_page_array(struct agp_memory *mem) | 109 | void agp_free_page_array(struct agp_memory *mem) |
| 112 | { | 110 | { |
| 113 | if (mem->vmalloc_flag) { | 111 | if (is_vmalloc_addr(mem->pages)) { |
| 114 | vfree(mem->pages); | 112 | vfree(mem->pages); |
| 115 | } else { | 113 | } else { |
| 116 | kfree(mem->pages); | 114 | kfree(mem->pages); |
diff --git a/drivers/gpu/drm/drm_fb_helper.c b/drivers/gpu/drm/drm_fb_helper.c index 08c4c926e65f..1f2cc6b09623 100644 --- a/drivers/gpu/drm/drm_fb_helper.c +++ b/drivers/gpu/drm/drm_fb_helper.c | |||
| @@ -146,7 +146,7 @@ static bool drm_fb_helper_connector_parse_command_line(struct drm_fb_helper_conn | |||
| 146 | cvt = 1; | 146 | cvt = 1; |
| 147 | break; | 147 | break; |
| 148 | case 'R': | 148 | case 'R': |
| 149 | if (!cvt) | 149 | if (cvt) |
| 150 | rb = 1; | 150 | rb = 1; |
| 151 | break; | 151 | break; |
| 152 | case 'm': | 152 | case 'm': |
| @@ -1024,11 +1024,18 @@ static struct drm_display_mode *drm_pick_cmdline_mode(struct drm_fb_helper_conne | |||
| 1024 | } | 1024 | } |
| 1025 | 1025 | ||
| 1026 | create_mode: | 1026 | create_mode: |
| 1027 | mode = drm_cvt_mode(fb_helper_conn->connector->dev, cmdline_mode->xres, | 1027 | if (cmdline_mode->cvt) |
| 1028 | cmdline_mode->yres, | 1028 | mode = drm_cvt_mode(fb_helper_conn->connector->dev, |
| 1029 | cmdline_mode->refresh_specified ? cmdline_mode->refresh : 60, | 1029 | cmdline_mode->xres, cmdline_mode->yres, |
| 1030 | cmdline_mode->rb, cmdline_mode->interlace, | 1030 | cmdline_mode->refresh_specified ? cmdline_mode->refresh : 60, |
| 1031 | cmdline_mode->margins); | 1031 | cmdline_mode->rb, cmdline_mode->interlace, |
| 1032 | cmdline_mode->margins); | ||
| 1033 | else | ||
| 1034 | mode = drm_gtf_mode(fb_helper_conn->connector->dev, | ||
| 1035 | cmdline_mode->xres, cmdline_mode->yres, | ||
| 1036 | cmdline_mode->refresh_specified ? cmdline_mode->refresh : 60, | ||
| 1037 | cmdline_mode->interlace, | ||
| 1038 | cmdline_mode->margins); | ||
| 1032 | drm_mode_set_crtcinfo(mode, CRTC_INTERLACE_HALVE_V); | 1039 | drm_mode_set_crtcinfo(mode, CRTC_INTERLACE_HALVE_V); |
| 1033 | list_add(&mode->head, &fb_helper_conn->connector->modes); | 1040 | list_add(&mode->head, &fb_helper_conn->connector->modes); |
| 1034 | return mode; | 1041 | return mode; |
diff --git a/drivers/gpu/drm/radeon/atombios_crtc.c b/drivers/gpu/drm/radeon/atombios_crtc.c index f3f2827017ef..8c2d6478a221 100644 --- a/drivers/gpu/drm/radeon/atombios_crtc.c +++ b/drivers/gpu/drm/radeon/atombios_crtc.c | |||
| @@ -498,7 +498,7 @@ static u32 atombios_adjust_pll(struct drm_crtc *crtc, | |||
| 498 | if ((rdev->family == CHIP_RS600) || | 498 | if ((rdev->family == CHIP_RS600) || |
| 499 | (rdev->family == CHIP_RS690) || | 499 | (rdev->family == CHIP_RS690) || |
| 500 | (rdev->family == CHIP_RS740)) | 500 | (rdev->family == CHIP_RS740)) |
| 501 | pll->flags |= (RADEON_PLL_USE_FRAC_FB_DIV | | 501 | pll->flags |= (/*RADEON_PLL_USE_FRAC_FB_DIV |*/ |
| 502 | RADEON_PLL_PREFER_CLOSEST_LOWER); | 502 | RADEON_PLL_PREFER_CLOSEST_LOWER); |
| 503 | 503 | ||
| 504 | if (ASIC_IS_DCE32(rdev) && mode->clock > 200000) /* range limits??? */ | 504 | if (ASIC_IS_DCE32(rdev) && mode->clock > 200000) /* range limits??? */ |
diff --git a/drivers/gpu/drm/radeon/evergreen.c b/drivers/gpu/drm/radeon/evergreen.c index 4b6623df3b96..1caf625e472b 100644 --- a/drivers/gpu/drm/radeon/evergreen.c +++ b/drivers/gpu/drm/radeon/evergreen.c | |||
| @@ -607,7 +607,7 @@ static void evergreen_mc_program(struct radeon_device *rdev) | |||
| 607 | WREG32(MC_VM_FB_LOCATION, tmp); | 607 | WREG32(MC_VM_FB_LOCATION, tmp); |
| 608 | WREG32(HDP_NONSURFACE_BASE, (rdev->mc.vram_start >> 8)); | 608 | WREG32(HDP_NONSURFACE_BASE, (rdev->mc.vram_start >> 8)); |
| 609 | WREG32(HDP_NONSURFACE_INFO, (2 << 7)); | 609 | WREG32(HDP_NONSURFACE_INFO, (2 << 7)); |
| 610 | WREG32(HDP_NONSURFACE_SIZE, (rdev->mc.mc_vram_size - 1) | 0x3FF); | 610 | WREG32(HDP_NONSURFACE_SIZE, 0x3FFFFFFF); |
| 611 | if (rdev->flags & RADEON_IS_AGP) { | 611 | if (rdev->flags & RADEON_IS_AGP) { |
| 612 | WREG32(MC_VM_AGP_TOP, rdev->mc.gtt_end >> 16); | 612 | WREG32(MC_VM_AGP_TOP, rdev->mc.gtt_end >> 16); |
| 613 | WREG32(MC_VM_AGP_BOT, rdev->mc.gtt_start >> 16); | 613 | WREG32(MC_VM_AGP_BOT, rdev->mc.gtt_start >> 16); |
| @@ -1222,11 +1222,11 @@ static void evergreen_gpu_init(struct radeon_device *rdev) | |||
| 1222 | ps_thread_count = 128; | 1222 | ps_thread_count = 128; |
| 1223 | 1223 | ||
| 1224 | sq_thread_resource_mgmt = NUM_PS_THREADS(ps_thread_count); | 1224 | sq_thread_resource_mgmt = NUM_PS_THREADS(ps_thread_count); |
| 1225 | sq_thread_resource_mgmt |= NUM_VS_THREADS(((rdev->config.evergreen.max_threads - ps_thread_count) / 6) / 8) * 8; | 1225 | sq_thread_resource_mgmt |= NUM_VS_THREADS((((rdev->config.evergreen.max_threads - ps_thread_count) / 6) / 8) * 8); |
| 1226 | sq_thread_resource_mgmt |= NUM_GS_THREADS(((rdev->config.evergreen.max_threads - ps_thread_count) / 6) / 8) * 8; | 1226 | sq_thread_resource_mgmt |= NUM_GS_THREADS((((rdev->config.evergreen.max_threads - ps_thread_count) / 6) / 8) * 8); |
| 1227 | sq_thread_resource_mgmt |= NUM_ES_THREADS(((rdev->config.evergreen.max_threads - ps_thread_count) / 6) / 8) * 8; | 1227 | sq_thread_resource_mgmt |= NUM_ES_THREADS((((rdev->config.evergreen.max_threads - ps_thread_count) / 6) / 8) * 8); |
| 1228 | sq_thread_resource_mgmt_2 = NUM_HS_THREADS(((rdev->config.evergreen.max_threads - ps_thread_count) / 6) / 8) * 8; | 1228 | sq_thread_resource_mgmt_2 = NUM_HS_THREADS((((rdev->config.evergreen.max_threads - ps_thread_count) / 6) / 8) * 8); |
| 1229 | sq_thread_resource_mgmt_2 |= NUM_LS_THREADS(((rdev->config.evergreen.max_threads - ps_thread_count) / 6) / 8) * 8; | 1229 | sq_thread_resource_mgmt_2 |= NUM_LS_THREADS((((rdev->config.evergreen.max_threads - ps_thread_count) / 6) / 8) * 8); |
| 1230 | 1230 | ||
| 1231 | sq_stack_resource_mgmt_1 = NUM_PS_STACK_ENTRIES((rdev->config.evergreen.max_stack_entries * 1) / 6); | 1231 | sq_stack_resource_mgmt_1 = NUM_PS_STACK_ENTRIES((rdev->config.evergreen.max_stack_entries * 1) / 6); |
| 1232 | sq_stack_resource_mgmt_1 |= NUM_VS_STACK_ENTRIES((rdev->config.evergreen.max_stack_entries * 1) / 6); | 1232 | sq_stack_resource_mgmt_1 |= NUM_VS_STACK_ENTRIES((rdev->config.evergreen.max_stack_entries * 1) / 6); |
| @@ -1260,6 +1260,9 @@ static void evergreen_gpu_init(struct radeon_device *rdev) | |||
| 1260 | WREG32(VGT_GS_VERTEX_REUSE, 16); | 1260 | WREG32(VGT_GS_VERTEX_REUSE, 16); |
| 1261 | WREG32(PA_SC_LINE_STIPPLE_STATE, 0); | 1261 | WREG32(PA_SC_LINE_STIPPLE_STATE, 0); |
| 1262 | 1262 | ||
| 1263 | WREG32(VGT_VERTEX_REUSE_BLOCK_CNTL, 14); | ||
| 1264 | WREG32(VGT_OUT_DEALLOC_CNTL, 16); | ||
| 1265 | |||
| 1263 | WREG32(CB_PERF_CTR0_SEL_0, 0); | 1266 | WREG32(CB_PERF_CTR0_SEL_0, 0); |
| 1264 | WREG32(CB_PERF_CTR0_SEL_1, 0); | 1267 | WREG32(CB_PERF_CTR0_SEL_1, 0); |
| 1265 | WREG32(CB_PERF_CTR1_SEL_0, 0); | 1268 | WREG32(CB_PERF_CTR1_SEL_0, 0); |
| @@ -1269,6 +1272,26 @@ static void evergreen_gpu_init(struct radeon_device *rdev) | |||
| 1269 | WREG32(CB_PERF_CTR3_SEL_0, 0); | 1272 | WREG32(CB_PERF_CTR3_SEL_0, 0); |
| 1270 | WREG32(CB_PERF_CTR3_SEL_1, 0); | 1273 | WREG32(CB_PERF_CTR3_SEL_1, 0); |
| 1271 | 1274 | ||
| 1275 | /* clear render buffer base addresses */ | ||
| 1276 | WREG32(CB_COLOR0_BASE, 0); | ||
| 1277 | WREG32(CB_COLOR1_BASE, 0); | ||
| 1278 | WREG32(CB_COLOR2_BASE, 0); | ||
| 1279 | WREG32(CB_COLOR3_BASE, 0); | ||
| 1280 | WREG32(CB_COLOR4_BASE, 0); | ||
| 1281 | WREG32(CB_COLOR5_BASE, 0); | ||
| 1282 | WREG32(CB_COLOR6_BASE, 0); | ||
| 1283 | WREG32(CB_COLOR7_BASE, 0); | ||
| 1284 | WREG32(CB_COLOR8_BASE, 0); | ||
| 1285 | WREG32(CB_COLOR9_BASE, 0); | ||
| 1286 | WREG32(CB_COLOR10_BASE, 0); | ||
| 1287 | WREG32(CB_COLOR11_BASE, 0); | ||
| 1288 | |||
| 1289 | /* set the shader const cache sizes to 0 */ | ||
| 1290 | for (i = SQ_ALU_CONST_BUFFER_SIZE_PS_0; i < 0x28200; i += 4) | ||
| 1291 | WREG32(i, 0); | ||
| 1292 | for (i = SQ_ALU_CONST_BUFFER_SIZE_HS_0; i < 0x29000; i += 4) | ||
| 1293 | WREG32(i, 0); | ||
| 1294 | |||
| 1272 | hdp_host_path_cntl = RREG32(HDP_HOST_PATH_CNTL); | 1295 | hdp_host_path_cntl = RREG32(HDP_HOST_PATH_CNTL); |
| 1273 | WREG32(HDP_HOST_PATH_CNTL, hdp_host_path_cntl); | 1296 | WREG32(HDP_HOST_PATH_CNTL, hdp_host_path_cntl); |
| 1274 | 1297 | ||
diff --git a/drivers/gpu/drm/radeon/evergreen_cs.c b/drivers/gpu/drm/radeon/evergreen_cs.c index 64516b950891..010963d4570f 100644 --- a/drivers/gpu/drm/radeon/evergreen_cs.c +++ b/drivers/gpu/drm/radeon/evergreen_cs.c | |||
| @@ -1197,7 +1197,7 @@ static int evergreen_packet3_check(struct radeon_cs_parser *p, | |||
| 1197 | DRM_ERROR("bad SET_RESOURCE (tex)\n"); | 1197 | DRM_ERROR("bad SET_RESOURCE (tex)\n"); |
| 1198 | return -EINVAL; | 1198 | return -EINVAL; |
| 1199 | } | 1199 | } |
| 1200 | ib[idx+1+(i*8)+3] += (u32)((reloc->lobj.gpu_offset >> 8) & 0xffffffff); | 1200 | ib[idx+1+(i*8)+2] += (u32)((reloc->lobj.gpu_offset >> 8) & 0xffffffff); |
| 1201 | if (reloc->lobj.tiling_flags & RADEON_TILING_MACRO) | 1201 | if (reloc->lobj.tiling_flags & RADEON_TILING_MACRO) |
| 1202 | ib[idx+1+(i*8)+1] |= TEX_ARRAY_MODE(ARRAY_2D_TILED_THIN1); | 1202 | ib[idx+1+(i*8)+1] |= TEX_ARRAY_MODE(ARRAY_2D_TILED_THIN1); |
| 1203 | else if (reloc->lobj.tiling_flags & RADEON_TILING_MICRO) | 1203 | else if (reloc->lobj.tiling_flags & RADEON_TILING_MICRO) |
| @@ -1209,7 +1209,7 @@ static int evergreen_packet3_check(struct radeon_cs_parser *p, | |||
| 1209 | DRM_ERROR("bad SET_RESOURCE (tex)\n"); | 1209 | DRM_ERROR("bad SET_RESOURCE (tex)\n"); |
| 1210 | return -EINVAL; | 1210 | return -EINVAL; |
| 1211 | } | 1211 | } |
| 1212 | ib[idx+1+(i*8)+4] += (u32)((reloc->lobj.gpu_offset >> 8) & 0xffffffff); | 1212 | ib[idx+1+(i*8)+3] += (u32)((reloc->lobj.gpu_offset >> 8) & 0xffffffff); |
| 1213 | mipmap = reloc->robj; | 1213 | mipmap = reloc->robj; |
| 1214 | r = evergreen_check_texture_resource(p, idx+1+(i*8), | 1214 | r = evergreen_check_texture_resource(p, idx+1+(i*8), |
| 1215 | texture, mipmap); | 1215 | texture, mipmap); |
diff --git a/drivers/gpu/drm/radeon/evergreend.h b/drivers/gpu/drm/radeon/evergreend.h index 79683f6b4452..a1cd621780e2 100644 --- a/drivers/gpu/drm/radeon/evergreend.h +++ b/drivers/gpu/drm/radeon/evergreend.h | |||
| @@ -713,6 +713,9 @@ | |||
| 713 | #define SQ_GSVS_RING_OFFSET_2 0x28930 | 713 | #define SQ_GSVS_RING_OFFSET_2 0x28930 |
| 714 | #define SQ_GSVS_RING_OFFSET_3 0x28934 | 714 | #define SQ_GSVS_RING_OFFSET_3 0x28934 |
| 715 | 715 | ||
| 716 | #define SQ_ALU_CONST_BUFFER_SIZE_PS_0 0x28140 | ||
| 717 | #define SQ_ALU_CONST_BUFFER_SIZE_HS_0 0x28f80 | ||
| 718 | |||
| 716 | #define SQ_ALU_CONST_CACHE_PS_0 0x28940 | 719 | #define SQ_ALU_CONST_CACHE_PS_0 0x28940 |
| 717 | #define SQ_ALU_CONST_CACHE_PS_1 0x28944 | 720 | #define SQ_ALU_CONST_CACHE_PS_1 0x28944 |
| 718 | #define SQ_ALU_CONST_CACHE_PS_2 0x28948 | 721 | #define SQ_ALU_CONST_CACHE_PS_2 0x28948 |
diff --git a/drivers/gpu/drm/radeon/r100.c b/drivers/gpu/drm/radeon/r100.c index cf89aa2eb28c..3970e62eaab8 100644 --- a/drivers/gpu/drm/radeon/r100.c +++ b/drivers/gpu/drm/radeon/r100.c | |||
| @@ -1628,6 +1628,7 @@ static int r100_packet0_check(struct radeon_cs_parser *p, | |||
| 1628 | case RADEON_TXFORMAT_RGB332: | 1628 | case RADEON_TXFORMAT_RGB332: |
| 1629 | case RADEON_TXFORMAT_Y8: | 1629 | case RADEON_TXFORMAT_Y8: |
| 1630 | track->textures[i].cpp = 1; | 1630 | track->textures[i].cpp = 1; |
| 1631 | track->textures[i].compress_format = R100_TRACK_COMP_NONE; | ||
| 1631 | break; | 1632 | break; |
| 1632 | case RADEON_TXFORMAT_AI88: | 1633 | case RADEON_TXFORMAT_AI88: |
| 1633 | case RADEON_TXFORMAT_ARGB1555: | 1634 | case RADEON_TXFORMAT_ARGB1555: |
| @@ -1639,12 +1640,14 @@ static int r100_packet0_check(struct radeon_cs_parser *p, | |||
| 1639 | case RADEON_TXFORMAT_LDUDV655: | 1640 | case RADEON_TXFORMAT_LDUDV655: |
| 1640 | case RADEON_TXFORMAT_DUDV88: | 1641 | case RADEON_TXFORMAT_DUDV88: |
| 1641 | track->textures[i].cpp = 2; | 1642 | track->textures[i].cpp = 2; |
| 1643 | track->textures[i].compress_format = R100_TRACK_COMP_NONE; | ||
| 1642 | break; | 1644 | break; |
| 1643 | case RADEON_TXFORMAT_ARGB8888: | 1645 | case RADEON_TXFORMAT_ARGB8888: |
| 1644 | case RADEON_TXFORMAT_RGBA8888: | 1646 | case RADEON_TXFORMAT_RGBA8888: |
| 1645 | case RADEON_TXFORMAT_SHADOW32: | 1647 | case RADEON_TXFORMAT_SHADOW32: |
| 1646 | case RADEON_TXFORMAT_LDUDUV8888: | 1648 | case RADEON_TXFORMAT_LDUDUV8888: |
| 1647 | track->textures[i].cpp = 4; | 1649 | track->textures[i].cpp = 4; |
| 1650 | track->textures[i].compress_format = R100_TRACK_COMP_NONE; | ||
| 1648 | break; | 1651 | break; |
| 1649 | case RADEON_TXFORMAT_DXT1: | 1652 | case RADEON_TXFORMAT_DXT1: |
| 1650 | track->textures[i].cpp = 1; | 1653 | track->textures[i].cpp = 1; |
| @@ -2604,12 +2607,6 @@ int r100_set_surface_reg(struct radeon_device *rdev, int reg, | |||
| 2604 | int surf_index = reg * 16; | 2607 | int surf_index = reg * 16; |
| 2605 | int flags = 0; | 2608 | int flags = 0; |
| 2606 | 2609 | ||
| 2607 | /* r100/r200 divide by 16 */ | ||
| 2608 | if (rdev->family < CHIP_R300) | ||
| 2609 | flags = pitch / 16; | ||
| 2610 | else | ||
| 2611 | flags = pitch / 8; | ||
| 2612 | |||
| 2613 | if (rdev->family <= CHIP_RS200) { | 2610 | if (rdev->family <= CHIP_RS200) { |
| 2614 | if ((tiling_flags & (RADEON_TILING_MACRO|RADEON_TILING_MICRO)) | 2611 | if ((tiling_flags & (RADEON_TILING_MACRO|RADEON_TILING_MICRO)) |
| 2615 | == (RADEON_TILING_MACRO|RADEON_TILING_MICRO)) | 2612 | == (RADEON_TILING_MACRO|RADEON_TILING_MICRO)) |
| @@ -2633,6 +2630,20 @@ int r100_set_surface_reg(struct radeon_device *rdev, int reg, | |||
| 2633 | if (tiling_flags & RADEON_TILING_SWAP_32BIT) | 2630 | if (tiling_flags & RADEON_TILING_SWAP_32BIT) |
| 2634 | flags |= RADEON_SURF_AP0_SWP_32BPP | RADEON_SURF_AP1_SWP_32BPP; | 2631 | flags |= RADEON_SURF_AP0_SWP_32BPP | RADEON_SURF_AP1_SWP_32BPP; |
| 2635 | 2632 | ||
| 2633 | /* when we aren't tiling the pitch seems to needs to be furtherdivided down. - tested on power5 + rn50 server */ | ||
| 2634 | if (tiling_flags & (RADEON_TILING_SWAP_16BIT | RADEON_TILING_SWAP_32BIT)) { | ||
| 2635 | if (!(tiling_flags & (RADEON_TILING_MACRO | RADEON_TILING_MICRO))) | ||
| 2636 | if (ASIC_IS_RN50(rdev)) | ||
| 2637 | pitch /= 16; | ||
| 2638 | } | ||
| 2639 | |||
| 2640 | /* r100/r200 divide by 16 */ | ||
| 2641 | if (rdev->family < CHIP_R300) | ||
| 2642 | flags |= pitch / 16; | ||
| 2643 | else | ||
| 2644 | flags |= pitch / 8; | ||
| 2645 | |||
| 2646 | |||
| 2636 | DRM_DEBUG("writing surface %d %d %x %x\n", reg, flags, offset, offset+obj_size-1); | 2647 | DRM_DEBUG("writing surface %d %d %x %x\n", reg, flags, offset, offset+obj_size-1); |
| 2637 | WREG32(RADEON_SURFACE0_INFO + surf_index, flags); | 2648 | WREG32(RADEON_SURFACE0_INFO + surf_index, flags); |
| 2638 | WREG32(RADEON_SURFACE0_LOWER_BOUND + surf_index, offset); | 2649 | WREG32(RADEON_SURFACE0_LOWER_BOUND + surf_index, offset); |
| @@ -3147,33 +3158,6 @@ static inline void r100_cs_track_texture_print(struct r100_cs_track_texture *t) | |||
| 3147 | DRM_ERROR("compress format %d\n", t->compress_format); | 3158 | DRM_ERROR("compress format %d\n", t->compress_format); |
| 3148 | } | 3159 | } |
| 3149 | 3160 | ||
| 3150 | static int r100_cs_track_cube(struct radeon_device *rdev, | ||
| 3151 | struct r100_cs_track *track, unsigned idx) | ||
| 3152 | { | ||
| 3153 | unsigned face, w, h; | ||
| 3154 | struct radeon_bo *cube_robj; | ||
| 3155 | unsigned long size; | ||
| 3156 | |||
| 3157 | for (face = 0; face < 5; face++) { | ||
| 3158 | cube_robj = track->textures[idx].cube_info[face].robj; | ||
| 3159 | w = track->textures[idx].cube_info[face].width; | ||
| 3160 | h = track->textures[idx].cube_info[face].height; | ||
| 3161 | |||
| 3162 | size = w * h; | ||
| 3163 | size *= track->textures[idx].cpp; | ||
| 3164 | |||
| 3165 | size += track->textures[idx].cube_info[face].offset; | ||
| 3166 | |||
| 3167 | if (size > radeon_bo_size(cube_robj)) { | ||
| 3168 | DRM_ERROR("Cube texture offset greater than object size %lu %lu\n", | ||
| 3169 | size, radeon_bo_size(cube_robj)); | ||
| 3170 | r100_cs_track_texture_print(&track->textures[idx]); | ||
| 3171 | return -1; | ||
| 3172 | } | ||
| 3173 | } | ||
| 3174 | return 0; | ||
| 3175 | } | ||
| 3176 | |||
| 3177 | static int r100_track_compress_size(int compress_format, int w, int h) | 3161 | static int r100_track_compress_size(int compress_format, int w, int h) |
| 3178 | { | 3162 | { |
| 3179 | int block_width, block_height, block_bytes; | 3163 | int block_width, block_height, block_bytes; |
| @@ -3204,6 +3188,37 @@ static int r100_track_compress_size(int compress_format, int w, int h) | |||
| 3204 | return sz; | 3188 | return sz; |
| 3205 | } | 3189 | } |
| 3206 | 3190 | ||
| 3191 | static int r100_cs_track_cube(struct radeon_device *rdev, | ||
| 3192 | struct r100_cs_track *track, unsigned idx) | ||
| 3193 | { | ||
| 3194 | unsigned face, w, h; | ||
| 3195 | struct radeon_bo *cube_robj; | ||
| 3196 | unsigned long size; | ||
| 3197 | unsigned compress_format = track->textures[idx].compress_format; | ||
| 3198 | |||
| 3199 | for (face = 0; face < 5; face++) { | ||
| 3200 | cube_robj = track->textures[idx].cube_info[face].robj; | ||
| 3201 | w = track->textures[idx].cube_info[face].width; | ||
| 3202 | h = track->textures[idx].cube_info[face].height; | ||
| 3203 | |||
| 3204 | if (compress_format) { | ||
| 3205 | size = r100_track_compress_size(compress_format, w, h); | ||
| 3206 | } else | ||
| 3207 | size = w * h; | ||
| 3208 | size *= track->textures[idx].cpp; | ||
| 3209 | |||
| 3210 | size += track->textures[idx].cube_info[face].offset; | ||
| 3211 | |||
| 3212 | if (size > radeon_bo_size(cube_robj)) { | ||
| 3213 | DRM_ERROR("Cube texture offset greater than object size %lu %lu\n", | ||
| 3214 | size, radeon_bo_size(cube_robj)); | ||
| 3215 | r100_cs_track_texture_print(&track->textures[idx]); | ||
| 3216 | return -1; | ||
| 3217 | } | ||
| 3218 | } | ||
| 3219 | return 0; | ||
| 3220 | } | ||
| 3221 | |||
| 3207 | static int r100_cs_track_texture_check(struct radeon_device *rdev, | 3222 | static int r100_cs_track_texture_check(struct radeon_device *rdev, |
| 3208 | struct r100_cs_track *track) | 3223 | struct r100_cs_track *track) |
| 3209 | { | 3224 | { |
diff --git a/drivers/gpu/drm/radeon/r200.c b/drivers/gpu/drm/radeon/r200.c index 85617c311212..0266d72e0a4c 100644 --- a/drivers/gpu/drm/radeon/r200.c +++ b/drivers/gpu/drm/radeon/r200.c | |||
| @@ -415,6 +415,8 @@ int r200_packet0_check(struct radeon_cs_parser *p, | |||
| 415 | /* 2D, 3D, CUBE */ | 415 | /* 2D, 3D, CUBE */ |
| 416 | switch (tmp) { | 416 | switch (tmp) { |
| 417 | case 0: | 417 | case 0: |
| 418 | case 3: | ||
| 419 | case 4: | ||
| 418 | case 5: | 420 | case 5: |
| 419 | case 6: | 421 | case 6: |
| 420 | case 7: | 422 | case 7: |
| @@ -450,6 +452,7 @@ int r200_packet0_check(struct radeon_cs_parser *p, | |||
| 450 | case R200_TXFORMAT_RGB332: | 452 | case R200_TXFORMAT_RGB332: |
| 451 | case R200_TXFORMAT_Y8: | 453 | case R200_TXFORMAT_Y8: |
| 452 | track->textures[i].cpp = 1; | 454 | track->textures[i].cpp = 1; |
| 455 | track->textures[i].compress_format = R100_TRACK_COMP_NONE; | ||
| 453 | break; | 456 | break; |
| 454 | case R200_TXFORMAT_AI88: | 457 | case R200_TXFORMAT_AI88: |
| 455 | case R200_TXFORMAT_ARGB1555: | 458 | case R200_TXFORMAT_ARGB1555: |
| @@ -461,6 +464,7 @@ int r200_packet0_check(struct radeon_cs_parser *p, | |||
| 461 | case R200_TXFORMAT_DVDU88: | 464 | case R200_TXFORMAT_DVDU88: |
| 462 | case R200_TXFORMAT_AVYU4444: | 465 | case R200_TXFORMAT_AVYU4444: |
| 463 | track->textures[i].cpp = 2; | 466 | track->textures[i].cpp = 2; |
| 467 | track->textures[i].compress_format = R100_TRACK_COMP_NONE; | ||
| 464 | break; | 468 | break; |
| 465 | case R200_TXFORMAT_ARGB8888: | 469 | case R200_TXFORMAT_ARGB8888: |
| 466 | case R200_TXFORMAT_RGBA8888: | 470 | case R200_TXFORMAT_RGBA8888: |
| @@ -468,6 +472,7 @@ int r200_packet0_check(struct radeon_cs_parser *p, | |||
| 468 | case R200_TXFORMAT_BGR111110: | 472 | case R200_TXFORMAT_BGR111110: |
| 469 | case R200_TXFORMAT_LDVDU8888: | 473 | case R200_TXFORMAT_LDVDU8888: |
| 470 | track->textures[i].cpp = 4; | 474 | track->textures[i].cpp = 4; |
| 475 | track->textures[i].compress_format = R100_TRACK_COMP_NONE; | ||
| 471 | break; | 476 | break; |
| 472 | case R200_TXFORMAT_DXT1: | 477 | case R200_TXFORMAT_DXT1: |
| 473 | track->textures[i].cpp = 1; | 478 | track->textures[i].cpp = 1; |
diff --git a/drivers/gpu/drm/radeon/r300.c b/drivers/gpu/drm/radeon/r300.c index b2f9efe2897c..7e81db5eb804 100644 --- a/drivers/gpu/drm/radeon/r300.c +++ b/drivers/gpu/drm/radeon/r300.c | |||
| @@ -881,6 +881,7 @@ static int r300_packet0_check(struct radeon_cs_parser *p, | |||
| 881 | case R300_TX_FORMAT_Y4X4: | 881 | case R300_TX_FORMAT_Y4X4: |
| 882 | case R300_TX_FORMAT_Z3Y3X2: | 882 | case R300_TX_FORMAT_Z3Y3X2: |
| 883 | track->textures[i].cpp = 1; | 883 | track->textures[i].cpp = 1; |
| 884 | track->textures[i].compress_format = R100_TRACK_COMP_NONE; | ||
| 884 | break; | 885 | break; |
| 885 | case R300_TX_FORMAT_X16: | 886 | case R300_TX_FORMAT_X16: |
| 886 | case R300_TX_FORMAT_Y8X8: | 887 | case R300_TX_FORMAT_Y8X8: |
| @@ -892,6 +893,7 @@ static int r300_packet0_check(struct radeon_cs_parser *p, | |||
| 892 | case R300_TX_FORMAT_B8G8_B8G8: | 893 | case R300_TX_FORMAT_B8G8_B8G8: |
| 893 | case R300_TX_FORMAT_G8R8_G8B8: | 894 | case R300_TX_FORMAT_G8R8_G8B8: |
| 894 | track->textures[i].cpp = 2; | 895 | track->textures[i].cpp = 2; |
| 896 | track->textures[i].compress_format = R100_TRACK_COMP_NONE; | ||
| 895 | break; | 897 | break; |
| 896 | case R300_TX_FORMAT_Y16X16: | 898 | case R300_TX_FORMAT_Y16X16: |
| 897 | case R300_TX_FORMAT_Z11Y11X10: | 899 | case R300_TX_FORMAT_Z11Y11X10: |
| @@ -902,14 +904,17 @@ static int r300_packet0_check(struct radeon_cs_parser *p, | |||
| 902 | case R300_TX_FORMAT_FL_I32: | 904 | case R300_TX_FORMAT_FL_I32: |
| 903 | case 0x1e: | 905 | case 0x1e: |
| 904 | track->textures[i].cpp = 4; | 906 | track->textures[i].cpp = 4; |
| 907 | track->textures[i].compress_format = R100_TRACK_COMP_NONE; | ||
| 905 | break; | 908 | break; |
| 906 | case R300_TX_FORMAT_W16Z16Y16X16: | 909 | case R300_TX_FORMAT_W16Z16Y16X16: |
| 907 | case R300_TX_FORMAT_FL_R16G16B16A16: | 910 | case R300_TX_FORMAT_FL_R16G16B16A16: |
| 908 | case R300_TX_FORMAT_FL_I32A32: | 911 | case R300_TX_FORMAT_FL_I32A32: |
| 909 | track->textures[i].cpp = 8; | 912 | track->textures[i].cpp = 8; |
| 913 | track->textures[i].compress_format = R100_TRACK_COMP_NONE; | ||
| 910 | break; | 914 | break; |
| 911 | case R300_TX_FORMAT_FL_R32G32B32A32: | 915 | case R300_TX_FORMAT_FL_R32G32B32A32: |
| 912 | track->textures[i].cpp = 16; | 916 | track->textures[i].cpp = 16; |
| 917 | track->textures[i].compress_format = R100_TRACK_COMP_NONE; | ||
| 913 | break; | 918 | break; |
| 914 | case R300_TX_FORMAT_DXT1: | 919 | case R300_TX_FORMAT_DXT1: |
| 915 | track->textures[i].cpp = 1; | 920 | track->textures[i].cpp = 1; |
diff --git a/drivers/gpu/drm/radeon/r600.c b/drivers/gpu/drm/radeon/r600.c index 0e91871f45be..3d6645ce2151 100644 --- a/drivers/gpu/drm/radeon/r600.c +++ b/drivers/gpu/drm/radeon/r600.c | |||
| @@ -130,9 +130,14 @@ void r600_pm_get_dynpm_state(struct radeon_device *rdev) | |||
| 130 | break; | 130 | break; |
| 131 | } | 131 | } |
| 132 | } | 132 | } |
| 133 | } else | 133 | } else { |
| 134 | rdev->pm.requested_power_state_index = | 134 | if (rdev->pm.current_power_state_index == 0) |
| 135 | rdev->pm.current_power_state_index - 1; | 135 | rdev->pm.requested_power_state_index = |
| 136 | rdev->pm.num_power_states - 1; | ||
| 137 | else | ||
| 138 | rdev->pm.requested_power_state_index = | ||
| 139 | rdev->pm.current_power_state_index - 1; | ||
| 140 | } | ||
| 136 | } | 141 | } |
| 137 | rdev->pm.requested_clock_mode_index = 0; | 142 | rdev->pm.requested_clock_mode_index = 0; |
| 138 | /* don't use the power state if crtcs are active and no display flag is set */ | 143 | /* don't use the power state if crtcs are active and no display flag is set */ |
| @@ -1097,7 +1102,7 @@ static void r600_mc_program(struct radeon_device *rdev) | |||
| 1097 | WREG32(MC_VM_FB_LOCATION, tmp); | 1102 | WREG32(MC_VM_FB_LOCATION, tmp); |
| 1098 | WREG32(HDP_NONSURFACE_BASE, (rdev->mc.vram_start >> 8)); | 1103 | WREG32(HDP_NONSURFACE_BASE, (rdev->mc.vram_start >> 8)); |
| 1099 | WREG32(HDP_NONSURFACE_INFO, (2 << 7)); | 1104 | WREG32(HDP_NONSURFACE_INFO, (2 << 7)); |
| 1100 | WREG32(HDP_NONSURFACE_SIZE, rdev->mc.mc_vram_size | 0x3FF); | 1105 | WREG32(HDP_NONSURFACE_SIZE, 0x3FFFFFFF); |
| 1101 | if (rdev->flags & RADEON_IS_AGP) { | 1106 | if (rdev->flags & RADEON_IS_AGP) { |
| 1102 | WREG32(MC_VM_AGP_TOP, rdev->mc.gtt_end >> 22); | 1107 | WREG32(MC_VM_AGP_TOP, rdev->mc.gtt_end >> 22); |
| 1103 | WREG32(MC_VM_AGP_BOT, rdev->mc.gtt_start >> 22); | 1108 | WREG32(MC_VM_AGP_BOT, rdev->mc.gtt_start >> 22); |
| @@ -1219,8 +1224,10 @@ int r600_mc_init(struct radeon_device *rdev) | |||
| 1219 | rdev->mc.visible_vram_size = rdev->mc.aper_size; | 1224 | rdev->mc.visible_vram_size = rdev->mc.aper_size; |
| 1220 | r600_vram_gtt_location(rdev, &rdev->mc); | 1225 | r600_vram_gtt_location(rdev, &rdev->mc); |
| 1221 | 1226 | ||
| 1222 | if (rdev->flags & RADEON_IS_IGP) | 1227 | if (rdev->flags & RADEON_IS_IGP) { |
| 1228 | rs690_pm_info(rdev); | ||
| 1223 | rdev->mc.igp_sideport_enabled = radeon_atombios_sideport_present(rdev); | 1229 | rdev->mc.igp_sideport_enabled = radeon_atombios_sideport_present(rdev); |
| 1230 | } | ||
| 1224 | radeon_update_bandwidth_info(rdev); | 1231 | radeon_update_bandwidth_info(rdev); |
| 1225 | return 0; | 1232 | return 0; |
| 1226 | } | 1233 | } |
diff --git a/drivers/gpu/drm/radeon/radeon.h b/drivers/gpu/drm/radeon/radeon.h index 8e1d44ca26ec..ab61aaa887bb 100644 --- a/drivers/gpu/drm/radeon/radeon.h +++ b/drivers/gpu/drm/radeon/radeon.h | |||
| @@ -177,6 +177,7 @@ void radeon_pm_resume(struct radeon_device *rdev); | |||
| 177 | void radeon_combios_get_power_modes(struct radeon_device *rdev); | 177 | void radeon_combios_get_power_modes(struct radeon_device *rdev); |
| 178 | void radeon_atombios_get_power_modes(struct radeon_device *rdev); | 178 | void radeon_atombios_get_power_modes(struct radeon_device *rdev); |
| 179 | void radeon_atom_set_voltage(struct radeon_device *rdev, u16 level); | 179 | void radeon_atom_set_voltage(struct radeon_device *rdev, u16 level); |
| 180 | void rs690_pm_info(struct radeon_device *rdev); | ||
| 180 | 181 | ||
| 181 | /* | 182 | /* |
| 182 | * Fences. | 183 | * Fences. |
| @@ -619,7 +620,8 @@ enum radeon_dynpm_state { | |||
| 619 | DYNPM_STATE_DISABLED, | 620 | DYNPM_STATE_DISABLED, |
| 620 | DYNPM_STATE_MINIMUM, | 621 | DYNPM_STATE_MINIMUM, |
| 621 | DYNPM_STATE_PAUSED, | 622 | DYNPM_STATE_PAUSED, |
| 622 | DYNPM_STATE_ACTIVE | 623 | DYNPM_STATE_ACTIVE, |
| 624 | DYNPM_STATE_SUSPENDED, | ||
| 623 | }; | 625 | }; |
| 624 | enum radeon_dynpm_action { | 626 | enum radeon_dynpm_action { |
| 625 | DYNPM_ACTION_NONE, | 627 | DYNPM_ACTION_NONE, |
diff --git a/drivers/gpu/drm/radeon/radeon_asic.c b/drivers/gpu/drm/radeon/radeon_asic.c index 87f7e2cc52d4..646f96f97c77 100644 --- a/drivers/gpu/drm/radeon/radeon_asic.c +++ b/drivers/gpu/drm/radeon/radeon_asic.c | |||
| @@ -780,6 +780,13 @@ int radeon_asic_init(struct radeon_device *rdev) | |||
| 780 | case CHIP_R423: | 780 | case CHIP_R423: |
| 781 | case CHIP_RV410: | 781 | case CHIP_RV410: |
| 782 | rdev->asic = &r420_asic; | 782 | rdev->asic = &r420_asic; |
| 783 | /* handle macs */ | ||
| 784 | if (rdev->bios == NULL) { | ||
| 785 | rdev->asic->get_engine_clock = &radeon_legacy_get_engine_clock; | ||
| 786 | rdev->asic->set_engine_clock = &radeon_legacy_set_engine_clock; | ||
| 787 | rdev->asic->get_memory_clock = &radeon_legacy_get_memory_clock; | ||
| 788 | rdev->asic->set_memory_clock = NULL; | ||
| 789 | } | ||
| 783 | break; | 790 | break; |
| 784 | case CHIP_RS400: | 791 | case CHIP_RS400: |
| 785 | case CHIP_RS480: | 792 | case CHIP_RS480: |
diff --git a/drivers/gpu/drm/radeon/radeon_bios.c b/drivers/gpu/drm/radeon/radeon_bios.c index fbba938f8048..2c9213739999 100644 --- a/drivers/gpu/drm/radeon/radeon_bios.c +++ b/drivers/gpu/drm/radeon/radeon_bios.c | |||
| @@ -48,6 +48,10 @@ static bool igp_read_bios_from_vram(struct radeon_device *rdev) | |||
| 48 | resource_size_t vram_base; | 48 | resource_size_t vram_base; |
| 49 | resource_size_t size = 256 * 1024; /* ??? */ | 49 | resource_size_t size = 256 * 1024; /* ??? */ |
| 50 | 50 | ||
| 51 | if (!(rdev->flags & RADEON_IS_IGP)) | ||
| 52 | if (!radeon_card_posted(rdev)) | ||
| 53 | return false; | ||
| 54 | |||
| 51 | rdev->bios = NULL; | 55 | rdev->bios = NULL; |
| 52 | vram_base = drm_get_resource_start(rdev->ddev, 0); | 56 | vram_base = drm_get_resource_start(rdev->ddev, 0); |
| 53 | bios = ioremap(vram_base, size); | 57 | bios = ioremap(vram_base, size); |
diff --git a/drivers/gpu/drm/radeon/radeon_combios.c b/drivers/gpu/drm/radeon/radeon_combios.c index 1bee2f9e24a5..d1c1d8dd93ce 100644 --- a/drivers/gpu/drm/radeon/radeon_combios.c +++ b/drivers/gpu/drm/radeon/radeon_combios.c | |||
| @@ -1411,6 +1411,11 @@ bool radeon_get_legacy_connector_info_from_table(struct drm_device *dev) | |||
| 1411 | rdev->mode_info.connector_table = CT_IMAC_G5_ISIGHT; | 1411 | rdev->mode_info.connector_table = CT_IMAC_G5_ISIGHT; |
| 1412 | } else | 1412 | } else |
| 1413 | #endif /* CONFIG_PPC_PMAC */ | 1413 | #endif /* CONFIG_PPC_PMAC */ |
| 1414 | #ifdef CONFIG_PPC64 | ||
| 1415 | if (ASIC_IS_RN50(rdev)) | ||
| 1416 | rdev->mode_info.connector_table = CT_RN50_POWER; | ||
| 1417 | else | ||
| 1418 | #endif | ||
| 1414 | rdev->mode_info.connector_table = CT_GENERIC; | 1419 | rdev->mode_info.connector_table = CT_GENERIC; |
| 1415 | } | 1420 | } |
| 1416 | 1421 | ||
| @@ -1853,6 +1858,33 @@ bool radeon_get_legacy_connector_info_from_table(struct drm_device *dev) | |||
| 1853 | CONNECTOR_OBJECT_ID_SVIDEO, | 1858 | CONNECTOR_OBJECT_ID_SVIDEO, |
| 1854 | &hpd); | 1859 | &hpd); |
| 1855 | break; | 1860 | break; |
| 1861 | case CT_RN50_POWER: | ||
| 1862 | DRM_INFO("Connector Table: %d (rn50-power)\n", | ||
| 1863 | rdev->mode_info.connector_table); | ||
| 1864 | /* VGA - primary dac */ | ||
| 1865 | ddc_i2c = combios_setup_i2c_bus(rdev, RADEON_GPIO_VGA_DDC); | ||
| 1866 | hpd.hpd = RADEON_HPD_NONE; | ||
| 1867 | radeon_add_legacy_encoder(dev, | ||
| 1868 | radeon_get_encoder_id(dev, | ||
| 1869 | ATOM_DEVICE_CRT1_SUPPORT, | ||
| 1870 | 1), | ||
| 1871 | ATOM_DEVICE_CRT1_SUPPORT); | ||
| 1872 | radeon_add_legacy_connector(dev, 0, ATOM_DEVICE_CRT1_SUPPORT, | ||
| 1873 | DRM_MODE_CONNECTOR_VGA, &ddc_i2c, | ||
| 1874 | CONNECTOR_OBJECT_ID_VGA, | ||
| 1875 | &hpd); | ||
| 1876 | ddc_i2c = combios_setup_i2c_bus(rdev, RADEON_GPIO_CRT2_DDC); | ||
| 1877 | hpd.hpd = RADEON_HPD_NONE; | ||
| 1878 | radeon_add_legacy_encoder(dev, | ||
| 1879 | radeon_get_encoder_id(dev, | ||
| 1880 | ATOM_DEVICE_CRT2_SUPPORT, | ||
| 1881 | 2), | ||
| 1882 | ATOM_DEVICE_CRT2_SUPPORT); | ||
| 1883 | radeon_add_legacy_connector(dev, 1, ATOM_DEVICE_CRT2_SUPPORT, | ||
| 1884 | DRM_MODE_CONNECTOR_VGA, &ddc_i2c, | ||
| 1885 | CONNECTOR_OBJECT_ID_VGA, | ||
| 1886 | &hpd); | ||
| 1887 | break; | ||
| 1856 | default: | 1888 | default: |
| 1857 | DRM_INFO("Connector table: %d (invalid)\n", | 1889 | DRM_INFO("Connector table: %d (invalid)\n", |
| 1858 | rdev->mode_info.connector_table); | 1890 | rdev->mode_info.connector_table); |
| @@ -1906,15 +1938,6 @@ static bool radeon_apply_legacy_quirks(struct drm_device *dev, | |||
| 1906 | return false; | 1938 | return false; |
| 1907 | } | 1939 | } |
| 1908 | 1940 | ||
| 1909 | /* Some RV100 cards with 2 VGA ports show up with DVI+VGA */ | ||
| 1910 | if (dev->pdev->device == 0x5159 && | ||
| 1911 | dev->pdev->subsystem_vendor == 0x1002 && | ||
| 1912 | dev->pdev->subsystem_device == 0x013a) { | ||
| 1913 | if (*legacy_connector == CONNECTOR_DVI_I_LEGACY) | ||
| 1914 | *legacy_connector = CONNECTOR_CRT_LEGACY; | ||
| 1915 | |||
| 1916 | } | ||
| 1917 | |||
| 1918 | /* X300 card with extra non-existent DVI port */ | 1941 | /* X300 card with extra non-existent DVI port */ |
| 1919 | if (dev->pdev->device == 0x5B60 && | 1942 | if (dev->pdev->device == 0x5B60 && |
| 1920 | dev->pdev->subsystem_vendor == 0x17af && | 1943 | dev->pdev->subsystem_vendor == 0x17af && |
| @@ -3019,6 +3042,14 @@ void radeon_combios_asic_init(struct drm_device *dev) | |||
| 3019 | combios_write_ram_size(dev); | 3042 | combios_write_ram_size(dev); |
| 3020 | } | 3043 | } |
| 3021 | 3044 | ||
| 3045 | /* quirk for rs4xx HP nx6125 laptop to make it resume | ||
| 3046 | * - it hangs on resume inside the dynclk 1 table. | ||
| 3047 | */ | ||
| 3048 | if (rdev->family == CHIP_RS480 && | ||
| 3049 | rdev->pdev->subsystem_vendor == 0x103c && | ||
| 3050 | rdev->pdev->subsystem_device == 0x308b) | ||
| 3051 | return; | ||
| 3052 | |||
| 3022 | /* DYN CLK 1 */ | 3053 | /* DYN CLK 1 */ |
| 3023 | table = combios_get_table_offset(dev, COMBIOS_DYN_CLK_1_TABLE); | 3054 | table = combios_get_table_offset(dev, COMBIOS_DYN_CLK_1_TABLE); |
| 3024 | if (table) | 3055 | if (table) |
diff --git a/drivers/gpu/drm/radeon/radeon_cursor.c b/drivers/gpu/drm/radeon/radeon_cursor.c index b7023fff89eb..4eb67c0e0996 100644 --- a/drivers/gpu/drm/radeon/radeon_cursor.c +++ b/drivers/gpu/drm/radeon/radeon_cursor.c | |||
| @@ -194,7 +194,7 @@ unpin: | |||
| 194 | fail: | 194 | fail: |
| 195 | drm_gem_object_unreference_unlocked(obj); | 195 | drm_gem_object_unreference_unlocked(obj); |
| 196 | 196 | ||
| 197 | return 0; | 197 | return ret; |
| 198 | } | 198 | } |
| 199 | 199 | ||
| 200 | int radeon_crtc_cursor_move(struct drm_crtc *crtc, | 200 | int radeon_crtc_cursor_move(struct drm_crtc *crtc, |
diff --git a/drivers/gpu/drm/radeon/radeon_device.c b/drivers/gpu/drm/radeon/radeon_device.c index f10faed21567..5f317317aba2 100644 --- a/drivers/gpu/drm/radeon/radeon_device.c +++ b/drivers/gpu/drm/radeon/radeon_device.c | |||
| @@ -779,6 +779,7 @@ int radeon_suspend_kms(struct drm_device *dev, pm_message_t state) | |||
| 779 | 779 | ||
| 780 | int radeon_resume_kms(struct drm_device *dev) | 780 | int radeon_resume_kms(struct drm_device *dev) |
| 781 | { | 781 | { |
| 782 | struct drm_connector *connector; | ||
| 782 | struct radeon_device *rdev = dev->dev_private; | 783 | struct radeon_device *rdev = dev->dev_private; |
| 783 | 784 | ||
| 784 | if (rdev->powered_down) | 785 | if (rdev->powered_down) |
| @@ -797,6 +798,12 @@ int radeon_resume_kms(struct drm_device *dev) | |||
| 797 | radeon_resume(rdev); | 798 | radeon_resume(rdev); |
| 798 | radeon_pm_resume(rdev); | 799 | radeon_pm_resume(rdev); |
| 799 | radeon_restore_bios_scratch_regs(rdev); | 800 | radeon_restore_bios_scratch_regs(rdev); |
| 801 | |||
| 802 | /* turn on display hw */ | ||
| 803 | list_for_each_entry(connector, &dev->mode_config.connector_list, head) { | ||
| 804 | drm_helper_connector_dpms(connector, DRM_MODE_DPMS_ON); | ||
| 805 | } | ||
| 806 | |||
| 800 | radeon_fbdev_set_suspend(rdev, 0); | 807 | radeon_fbdev_set_suspend(rdev, 0); |
| 801 | release_console_sem(); | 808 | release_console_sem(); |
| 802 | 809 | ||
diff --git a/drivers/gpu/drm/radeon/radeon_encoders.c b/drivers/gpu/drm/radeon/radeon_encoders.c index 1ebb100015b7..e0b30b264c28 100644 --- a/drivers/gpu/drm/radeon/radeon_encoders.c +++ b/drivers/gpu/drm/radeon/radeon_encoders.c | |||
| @@ -1072,6 +1072,8 @@ radeon_atom_encoder_dpms(struct drm_encoder *encoder, int mode) | |||
| 1072 | if (is_dig) { | 1072 | if (is_dig) { |
| 1073 | switch (mode) { | 1073 | switch (mode) { |
| 1074 | case DRM_MODE_DPMS_ON: | 1074 | case DRM_MODE_DPMS_ON: |
| 1075 | if (!ASIC_IS_DCE4(rdev)) | ||
| 1076 | atombios_dig_transmitter_setup(encoder, ATOM_TRANSMITTER_ACTION_ENABLE_OUTPUT, 0, 0); | ||
| 1075 | if (atombios_get_encoder_mode(encoder) == ATOM_ENCODER_MODE_DP) { | 1077 | if (atombios_get_encoder_mode(encoder) == ATOM_ENCODER_MODE_DP) { |
| 1076 | struct drm_connector *connector = radeon_get_connector_for_encoder(encoder); | 1078 | struct drm_connector *connector = radeon_get_connector_for_encoder(encoder); |
| 1077 | 1079 | ||
| @@ -1079,8 +1081,6 @@ radeon_atom_encoder_dpms(struct drm_encoder *encoder, int mode) | |||
| 1079 | if (ASIC_IS_DCE4(rdev)) | 1081 | if (ASIC_IS_DCE4(rdev)) |
| 1080 | atombios_dig_encoder_setup(encoder, ATOM_ENCODER_CMD_DP_VIDEO_ON); | 1082 | atombios_dig_encoder_setup(encoder, ATOM_ENCODER_CMD_DP_VIDEO_ON); |
| 1081 | } | 1083 | } |
| 1082 | if (!ASIC_IS_DCE4(rdev)) | ||
| 1083 | atombios_dig_transmitter_setup(encoder, ATOM_TRANSMITTER_ACTION_ENABLE_OUTPUT, 0, 0); | ||
| 1084 | break; | 1084 | break; |
| 1085 | case DRM_MODE_DPMS_STANDBY: | 1085 | case DRM_MODE_DPMS_STANDBY: |
| 1086 | case DRM_MODE_DPMS_SUSPEND: | 1086 | case DRM_MODE_DPMS_SUSPEND: |
diff --git a/drivers/gpu/drm/radeon/radeon_legacy_encoders.c b/drivers/gpu/drm/radeon/radeon_legacy_encoders.c index 5b07b8848e09..bad77f40a9da 100644 --- a/drivers/gpu/drm/radeon/radeon_legacy_encoders.c +++ b/drivers/gpu/drm/radeon/radeon_legacy_encoders.c | |||
| @@ -928,16 +928,14 @@ static void radeon_legacy_tv_dac_mode_set(struct drm_encoder *encoder, | |||
| 928 | if (ASIC_IS_R300(rdev)) { | 928 | if (ASIC_IS_R300(rdev)) { |
| 929 | gpiopad_a = RREG32(RADEON_GPIOPAD_A) | 1; | 929 | gpiopad_a = RREG32(RADEON_GPIOPAD_A) | 1; |
| 930 | disp_output_cntl = RREG32(RADEON_DISP_OUTPUT_CNTL); | 930 | disp_output_cntl = RREG32(RADEON_DISP_OUTPUT_CNTL); |
| 931 | } | 931 | } else if (rdev->family != CHIP_R200) |
| 932 | |||
| 933 | if (rdev->family == CHIP_R200 || ASIC_IS_R300(rdev)) | ||
| 934 | disp_tv_out_cntl = RREG32(RADEON_DISP_TV_OUT_CNTL); | ||
| 935 | else | ||
| 936 | disp_hw_debug = RREG32(RADEON_DISP_HW_DEBUG); | 932 | disp_hw_debug = RREG32(RADEON_DISP_HW_DEBUG); |
| 937 | 933 | else if (rdev->family == CHIP_R200) | |
| 938 | if (rdev->family == CHIP_R200) | ||
| 939 | fp2_gen_cntl = RREG32(RADEON_FP2_GEN_CNTL); | 934 | fp2_gen_cntl = RREG32(RADEON_FP2_GEN_CNTL); |
| 940 | 935 | ||
| 936 | if (rdev->family >= CHIP_R200) | ||
| 937 | disp_tv_out_cntl = RREG32(RADEON_DISP_TV_OUT_CNTL); | ||
| 938 | |||
| 941 | if (is_tv) { | 939 | if (is_tv) { |
| 942 | uint32_t dac_cntl; | 940 | uint32_t dac_cntl; |
| 943 | 941 | ||
| @@ -1002,15 +1000,13 @@ static void radeon_legacy_tv_dac_mode_set(struct drm_encoder *encoder, | |||
| 1002 | if (ASIC_IS_R300(rdev)) { | 1000 | if (ASIC_IS_R300(rdev)) { |
| 1003 | WREG32_P(RADEON_GPIOPAD_A, gpiopad_a, ~1); | 1001 | WREG32_P(RADEON_GPIOPAD_A, gpiopad_a, ~1); |
| 1004 | WREG32(RADEON_DISP_OUTPUT_CNTL, disp_output_cntl); | 1002 | WREG32(RADEON_DISP_OUTPUT_CNTL, disp_output_cntl); |
| 1005 | } | 1003 | } else if (rdev->family != CHIP_R200) |
| 1004 | WREG32(RADEON_DISP_HW_DEBUG, disp_hw_debug); | ||
| 1005 | else if (rdev->family == CHIP_R200) | ||
| 1006 | WREG32(RADEON_FP2_GEN_CNTL, fp2_gen_cntl); | ||
| 1006 | 1007 | ||
| 1007 | if (rdev->family >= CHIP_R200) | 1008 | if (rdev->family >= CHIP_R200) |
| 1008 | WREG32(RADEON_DISP_TV_OUT_CNTL, disp_tv_out_cntl); | 1009 | WREG32(RADEON_DISP_TV_OUT_CNTL, disp_tv_out_cntl); |
| 1009 | else | ||
| 1010 | WREG32(RADEON_DISP_HW_DEBUG, disp_hw_debug); | ||
| 1011 | |||
| 1012 | if (rdev->family == CHIP_R200) | ||
| 1013 | WREG32(RADEON_FP2_GEN_CNTL, fp2_gen_cntl); | ||
| 1014 | 1010 | ||
| 1015 | if (is_tv) | 1011 | if (is_tv) |
| 1016 | radeon_legacy_tv_mode_set(encoder, mode, adjusted_mode); | 1012 | radeon_legacy_tv_mode_set(encoder, mode, adjusted_mode); |
diff --git a/drivers/gpu/drm/radeon/radeon_mode.h b/drivers/gpu/drm/radeon/radeon_mode.h index 67358baf28b2..95696aa57ac8 100644 --- a/drivers/gpu/drm/radeon/radeon_mode.h +++ b/drivers/gpu/drm/radeon/radeon_mode.h | |||
| @@ -206,6 +206,7 @@ enum radeon_connector_table { | |||
| 206 | CT_MINI_INTERNAL, | 206 | CT_MINI_INTERNAL, |
| 207 | CT_IMAC_G5_ISIGHT, | 207 | CT_IMAC_G5_ISIGHT, |
| 208 | CT_EMAC, | 208 | CT_EMAC, |
| 209 | CT_RN50_POWER, | ||
| 209 | }; | 210 | }; |
| 210 | 211 | ||
| 211 | enum radeon_dvo_chip { | 212 | enum radeon_dvo_chip { |
diff --git a/drivers/gpu/drm/radeon/radeon_pm.c b/drivers/gpu/drm/radeon/radeon_pm.c index 63f679a04b25..115d26b762cc 100644 --- a/drivers/gpu/drm/radeon/radeon_pm.c +++ b/drivers/gpu/drm/radeon/radeon_pm.c | |||
| @@ -397,13 +397,20 @@ static ssize_t radeon_set_pm_method(struct device *dev, | |||
| 397 | rdev->pm.dynpm_planned_action = DYNPM_ACTION_DEFAULT; | 397 | rdev->pm.dynpm_planned_action = DYNPM_ACTION_DEFAULT; |
| 398 | mutex_unlock(&rdev->pm.mutex); | 398 | mutex_unlock(&rdev->pm.mutex); |
| 399 | } else if (strncmp("profile", buf, strlen("profile")) == 0) { | 399 | } else if (strncmp("profile", buf, strlen("profile")) == 0) { |
| 400 | bool flush_wq = false; | ||
| 401 | |||
| 400 | mutex_lock(&rdev->pm.mutex); | 402 | mutex_lock(&rdev->pm.mutex); |
| 401 | rdev->pm.pm_method = PM_METHOD_PROFILE; | 403 | if (rdev->pm.pm_method == PM_METHOD_DYNPM) { |
| 404 | cancel_delayed_work(&rdev->pm.dynpm_idle_work); | ||
| 405 | flush_wq = true; | ||
| 406 | } | ||
| 402 | /* disable dynpm */ | 407 | /* disable dynpm */ |
| 403 | rdev->pm.dynpm_state = DYNPM_STATE_DISABLED; | 408 | rdev->pm.dynpm_state = DYNPM_STATE_DISABLED; |
| 404 | rdev->pm.dynpm_planned_action = DYNPM_ACTION_NONE; | 409 | rdev->pm.dynpm_planned_action = DYNPM_ACTION_NONE; |
| 405 | cancel_delayed_work(&rdev->pm.dynpm_idle_work); | 410 | rdev->pm.pm_method = PM_METHOD_PROFILE; |
| 406 | mutex_unlock(&rdev->pm.mutex); | 411 | mutex_unlock(&rdev->pm.mutex); |
| 412 | if (flush_wq) | ||
| 413 | flush_workqueue(rdev->wq); | ||
| 407 | } else { | 414 | } else { |
| 408 | DRM_ERROR("invalid power method!\n"); | 415 | DRM_ERROR("invalid power method!\n"); |
| 409 | goto fail; | 416 | goto fail; |
| @@ -418,9 +425,18 @@ static DEVICE_ATTR(power_method, S_IRUGO | S_IWUSR, radeon_get_pm_method, radeon | |||
| 418 | 425 | ||
| 419 | void radeon_pm_suspend(struct radeon_device *rdev) | 426 | void radeon_pm_suspend(struct radeon_device *rdev) |
| 420 | { | 427 | { |
| 428 | bool flush_wq = false; | ||
| 429 | |||
| 421 | mutex_lock(&rdev->pm.mutex); | 430 | mutex_lock(&rdev->pm.mutex); |
| 422 | cancel_delayed_work(&rdev->pm.dynpm_idle_work); | 431 | if (rdev->pm.pm_method == PM_METHOD_DYNPM) { |
| 432 | cancel_delayed_work(&rdev->pm.dynpm_idle_work); | ||
| 433 | if (rdev->pm.dynpm_state == DYNPM_STATE_ACTIVE) | ||
| 434 | rdev->pm.dynpm_state = DYNPM_STATE_SUSPENDED; | ||
| 435 | flush_wq = true; | ||
| 436 | } | ||
| 423 | mutex_unlock(&rdev->pm.mutex); | 437 | mutex_unlock(&rdev->pm.mutex); |
| 438 | if (flush_wq) | ||
| 439 | flush_workqueue(rdev->wq); | ||
| 424 | } | 440 | } |
| 425 | 441 | ||
| 426 | void radeon_pm_resume(struct radeon_device *rdev) | 442 | void radeon_pm_resume(struct radeon_device *rdev) |
| @@ -432,6 +448,12 @@ void radeon_pm_resume(struct radeon_device *rdev) | |||
| 432 | rdev->pm.current_sclk = rdev->clock.default_sclk; | 448 | rdev->pm.current_sclk = rdev->clock.default_sclk; |
| 433 | rdev->pm.current_mclk = rdev->clock.default_mclk; | 449 | rdev->pm.current_mclk = rdev->clock.default_mclk; |
| 434 | rdev->pm.current_vddc = rdev->pm.power_state[rdev->pm.default_power_state_index].clock_info[0].voltage.voltage; | 450 | rdev->pm.current_vddc = rdev->pm.power_state[rdev->pm.default_power_state_index].clock_info[0].voltage.voltage; |
| 451 | if (rdev->pm.pm_method == PM_METHOD_DYNPM | ||
| 452 | && rdev->pm.dynpm_state == DYNPM_STATE_SUSPENDED) { | ||
| 453 | rdev->pm.dynpm_state = DYNPM_STATE_ACTIVE; | ||
| 454 | queue_delayed_work(rdev->wq, &rdev->pm.dynpm_idle_work, | ||
| 455 | msecs_to_jiffies(RADEON_IDLE_LOOP_MS)); | ||
| 456 | } | ||
| 435 | mutex_unlock(&rdev->pm.mutex); | 457 | mutex_unlock(&rdev->pm.mutex); |
| 436 | radeon_pm_compute_clocks(rdev); | 458 | radeon_pm_compute_clocks(rdev); |
| 437 | } | 459 | } |
| @@ -486,6 +508,8 @@ int radeon_pm_init(struct radeon_device *rdev) | |||
| 486 | void radeon_pm_fini(struct radeon_device *rdev) | 508 | void radeon_pm_fini(struct radeon_device *rdev) |
| 487 | { | 509 | { |
| 488 | if (rdev->pm.num_power_states > 1) { | 510 | if (rdev->pm.num_power_states > 1) { |
| 511 | bool flush_wq = false; | ||
| 512 | |||
| 489 | mutex_lock(&rdev->pm.mutex); | 513 | mutex_lock(&rdev->pm.mutex); |
| 490 | if (rdev->pm.pm_method == PM_METHOD_PROFILE) { | 514 | if (rdev->pm.pm_method == PM_METHOD_PROFILE) { |
| 491 | rdev->pm.profile = PM_PROFILE_DEFAULT; | 515 | rdev->pm.profile = PM_PROFILE_DEFAULT; |
| @@ -493,13 +517,16 @@ void radeon_pm_fini(struct radeon_device *rdev) | |||
| 493 | radeon_pm_set_clocks(rdev); | 517 | radeon_pm_set_clocks(rdev); |
| 494 | } else if (rdev->pm.pm_method == PM_METHOD_DYNPM) { | 518 | } else if (rdev->pm.pm_method == PM_METHOD_DYNPM) { |
| 495 | /* cancel work */ | 519 | /* cancel work */ |
| 496 | cancel_delayed_work_sync(&rdev->pm.dynpm_idle_work); | 520 | cancel_delayed_work(&rdev->pm.dynpm_idle_work); |
| 521 | flush_wq = true; | ||
| 497 | /* reset default clocks */ | 522 | /* reset default clocks */ |
| 498 | rdev->pm.dynpm_state = DYNPM_STATE_DISABLED; | 523 | rdev->pm.dynpm_state = DYNPM_STATE_DISABLED; |
| 499 | rdev->pm.dynpm_planned_action = DYNPM_ACTION_DEFAULT; | 524 | rdev->pm.dynpm_planned_action = DYNPM_ACTION_DEFAULT; |
| 500 | radeon_pm_set_clocks(rdev); | 525 | radeon_pm_set_clocks(rdev); |
| 501 | } | 526 | } |
| 502 | mutex_unlock(&rdev->pm.mutex); | 527 | mutex_unlock(&rdev->pm.mutex); |
| 528 | if (flush_wq) | ||
| 529 | flush_workqueue(rdev->wq); | ||
| 503 | 530 | ||
| 504 | device_remove_file(rdev->dev, &dev_attr_power_profile); | 531 | device_remove_file(rdev->dev, &dev_attr_power_profile); |
| 505 | device_remove_file(rdev->dev, &dev_attr_power_method); | 532 | device_remove_file(rdev->dev, &dev_attr_power_method); |
| @@ -720,12 +747,12 @@ static void radeon_dynpm_idle_work_handler(struct work_struct *work) | |||
| 720 | radeon_pm_get_dynpm_state(rdev); | 747 | radeon_pm_get_dynpm_state(rdev); |
| 721 | radeon_pm_set_clocks(rdev); | 748 | radeon_pm_set_clocks(rdev); |
| 722 | } | 749 | } |
| 750 | |||
| 751 | queue_delayed_work(rdev->wq, &rdev->pm.dynpm_idle_work, | ||
| 752 | msecs_to_jiffies(RADEON_IDLE_LOOP_MS)); | ||
| 723 | } | 753 | } |
| 724 | mutex_unlock(&rdev->pm.mutex); | 754 | mutex_unlock(&rdev->pm.mutex); |
| 725 | ttm_bo_unlock_delayed_workqueue(&rdev->mman.bdev, resched); | 755 | ttm_bo_unlock_delayed_workqueue(&rdev->mman.bdev, resched); |
| 726 | |||
| 727 | queue_delayed_work(rdev->wq, &rdev->pm.dynpm_idle_work, | ||
| 728 | msecs_to_jiffies(RADEON_IDLE_LOOP_MS)); | ||
| 729 | } | 756 | } |
| 730 | 757 | ||
| 731 | /* | 758 | /* |
diff --git a/drivers/gpu/drm/radeon/reg_srcs/evergreen b/drivers/gpu/drm/radeon/reg_srcs/evergreen index b5c757f68d3c..f78fd592544d 100644 --- a/drivers/gpu/drm/radeon/reg_srcs/evergreen +++ b/drivers/gpu/drm/radeon/reg_srcs/evergreen | |||
| @@ -80,8 +80,8 @@ evergreen 0x9400 | |||
| 80 | 0x00028010 DB_RENDER_OVERRIDE2 | 80 | 0x00028010 DB_RENDER_OVERRIDE2 |
| 81 | 0x00028028 DB_STENCIL_CLEAR | 81 | 0x00028028 DB_STENCIL_CLEAR |
| 82 | 0x0002802C DB_DEPTH_CLEAR | 82 | 0x0002802C DB_DEPTH_CLEAR |
| 83 | 0x00028034 PA_SC_SCREEN_SCISSOR_BR | ||
| 84 | 0x00028030 PA_SC_SCREEN_SCISSOR_TL | 83 | 0x00028030 PA_SC_SCREEN_SCISSOR_TL |
| 84 | 0x00028034 PA_SC_SCREEN_SCISSOR_BR | ||
| 85 | 0x0002805C DB_DEPTH_SLICE | 85 | 0x0002805C DB_DEPTH_SLICE |
| 86 | 0x00028140 SQ_ALU_CONST_BUFFER_SIZE_PS_0 | 86 | 0x00028140 SQ_ALU_CONST_BUFFER_SIZE_PS_0 |
| 87 | 0x00028144 SQ_ALU_CONST_BUFFER_SIZE_PS_1 | 87 | 0x00028144 SQ_ALU_CONST_BUFFER_SIZE_PS_1 |
| @@ -460,8 +460,8 @@ evergreen 0x9400 | |||
| 460 | 0x00028844 SQ_PGM_RESOURCES_PS | 460 | 0x00028844 SQ_PGM_RESOURCES_PS |
| 461 | 0x00028848 SQ_PGM_RESOURCES_2_PS | 461 | 0x00028848 SQ_PGM_RESOURCES_2_PS |
| 462 | 0x0002884C SQ_PGM_EXPORTS_PS | 462 | 0x0002884C SQ_PGM_EXPORTS_PS |
| 463 | 0x0002885C SQ_PGM_RESOURCES_VS | 463 | 0x00028860 SQ_PGM_RESOURCES_VS |
| 464 | 0x00028860 SQ_PGM_RESOURCES_2_VS | 464 | 0x00028864 SQ_PGM_RESOURCES_2_VS |
| 465 | 0x00028878 SQ_PGM_RESOURCES_GS | 465 | 0x00028878 SQ_PGM_RESOURCES_GS |
| 466 | 0x0002887C SQ_PGM_RESOURCES_2_GS | 466 | 0x0002887C SQ_PGM_RESOURCES_2_GS |
| 467 | 0x00028890 SQ_PGM_RESOURCES_ES | 467 | 0x00028890 SQ_PGM_RESOURCES_ES |
| @@ -469,8 +469,8 @@ evergreen 0x9400 | |||
| 469 | 0x000288A8 SQ_PGM_RESOURCES_FS | 469 | 0x000288A8 SQ_PGM_RESOURCES_FS |
| 470 | 0x000288BC SQ_PGM_RESOURCES_HS | 470 | 0x000288BC SQ_PGM_RESOURCES_HS |
| 471 | 0x000288C0 SQ_PGM_RESOURCES_2_HS | 471 | 0x000288C0 SQ_PGM_RESOURCES_2_HS |
| 472 | 0x000288D0 SQ_PGM_RESOURCES_LS | 472 | 0x000288D4 SQ_PGM_RESOURCES_LS |
| 473 | 0x000288D4 SQ_PGM_RESOURCES_2_LS | 473 | 0x000288D8 SQ_PGM_RESOURCES_2_LS |
| 474 | 0x000288E8 SQ_LDS_ALLOC | 474 | 0x000288E8 SQ_LDS_ALLOC |
| 475 | 0x000288EC SQ_LDS_ALLOC_PS | 475 | 0x000288EC SQ_LDS_ALLOC_PS |
| 476 | 0x000288F0 SQ_VTX_SEMANTIC_CLEAR | 476 | 0x000288F0 SQ_VTX_SEMANTIC_CLEAR |
diff --git a/drivers/gpu/drm/radeon/rs690.c b/drivers/gpu/drm/radeon/rs690.c index bcc33195ebc2..f4f0a61bcdce 100644 --- a/drivers/gpu/drm/radeon/rs690.c +++ b/drivers/gpu/drm/radeon/rs690.c | |||
| @@ -79,7 +79,13 @@ void rs690_pm_info(struct radeon_device *rdev) | |||
| 79 | tmp.full = dfixed_const(100); | 79 | tmp.full = dfixed_const(100); |
| 80 | rdev->pm.igp_sideport_mclk.full = dfixed_const(info->info.ulBootUpMemoryClock); | 80 | rdev->pm.igp_sideport_mclk.full = dfixed_const(info->info.ulBootUpMemoryClock); |
| 81 | rdev->pm.igp_sideport_mclk.full = dfixed_div(rdev->pm.igp_sideport_mclk, tmp); | 81 | rdev->pm.igp_sideport_mclk.full = dfixed_div(rdev->pm.igp_sideport_mclk, tmp); |
| 82 | rdev->pm.igp_system_mclk.full = dfixed_const(le16_to_cpu(info->info.usK8MemoryClock)); | 82 | if (info->info.usK8MemoryClock) |
| 83 | rdev->pm.igp_system_mclk.full = dfixed_const(le16_to_cpu(info->info.usK8MemoryClock)); | ||
| 84 | else if (rdev->clock.default_mclk) { | ||
| 85 | rdev->pm.igp_system_mclk.full = dfixed_const(rdev->clock.default_mclk); | ||
| 86 | rdev->pm.igp_system_mclk.full = dfixed_div(rdev->pm.igp_system_mclk, tmp); | ||
| 87 | } else | ||
| 88 | rdev->pm.igp_system_mclk.full = dfixed_const(400); | ||
| 83 | rdev->pm.igp_ht_link_clk.full = dfixed_const(le16_to_cpu(info->info.usFSBClock)); | 89 | rdev->pm.igp_ht_link_clk.full = dfixed_const(le16_to_cpu(info->info.usFSBClock)); |
| 84 | rdev->pm.igp_ht_link_width.full = dfixed_const(info->info.ucHTLinkWidth); | 90 | rdev->pm.igp_ht_link_width.full = dfixed_const(info->info.ucHTLinkWidth); |
| 85 | break; | 91 | break; |
| @@ -87,34 +93,31 @@ void rs690_pm_info(struct radeon_device *rdev) | |||
| 87 | tmp.full = dfixed_const(100); | 93 | tmp.full = dfixed_const(100); |
| 88 | rdev->pm.igp_sideport_mclk.full = dfixed_const(info->info_v2.ulBootUpSidePortClock); | 94 | rdev->pm.igp_sideport_mclk.full = dfixed_const(info->info_v2.ulBootUpSidePortClock); |
| 89 | rdev->pm.igp_sideport_mclk.full = dfixed_div(rdev->pm.igp_sideport_mclk, tmp); | 95 | rdev->pm.igp_sideport_mclk.full = dfixed_div(rdev->pm.igp_sideport_mclk, tmp); |
| 90 | rdev->pm.igp_system_mclk.full = dfixed_const(info->info_v2.ulBootUpUMAClock); | 96 | if (info->info_v2.ulBootUpUMAClock) |
| 97 | rdev->pm.igp_system_mclk.full = dfixed_const(info->info_v2.ulBootUpUMAClock); | ||
| 98 | else if (rdev->clock.default_mclk) | ||
| 99 | rdev->pm.igp_system_mclk.full = dfixed_const(rdev->clock.default_mclk); | ||
| 100 | else | ||
| 101 | rdev->pm.igp_system_mclk.full = dfixed_const(66700); | ||
| 91 | rdev->pm.igp_system_mclk.full = dfixed_div(rdev->pm.igp_system_mclk, tmp); | 102 | rdev->pm.igp_system_mclk.full = dfixed_div(rdev->pm.igp_system_mclk, tmp); |
| 92 | rdev->pm.igp_ht_link_clk.full = dfixed_const(info->info_v2.ulHTLinkFreq); | 103 | rdev->pm.igp_ht_link_clk.full = dfixed_const(info->info_v2.ulHTLinkFreq); |
| 93 | rdev->pm.igp_ht_link_clk.full = dfixed_div(rdev->pm.igp_ht_link_clk, tmp); | 104 | rdev->pm.igp_ht_link_clk.full = dfixed_div(rdev->pm.igp_ht_link_clk, tmp); |
| 94 | rdev->pm.igp_ht_link_width.full = dfixed_const(le16_to_cpu(info->info_v2.usMinHTLinkWidth)); | 105 | rdev->pm.igp_ht_link_width.full = dfixed_const(le16_to_cpu(info->info_v2.usMinHTLinkWidth)); |
| 95 | break; | 106 | break; |
| 96 | default: | 107 | default: |
| 97 | tmp.full = dfixed_const(100); | ||
| 98 | /* We assume the slower possible clock ie worst case */ | 108 | /* We assume the slower possible clock ie worst case */ |
| 99 | /* DDR 333Mhz */ | 109 | rdev->pm.igp_sideport_mclk.full = dfixed_const(200); |
| 100 | rdev->pm.igp_sideport_mclk.full = dfixed_const(333); | 110 | rdev->pm.igp_system_mclk.full = dfixed_const(200); |
| 101 | /* FIXME: system clock ? */ | 111 | rdev->pm.igp_ht_link_clk.full = dfixed_const(1000); |
| 102 | rdev->pm.igp_system_mclk.full = dfixed_const(100); | ||
| 103 | rdev->pm.igp_system_mclk.full = dfixed_div(rdev->pm.igp_system_mclk, tmp); | ||
| 104 | rdev->pm.igp_ht_link_clk.full = dfixed_const(200); | ||
| 105 | rdev->pm.igp_ht_link_width.full = dfixed_const(8); | 112 | rdev->pm.igp_ht_link_width.full = dfixed_const(8); |
| 106 | DRM_ERROR("No integrated system info for your GPU, using safe default\n"); | 113 | DRM_ERROR("No integrated system info for your GPU, using safe default\n"); |
| 107 | break; | 114 | break; |
| 108 | } | 115 | } |
| 109 | } else { | 116 | } else { |
| 110 | tmp.full = dfixed_const(100); | ||
| 111 | /* We assume the slower possible clock ie worst case */ | 117 | /* We assume the slower possible clock ie worst case */ |
| 112 | /* DDR 333Mhz */ | 118 | rdev->pm.igp_sideport_mclk.full = dfixed_const(200); |
| 113 | rdev->pm.igp_sideport_mclk.full = dfixed_const(333); | 119 | rdev->pm.igp_system_mclk.full = dfixed_const(200); |
| 114 | /* FIXME: system clock ? */ | 120 | rdev->pm.igp_ht_link_clk.full = dfixed_const(1000); |
| 115 | rdev->pm.igp_system_mclk.full = dfixed_const(100); | ||
| 116 | rdev->pm.igp_system_mclk.full = dfixed_div(rdev->pm.igp_system_mclk, tmp); | ||
| 117 | rdev->pm.igp_ht_link_clk.full = dfixed_const(200); | ||
| 118 | rdev->pm.igp_ht_link_width.full = dfixed_const(8); | 121 | rdev->pm.igp_ht_link_width.full = dfixed_const(8); |
| 119 | DRM_ERROR("No integrated system info for your GPU, using safe default\n"); | 122 | DRM_ERROR("No integrated system info for your GPU, using safe default\n"); |
| 120 | } | 123 | } |
| @@ -228,10 +231,6 @@ void rs690_crtc_bandwidth_compute(struct radeon_device *rdev, | |||
| 228 | fixed20_12 a, b, c; | 231 | fixed20_12 a, b, c; |
| 229 | fixed20_12 pclk, request_fifo_depth, tolerable_latency, estimated_width; | 232 | fixed20_12 pclk, request_fifo_depth, tolerable_latency, estimated_width; |
| 230 | fixed20_12 consumption_time, line_time, chunk_time, read_delay_latency; | 233 | fixed20_12 consumption_time, line_time, chunk_time, read_delay_latency; |
| 231 | /* FIXME: detect IGP with sideport memory, i don't think there is any | ||
| 232 | * such product available | ||
| 233 | */ | ||
| 234 | bool sideport = false; | ||
| 235 | 234 | ||
| 236 | if (!crtc->base.enabled) { | 235 | if (!crtc->base.enabled) { |
| 237 | /* FIXME: wouldn't it better to set priority mark to maximum */ | 236 | /* FIXME: wouldn't it better to set priority mark to maximum */ |
| @@ -300,7 +299,7 @@ void rs690_crtc_bandwidth_compute(struct radeon_device *rdev, | |||
| 300 | 299 | ||
| 301 | /* Maximun bandwidth is the minimun bandwidth of all component */ | 300 | /* Maximun bandwidth is the minimun bandwidth of all component */ |
| 302 | rdev->pm.max_bandwidth = rdev->pm.core_bandwidth; | 301 | rdev->pm.max_bandwidth = rdev->pm.core_bandwidth; |
| 303 | if (sideport) { | 302 | if (rdev->mc.igp_sideport_enabled) { |
| 304 | if (rdev->pm.max_bandwidth.full > rdev->pm.sideport_bandwidth.full && | 303 | if (rdev->pm.max_bandwidth.full > rdev->pm.sideport_bandwidth.full && |
| 305 | rdev->pm.sideport_bandwidth.full) | 304 | rdev->pm.sideport_bandwidth.full) |
| 306 | rdev->pm.max_bandwidth = rdev->pm.sideport_bandwidth; | 305 | rdev->pm.max_bandwidth = rdev->pm.sideport_bandwidth; |
diff --git a/drivers/gpu/drm/radeon/rv770.c b/drivers/gpu/drm/radeon/rv770.c index cec536c222c5..b7fd82064922 100644 --- a/drivers/gpu/drm/radeon/rv770.c +++ b/drivers/gpu/drm/radeon/rv770.c | |||
| @@ -224,7 +224,7 @@ static void rv770_mc_program(struct radeon_device *rdev) | |||
| 224 | WREG32(MC_VM_FB_LOCATION, tmp); | 224 | WREG32(MC_VM_FB_LOCATION, tmp); |
| 225 | WREG32(HDP_NONSURFACE_BASE, (rdev->mc.vram_start >> 8)); | 225 | WREG32(HDP_NONSURFACE_BASE, (rdev->mc.vram_start >> 8)); |
| 226 | WREG32(HDP_NONSURFACE_INFO, (2 << 7)); | 226 | WREG32(HDP_NONSURFACE_INFO, (2 << 7)); |
| 227 | WREG32(HDP_NONSURFACE_SIZE, (rdev->mc.mc_vram_size - 1) | 0x3FF); | 227 | WREG32(HDP_NONSURFACE_SIZE, 0x3FFFFFFF); |
| 228 | if (rdev->flags & RADEON_IS_AGP) { | 228 | if (rdev->flags & RADEON_IS_AGP) { |
| 229 | WREG32(MC_VM_AGP_TOP, rdev->mc.gtt_end >> 16); | 229 | WREG32(MC_VM_AGP_TOP, rdev->mc.gtt_end >> 16); |
| 230 | WREG32(MC_VM_AGP_BOT, rdev->mc.gtt_start >> 16); | 230 | WREG32(MC_VM_AGP_BOT, rdev->mc.gtt_start >> 16); |
diff --git a/drivers/gpu/drm/ttm/ttm_page_alloc.c b/drivers/gpu/drm/ttm/ttm_page_alloc.c index ef910694bd63..2f047577b1e3 100644 --- a/drivers/gpu/drm/ttm/ttm_page_alloc.c +++ b/drivers/gpu/drm/ttm/ttm_page_alloc.c | |||
| @@ -667,7 +667,7 @@ int ttm_get_pages(struct list_head *pages, int flags, | |||
| 667 | { | 667 | { |
| 668 | struct ttm_page_pool *pool = ttm_get_pool(flags, cstate); | 668 | struct ttm_page_pool *pool = ttm_get_pool(flags, cstate); |
| 669 | struct page *p = NULL; | 669 | struct page *p = NULL; |
| 670 | int gfp_flags = 0; | 670 | int gfp_flags = GFP_USER; |
| 671 | int r; | 671 | int r; |
| 672 | 672 | ||
| 673 | /* set zero flag for page allocation if required */ | 673 | /* set zero flag for page allocation if required */ |
diff --git a/include/linux/agp_backend.h b/include/linux/agp_backend.h index 9101ed64f803..09ea4a1e9505 100644 --- a/include/linux/agp_backend.h +++ b/include/linux/agp_backend.h | |||
| @@ -79,7 +79,6 @@ struct agp_memory { | |||
| 79 | u32 physical; | 79 | u32 physical; |
| 80 | bool is_bound; | 80 | bool is_bound; |
| 81 | bool is_flushed; | 81 | bool is_flushed; |
| 82 | bool vmalloc_flag; | ||
| 83 | /* list of agp_memory mapped to the aperture */ | 82 | /* list of agp_memory mapped to the aperture */ |
| 84 | struct list_head mapped_list; | 83 | struct list_head mapped_list; |
| 85 | /* DMA-mapped addresses */ | 84 | /* DMA-mapped addresses */ |
diff --git a/include/linux/fb.h b/include/linux/fb.h index 907ace3a64c8..8e5a9dfb76bf 100644 --- a/include/linux/fb.h +++ b/include/linux/fb.h | |||
| @@ -786,8 +786,6 @@ struct fb_tile_ops { | |||
| 786 | #define FBINFO_MISC_USEREVENT 0x10000 /* event request | 786 | #define FBINFO_MISC_USEREVENT 0x10000 /* event request |
| 787 | from userspace */ | 787 | from userspace */ |
| 788 | #define FBINFO_MISC_TILEBLITTING 0x20000 /* use tile blitting */ | 788 | #define FBINFO_MISC_TILEBLITTING 0x20000 /* use tile blitting */ |
| 789 | #define FBINFO_MISC_FIRMWARE 0x40000 /* a replaceable firmware | ||
| 790 | inited framebuffer */ | ||
| 791 | 789 | ||
| 792 | /* A driver may set this flag to indicate that it does want a set_par to be | 790 | /* A driver may set this flag to indicate that it does want a set_par to be |
| 793 | * called every time when fbcon_switch is executed. The advantage is that with | 791 | * called every time when fbcon_switch is executed. The advantage is that with |
| @@ -801,6 +799,8 @@ struct fb_tile_ops { | |||
| 801 | */ | 799 | */ |
| 802 | #define FBINFO_MISC_ALWAYS_SETPAR 0x40000 | 800 | #define FBINFO_MISC_ALWAYS_SETPAR 0x40000 |
| 803 | 801 | ||
| 802 | /* where the fb is a firmware driver, and can be replaced with a proper one */ | ||
| 803 | #define FBINFO_MISC_FIRMWARE 0x80000 | ||
| 804 | /* | 804 | /* |
| 805 | * Host and GPU endianness differ. | 805 | * Host and GPU endianness differ. |
| 806 | */ | 806 | */ |
