diff options
Diffstat (limited to 'drivers/gpu/drm/radeon')
24 files changed, 172 insertions, 93 deletions
diff --git a/drivers/gpu/drm/radeon/atombios_crtc.c b/drivers/gpu/drm/radeon/atombios_crtc.c index 9541995e4b21..c742944d3805 100644 --- a/drivers/gpu/drm/radeon/atombios_crtc.c +++ b/drivers/gpu/drm/radeon/atombios_crtc.c | |||
@@ -764,7 +764,7 @@ static void atombios_crtc_set_dcpll(struct drm_crtc *crtc, | |||
764 | } | 764 | } |
765 | 765 | ||
766 | static void atombios_crtc_program_pll(struct drm_crtc *crtc, | 766 | static void atombios_crtc_program_pll(struct drm_crtc *crtc, |
767 | int crtc_id, | 767 | u32 crtc_id, |
768 | int pll_id, | 768 | int pll_id, |
769 | u32 encoder_mode, | 769 | u32 encoder_mode, |
770 | u32 encoder_id, | 770 | u32 encoder_id, |
@@ -851,8 +851,7 @@ static void atombios_crtc_program_pll(struct drm_crtc *crtc, | |||
851 | args.v5.ucPpll = pll_id; | 851 | args.v5.ucPpll = pll_id; |
852 | break; | 852 | break; |
853 | case 6: | 853 | case 6: |
854 | args.v6.ulCrtcPclkFreq.ucCRTC = crtc_id; | 854 | args.v6.ulDispEngClkFreq = cpu_to_le32(crtc_id << 24 | clock / 10); |
855 | args.v6.ulCrtcPclkFreq.ulPixelClock = cpu_to_le32(clock / 10); | ||
856 | args.v6.ucRefDiv = ref_div; | 855 | args.v6.ucRefDiv = ref_div; |
857 | args.v6.usFbDiv = cpu_to_le16(fb_div); | 856 | args.v6.usFbDiv = cpu_to_le16(fb_div); |
858 | args.v6.ulFbDivDecFrac = cpu_to_le32(frac_fb_div * 100000); | 857 | args.v6.ulFbDivDecFrac = cpu_to_le32(frac_fb_div * 100000); |
diff --git a/drivers/gpu/drm/radeon/atombios_dp.c b/drivers/gpu/drm/radeon/atombios_dp.c index 8c0f9e36ff8e..645b84b3d203 100644 --- a/drivers/gpu/drm/radeon/atombios_dp.c +++ b/drivers/gpu/drm/radeon/atombios_dp.c | |||
@@ -627,6 +627,7 @@ struct radeon_dp_link_train_info { | |||
627 | u8 train_set[4]; | 627 | u8 train_set[4]; |
628 | u8 link_status[DP_LINK_STATUS_SIZE]; | 628 | u8 link_status[DP_LINK_STATUS_SIZE]; |
629 | u8 tries; | 629 | u8 tries; |
630 | bool use_dpencoder; | ||
630 | }; | 631 | }; |
631 | 632 | ||
632 | static void radeon_dp_update_vs_emph(struct radeon_dp_link_train_info *dp_info) | 633 | static void radeon_dp_update_vs_emph(struct radeon_dp_link_train_info *dp_info) |
@@ -646,7 +647,7 @@ static void radeon_dp_set_tp(struct radeon_dp_link_train_info *dp_info, int tp) | |||
646 | int rtp = 0; | 647 | int rtp = 0; |
647 | 648 | ||
648 | /* set training pattern on the source */ | 649 | /* set training pattern on the source */ |
649 | if (ASIC_IS_DCE4(dp_info->rdev)) { | 650 | if (ASIC_IS_DCE4(dp_info->rdev) || !dp_info->use_dpencoder) { |
650 | switch (tp) { | 651 | switch (tp) { |
651 | case DP_TRAINING_PATTERN_1: | 652 | case DP_TRAINING_PATTERN_1: |
652 | rtp = ATOM_ENCODER_CMD_DP_LINK_TRAINING_PATTERN1; | 653 | rtp = ATOM_ENCODER_CMD_DP_LINK_TRAINING_PATTERN1; |
@@ -706,7 +707,7 @@ static int radeon_dp_link_train_init(struct radeon_dp_link_train_info *dp_info) | |||
706 | radeon_write_dpcd_reg(dp_info->radeon_connector, DP_LINK_BW_SET, tmp); | 707 | radeon_write_dpcd_reg(dp_info->radeon_connector, DP_LINK_BW_SET, tmp); |
707 | 708 | ||
708 | /* start training on the source */ | 709 | /* start training on the source */ |
709 | if (ASIC_IS_DCE4(dp_info->rdev)) | 710 | if (ASIC_IS_DCE4(dp_info->rdev) || !dp_info->use_dpencoder) |
710 | atombios_dig_encoder_setup(dp_info->encoder, | 711 | atombios_dig_encoder_setup(dp_info->encoder, |
711 | ATOM_ENCODER_CMD_DP_LINK_TRAINING_START, 0); | 712 | ATOM_ENCODER_CMD_DP_LINK_TRAINING_START, 0); |
712 | else | 713 | else |
@@ -731,7 +732,7 @@ static int radeon_dp_link_train_finish(struct radeon_dp_link_train_info *dp_info | |||
731 | DP_TRAINING_PATTERN_DISABLE); | 732 | DP_TRAINING_PATTERN_DISABLE); |
732 | 733 | ||
733 | /* disable the training pattern on the source */ | 734 | /* disable the training pattern on the source */ |
734 | if (ASIC_IS_DCE4(dp_info->rdev)) | 735 | if (ASIC_IS_DCE4(dp_info->rdev) || !dp_info->use_dpencoder) |
735 | atombios_dig_encoder_setup(dp_info->encoder, | 736 | atombios_dig_encoder_setup(dp_info->encoder, |
736 | ATOM_ENCODER_CMD_DP_LINK_TRAINING_COMPLETE, 0); | 737 | ATOM_ENCODER_CMD_DP_LINK_TRAINING_COMPLETE, 0); |
737 | else | 738 | else |
@@ -869,7 +870,8 @@ void radeon_dp_link_train(struct drm_encoder *encoder, | |||
869 | struct radeon_connector *radeon_connector; | 870 | struct radeon_connector *radeon_connector; |
870 | struct radeon_connector_atom_dig *dig_connector; | 871 | struct radeon_connector_atom_dig *dig_connector; |
871 | struct radeon_dp_link_train_info dp_info; | 872 | struct radeon_dp_link_train_info dp_info; |
872 | u8 tmp; | 873 | int index; |
874 | u8 tmp, frev, crev; | ||
873 | 875 | ||
874 | if (!radeon_encoder->enc_priv) | 876 | if (!radeon_encoder->enc_priv) |
875 | return; | 877 | return; |
@@ -884,6 +886,18 @@ void radeon_dp_link_train(struct drm_encoder *encoder, | |||
884 | (dig_connector->dp_sink_type != CONNECTOR_OBJECT_ID_eDP)) | 886 | (dig_connector->dp_sink_type != CONNECTOR_OBJECT_ID_eDP)) |
885 | return; | 887 | return; |
886 | 888 | ||
889 | /* DPEncoderService newer than 1.1 can't program properly the | ||
890 | * training pattern. When facing such version use the | ||
891 | * DIGXEncoderControl (X== 1 | 2) | ||
892 | */ | ||
893 | dp_info.use_dpencoder = true; | ||
894 | index = GetIndexIntoMasterTable(COMMAND, DPEncoderService); | ||
895 | if (atom_parse_cmd_header(rdev->mode_info.atom_context, index, &frev, &crev)) { | ||
896 | if (crev > 1) { | ||
897 | dp_info.use_dpencoder = false; | ||
898 | } | ||
899 | } | ||
900 | |||
887 | dp_info.enc_id = 0; | 901 | dp_info.enc_id = 0; |
888 | if (dig->dig_encoder) | 902 | if (dig->dig_encoder) |
889 | dp_info.enc_id |= ATOM_DP_CONFIG_DIG2_ENCODER; | 903 | dp_info.enc_id |= ATOM_DP_CONFIG_DIG2_ENCODER; |
diff --git a/drivers/gpu/drm/radeon/evergreen.c b/drivers/gpu/drm/radeon/evergreen.c index 15bd0477a3e8..14dce9f22172 100644 --- a/drivers/gpu/drm/radeon/evergreen.c +++ b/drivers/gpu/drm/radeon/evergreen.c | |||
@@ -1382,9 +1382,6 @@ int evergreen_cp_resume(struct radeon_device *rdev) | |||
1382 | 1382 | ||
1383 | /* set the wb address wether it's enabled or not */ | 1383 | /* set the wb address wether it's enabled or not */ |
1384 | WREG32(CP_RB_RPTR_ADDR, | 1384 | WREG32(CP_RB_RPTR_ADDR, |
1385 | #ifdef __BIG_ENDIAN | ||
1386 | RB_RPTR_SWAP(2) | | ||
1387 | #endif | ||
1388 | ((rdev->wb.gpu_addr + RADEON_WB_CP_RPTR_OFFSET) & 0xFFFFFFFC)); | 1385 | ((rdev->wb.gpu_addr + RADEON_WB_CP_RPTR_OFFSET) & 0xFFFFFFFC)); |
1389 | WREG32(CP_RB_RPTR_ADDR_HI, upper_32_bits(rdev->wb.gpu_addr + RADEON_WB_CP_RPTR_OFFSET) & 0xFF); | 1386 | WREG32(CP_RB_RPTR_ADDR_HI, upper_32_bits(rdev->wb.gpu_addr + RADEON_WB_CP_RPTR_OFFSET) & 0xFF); |
1390 | WREG32(SCRATCH_ADDR, ((rdev->wb.gpu_addr + RADEON_WB_SCRATCH_OFFSET) >> 8) & 0xFFFFFFFF); | 1387 | WREG32(SCRATCH_ADDR, ((rdev->wb.gpu_addr + RADEON_WB_SCRATCH_OFFSET) >> 8) & 0xFFFFFFFF); |
@@ -2047,6 +2044,7 @@ static void evergreen_gpu_init(struct radeon_device *rdev) | |||
2047 | rdev->config.evergreen.tile_config |= | 2044 | rdev->config.evergreen.tile_config |= |
2048 | ((gb_addr_config & 0x30000000) >> 28) << 12; | 2045 | ((gb_addr_config & 0x30000000) >> 28) << 12; |
2049 | 2046 | ||
2047 | rdev->config.evergreen.backend_map = gb_backend_map; | ||
2050 | WREG32(GB_BACKEND_MAP, gb_backend_map); | 2048 | WREG32(GB_BACKEND_MAP, gb_backend_map); |
2051 | WREG32(GB_ADDR_CONFIG, gb_addr_config); | 2049 | WREG32(GB_ADDR_CONFIG, gb_addr_config); |
2052 | WREG32(DMIF_ADDR_CONFIG, gb_addr_config); | 2050 | WREG32(DMIF_ADDR_CONFIG, gb_addr_config); |
@@ -2761,6 +2759,9 @@ int evergreen_irq_process(struct radeon_device *rdev) | |||
2761 | return IRQ_NONE; | 2759 | return IRQ_NONE; |
2762 | } | 2760 | } |
2763 | restart_ih: | 2761 | restart_ih: |
2762 | /* Order reading of wptr vs. reading of IH ring data */ | ||
2763 | rmb(); | ||
2764 | |||
2764 | /* display interrupts */ | 2765 | /* display interrupts */ |
2765 | evergreen_irq_ack(rdev); | 2766 | evergreen_irq_ack(rdev); |
2766 | 2767 | ||
diff --git a/drivers/gpu/drm/radeon/evergreen_cs.c b/drivers/gpu/drm/radeon/evergreen_cs.c index 23d36417158d..189e86522b5b 100644 --- a/drivers/gpu/drm/radeon/evergreen_cs.c +++ b/drivers/gpu/drm/radeon/evergreen_cs.c | |||
@@ -856,7 +856,6 @@ static inline int evergreen_cs_check_reg(struct radeon_cs_parser *p, u32 reg, u3 | |||
856 | case SQ_PGM_START_PS: | 856 | case SQ_PGM_START_PS: |
857 | case SQ_PGM_START_HS: | 857 | case SQ_PGM_START_HS: |
858 | case SQ_PGM_START_LS: | 858 | case SQ_PGM_START_LS: |
859 | case GDS_ADDR_BASE: | ||
860 | case SQ_CONST_MEM_BASE: | 859 | case SQ_CONST_MEM_BASE: |
861 | case SQ_ALU_CONST_CACHE_GS_0: | 860 | case SQ_ALU_CONST_CACHE_GS_0: |
862 | case SQ_ALU_CONST_CACHE_GS_1: | 861 | case SQ_ALU_CONST_CACHE_GS_1: |
@@ -946,6 +945,34 @@ static inline int evergreen_cs_check_reg(struct radeon_cs_parser *p, u32 reg, u3 | |||
946 | } | 945 | } |
947 | ib[idx] += (u32)((reloc->lobj.gpu_offset >> 8) & 0xffffffff); | 946 | ib[idx] += (u32)((reloc->lobj.gpu_offset >> 8) & 0xffffffff); |
948 | break; | 947 | break; |
948 | case SX_MEMORY_EXPORT_BASE: | ||
949 | if (p->rdev->family >= CHIP_CAYMAN) { | ||
950 | dev_warn(p->dev, "bad SET_CONFIG_REG " | ||
951 | "0x%04X\n", reg); | ||
952 | return -EINVAL; | ||
953 | } | ||
954 | r = evergreen_cs_packet_next_reloc(p, &reloc); | ||
955 | if (r) { | ||
956 | dev_warn(p->dev, "bad SET_CONFIG_REG " | ||
957 | "0x%04X\n", reg); | ||
958 | return -EINVAL; | ||
959 | } | ||
960 | ib[idx] += (u32)((reloc->lobj.gpu_offset >> 8) & 0xffffffff); | ||
961 | break; | ||
962 | case CAYMAN_SX_SCATTER_EXPORT_BASE: | ||
963 | if (p->rdev->family < CHIP_CAYMAN) { | ||
964 | dev_warn(p->dev, "bad SET_CONTEXT_REG " | ||
965 | "0x%04X\n", reg); | ||
966 | return -EINVAL; | ||
967 | } | ||
968 | r = evergreen_cs_packet_next_reloc(p, &reloc); | ||
969 | if (r) { | ||
970 | dev_warn(p->dev, "bad SET_CONTEXT_REG " | ||
971 | "0x%04X\n", reg); | ||
972 | return -EINVAL; | ||
973 | } | ||
974 | ib[idx] += (u32)((reloc->lobj.gpu_offset >> 8) & 0xffffffff); | ||
975 | break; | ||
949 | default: | 976 | default: |
950 | dev_warn(p->dev, "forbidden register 0x%08x at %d\n", reg, idx); | 977 | dev_warn(p->dev, "forbidden register 0x%08x at %d\n", reg, idx); |
951 | return -EINVAL; | 978 | return -EINVAL; |
@@ -1153,6 +1180,34 @@ static int evergreen_packet3_check(struct radeon_cs_parser *p, | |||
1153 | return r; | 1180 | return r; |
1154 | } | 1181 | } |
1155 | break; | 1182 | break; |
1183 | case PACKET3_DISPATCH_DIRECT: | ||
1184 | if (pkt->count != 3) { | ||
1185 | DRM_ERROR("bad DISPATCH_DIRECT\n"); | ||
1186 | return -EINVAL; | ||
1187 | } | ||
1188 | r = evergreen_cs_track_check(p); | ||
1189 | if (r) { | ||
1190 | dev_warn(p->dev, "%s:%d invalid cmd stream %d\n", __func__, __LINE__, idx); | ||
1191 | return r; | ||
1192 | } | ||
1193 | break; | ||
1194 | case PACKET3_DISPATCH_INDIRECT: | ||
1195 | if (pkt->count != 1) { | ||
1196 | DRM_ERROR("bad DISPATCH_INDIRECT\n"); | ||
1197 | return -EINVAL; | ||
1198 | } | ||
1199 | r = evergreen_cs_packet_next_reloc(p, &reloc); | ||
1200 | if (r) { | ||
1201 | DRM_ERROR("bad DISPATCH_INDIRECT\n"); | ||
1202 | return -EINVAL; | ||
1203 | } | ||
1204 | ib[idx+0] = idx_value + (u32)(reloc->lobj.gpu_offset & 0xffffffff); | ||
1205 | r = evergreen_cs_track_check(p); | ||
1206 | if (r) { | ||
1207 | dev_warn(p->dev, "%s:%d invalid cmd stream\n", __func__, __LINE__); | ||
1208 | return r; | ||
1209 | } | ||
1210 | break; | ||
1156 | case PACKET3_WAIT_REG_MEM: | 1211 | case PACKET3_WAIT_REG_MEM: |
1157 | if (pkt->count != 5) { | 1212 | if (pkt->count != 5) { |
1158 | DRM_ERROR("bad WAIT_REG_MEM\n"); | 1213 | DRM_ERROR("bad WAIT_REG_MEM\n"); |
diff --git a/drivers/gpu/drm/radeon/evergreend.h b/drivers/gpu/drm/radeon/evergreend.h index b7b2714f0b32..7363d9dec909 100644 --- a/drivers/gpu/drm/radeon/evergreend.h +++ b/drivers/gpu/drm/radeon/evergreend.h | |||
@@ -351,6 +351,7 @@ | |||
351 | #define COLOR_BUFFER_SIZE(x) ((x) << 0) | 351 | #define COLOR_BUFFER_SIZE(x) ((x) << 0) |
352 | #define POSITION_BUFFER_SIZE(x) ((x) << 8) | 352 | #define POSITION_BUFFER_SIZE(x) ((x) << 8) |
353 | #define SMX_BUFFER_SIZE(x) ((x) << 16) | 353 | #define SMX_BUFFER_SIZE(x) ((x) << 16) |
354 | #define SX_MEMORY_EXPORT_BASE 0x9010 | ||
354 | #define SX_MISC 0x28350 | 355 | #define SX_MISC 0x28350 |
355 | 356 | ||
356 | #define CB_PERF_CTR0_SEL_0 0x9A20 | 357 | #define CB_PERF_CTR0_SEL_0 0x9A20 |
@@ -1122,6 +1123,7 @@ | |||
1122 | #define CAYMAN_PA_SC_AA_CONFIG 0x28BE0 | 1123 | #define CAYMAN_PA_SC_AA_CONFIG 0x28BE0 |
1123 | #define CAYMAN_MSAA_NUM_SAMPLES_SHIFT 0 | 1124 | #define CAYMAN_MSAA_NUM_SAMPLES_SHIFT 0 |
1124 | #define CAYMAN_MSAA_NUM_SAMPLES_MASK 0x7 | 1125 | #define CAYMAN_MSAA_NUM_SAMPLES_MASK 0x7 |
1126 | #define CAYMAN_SX_SCATTER_EXPORT_BASE 0x28358 | ||
1125 | /* cayman packet3 addition */ | 1127 | /* cayman packet3 addition */ |
1126 | #define CAYMAN_PACKET3_DEALLOC_STATE 0x14 | 1128 | #define CAYMAN_PACKET3_DEALLOC_STATE 0x14 |
1127 | 1129 | ||
diff --git a/drivers/gpu/drm/radeon/ni.c b/drivers/gpu/drm/radeon/ni.c index 559dbd412906..44c4750f4518 100644 --- a/drivers/gpu/drm/radeon/ni.c +++ b/drivers/gpu/drm/radeon/ni.c | |||
@@ -833,6 +833,7 @@ static void cayman_gpu_init(struct radeon_device *rdev) | |||
833 | rdev->config.cayman.tile_config |= | 833 | rdev->config.cayman.tile_config |= |
834 | ((gb_addr_config & ROW_SIZE_MASK) >> ROW_SIZE_SHIFT) << 12; | 834 | ((gb_addr_config & ROW_SIZE_MASK) >> ROW_SIZE_SHIFT) << 12; |
835 | 835 | ||
836 | rdev->config.cayman.backend_map = gb_backend_map; | ||
836 | WREG32(GB_BACKEND_MAP, gb_backend_map); | 837 | WREG32(GB_BACKEND_MAP, gb_backend_map); |
837 | WREG32(GB_ADDR_CONFIG, gb_addr_config); | 838 | WREG32(GB_ADDR_CONFIG, gb_addr_config); |
838 | WREG32(DMIF_ADDR_CONFIG, gb_addr_config); | 839 | WREG32(DMIF_ADDR_CONFIG, gb_addr_config); |
diff --git a/drivers/gpu/drm/radeon/r600.c b/drivers/gpu/drm/radeon/r600.c index bc54b26cb32f..aa5571b73aa0 100644 --- a/drivers/gpu/drm/radeon/r600.c +++ b/drivers/gpu/drm/radeon/r600.c | |||
@@ -1662,6 +1662,7 @@ void r600_gpu_init(struct radeon_device *rdev) | |||
1662 | R6XX_MAX_BACKENDS_MASK) >> 16)), | 1662 | R6XX_MAX_BACKENDS_MASK) >> 16)), |
1663 | (cc_rb_backend_disable >> 16)); | 1663 | (cc_rb_backend_disable >> 16)); |
1664 | rdev->config.r600.tile_config = tiling_config; | 1664 | rdev->config.r600.tile_config = tiling_config; |
1665 | rdev->config.r600.backend_map = backend_map; | ||
1665 | tiling_config |= BACKEND_MAP(backend_map); | 1666 | tiling_config |= BACKEND_MAP(backend_map); |
1666 | WREG32(GB_TILING_CONFIG, tiling_config); | 1667 | WREG32(GB_TILING_CONFIG, tiling_config); |
1667 | WREG32(DCP_TILING_CONFIG, tiling_config & 0xffff); | 1668 | WREG32(DCP_TILING_CONFIG, tiling_config & 0xffff); |
@@ -2212,9 +2213,6 @@ int r600_cp_resume(struct radeon_device *rdev) | |||
2212 | 2213 | ||
2213 | /* set the wb address whether it's enabled or not */ | 2214 | /* set the wb address whether it's enabled or not */ |
2214 | WREG32(CP_RB_RPTR_ADDR, | 2215 | WREG32(CP_RB_RPTR_ADDR, |
2215 | #ifdef __BIG_ENDIAN | ||
2216 | RB_RPTR_SWAP(2) | | ||
2217 | #endif | ||
2218 | ((rdev->wb.gpu_addr + RADEON_WB_CP_RPTR_OFFSET) & 0xFFFFFFFC)); | 2216 | ((rdev->wb.gpu_addr + RADEON_WB_CP_RPTR_OFFSET) & 0xFFFFFFFC)); |
2219 | WREG32(CP_RB_RPTR_ADDR_HI, upper_32_bits(rdev->wb.gpu_addr + RADEON_WB_CP_RPTR_OFFSET) & 0xFF); | 2217 | WREG32(CP_RB_RPTR_ADDR_HI, upper_32_bits(rdev->wb.gpu_addr + RADEON_WB_CP_RPTR_OFFSET) & 0xFF); |
2220 | WREG32(SCRATCH_ADDR, ((rdev->wb.gpu_addr + RADEON_WB_SCRATCH_OFFSET) >> 8) & 0xFFFFFFFF); | 2218 | WREG32(SCRATCH_ADDR, ((rdev->wb.gpu_addr + RADEON_WB_SCRATCH_OFFSET) >> 8) & 0xFFFFFFFF); |
@@ -2994,10 +2992,6 @@ int r600_irq_init(struct radeon_device *rdev) | |||
2994 | /* RPTR_REARM only works if msi's are enabled */ | 2992 | /* RPTR_REARM only works if msi's are enabled */ |
2995 | if (rdev->msi_enabled) | 2993 | if (rdev->msi_enabled) |
2996 | ih_cntl |= RPTR_REARM; | 2994 | ih_cntl |= RPTR_REARM; |
2997 | |||
2998 | #ifdef __BIG_ENDIAN | ||
2999 | ih_cntl |= IH_MC_SWAP(IH_MC_SWAP_32BIT); | ||
3000 | #endif | ||
3001 | WREG32(IH_CNTL, ih_cntl); | 2995 | WREG32(IH_CNTL, ih_cntl); |
3002 | 2996 | ||
3003 | /* force the active interrupt state to all disabled */ | 2997 | /* force the active interrupt state to all disabled */ |
@@ -3308,6 +3302,10 @@ int r600_irq_process(struct radeon_device *rdev) | |||
3308 | if (!rdev->ih.enabled || rdev->shutdown) | 3302 | if (!rdev->ih.enabled || rdev->shutdown) |
3309 | return IRQ_NONE; | 3303 | return IRQ_NONE; |
3310 | 3304 | ||
3305 | /* No MSIs, need a dummy read to flush PCI DMAs */ | ||
3306 | if (!rdev->msi_enabled) | ||
3307 | RREG32(IH_RB_WPTR); | ||
3308 | |||
3311 | wptr = r600_get_ih_wptr(rdev); | 3309 | wptr = r600_get_ih_wptr(rdev); |
3312 | rptr = rdev->ih.rptr; | 3310 | rptr = rdev->ih.rptr; |
3313 | DRM_DEBUG("r600_irq_process start: rptr %d, wptr %d\n", rptr, wptr); | 3311 | DRM_DEBUG("r600_irq_process start: rptr %d, wptr %d\n", rptr, wptr); |
@@ -3320,6 +3318,9 @@ int r600_irq_process(struct radeon_device *rdev) | |||
3320 | } | 3318 | } |
3321 | 3319 | ||
3322 | restart_ih: | 3320 | restart_ih: |
3321 | /* Order reading of wptr vs. reading of IH ring data */ | ||
3322 | rmb(); | ||
3323 | |||
3323 | /* display interrupts */ | 3324 | /* display interrupts */ |
3324 | r600_irq_ack(rdev); | 3325 | r600_irq_ack(rdev); |
3325 | 3326 | ||
diff --git a/drivers/gpu/drm/radeon/r600_cp.c b/drivers/gpu/drm/radeon/r600_cp.c index c3ab959bdc7c..45fd592f9606 100644 --- a/drivers/gpu/drm/radeon/r600_cp.c +++ b/drivers/gpu/drm/radeon/r600_cp.c | |||
@@ -1802,8 +1802,8 @@ static void r600_cp_init_ring_buffer(struct drm_device *dev, | |||
1802 | /* Set ring buffer size */ | 1802 | /* Set ring buffer size */ |
1803 | #ifdef __BIG_ENDIAN | 1803 | #ifdef __BIG_ENDIAN |
1804 | RADEON_WRITE(R600_CP_RB_CNTL, | 1804 | RADEON_WRITE(R600_CP_RB_CNTL, |
1805 | RADEON_BUF_SWAP_32BIT | | 1805 | R600_BUF_SWAP_32BIT | |
1806 | RADEON_RB_NO_UPDATE | | 1806 | R600_RB_NO_UPDATE | |
1807 | (dev_priv->ring.rptr_update_l2qw << 8) | | 1807 | (dev_priv->ring.rptr_update_l2qw << 8) | |
1808 | dev_priv->ring.size_l2qw); | 1808 | dev_priv->ring.size_l2qw); |
1809 | #else | 1809 | #else |
@@ -1820,15 +1820,15 @@ static void r600_cp_init_ring_buffer(struct drm_device *dev, | |||
1820 | 1820 | ||
1821 | #ifdef __BIG_ENDIAN | 1821 | #ifdef __BIG_ENDIAN |
1822 | RADEON_WRITE(R600_CP_RB_CNTL, | 1822 | RADEON_WRITE(R600_CP_RB_CNTL, |
1823 | RADEON_BUF_SWAP_32BIT | | 1823 | R600_BUF_SWAP_32BIT | |
1824 | RADEON_RB_NO_UPDATE | | 1824 | R600_RB_NO_UPDATE | |
1825 | RADEON_RB_RPTR_WR_ENA | | 1825 | R600_RB_RPTR_WR_ENA | |
1826 | (dev_priv->ring.rptr_update_l2qw << 8) | | 1826 | (dev_priv->ring.rptr_update_l2qw << 8) | |
1827 | dev_priv->ring.size_l2qw); | 1827 | dev_priv->ring.size_l2qw); |
1828 | #else | 1828 | #else |
1829 | RADEON_WRITE(R600_CP_RB_CNTL, | 1829 | RADEON_WRITE(R600_CP_RB_CNTL, |
1830 | RADEON_RB_NO_UPDATE | | 1830 | R600_RB_NO_UPDATE | |
1831 | RADEON_RB_RPTR_WR_ENA | | 1831 | R600_RB_RPTR_WR_ENA | |
1832 | (dev_priv->ring.rptr_update_l2qw << 8) | | 1832 | (dev_priv->ring.rptr_update_l2qw << 8) | |
1833 | dev_priv->ring.size_l2qw); | 1833 | dev_priv->ring.size_l2qw); |
1834 | #endif | 1834 | #endif |
@@ -1851,13 +1851,8 @@ static void r600_cp_init_ring_buffer(struct drm_device *dev, | |||
1851 | - ((unsigned long) dev->sg->virtual) | 1851 | - ((unsigned long) dev->sg->virtual) |
1852 | + dev_priv->gart_vm_start; | 1852 | + dev_priv->gart_vm_start; |
1853 | } | 1853 | } |
1854 | RADEON_WRITE(R600_CP_RB_RPTR_ADDR, | 1854 | RADEON_WRITE(R600_CP_RB_RPTR_ADDR, (rptr_addr & 0xfffffffc)); |
1855 | #ifdef __BIG_ENDIAN | 1855 | RADEON_WRITE(R600_CP_RB_RPTR_ADDR_HI, upper_32_bits(rptr_addr)); |
1856 | (2 << 0) | | ||
1857 | #endif | ||
1858 | (rptr_addr & 0xfffffffc)); | ||
1859 | RADEON_WRITE(R600_CP_RB_RPTR_ADDR_HI, | ||
1860 | upper_32_bits(rptr_addr)); | ||
1861 | 1856 | ||
1862 | #ifdef __BIG_ENDIAN | 1857 | #ifdef __BIG_ENDIAN |
1863 | RADEON_WRITE(R600_CP_RB_CNTL, | 1858 | RADEON_WRITE(R600_CP_RB_CNTL, |
diff --git a/drivers/gpu/drm/radeon/r600_cs.c b/drivers/gpu/drm/radeon/r600_cs.c index 909bda8dd550..db8ef1905d5f 100644 --- a/drivers/gpu/drm/radeon/r600_cs.c +++ b/drivers/gpu/drm/radeon/r600_cs.c | |||
@@ -1200,6 +1200,15 @@ static inline int r600_cs_check_reg(struct radeon_cs_parser *p, u32 reg, u32 idx | |||
1200 | } | 1200 | } |
1201 | ib[idx] += (u32)((reloc->lobj.gpu_offset >> 8) & 0xffffffff); | 1201 | ib[idx] += (u32)((reloc->lobj.gpu_offset >> 8) & 0xffffffff); |
1202 | break; | 1202 | break; |
1203 | case SX_MEMORY_EXPORT_BASE: | ||
1204 | r = r600_cs_packet_next_reloc(p, &reloc); | ||
1205 | if (r) { | ||
1206 | dev_warn(p->dev, "bad SET_CONFIG_REG " | ||
1207 | "0x%04X\n", reg); | ||
1208 | return -EINVAL; | ||
1209 | } | ||
1210 | ib[idx] += (u32)((reloc->lobj.gpu_offset >> 8) & 0xffffffff); | ||
1211 | break; | ||
1203 | default: | 1212 | default: |
1204 | dev_warn(p->dev, "forbidden register 0x%08x at %d\n", reg, idx); | 1213 | dev_warn(p->dev, "forbidden register 0x%08x at %d\n", reg, idx); |
1205 | return -EINVAL; | 1214 | return -EINVAL; |
diff --git a/drivers/gpu/drm/radeon/radeon.h b/drivers/gpu/drm/radeon/radeon.h index ef0e0e016914..ef37a9b5a3cc 100644 --- a/drivers/gpu/drm/radeon/radeon.h +++ b/drivers/gpu/drm/radeon/radeon.h | |||
@@ -1003,6 +1003,7 @@ struct r600_asic { | |||
1003 | unsigned tiling_npipes; | 1003 | unsigned tiling_npipes; |
1004 | unsigned tiling_group_size; | 1004 | unsigned tiling_group_size; |
1005 | unsigned tile_config; | 1005 | unsigned tile_config; |
1006 | unsigned backend_map; | ||
1006 | struct r100_gpu_lockup lockup; | 1007 | struct r100_gpu_lockup lockup; |
1007 | }; | 1008 | }; |
1008 | 1009 | ||
@@ -1028,6 +1029,7 @@ struct rv770_asic { | |||
1028 | unsigned tiling_npipes; | 1029 | unsigned tiling_npipes; |
1029 | unsigned tiling_group_size; | 1030 | unsigned tiling_group_size; |
1030 | unsigned tile_config; | 1031 | unsigned tile_config; |
1032 | unsigned backend_map; | ||
1031 | struct r100_gpu_lockup lockup; | 1033 | struct r100_gpu_lockup lockup; |
1032 | }; | 1034 | }; |
1033 | 1035 | ||
@@ -1054,6 +1056,7 @@ struct evergreen_asic { | |||
1054 | unsigned tiling_npipes; | 1056 | unsigned tiling_npipes; |
1055 | unsigned tiling_group_size; | 1057 | unsigned tiling_group_size; |
1056 | unsigned tile_config; | 1058 | unsigned tile_config; |
1059 | unsigned backend_map; | ||
1057 | struct r100_gpu_lockup lockup; | 1060 | struct r100_gpu_lockup lockup; |
1058 | }; | 1061 | }; |
1059 | 1062 | ||
@@ -1174,7 +1177,7 @@ struct radeon_device { | |||
1174 | /* Register mmio */ | 1177 | /* Register mmio */ |
1175 | resource_size_t rmmio_base; | 1178 | resource_size_t rmmio_base; |
1176 | resource_size_t rmmio_size; | 1179 | resource_size_t rmmio_size; |
1177 | void *rmmio; | 1180 | void __iomem *rmmio; |
1178 | radeon_rreg_t mc_rreg; | 1181 | radeon_rreg_t mc_rreg; |
1179 | radeon_wreg_t mc_wreg; | 1182 | radeon_wreg_t mc_wreg; |
1180 | radeon_rreg_t pll_rreg; | 1183 | radeon_rreg_t pll_rreg; |
@@ -1251,20 +1254,20 @@ int radeon_gpu_wait_for_idle(struct radeon_device *rdev); | |||
1251 | static inline uint32_t r100_mm_rreg(struct radeon_device *rdev, uint32_t reg) | 1254 | static inline uint32_t r100_mm_rreg(struct radeon_device *rdev, uint32_t reg) |
1252 | { | 1255 | { |
1253 | if (reg < rdev->rmmio_size) | 1256 | if (reg < rdev->rmmio_size) |
1254 | return readl(((void __iomem *)rdev->rmmio) + reg); | 1257 | return readl((rdev->rmmio) + reg); |
1255 | else { | 1258 | else { |
1256 | writel(reg, ((void __iomem *)rdev->rmmio) + RADEON_MM_INDEX); | 1259 | writel(reg, (rdev->rmmio) + RADEON_MM_INDEX); |
1257 | return readl(((void __iomem *)rdev->rmmio) + RADEON_MM_DATA); | 1260 | return readl((rdev->rmmio) + RADEON_MM_DATA); |
1258 | } | 1261 | } |
1259 | } | 1262 | } |
1260 | 1263 | ||
1261 | static inline void r100_mm_wreg(struct radeon_device *rdev, uint32_t reg, uint32_t v) | 1264 | static inline void r100_mm_wreg(struct radeon_device *rdev, uint32_t reg, uint32_t v) |
1262 | { | 1265 | { |
1263 | if (reg < rdev->rmmio_size) | 1266 | if (reg < rdev->rmmio_size) |
1264 | writel(v, ((void __iomem *)rdev->rmmio) + reg); | 1267 | writel(v, (rdev->rmmio) + reg); |
1265 | else { | 1268 | else { |
1266 | writel(reg, ((void __iomem *)rdev->rmmio) + RADEON_MM_INDEX); | 1269 | writel(reg, (rdev->rmmio) + RADEON_MM_INDEX); |
1267 | writel(v, ((void __iomem *)rdev->rmmio) + RADEON_MM_DATA); | 1270 | writel(v, (rdev->rmmio) + RADEON_MM_DATA); |
1268 | } | 1271 | } |
1269 | } | 1272 | } |
1270 | 1273 | ||
@@ -1296,10 +1299,10 @@ static inline void r100_io_wreg(struct radeon_device *rdev, u32 reg, u32 v) | |||
1296 | /* | 1299 | /* |
1297 | * Registers read & write functions. | 1300 | * Registers read & write functions. |
1298 | */ | 1301 | */ |
1299 | #define RREG8(reg) readb(((void __iomem *)rdev->rmmio) + (reg)) | 1302 | #define RREG8(reg) readb((rdev->rmmio) + (reg)) |
1300 | #define WREG8(reg, v) writeb(v, ((void __iomem *)rdev->rmmio) + (reg)) | 1303 | #define WREG8(reg, v) writeb(v, (rdev->rmmio) + (reg)) |
1301 | #define RREG16(reg) readw(((void __iomem *)rdev->rmmio) + (reg)) | 1304 | #define RREG16(reg) readw((rdev->rmmio) + (reg)) |
1302 | #define WREG16(reg, v) writew(v, ((void __iomem *)rdev->rmmio) + (reg)) | 1305 | #define WREG16(reg, v) writew(v, (rdev->rmmio) + (reg)) |
1303 | #define RREG32(reg) r100_mm_rreg(rdev, (reg)) | 1306 | #define RREG32(reg) r100_mm_rreg(rdev, (reg)) |
1304 | #define DREG32(reg) printk(KERN_INFO "REGISTER: " #reg " : 0x%08X\n", r100_mm_rreg(rdev, (reg))) | 1307 | #define DREG32(reg) printk(KERN_INFO "REGISTER: " #reg " : 0x%08X\n", r100_mm_rreg(rdev, (reg))) |
1305 | #define WREG32(reg, v) r100_mm_wreg(rdev, (reg), (v)) | 1308 | #define WREG32(reg, v) r100_mm_wreg(rdev, (reg), (v)) |
diff --git a/drivers/gpu/drm/radeon/radeon_asic.c b/drivers/gpu/drm/radeon/radeon_asic.c index b2449629537d..df8218bb83a6 100644 --- a/drivers/gpu/drm/radeon/radeon_asic.c +++ b/drivers/gpu/drm/radeon/radeon_asic.c | |||
@@ -625,7 +625,7 @@ static struct radeon_asic r600_asic = { | |||
625 | .fence_ring_emit = &r600_fence_ring_emit, | 625 | .fence_ring_emit = &r600_fence_ring_emit, |
626 | .cs_parse = &r600_cs_parse, | 626 | .cs_parse = &r600_cs_parse, |
627 | .copy_blit = &r600_copy_blit, | 627 | .copy_blit = &r600_copy_blit, |
628 | .copy_dma = &r600_copy_blit, | 628 | .copy_dma = NULL, |
629 | .copy = &r600_copy_blit, | 629 | .copy = &r600_copy_blit, |
630 | .get_engine_clock = &radeon_atom_get_engine_clock, | 630 | .get_engine_clock = &radeon_atom_get_engine_clock, |
631 | .set_engine_clock = &radeon_atom_set_engine_clock, | 631 | .set_engine_clock = &radeon_atom_set_engine_clock, |
@@ -672,7 +672,7 @@ static struct radeon_asic rs780_asic = { | |||
672 | .fence_ring_emit = &r600_fence_ring_emit, | 672 | .fence_ring_emit = &r600_fence_ring_emit, |
673 | .cs_parse = &r600_cs_parse, | 673 | .cs_parse = &r600_cs_parse, |
674 | .copy_blit = &r600_copy_blit, | 674 | .copy_blit = &r600_copy_blit, |
675 | .copy_dma = &r600_copy_blit, | 675 | .copy_dma = NULL, |
676 | .copy = &r600_copy_blit, | 676 | .copy = &r600_copy_blit, |
677 | .get_engine_clock = &radeon_atom_get_engine_clock, | 677 | .get_engine_clock = &radeon_atom_get_engine_clock, |
678 | .set_engine_clock = &radeon_atom_set_engine_clock, | 678 | .set_engine_clock = &radeon_atom_set_engine_clock, |
@@ -719,7 +719,7 @@ static struct radeon_asic rv770_asic = { | |||
719 | .fence_ring_emit = &r600_fence_ring_emit, | 719 | .fence_ring_emit = &r600_fence_ring_emit, |
720 | .cs_parse = &r600_cs_parse, | 720 | .cs_parse = &r600_cs_parse, |
721 | .copy_blit = &r600_copy_blit, | 721 | .copy_blit = &r600_copy_blit, |
722 | .copy_dma = &r600_copy_blit, | 722 | .copy_dma = NULL, |
723 | .copy = &r600_copy_blit, | 723 | .copy = &r600_copy_blit, |
724 | .get_engine_clock = &radeon_atom_get_engine_clock, | 724 | .get_engine_clock = &radeon_atom_get_engine_clock, |
725 | .set_engine_clock = &radeon_atom_set_engine_clock, | 725 | .set_engine_clock = &radeon_atom_set_engine_clock, |
@@ -766,7 +766,7 @@ static struct radeon_asic evergreen_asic = { | |||
766 | .fence_ring_emit = &r600_fence_ring_emit, | 766 | .fence_ring_emit = &r600_fence_ring_emit, |
767 | .cs_parse = &evergreen_cs_parse, | 767 | .cs_parse = &evergreen_cs_parse, |
768 | .copy_blit = &evergreen_copy_blit, | 768 | .copy_blit = &evergreen_copy_blit, |
769 | .copy_dma = &evergreen_copy_blit, | 769 | .copy_dma = NULL, |
770 | .copy = &evergreen_copy_blit, | 770 | .copy = &evergreen_copy_blit, |
771 | .get_engine_clock = &radeon_atom_get_engine_clock, | 771 | .get_engine_clock = &radeon_atom_get_engine_clock, |
772 | .set_engine_clock = &radeon_atom_set_engine_clock, | 772 | .set_engine_clock = &radeon_atom_set_engine_clock, |
@@ -813,7 +813,7 @@ static struct radeon_asic sumo_asic = { | |||
813 | .fence_ring_emit = &r600_fence_ring_emit, | 813 | .fence_ring_emit = &r600_fence_ring_emit, |
814 | .cs_parse = &evergreen_cs_parse, | 814 | .cs_parse = &evergreen_cs_parse, |
815 | .copy_blit = &evergreen_copy_blit, | 815 | .copy_blit = &evergreen_copy_blit, |
816 | .copy_dma = &evergreen_copy_blit, | 816 | .copy_dma = NULL, |
817 | .copy = &evergreen_copy_blit, | 817 | .copy = &evergreen_copy_blit, |
818 | .get_engine_clock = &radeon_atom_get_engine_clock, | 818 | .get_engine_clock = &radeon_atom_get_engine_clock, |
819 | .set_engine_clock = &radeon_atom_set_engine_clock, | 819 | .set_engine_clock = &radeon_atom_set_engine_clock, |
@@ -860,7 +860,7 @@ static struct radeon_asic btc_asic = { | |||
860 | .fence_ring_emit = &r600_fence_ring_emit, | 860 | .fence_ring_emit = &r600_fence_ring_emit, |
861 | .cs_parse = &evergreen_cs_parse, | 861 | .cs_parse = &evergreen_cs_parse, |
862 | .copy_blit = &evergreen_copy_blit, | 862 | .copy_blit = &evergreen_copy_blit, |
863 | .copy_dma = &evergreen_copy_blit, | 863 | .copy_dma = NULL, |
864 | .copy = &evergreen_copy_blit, | 864 | .copy = &evergreen_copy_blit, |
865 | .get_engine_clock = &radeon_atom_get_engine_clock, | 865 | .get_engine_clock = &radeon_atom_get_engine_clock, |
866 | .set_engine_clock = &radeon_atom_set_engine_clock, | 866 | .set_engine_clock = &radeon_atom_set_engine_clock, |
@@ -907,7 +907,7 @@ static struct radeon_asic cayman_asic = { | |||
907 | .fence_ring_emit = &r600_fence_ring_emit, | 907 | .fence_ring_emit = &r600_fence_ring_emit, |
908 | .cs_parse = &evergreen_cs_parse, | 908 | .cs_parse = &evergreen_cs_parse, |
909 | .copy_blit = &evergreen_copy_blit, | 909 | .copy_blit = &evergreen_copy_blit, |
910 | .copy_dma = &evergreen_copy_blit, | 910 | .copy_dma = NULL, |
911 | .copy = &evergreen_copy_blit, | 911 | .copy = &evergreen_copy_blit, |
912 | .get_engine_clock = &radeon_atom_get_engine_clock, | 912 | .get_engine_clock = &radeon_atom_get_engine_clock, |
913 | .set_engine_clock = &radeon_atom_set_engine_clock, | 913 | .set_engine_clock = &radeon_atom_set_engine_clock, |
diff --git a/drivers/gpu/drm/radeon/radeon_clocks.c b/drivers/gpu/drm/radeon/radeon_clocks.c index 2d48e7a1474b..dcd0863e31ae 100644 --- a/drivers/gpu/drm/radeon/radeon_clocks.c +++ b/drivers/gpu/drm/radeon/radeon_clocks.c | |||
@@ -96,7 +96,7 @@ uint32_t radeon_legacy_get_memory_clock(struct radeon_device *rdev) | |||
96 | * Read XTAL (ref clock), SCLK and MCLK from Open Firmware device | 96 | * Read XTAL (ref clock), SCLK and MCLK from Open Firmware device |
97 | * tree. Hopefully, ATI OF driver is kind enough to fill these | 97 | * tree. Hopefully, ATI OF driver is kind enough to fill these |
98 | */ | 98 | */ |
99 | static bool __devinit radeon_read_clocks_OF(struct drm_device *dev) | 99 | static bool radeon_read_clocks_OF(struct drm_device *dev) |
100 | { | 100 | { |
101 | struct radeon_device *rdev = dev->dev_private; | 101 | struct radeon_device *rdev = dev->dev_private; |
102 | struct device_node *dp = rdev->pdev->dev.of_node; | 102 | struct device_node *dp = rdev->pdev->dev.of_node; |
@@ -166,7 +166,7 @@ static bool __devinit radeon_read_clocks_OF(struct drm_device *dev) | |||
166 | return true; | 166 | return true; |
167 | } | 167 | } |
168 | #else | 168 | #else |
169 | static bool __devinit radeon_read_clocks_OF(struct drm_device *dev) | 169 | static bool radeon_read_clocks_OF(struct drm_device *dev) |
170 | { | 170 | { |
171 | return false; | 171 | return false; |
172 | } | 172 | } |
diff --git a/drivers/gpu/drm/radeon/radeon_combios.c b/drivers/gpu/drm/radeon/radeon_combios.c index e4594676a07c..a74217cd192f 100644 --- a/drivers/gpu/drm/radeon/radeon_combios.c +++ b/drivers/gpu/drm/radeon/radeon_combios.c | |||
@@ -779,7 +779,8 @@ void radeon_combios_i2c_init(struct radeon_device *rdev) | |||
779 | } | 779 | } |
780 | } | 780 | } |
781 | } | 781 | } |
782 | } else if (rdev->family >= CHIP_R200) { | 782 | } else if ((rdev->family == CHIP_R200) || |
783 | (rdev->family >= CHIP_R300)) { | ||
783 | /* 0x68 */ | 784 | /* 0x68 */ |
784 | i2c = combios_setup_i2c_bus(rdev, DDC_MONID, 0, 0); | 785 | i2c = combios_setup_i2c_bus(rdev, DDC_MONID, 0, 0); |
785 | rdev->i2c_bus[3] = radeon_i2c_create(dev, &i2c, "MONID"); | 786 | rdev->i2c_bus[3] = radeon_i2c_create(dev, &i2c, "MONID"); |
diff --git a/drivers/gpu/drm/radeon/radeon_cp.c b/drivers/gpu/drm/radeon/radeon_cp.c index 75867792a4e2..045ec59478f9 100644 --- a/drivers/gpu/drm/radeon/radeon_cp.c +++ b/drivers/gpu/drm/radeon/radeon_cp.c | |||
@@ -2115,7 +2115,7 @@ int radeon_driver_load(struct drm_device *dev, unsigned long flags) | |||
2115 | 2115 | ||
2116 | if (drm_pci_device_is_agp(dev)) | 2116 | if (drm_pci_device_is_agp(dev)) |
2117 | dev_priv->flags |= RADEON_IS_AGP; | 2117 | dev_priv->flags |= RADEON_IS_AGP; |
2118 | else if (drm_pci_device_is_pcie(dev)) | 2118 | else if (pci_is_pcie(dev->pdev)) |
2119 | dev_priv->flags |= RADEON_IS_PCIE; | 2119 | dev_priv->flags |= RADEON_IS_PCIE; |
2120 | else | 2120 | else |
2121 | dev_priv->flags |= RADEON_IS_PCI; | 2121 | dev_priv->flags |= RADEON_IS_PCI; |
diff --git a/drivers/gpu/drm/radeon/radeon_display.c b/drivers/gpu/drm/radeon/radeon_display.c index 292f73f0ddbd..28f4655905bc 100644 --- a/drivers/gpu/drm/radeon/radeon_display.c +++ b/drivers/gpu/drm/radeon/radeon_display.c | |||
@@ -282,7 +282,7 @@ void radeon_crtc_handle_flip(struct radeon_device *rdev, int crtc_id) | |||
282 | spin_lock_irqsave(&rdev->ddev->event_lock, flags); | 282 | spin_lock_irqsave(&rdev->ddev->event_lock, flags); |
283 | work = radeon_crtc->unpin_work; | 283 | work = radeon_crtc->unpin_work; |
284 | if (work == NULL || | 284 | if (work == NULL || |
285 | !radeon_fence_signaled(work->fence)) { | 285 | (work->fence && !radeon_fence_signaled(work->fence))) { |
286 | spin_unlock_irqrestore(&rdev->ddev->event_lock, flags); | 286 | spin_unlock_irqrestore(&rdev->ddev->event_lock, flags); |
287 | return; | 287 | return; |
288 | } | 288 | } |
@@ -348,7 +348,6 @@ static int radeon_crtc_page_flip(struct drm_crtc *crtc, | |||
348 | struct radeon_framebuffer *new_radeon_fb; | 348 | struct radeon_framebuffer *new_radeon_fb; |
349 | struct drm_gem_object *obj; | 349 | struct drm_gem_object *obj; |
350 | struct radeon_bo *rbo; | 350 | struct radeon_bo *rbo; |
351 | struct radeon_fence *fence; | ||
352 | struct radeon_unpin_work *work; | 351 | struct radeon_unpin_work *work; |
353 | unsigned long flags; | 352 | unsigned long flags; |
354 | u32 tiling_flags, pitch_pixels; | 353 | u32 tiling_flags, pitch_pixels; |
@@ -359,16 +358,9 @@ static int radeon_crtc_page_flip(struct drm_crtc *crtc, | |||
359 | if (work == NULL) | 358 | if (work == NULL) |
360 | return -ENOMEM; | 359 | return -ENOMEM; |
361 | 360 | ||
362 | r = radeon_fence_create(rdev, &fence); | ||
363 | if (unlikely(r != 0)) { | ||
364 | kfree(work); | ||
365 | DRM_ERROR("flip queue: failed to create fence.\n"); | ||
366 | return -ENOMEM; | ||
367 | } | ||
368 | work->event = event; | 361 | work->event = event; |
369 | work->rdev = rdev; | 362 | work->rdev = rdev; |
370 | work->crtc_id = radeon_crtc->crtc_id; | 363 | work->crtc_id = radeon_crtc->crtc_id; |
371 | work->fence = radeon_fence_ref(fence); | ||
372 | old_radeon_fb = to_radeon_framebuffer(crtc->fb); | 364 | old_radeon_fb = to_radeon_framebuffer(crtc->fb); |
373 | new_radeon_fb = to_radeon_framebuffer(fb); | 365 | new_radeon_fb = to_radeon_framebuffer(fb); |
374 | /* schedule unpin of the old buffer */ | 366 | /* schedule unpin of the old buffer */ |
@@ -377,6 +369,10 @@ static int radeon_crtc_page_flip(struct drm_crtc *crtc, | |||
377 | drm_gem_object_reference(obj); | 369 | drm_gem_object_reference(obj); |
378 | rbo = gem_to_radeon_bo(obj); | 370 | rbo = gem_to_radeon_bo(obj); |
379 | work->old_rbo = rbo; | 371 | work->old_rbo = rbo; |
372 | obj = new_radeon_fb->obj; | ||
373 | rbo = gem_to_radeon_bo(obj); | ||
374 | if (rbo->tbo.sync_obj) | ||
375 | work->fence = radeon_fence_ref(rbo->tbo.sync_obj); | ||
380 | INIT_WORK(&work->work, radeon_unpin_work_func); | 376 | INIT_WORK(&work->work, radeon_unpin_work_func); |
381 | 377 | ||
382 | /* We borrow the event spin lock for protecting unpin_work */ | 378 | /* We borrow the event spin lock for protecting unpin_work */ |
@@ -391,9 +387,6 @@ static int radeon_crtc_page_flip(struct drm_crtc *crtc, | |||
391 | spin_unlock_irqrestore(&dev->event_lock, flags); | 387 | spin_unlock_irqrestore(&dev->event_lock, flags); |
392 | 388 | ||
393 | /* pin the new buffer */ | 389 | /* pin the new buffer */ |
394 | obj = new_radeon_fb->obj; | ||
395 | rbo = gem_to_radeon_bo(obj); | ||
396 | |||
397 | DRM_DEBUG_DRIVER("flip-ioctl() cur_fbo = %p, cur_bbo = %p\n", | 390 | DRM_DEBUG_DRIVER("flip-ioctl() cur_fbo = %p, cur_bbo = %p\n", |
398 | work->old_rbo, rbo); | 391 | work->old_rbo, rbo); |
399 | 392 | ||
@@ -461,37 +454,18 @@ static int radeon_crtc_page_flip(struct drm_crtc *crtc, | |||
461 | goto pflip_cleanup1; | 454 | goto pflip_cleanup1; |
462 | } | 455 | } |
463 | 456 | ||
464 | /* 32 ought to cover us */ | ||
465 | r = radeon_ring_lock(rdev, 32); | ||
466 | if (r) { | ||
467 | DRM_ERROR("failed to lock the ring before flip\n"); | ||
468 | goto pflip_cleanup2; | ||
469 | } | ||
470 | |||
471 | /* emit the fence */ | ||
472 | radeon_fence_emit(rdev, fence); | ||
473 | /* set the proper interrupt */ | 457 | /* set the proper interrupt */ |
474 | radeon_pre_page_flip(rdev, radeon_crtc->crtc_id); | 458 | radeon_pre_page_flip(rdev, radeon_crtc->crtc_id); |
475 | /* fire the ring */ | ||
476 | radeon_ring_unlock_commit(rdev); | ||
477 | 459 | ||
478 | return 0; | 460 | return 0; |
479 | 461 | ||
480 | pflip_cleanup2: | ||
481 | drm_vblank_put(dev, radeon_crtc->crtc_id); | ||
482 | |||
483 | pflip_cleanup1: | 462 | pflip_cleanup1: |
484 | r = radeon_bo_reserve(rbo, false); | 463 | if (unlikely(radeon_bo_reserve(rbo, false) != 0)) { |
485 | if (unlikely(r != 0)) { | ||
486 | DRM_ERROR("failed to reserve new rbo in error path\n"); | 464 | DRM_ERROR("failed to reserve new rbo in error path\n"); |
487 | goto pflip_cleanup; | 465 | goto pflip_cleanup; |
488 | } | 466 | } |
489 | r = radeon_bo_unpin(rbo); | 467 | if (unlikely(radeon_bo_unpin(rbo) != 0)) { |
490 | if (unlikely(r != 0)) { | ||
491 | radeon_bo_unreserve(rbo); | ||
492 | r = -EINVAL; | ||
493 | DRM_ERROR("failed to unpin new rbo in error path\n"); | 468 | DRM_ERROR("failed to unpin new rbo in error path\n"); |
494 | goto pflip_cleanup; | ||
495 | } | 469 | } |
496 | radeon_bo_unreserve(rbo); | 470 | radeon_bo_unreserve(rbo); |
497 | 471 | ||
@@ -501,7 +475,7 @@ pflip_cleanup: | |||
501 | unlock_free: | 475 | unlock_free: |
502 | drm_gem_object_unreference_unlocked(old_radeon_fb->obj); | 476 | drm_gem_object_unreference_unlocked(old_radeon_fb->obj); |
503 | spin_unlock_irqrestore(&dev->event_lock, flags); | 477 | spin_unlock_irqrestore(&dev->event_lock, flags); |
504 | radeon_fence_unref(&fence); | 478 | radeon_fence_unref(&work->fence); |
505 | kfree(work); | 479 | kfree(work); |
506 | 480 | ||
507 | return r; | 481 | return r; |
diff --git a/drivers/gpu/drm/radeon/radeon_drv.c b/drivers/gpu/drm/radeon/radeon_drv.c index 73dfbe8e5f9e..85f033f19a8a 100644 --- a/drivers/gpu/drm/radeon/radeon_drv.c +++ b/drivers/gpu/drm/radeon/radeon_drv.c | |||
@@ -50,10 +50,11 @@ | |||
50 | * 2.7.0 - fixups for r600 2D tiling support. (no external ABI change), add eg dyn gpr regs | 50 | * 2.7.0 - fixups for r600 2D tiling support. (no external ABI change), add eg dyn gpr regs |
51 | * 2.8.0 - pageflip support, r500 US_FORMAT regs. r500 ARGB2101010 colorbuf, r300->r500 CMASK, clock crystal query | 51 | * 2.8.0 - pageflip support, r500 US_FORMAT regs. r500 ARGB2101010 colorbuf, r300->r500 CMASK, clock crystal query |
52 | * 2.9.0 - r600 tiling (s3tc,rgtc) working, SET_PREDICATION packet 3 on r600 + eg, backend query | 52 | * 2.9.0 - r600 tiling (s3tc,rgtc) working, SET_PREDICATION packet 3 on r600 + eg, backend query |
53 | * 2.10.0 - fusion 2D tiling | 53 | * 2.10.0 - fusion 2D tiling, initial compute support for the CS checker |
54 | * 2.11.0 - backend map | ||
54 | */ | 55 | */ |
55 | #define KMS_DRIVER_MAJOR 2 | 56 | #define KMS_DRIVER_MAJOR 2 |
56 | #define KMS_DRIVER_MINOR 10 | 57 | #define KMS_DRIVER_MINOR 11 |
57 | #define KMS_DRIVER_PATCHLEVEL 0 | 58 | #define KMS_DRIVER_PATCHLEVEL 0 |
58 | int radeon_driver_load_kms(struct drm_device *dev, unsigned long flags); | 59 | int radeon_driver_load_kms(struct drm_device *dev, unsigned long flags); |
59 | int radeon_driver_unload_kms(struct drm_device *dev); | 60 | int radeon_driver_unload_kms(struct drm_device *dev); |
diff --git a/drivers/gpu/drm/radeon/radeon_kms.c b/drivers/gpu/drm/radeon/radeon_kms.c index bd58af658581..be2c1224e68a 100644 --- a/drivers/gpu/drm/radeon/radeon_kms.c +++ b/drivers/gpu/drm/radeon/radeon_kms.c | |||
@@ -60,7 +60,7 @@ int radeon_driver_load_kms(struct drm_device *dev, unsigned long flags) | |||
60 | /* update BUS flag */ | 60 | /* update BUS flag */ |
61 | if (drm_pci_device_is_agp(dev)) { | 61 | if (drm_pci_device_is_agp(dev)) { |
62 | flags |= RADEON_IS_AGP; | 62 | flags |= RADEON_IS_AGP; |
63 | } else if (drm_pci_device_is_pcie(dev)) { | 63 | } else if (pci_is_pcie(dev->pdev)) { |
64 | flags |= RADEON_IS_PCIE; | 64 | flags |= RADEON_IS_PCIE; |
65 | } else { | 65 | } else { |
66 | flags |= RADEON_IS_PCI; | 66 | flags |= RADEON_IS_PCI; |
@@ -237,6 +237,19 @@ int radeon_info_ioctl(struct drm_device *dev, void *data, struct drm_file *filp) | |||
237 | case RADEON_INFO_FUSION_GART_WORKING: | 237 | case RADEON_INFO_FUSION_GART_WORKING: |
238 | value = 1; | 238 | value = 1; |
239 | break; | 239 | break; |
240 | case RADEON_INFO_BACKEND_MAP: | ||
241 | if (rdev->family >= CHIP_CAYMAN) | ||
242 | value = rdev->config.cayman.backend_map; | ||
243 | else if (rdev->family >= CHIP_CEDAR) | ||
244 | value = rdev->config.evergreen.backend_map; | ||
245 | else if (rdev->family >= CHIP_RV770) | ||
246 | value = rdev->config.rv770.backend_map; | ||
247 | else if (rdev->family >= CHIP_R600) | ||
248 | value = rdev->config.r600.backend_map; | ||
249 | else { | ||
250 | return -EINVAL; | ||
251 | } | ||
252 | break; | ||
240 | default: | 253 | default: |
241 | DRM_DEBUG_KMS("Invalid request %d\n", info->request); | 254 | DRM_DEBUG_KMS("Invalid request %d\n", info->request); |
242 | return -EINVAL; | 255 | return -EINVAL; |
diff --git a/drivers/gpu/drm/radeon/radeon_pm.c b/drivers/gpu/drm/radeon/radeon_pm.c index aaa19dc418a0..6fabe89fa6a1 100644 --- a/drivers/gpu/drm/radeon/radeon_pm.c +++ b/drivers/gpu/drm/radeon/radeon_pm.c | |||
@@ -594,6 +594,9 @@ int radeon_pm_init(struct radeon_device *rdev) | |||
594 | if (rdev->pm.default_vddc) | 594 | if (rdev->pm.default_vddc) |
595 | radeon_atom_set_voltage(rdev, rdev->pm.default_vddc, | 595 | radeon_atom_set_voltage(rdev, rdev->pm.default_vddc, |
596 | SET_VOLTAGE_TYPE_ASIC_VDDC); | 596 | SET_VOLTAGE_TYPE_ASIC_VDDC); |
597 | if (rdev->pm.default_vddci) | ||
598 | radeon_atom_set_voltage(rdev, rdev->pm.default_vddci, | ||
599 | SET_VOLTAGE_TYPE_ASIC_VDDCI); | ||
597 | if (rdev->pm.default_sclk) | 600 | if (rdev->pm.default_sclk) |
598 | radeon_set_engine_clock(rdev, rdev->pm.default_sclk); | 601 | radeon_set_engine_clock(rdev, rdev->pm.default_sclk); |
599 | if (rdev->pm.default_mclk) | 602 | if (rdev->pm.default_mclk) |
diff --git a/drivers/gpu/drm/radeon/radeon_reg.h b/drivers/gpu/drm/radeon/radeon_reg.h index bc44a3d35ec6..b4ce86455707 100644 --- a/drivers/gpu/drm/radeon/radeon_reg.h +++ b/drivers/gpu/drm/radeon/radeon_reg.h | |||
@@ -3295,7 +3295,7 @@ | |||
3295 | # define RADEON_RB_BUFSZ_MASK (0x3f << 0) | 3295 | # define RADEON_RB_BUFSZ_MASK (0x3f << 0) |
3296 | # define RADEON_RB_BLKSZ_SHIFT 8 | 3296 | # define RADEON_RB_BLKSZ_SHIFT 8 |
3297 | # define RADEON_RB_BLKSZ_MASK (0x3f << 8) | 3297 | # define RADEON_RB_BLKSZ_MASK (0x3f << 8) |
3298 | # define RADEON_BUF_SWAP_32BIT (1 << 17) | 3298 | # define RADEON_BUF_SWAP_32BIT (2 << 16) |
3299 | # define RADEON_MAX_FETCH_SHIFT 18 | 3299 | # define RADEON_MAX_FETCH_SHIFT 18 |
3300 | # define RADEON_MAX_FETCH_MASK (0x3 << 18) | 3300 | # define RADEON_MAX_FETCH_MASK (0x3 << 18) |
3301 | # define RADEON_RB_NO_UPDATE (1 << 27) | 3301 | # define RADEON_RB_NO_UPDATE (1 << 27) |
diff --git a/drivers/gpu/drm/radeon/reg_srcs/cayman b/drivers/gpu/drm/radeon/reg_srcs/cayman index 0aa8e85a9457..2316977eb924 100644 --- a/drivers/gpu/drm/radeon/reg_srcs/cayman +++ b/drivers/gpu/drm/radeon/reg_srcs/cayman | |||
@@ -208,6 +208,7 @@ cayman 0x9400 | |||
208 | 0x0002834C PA_SC_VPORT_ZMAX_15 | 208 | 0x0002834C PA_SC_VPORT_ZMAX_15 |
209 | 0x00028350 SX_MISC | 209 | 0x00028350 SX_MISC |
210 | 0x00028354 SX_SURFACE_SYNC | 210 | 0x00028354 SX_SURFACE_SYNC |
211 | 0x0002835C SX_SCATTER_EXPORT_SIZE | ||
211 | 0x00028380 SQ_VTX_SEMANTIC_0 | 212 | 0x00028380 SQ_VTX_SEMANTIC_0 |
212 | 0x00028384 SQ_VTX_SEMANTIC_1 | 213 | 0x00028384 SQ_VTX_SEMANTIC_1 |
213 | 0x00028388 SQ_VTX_SEMANTIC_2 | 214 | 0x00028388 SQ_VTX_SEMANTIC_2 |
@@ -432,6 +433,7 @@ cayman 0x9400 | |||
432 | 0x00028700 SPI_STACK_MGMT | 433 | 0x00028700 SPI_STACK_MGMT |
433 | 0x00028704 SPI_WAVE_MGMT_1 | 434 | 0x00028704 SPI_WAVE_MGMT_1 |
434 | 0x00028708 SPI_WAVE_MGMT_2 | 435 | 0x00028708 SPI_WAVE_MGMT_2 |
436 | 0x00028720 GDS_ADDR_BASE | ||
435 | 0x00028724 GDS_ADDR_SIZE | 437 | 0x00028724 GDS_ADDR_SIZE |
436 | 0x00028780 CB_BLEND0_CONTROL | 438 | 0x00028780 CB_BLEND0_CONTROL |
437 | 0x00028784 CB_BLEND1_CONTROL | 439 | 0x00028784 CB_BLEND1_CONTROL |
diff --git a/drivers/gpu/drm/radeon/reg_srcs/evergreen b/drivers/gpu/drm/radeon/reg_srcs/evergreen index 0e28cae7ea43..161737a28c23 100644 --- a/drivers/gpu/drm/radeon/reg_srcs/evergreen +++ b/drivers/gpu/drm/radeon/reg_srcs/evergreen | |||
@@ -44,6 +44,7 @@ evergreen 0x9400 | |||
44 | 0x00008E28 SQ_STATIC_THREAD_MGMT_3 | 44 | 0x00008E28 SQ_STATIC_THREAD_MGMT_3 |
45 | 0x00008E2C SQ_LDS_RESOURCE_MGMT | 45 | 0x00008E2C SQ_LDS_RESOURCE_MGMT |
46 | 0x00008E48 SQ_EX_ALLOC_TABLE_SLOTS | 46 | 0x00008E48 SQ_EX_ALLOC_TABLE_SLOTS |
47 | 0x00009014 SX_MEMORY_EXPORT_SIZE | ||
47 | 0x00009100 SPI_CONFIG_CNTL | 48 | 0x00009100 SPI_CONFIG_CNTL |
48 | 0x0000913C SPI_CONFIG_CNTL_1 | 49 | 0x0000913C SPI_CONFIG_CNTL_1 |
49 | 0x00009508 TA_CNTL_AUX | 50 | 0x00009508 TA_CNTL_AUX |
@@ -442,7 +443,9 @@ evergreen 0x9400 | |||
442 | 0x000286EC SPI_COMPUTE_NUM_THREAD_X | 443 | 0x000286EC SPI_COMPUTE_NUM_THREAD_X |
443 | 0x000286F0 SPI_COMPUTE_NUM_THREAD_Y | 444 | 0x000286F0 SPI_COMPUTE_NUM_THREAD_Y |
444 | 0x000286F4 SPI_COMPUTE_NUM_THREAD_Z | 445 | 0x000286F4 SPI_COMPUTE_NUM_THREAD_Z |
446 | 0x00028720 GDS_ADDR_BASE | ||
445 | 0x00028724 GDS_ADDR_SIZE | 447 | 0x00028724 GDS_ADDR_SIZE |
448 | 0x00028728 GDS_ORDERED_WAVE_PER_SE | ||
446 | 0x00028780 CB_BLEND0_CONTROL | 449 | 0x00028780 CB_BLEND0_CONTROL |
447 | 0x00028784 CB_BLEND1_CONTROL | 450 | 0x00028784 CB_BLEND1_CONTROL |
448 | 0x00028788 CB_BLEND2_CONTROL | 451 | 0x00028788 CB_BLEND2_CONTROL |
diff --git a/drivers/gpu/drm/radeon/reg_srcs/r600 b/drivers/gpu/drm/radeon/reg_srcs/r600 index ea49752ee99c..0380c5c15f80 100644 --- a/drivers/gpu/drm/radeon/reg_srcs/r600 +++ b/drivers/gpu/drm/radeon/reg_srcs/r600 | |||
@@ -429,6 +429,7 @@ r600 0x9400 | |||
429 | 0x00028438 SX_ALPHA_REF | 429 | 0x00028438 SX_ALPHA_REF |
430 | 0x00028410 SX_ALPHA_TEST_CONTROL | 430 | 0x00028410 SX_ALPHA_TEST_CONTROL |
431 | 0x00028350 SX_MISC | 431 | 0x00028350 SX_MISC |
432 | 0x00009014 SX_MEMORY_EXPORT_SIZE | ||
432 | 0x00009604 TC_INVALIDATE | 433 | 0x00009604 TC_INVALIDATE |
433 | 0x00009400 TD_FILTER4 | 434 | 0x00009400 TD_FILTER4 |
434 | 0x00009404 TD_FILTER4_1 | 435 | 0x00009404 TD_FILTER4_1 |
diff --git a/drivers/gpu/drm/radeon/rs600.c b/drivers/gpu/drm/radeon/rs600.c index 1f5850e473cc..4b5d0e6974a8 100644 --- a/drivers/gpu/drm/radeon/rs600.c +++ b/drivers/gpu/drm/radeon/rs600.c | |||
@@ -530,7 +530,7 @@ int rs600_gart_set_page(struct radeon_device *rdev, int i, uint64_t addr) | |||
530 | addr = addr & 0xFFFFFFFFFFFFF000ULL; | 530 | addr = addr & 0xFFFFFFFFFFFFF000ULL; |
531 | addr |= R600_PTE_VALID | R600_PTE_SYSTEM | R600_PTE_SNOOPED; | 531 | addr |= R600_PTE_VALID | R600_PTE_SYSTEM | R600_PTE_SNOOPED; |
532 | addr |= R600_PTE_READABLE | R600_PTE_WRITEABLE; | 532 | addr |= R600_PTE_READABLE | R600_PTE_WRITEABLE; |
533 | writeq(addr, ((void __iomem *)ptr) + (i * 8)); | 533 | writeq(addr, ptr + (i * 8)); |
534 | return 0; | 534 | return 0; |
535 | } | 535 | } |
536 | 536 | ||
diff --git a/drivers/gpu/drm/radeon/rv770.c b/drivers/gpu/drm/radeon/rv770.c index 4de51891aa6d..4720d000d440 100644 --- a/drivers/gpu/drm/radeon/rv770.c +++ b/drivers/gpu/drm/radeon/rv770.c | |||
@@ -778,6 +778,7 @@ static void rv770_gpu_init(struct radeon_device *rdev) | |||
778 | (cc_rb_backend_disable >> 16)); | 778 | (cc_rb_backend_disable >> 16)); |
779 | 779 | ||
780 | rdev->config.rv770.tile_config = gb_tiling_config; | 780 | rdev->config.rv770.tile_config = gb_tiling_config; |
781 | rdev->config.rv770.backend_map = backend_map; | ||
781 | gb_tiling_config |= BACKEND_MAP(backend_map); | 782 | gb_tiling_config |= BACKEND_MAP(backend_map); |
782 | 783 | ||
783 | WREG32(GB_TILING_CONFIG, gb_tiling_config); | 784 | WREG32(GB_TILING_CONFIG, gb_tiling_config); |