diff options
author | Dave Airlie <airlied@redhat.com> | 2012-03-15 06:24:32 -0400 |
---|---|---|
committer | Dave Airlie <airlied@redhat.com> | 2012-03-15 06:24:32 -0400 |
commit | 8229c885fe361e521ac64de36b16011e54a30de0 (patch) | |
tree | 572e5d34b16713ddef9e803308c6f72014aff01b /drivers/gpu/drm/radeon | |
parent | c3c50e8b651887bcefcc13beb3739c00b2379b5c (diff) | |
parent | fde7d9049e55ab85a390be7f415d74c9f62dd0f9 (diff) |
drm: Merge tag 'v3.3-rc7' into drm-core-next
Merge the fixes so far into core-next, needed to test
intel driver.
Conflicts:
drivers/gpu/drm/i915/intel_ringbuffer.c
Diffstat (limited to 'drivers/gpu/drm/radeon')
25 files changed, 154 insertions, 36 deletions
diff --git a/drivers/gpu/drm/radeon/evergreen.c b/drivers/gpu/drm/radeon/evergreen.c index 450b01d915e2..466db4115cd5 100644 --- a/drivers/gpu/drm/radeon/evergreen.c +++ b/drivers/gpu/drm/radeon/evergreen.c | |||
@@ -3273,6 +3273,7 @@ int evergreen_resume(struct radeon_device *rdev) | |||
3273 | r = evergreen_startup(rdev); | 3273 | r = evergreen_startup(rdev); |
3274 | if (r) { | 3274 | if (r) { |
3275 | DRM_ERROR("evergreen startup failed on resume\n"); | 3275 | DRM_ERROR("evergreen startup failed on resume\n"); |
3276 | rdev->accel_working = false; | ||
3276 | return r; | 3277 | return r; |
3277 | } | 3278 | } |
3278 | 3279 | ||
diff --git a/drivers/gpu/drm/radeon/ni.c b/drivers/gpu/drm/radeon/ni.c index 8ce7f9973a5c..160799c14b91 100644 --- a/drivers/gpu/drm/radeon/ni.c +++ b/drivers/gpu/drm/radeon/ni.c | |||
@@ -1547,6 +1547,7 @@ int cayman_resume(struct radeon_device *rdev) | |||
1547 | r = cayman_startup(rdev); | 1547 | r = cayman_startup(rdev); |
1548 | if (r) { | 1548 | if (r) { |
1549 | DRM_ERROR("cayman startup failed on resume\n"); | 1549 | DRM_ERROR("cayman startup failed on resume\n"); |
1550 | rdev->accel_working = false; | ||
1550 | return r; | 1551 | return r; |
1551 | } | 1552 | } |
1552 | return r; | 1553 | return r; |
diff --git a/drivers/gpu/drm/radeon/r100.c b/drivers/gpu/drm/radeon/r100.c index cee3c8a28dbd..81801c176aa5 100644 --- a/drivers/gpu/drm/radeon/r100.c +++ b/drivers/gpu/drm/radeon/r100.c | |||
@@ -827,9 +827,7 @@ int r100_irq_process(struct radeon_device *rdev) | |||
827 | WREG32(RADEON_AIC_CNTL, msi_rearm | RS400_MSI_REARM); | 827 | WREG32(RADEON_AIC_CNTL, msi_rearm | RS400_MSI_REARM); |
828 | break; | 828 | break; |
829 | default: | 829 | default: |
830 | msi_rearm = RREG32(RADEON_MSI_REARM_EN) & ~RV370_MSI_REARM_EN; | 830 | WREG32(RADEON_MSI_REARM_EN, RV370_MSI_REARM_EN); |
831 | WREG32(RADEON_MSI_REARM_EN, msi_rearm); | ||
832 | WREG32(RADEON_MSI_REARM_EN, msi_rearm | RV370_MSI_REARM_EN); | ||
833 | break; | 831 | break; |
834 | } | 832 | } |
835 | } | 833 | } |
@@ -3979,6 +3977,8 @@ static int r100_startup(struct radeon_device *rdev) | |||
3979 | 3977 | ||
3980 | int r100_resume(struct radeon_device *rdev) | 3978 | int r100_resume(struct radeon_device *rdev) |
3981 | { | 3979 | { |
3980 | int r; | ||
3981 | |||
3982 | /* Make sur GART are not working */ | 3982 | /* Make sur GART are not working */ |
3983 | if (rdev->flags & RADEON_IS_PCI) | 3983 | if (rdev->flags & RADEON_IS_PCI) |
3984 | r100_pci_gart_disable(rdev); | 3984 | r100_pci_gart_disable(rdev); |
@@ -3998,7 +3998,11 @@ int r100_resume(struct radeon_device *rdev) | |||
3998 | radeon_surface_init(rdev); | 3998 | radeon_surface_init(rdev); |
3999 | 3999 | ||
4000 | rdev->accel_working = true; | 4000 | rdev->accel_working = true; |
4001 | return r100_startup(rdev); | 4001 | r = r100_startup(rdev); |
4002 | if (r) { | ||
4003 | rdev->accel_working = false; | ||
4004 | } | ||
4005 | return r; | ||
4002 | } | 4006 | } |
4003 | 4007 | ||
4004 | int r100_suspend(struct radeon_device *rdev) | 4008 | int r100_suspend(struct radeon_device *rdev) |
diff --git a/drivers/gpu/drm/radeon/r300.c b/drivers/gpu/drm/radeon/r300.c index 9b36e581b18d..fa14383f9ca0 100644 --- a/drivers/gpu/drm/radeon/r300.c +++ b/drivers/gpu/drm/radeon/r300.c | |||
@@ -1430,6 +1430,8 @@ static int r300_startup(struct radeon_device *rdev) | |||
1430 | 1430 | ||
1431 | int r300_resume(struct radeon_device *rdev) | 1431 | int r300_resume(struct radeon_device *rdev) |
1432 | { | 1432 | { |
1433 | int r; | ||
1434 | |||
1433 | /* Make sur GART are not working */ | 1435 | /* Make sur GART are not working */ |
1434 | if (rdev->flags & RADEON_IS_PCIE) | 1436 | if (rdev->flags & RADEON_IS_PCIE) |
1435 | rv370_pcie_gart_disable(rdev); | 1437 | rv370_pcie_gart_disable(rdev); |
@@ -1451,7 +1453,11 @@ int r300_resume(struct radeon_device *rdev) | |||
1451 | radeon_surface_init(rdev); | 1453 | radeon_surface_init(rdev); |
1452 | 1454 | ||
1453 | rdev->accel_working = true; | 1455 | rdev->accel_working = true; |
1454 | return r300_startup(rdev); | 1456 | r = r300_startup(rdev); |
1457 | if (r) { | ||
1458 | rdev->accel_working = false; | ||
1459 | } | ||
1460 | return r; | ||
1455 | } | 1461 | } |
1456 | 1462 | ||
1457 | int r300_suspend(struct radeon_device *rdev) | 1463 | int r300_suspend(struct radeon_device *rdev) |
diff --git a/drivers/gpu/drm/radeon/r420.c b/drivers/gpu/drm/radeon/r420.c index d0f2c0363c27..f3fcaacfea01 100644 --- a/drivers/gpu/drm/radeon/r420.c +++ b/drivers/gpu/drm/radeon/r420.c | |||
@@ -291,6 +291,8 @@ static int r420_startup(struct radeon_device *rdev) | |||
291 | 291 | ||
292 | int r420_resume(struct radeon_device *rdev) | 292 | int r420_resume(struct radeon_device *rdev) |
293 | { | 293 | { |
294 | int r; | ||
295 | |||
294 | /* Make sur GART are not working */ | 296 | /* Make sur GART are not working */ |
295 | if (rdev->flags & RADEON_IS_PCIE) | 297 | if (rdev->flags & RADEON_IS_PCIE) |
296 | rv370_pcie_gart_disable(rdev); | 298 | rv370_pcie_gart_disable(rdev); |
@@ -316,7 +318,11 @@ int r420_resume(struct radeon_device *rdev) | |||
316 | radeon_surface_init(rdev); | 318 | radeon_surface_init(rdev); |
317 | 319 | ||
318 | rdev->accel_working = true; | 320 | rdev->accel_working = true; |
319 | return r420_startup(rdev); | 321 | r = r420_startup(rdev); |
322 | if (r) { | ||
323 | rdev->accel_working = false; | ||
324 | } | ||
325 | return r; | ||
320 | } | 326 | } |
321 | 327 | ||
322 | int r420_suspend(struct radeon_device *rdev) | 328 | int r420_suspend(struct radeon_device *rdev) |
diff --git a/drivers/gpu/drm/radeon/r520.c b/drivers/gpu/drm/radeon/r520.c index 422923ce70b6..ebcc15b03c9f 100644 --- a/drivers/gpu/drm/radeon/r520.c +++ b/drivers/gpu/drm/radeon/r520.c | |||
@@ -218,6 +218,8 @@ static int r520_startup(struct radeon_device *rdev) | |||
218 | 218 | ||
219 | int r520_resume(struct radeon_device *rdev) | 219 | int r520_resume(struct radeon_device *rdev) |
220 | { | 220 | { |
221 | int r; | ||
222 | |||
221 | /* Make sur GART are not working */ | 223 | /* Make sur GART are not working */ |
222 | if (rdev->flags & RADEON_IS_PCIE) | 224 | if (rdev->flags & RADEON_IS_PCIE) |
223 | rv370_pcie_gart_disable(rdev); | 225 | rv370_pcie_gart_disable(rdev); |
@@ -237,7 +239,11 @@ int r520_resume(struct radeon_device *rdev) | |||
237 | radeon_surface_init(rdev); | 239 | radeon_surface_init(rdev); |
238 | 240 | ||
239 | rdev->accel_working = true; | 241 | rdev->accel_working = true; |
240 | return r520_startup(rdev); | 242 | r = r520_startup(rdev); |
243 | if (r) { | ||
244 | rdev->accel_working = false; | ||
245 | } | ||
246 | return r; | ||
241 | } | 247 | } |
242 | 248 | ||
243 | int r520_init(struct radeon_device *rdev) | 249 | int r520_init(struct radeon_device *rdev) |
diff --git a/drivers/gpu/drm/radeon/r600.c b/drivers/gpu/drm/radeon/r600.c index 8a6d68c028d3..5eb23829353f 100644 --- a/drivers/gpu/drm/radeon/r600.c +++ b/drivers/gpu/drm/radeon/r600.c | |||
@@ -2362,6 +2362,9 @@ void r600_semaphore_ring_emit(struct radeon_device *rdev, | |||
2362 | uint64_t addr = semaphore->gpu_addr; | 2362 | uint64_t addr = semaphore->gpu_addr; |
2363 | unsigned sel = emit_wait ? PACKET3_SEM_SEL_WAIT : PACKET3_SEM_SEL_SIGNAL; | 2363 | unsigned sel = emit_wait ? PACKET3_SEM_SEL_WAIT : PACKET3_SEM_SEL_SIGNAL; |
2364 | 2364 | ||
2365 | if (rdev->family < CHIP_CAYMAN) | ||
2366 | sel |= PACKET3_SEM_WAIT_ON_SIGNAL; | ||
2367 | |||
2365 | radeon_ring_write(ring, PACKET3(PACKET3_MEM_SEMAPHORE, 1)); | 2368 | radeon_ring_write(ring, PACKET3(PACKET3_MEM_SEMAPHORE, 1)); |
2366 | radeon_ring_write(ring, addr & 0xffffffff); | 2369 | radeon_ring_write(ring, addr & 0xffffffff); |
2367 | radeon_ring_write(ring, (upper_32_bits(addr) & 0xff) | sel); | 2370 | radeon_ring_write(ring, (upper_32_bits(addr) & 0xff) | sel); |
@@ -2529,6 +2532,7 @@ int r600_resume(struct radeon_device *rdev) | |||
2529 | r = r600_startup(rdev); | 2532 | r = r600_startup(rdev); |
2530 | if (r) { | 2533 | if (r) { |
2531 | DRM_ERROR("r600 startup failed on resume\n"); | 2534 | DRM_ERROR("r600 startup failed on resume\n"); |
2535 | rdev->accel_working = false; | ||
2532 | return r; | 2536 | return r; |
2533 | } | 2537 | } |
2534 | 2538 | ||
diff --git a/drivers/gpu/drm/radeon/r600_blit_shaders.c b/drivers/gpu/drm/radeon/r600_blit_shaders.c index 2d1f6c5ee2a7..73e2c7c6edbc 100644 --- a/drivers/gpu/drm/radeon/r600_blit_shaders.c +++ b/drivers/gpu/drm/radeon/r600_blit_shaders.c | |||
@@ -314,6 +314,10 @@ const u32 r6xx_default_state[] = | |||
314 | 0x00000000, /* VGT_VTX_CNT_EN */ | 314 | 0x00000000, /* VGT_VTX_CNT_EN */ |
315 | 315 | ||
316 | 0xc0016900, | 316 | 0xc0016900, |
317 | 0x000000d4, | ||
318 | 0x00000000, /* SX_MISC */ | ||
319 | |||
320 | 0xc0016900, | ||
317 | 0x000002c8, | 321 | 0x000002c8, |
318 | 0x00000000, /* VGT_STRMOUT_BUFFER_EN */ | 322 | 0x00000000, /* VGT_STRMOUT_BUFFER_EN */ |
319 | 323 | ||
@@ -626,6 +630,10 @@ const u32 r7xx_default_state[] = | |||
626 | 0x00000000, /* VGT_VTX_CNT_EN */ | 630 | 0x00000000, /* VGT_VTX_CNT_EN */ |
627 | 631 | ||
628 | 0xc0016900, | 632 | 0xc0016900, |
633 | 0x000000d4, | ||
634 | 0x00000000, /* SX_MISC */ | ||
635 | |||
636 | 0xc0016900, | ||
629 | 0x000002c8, | 637 | 0x000002c8, |
630 | 0x00000000, /* VGT_STRMOUT_BUFFER_EN */ | 638 | 0x00000000, /* VGT_STRMOUT_BUFFER_EN */ |
631 | 639 | ||
diff --git a/drivers/gpu/drm/radeon/r600_cs.c b/drivers/gpu/drm/radeon/r600_cs.c index 5cbe948ef16e..2e465a7089bd 100644 --- a/drivers/gpu/drm/radeon/r600_cs.c +++ b/drivers/gpu/drm/radeon/r600_cs.c | |||
@@ -1392,6 +1392,7 @@ static int r600_check_texture_resource(struct radeon_cs_parser *p, u32 idx, | |||
1392 | h0 = G_038004_TEX_HEIGHT(word1) + 1; | 1392 | h0 = G_038004_TEX_HEIGHT(word1) + 1; |
1393 | d0 = G_038004_TEX_DEPTH(word1); | 1393 | d0 = G_038004_TEX_DEPTH(word1); |
1394 | nfaces = 1; | 1394 | nfaces = 1; |
1395 | array = 0; | ||
1395 | switch (G_038000_DIM(word0)) { | 1396 | switch (G_038000_DIM(word0)) { |
1396 | case V_038000_SQ_TEX_DIM_1D: | 1397 | case V_038000_SQ_TEX_DIM_1D: |
1397 | case V_038000_SQ_TEX_DIM_2D: | 1398 | case V_038000_SQ_TEX_DIM_2D: |
diff --git a/drivers/gpu/drm/radeon/r600d.h b/drivers/gpu/drm/radeon/r600d.h index 2ba460b5b62f..8ae328ff5fdd 100644 --- a/drivers/gpu/drm/radeon/r600d.h +++ b/drivers/gpu/drm/radeon/r600d.h | |||
@@ -850,6 +850,7 @@ | |||
850 | #define PACKET3_STRMOUT_BUFFER_UPDATE 0x34 | 850 | #define PACKET3_STRMOUT_BUFFER_UPDATE 0x34 |
851 | #define PACKET3_INDIRECT_BUFFER_MP 0x38 | 851 | #define PACKET3_INDIRECT_BUFFER_MP 0x38 |
852 | #define PACKET3_MEM_SEMAPHORE 0x39 | 852 | #define PACKET3_MEM_SEMAPHORE 0x39 |
853 | # define PACKET3_SEM_WAIT_ON_SIGNAL (0x1 << 12) | ||
853 | # define PACKET3_SEM_SEL_SIGNAL (0x6 << 29) | 854 | # define PACKET3_SEM_SEL_SIGNAL (0x6 << 29) |
854 | # define PACKET3_SEM_SEL_WAIT (0x7 << 29) | 855 | # define PACKET3_SEM_SEL_WAIT (0x7 << 29) |
855 | #define PACKET3_MPEG_INDEX 0x3A | 856 | #define PACKET3_MPEG_INDEX 0x3A |
diff --git a/drivers/gpu/drm/radeon/radeon_atombios.c b/drivers/gpu/drm/radeon/radeon_atombios.c index 5082d17d14dc..1f53ae74ada1 100644 --- a/drivers/gpu/drm/radeon/radeon_atombios.c +++ b/drivers/gpu/drm/radeon/radeon_atombios.c | |||
@@ -2931,6 +2931,20 @@ radeon_atombios_connected_scratch_regs(struct drm_connector *connector, | |||
2931 | bios_6_scratch &= ~ATOM_S6_ACC_REQ_DFP5; | 2931 | bios_6_scratch &= ~ATOM_S6_ACC_REQ_DFP5; |
2932 | } | 2932 | } |
2933 | } | 2933 | } |
2934 | if ((radeon_encoder->devices & ATOM_DEVICE_DFP6_SUPPORT) && | ||
2935 | (radeon_connector->devices & ATOM_DEVICE_DFP6_SUPPORT)) { | ||
2936 | if (connected) { | ||
2937 | DRM_DEBUG_KMS("DFP6 connected\n"); | ||
2938 | bios_0_scratch |= ATOM_S0_DFP6; | ||
2939 | bios_3_scratch |= ATOM_S3_DFP6_ACTIVE; | ||
2940 | bios_6_scratch |= ATOM_S6_ACC_REQ_DFP6; | ||
2941 | } else { | ||
2942 | DRM_DEBUG_KMS("DFP6 disconnected\n"); | ||
2943 | bios_0_scratch &= ~ATOM_S0_DFP6; | ||
2944 | bios_3_scratch &= ~ATOM_S3_DFP6_ACTIVE; | ||
2945 | bios_6_scratch &= ~ATOM_S6_ACC_REQ_DFP6; | ||
2946 | } | ||
2947 | } | ||
2934 | 2948 | ||
2935 | if (rdev->family >= CHIP_R600) { | 2949 | if (rdev->family >= CHIP_R600) { |
2936 | WREG32(R600_BIOS_0_SCRATCH, bios_0_scratch); | 2950 | WREG32(R600_BIOS_0_SCRATCH, bios_0_scratch); |
@@ -2951,6 +2965,9 @@ radeon_atombios_encoder_crtc_scratch_regs(struct drm_encoder *encoder, int crtc) | |||
2951 | struct radeon_encoder *radeon_encoder = to_radeon_encoder(encoder); | 2965 | struct radeon_encoder *radeon_encoder = to_radeon_encoder(encoder); |
2952 | uint32_t bios_3_scratch; | 2966 | uint32_t bios_3_scratch; |
2953 | 2967 | ||
2968 | if (ASIC_IS_DCE4(rdev)) | ||
2969 | return; | ||
2970 | |||
2954 | if (rdev->family >= CHIP_R600) | 2971 | if (rdev->family >= CHIP_R600) |
2955 | bios_3_scratch = RREG32(R600_BIOS_3_SCRATCH); | 2972 | bios_3_scratch = RREG32(R600_BIOS_3_SCRATCH); |
2956 | else | 2973 | else |
@@ -3003,6 +3020,9 @@ radeon_atombios_encoder_dpms_scratch_regs(struct drm_encoder *encoder, bool on) | |||
3003 | struct radeon_encoder *radeon_encoder = to_radeon_encoder(encoder); | 3020 | struct radeon_encoder *radeon_encoder = to_radeon_encoder(encoder); |
3004 | uint32_t bios_2_scratch; | 3021 | uint32_t bios_2_scratch; |
3005 | 3022 | ||
3023 | if (ASIC_IS_DCE4(rdev)) | ||
3024 | return; | ||
3025 | |||
3006 | if (rdev->family >= CHIP_R600) | 3026 | if (rdev->family >= CHIP_R600) |
3007 | bios_2_scratch = RREG32(R600_BIOS_2_SCRATCH); | 3027 | bios_2_scratch = RREG32(R600_BIOS_2_SCRATCH); |
3008 | else | 3028 | else |
diff --git a/drivers/gpu/drm/radeon/radeon_connectors.c b/drivers/gpu/drm/radeon/radeon_connectors.c index e7cb3ab09243..8c9a8115b632 100644 --- a/drivers/gpu/drm/radeon/radeon_connectors.c +++ b/drivers/gpu/drm/radeon/radeon_connectors.c | |||
@@ -1057,7 +1057,7 @@ static int radeon_dvi_mode_valid(struct drm_connector *connector, | |||
1057 | (radeon_connector->connector_object_id == CONNECTOR_OBJECT_ID_HDMI_TYPE_B)) | 1057 | (radeon_connector->connector_object_id == CONNECTOR_OBJECT_ID_HDMI_TYPE_B)) |
1058 | return MODE_OK; | 1058 | return MODE_OK; |
1059 | else if (radeon_connector->connector_object_id == CONNECTOR_OBJECT_ID_HDMI_TYPE_A) { | 1059 | else if (radeon_connector->connector_object_id == CONNECTOR_OBJECT_ID_HDMI_TYPE_A) { |
1060 | if (ASIC_IS_DCE3(rdev)) { | 1060 | if (0) { |
1061 | /* HDMI 1.3+ supports max clock of 340 Mhz */ | 1061 | /* HDMI 1.3+ supports max clock of 340 Mhz */ |
1062 | if (mode->clock > 340000) | 1062 | if (mode->clock > 340000) |
1063 | return MODE_CLOCK_HIGH; | 1063 | return MODE_CLOCK_HIGH; |
@@ -1117,13 +1117,23 @@ static int radeon_dp_get_modes(struct drm_connector *connector) | |||
1117 | (connector->connector_type == DRM_MODE_CONNECTOR_LVDS)) { | 1117 | (connector->connector_type == DRM_MODE_CONNECTOR_LVDS)) { |
1118 | struct drm_display_mode *mode; | 1118 | struct drm_display_mode *mode; |
1119 | 1119 | ||
1120 | if (!radeon_dig_connector->edp_on) | 1120 | if (connector->connector_type == DRM_MODE_CONNECTOR_eDP) { |
1121 | atombios_set_edp_panel_power(connector, | 1121 | if (!radeon_dig_connector->edp_on) |
1122 | ATOM_TRANSMITTER_ACTION_POWER_ON); | 1122 | atombios_set_edp_panel_power(connector, |
1123 | ret = radeon_ddc_get_modes(radeon_connector); | 1123 | ATOM_TRANSMITTER_ACTION_POWER_ON); |
1124 | if (!radeon_dig_connector->edp_on) | 1124 | ret = radeon_ddc_get_modes(radeon_connector); |
1125 | atombios_set_edp_panel_power(connector, | 1125 | if (!radeon_dig_connector->edp_on) |
1126 | ATOM_TRANSMITTER_ACTION_POWER_OFF); | 1126 | atombios_set_edp_panel_power(connector, |
1127 | ATOM_TRANSMITTER_ACTION_POWER_OFF); | ||
1128 | } else { | ||
1129 | /* need to setup ddc on the bridge */ | ||
1130 | if (radeon_connector_encoder_get_dp_bridge_encoder_id(connector) != | ||
1131 | ENCODER_OBJECT_ID_NONE) { | ||
1132 | if (encoder) | ||
1133 | radeon_atom_ext_encoder_setup_ddc(encoder); | ||
1134 | } | ||
1135 | ret = radeon_ddc_get_modes(radeon_connector); | ||
1136 | } | ||
1127 | 1137 | ||
1128 | if (ret > 0) { | 1138 | if (ret > 0) { |
1129 | if (encoder) { | 1139 | if (encoder) { |
@@ -1134,7 +1144,6 @@ static int radeon_dp_get_modes(struct drm_connector *connector) | |||
1134 | return ret; | 1144 | return ret; |
1135 | } | 1145 | } |
1136 | 1146 | ||
1137 | encoder = radeon_best_single_encoder(connector); | ||
1138 | if (!encoder) | 1147 | if (!encoder) |
1139 | return 0; | 1148 | return 0; |
1140 | 1149 | ||
diff --git a/drivers/gpu/drm/radeon/radeon_cs.c b/drivers/gpu/drm/radeon/radeon_cs.c index dc79d08c1f97..9b4124ee17f7 100644 --- a/drivers/gpu/drm/radeon/radeon_cs.c +++ b/drivers/gpu/drm/radeon/radeon_cs.c | |||
@@ -460,6 +460,10 @@ int radeon_cs_ioctl(struct drm_device *dev, void *data, struct drm_file *filp) | |||
460 | int r; | 460 | int r; |
461 | 461 | ||
462 | radeon_mutex_lock(&rdev->cs_mutex); | 462 | radeon_mutex_lock(&rdev->cs_mutex); |
463 | if (!rdev->accel_working) { | ||
464 | radeon_mutex_unlock(&rdev->cs_mutex); | ||
465 | return -EBUSY; | ||
466 | } | ||
463 | /* initialize parser */ | 467 | /* initialize parser */ |
464 | memset(&parser, 0, sizeof(struct radeon_cs_parser)); | 468 | memset(&parser, 0, sizeof(struct radeon_cs_parser)); |
465 | parser.filp = filp; | 469 | parser.filp = filp; |
diff --git a/drivers/gpu/drm/radeon/radeon_display.c b/drivers/gpu/drm/radeon/radeon_display.c index 1f98e5fbc733..b25bb2a55814 100644 --- a/drivers/gpu/drm/radeon/radeon_display.c +++ b/drivers/gpu/drm/radeon/radeon_display.c | |||
@@ -1087,15 +1087,21 @@ static const struct drm_framebuffer_funcs radeon_fb_funcs = { | |||
1087 | .create_handle = radeon_user_framebuffer_create_handle, | 1087 | .create_handle = radeon_user_framebuffer_create_handle, |
1088 | }; | 1088 | }; |
1089 | 1089 | ||
1090 | void | 1090 | int |
1091 | radeon_framebuffer_init(struct drm_device *dev, | 1091 | radeon_framebuffer_init(struct drm_device *dev, |
1092 | struct radeon_framebuffer *rfb, | 1092 | struct radeon_framebuffer *rfb, |
1093 | struct drm_mode_fb_cmd2 *mode_cmd, | 1093 | struct drm_mode_fb_cmd2 *mode_cmd, |
1094 | struct drm_gem_object *obj) | 1094 | struct drm_gem_object *obj) |
1095 | { | 1095 | { |
1096 | int ret; | ||
1096 | rfb->obj = obj; | 1097 | rfb->obj = obj; |
1097 | drm_framebuffer_init(dev, &rfb->base, &radeon_fb_funcs); | 1098 | ret = drm_framebuffer_init(dev, &rfb->base, &radeon_fb_funcs); |
1099 | if (ret) { | ||
1100 | rfb->obj = NULL; | ||
1101 | return ret; | ||
1102 | } | ||
1098 | drm_helper_mode_fill_fb_struct(&rfb->base, mode_cmd); | 1103 | drm_helper_mode_fill_fb_struct(&rfb->base, mode_cmd); |
1104 | return 0; | ||
1099 | } | 1105 | } |
1100 | 1106 | ||
1101 | static struct drm_framebuffer * | 1107 | static struct drm_framebuffer * |
@@ -1105,6 +1111,7 @@ radeon_user_framebuffer_create(struct drm_device *dev, | |||
1105 | { | 1111 | { |
1106 | struct drm_gem_object *obj; | 1112 | struct drm_gem_object *obj; |
1107 | struct radeon_framebuffer *radeon_fb; | 1113 | struct radeon_framebuffer *radeon_fb; |
1114 | int ret; | ||
1108 | 1115 | ||
1109 | obj = drm_gem_object_lookup(dev, file_priv, mode_cmd->handles[0]); | 1116 | obj = drm_gem_object_lookup(dev, file_priv, mode_cmd->handles[0]); |
1110 | if (obj == NULL) { | 1117 | if (obj == NULL) { |
@@ -1117,7 +1124,12 @@ radeon_user_framebuffer_create(struct drm_device *dev, | |||
1117 | if (radeon_fb == NULL) | 1124 | if (radeon_fb == NULL) |
1118 | return ERR_PTR(-ENOMEM); | 1125 | return ERR_PTR(-ENOMEM); |
1119 | 1126 | ||
1120 | radeon_framebuffer_init(dev, radeon_fb, mode_cmd, obj); | 1127 | ret = radeon_framebuffer_init(dev, radeon_fb, mode_cmd, obj); |
1128 | if (ret) { | ||
1129 | kfree(radeon_fb); | ||
1130 | drm_gem_object_unreference_unlocked(obj); | ||
1131 | return NULL; | ||
1132 | } | ||
1121 | 1133 | ||
1122 | return &radeon_fb->base; | 1134 | return &radeon_fb->base; |
1123 | } | 1135 | } |
diff --git a/drivers/gpu/drm/radeon/radeon_encoders.c b/drivers/gpu/drm/radeon/radeon_encoders.c index 9419c51bcf50..26e92708d114 100644 --- a/drivers/gpu/drm/radeon/radeon_encoders.c +++ b/drivers/gpu/drm/radeon/radeon_encoders.c | |||
@@ -307,8 +307,6 @@ void radeon_panel_mode_fixup(struct drm_encoder *encoder, | |||
307 | bool radeon_dig_monitor_is_duallink(struct drm_encoder *encoder, | 307 | bool radeon_dig_monitor_is_duallink(struct drm_encoder *encoder, |
308 | u32 pixel_clock) | 308 | u32 pixel_clock) |
309 | { | 309 | { |
310 | struct drm_device *dev = encoder->dev; | ||
311 | struct radeon_device *rdev = dev->dev_private; | ||
312 | struct drm_connector *connector; | 310 | struct drm_connector *connector; |
313 | struct radeon_connector *radeon_connector; | 311 | struct radeon_connector *radeon_connector; |
314 | struct radeon_connector_atom_dig *dig_connector; | 312 | struct radeon_connector_atom_dig *dig_connector; |
@@ -326,7 +324,7 @@ bool radeon_dig_monitor_is_duallink(struct drm_encoder *encoder, | |||
326 | case DRM_MODE_CONNECTOR_HDMIB: | 324 | case DRM_MODE_CONNECTOR_HDMIB: |
327 | if (radeon_connector->use_digital) { | 325 | if (radeon_connector->use_digital) { |
328 | /* HDMI 1.3 supports up to 340 Mhz over single link */ | 326 | /* HDMI 1.3 supports up to 340 Mhz over single link */ |
329 | if (ASIC_IS_DCE3(rdev) && drm_detect_hdmi_monitor(radeon_connector->edid)) { | 327 | if (0 && drm_detect_hdmi_monitor(radeon_connector->edid)) { |
330 | if (pixel_clock > 340000) | 328 | if (pixel_clock > 340000) |
331 | return true; | 329 | return true; |
332 | else | 330 | else |
@@ -348,7 +346,7 @@ bool radeon_dig_monitor_is_duallink(struct drm_encoder *encoder, | |||
348 | return false; | 346 | return false; |
349 | else { | 347 | else { |
350 | /* HDMI 1.3 supports up to 340 Mhz over single link */ | 348 | /* HDMI 1.3 supports up to 340 Mhz over single link */ |
351 | if (ASIC_IS_DCE3(rdev) && drm_detect_hdmi_monitor(radeon_connector->edid)) { | 349 | if (0 && drm_detect_hdmi_monitor(radeon_connector->edid)) { |
352 | if (pixel_clock > 340000) | 350 | if (pixel_clock > 340000) |
353 | return true; | 351 | return true; |
354 | else | 352 | else |
diff --git a/drivers/gpu/drm/radeon/radeon_fb.c b/drivers/gpu/drm/radeon/radeon_fb.c index a5692d5f415d..60b97ab1d19e 100644 --- a/drivers/gpu/drm/radeon/radeon_fb.c +++ b/drivers/gpu/drm/radeon/radeon_fb.c | |||
@@ -209,6 +209,11 @@ static int radeonfb_create(struct radeon_fbdev *rfbdev, | |||
209 | sizes->surface_depth); | 209 | sizes->surface_depth); |
210 | 210 | ||
211 | ret = radeonfb_create_pinned_object(rfbdev, &mode_cmd, &gobj); | 211 | ret = radeonfb_create_pinned_object(rfbdev, &mode_cmd, &gobj); |
212 | if (ret) { | ||
213 | DRM_ERROR("failed to create fbcon object %d\n", ret); | ||
214 | return ret; | ||
215 | } | ||
216 | |||
212 | rbo = gem_to_radeon_bo(gobj); | 217 | rbo = gem_to_radeon_bo(gobj); |
213 | 218 | ||
214 | /* okay we have an object now allocate the framebuffer */ | 219 | /* okay we have an object now allocate the framebuffer */ |
@@ -220,7 +225,11 @@ static int radeonfb_create(struct radeon_fbdev *rfbdev, | |||
220 | 225 | ||
221 | info->par = rfbdev; | 226 | info->par = rfbdev; |
222 | 227 | ||
223 | radeon_framebuffer_init(rdev->ddev, &rfbdev->rfb, &mode_cmd, gobj); | 228 | ret = radeon_framebuffer_init(rdev->ddev, &rfbdev->rfb, &mode_cmd, gobj); |
229 | if (ret) { | ||
230 | DRM_ERROR("failed to initalise framebuffer %d\n", ret); | ||
231 | goto out_unref; | ||
232 | } | ||
224 | 233 | ||
225 | fb = &rfbdev->rfb.base; | 234 | fb = &rfbdev->rfb.base; |
226 | 235 | ||
diff --git a/drivers/gpu/drm/radeon/radeon_fence.c b/drivers/gpu/drm/radeon/radeon_fence.c index 64ea3dd9e6ff..4bd36a354fbe 100644 --- a/drivers/gpu/drm/radeon/radeon_fence.c +++ b/drivers/gpu/drm/radeon/radeon_fence.c | |||
@@ -364,8 +364,10 @@ int radeon_fence_count_emitted(struct radeon_device *rdev, int ring) | |||
364 | int not_processed = 0; | 364 | int not_processed = 0; |
365 | 365 | ||
366 | read_lock_irqsave(&rdev->fence_lock, irq_flags); | 366 | read_lock_irqsave(&rdev->fence_lock, irq_flags); |
367 | if (!rdev->fence_drv[ring].initialized) | 367 | if (!rdev->fence_drv[ring].initialized) { |
368 | read_unlock_irqrestore(&rdev->fence_lock, irq_flags); | ||
368 | return 0; | 369 | return 0; |
370 | } | ||
369 | 371 | ||
370 | if (!list_empty(&rdev->fence_drv[ring].emitted)) { | 372 | if (!list_empty(&rdev->fence_drv[ring].emitted)) { |
371 | struct list_head *ptr; | 373 | struct list_head *ptr; |
diff --git a/drivers/gpu/drm/radeon/radeon_gart.c b/drivers/gpu/drm/radeon/radeon_gart.c index 010dad8b66ae..c58a036233fb 100644 --- a/drivers/gpu/drm/radeon/radeon_gart.c +++ b/drivers/gpu/drm/radeon/radeon_gart.c | |||
@@ -597,13 +597,13 @@ int radeon_vm_bo_rmv(struct radeon_device *rdev, | |||
597 | if (bo_va == NULL) | 597 | if (bo_va == NULL) |
598 | return 0; | 598 | return 0; |
599 | 599 | ||
600 | list_del(&bo_va->bo_list); | ||
601 | mutex_lock(&vm->mutex); | 600 | mutex_lock(&vm->mutex); |
602 | radeon_mutex_lock(&rdev->cs_mutex); | 601 | radeon_mutex_lock(&rdev->cs_mutex); |
603 | radeon_vm_bo_update_pte(rdev, vm, bo, NULL); | 602 | radeon_vm_bo_update_pte(rdev, vm, bo, NULL); |
604 | radeon_mutex_unlock(&rdev->cs_mutex); | 603 | radeon_mutex_unlock(&rdev->cs_mutex); |
605 | list_del(&bo_va->vm_list); | 604 | list_del(&bo_va->vm_list); |
606 | mutex_unlock(&vm->mutex); | 605 | mutex_unlock(&vm->mutex); |
606 | list_del(&bo_va->bo_list); | ||
607 | 607 | ||
608 | kfree(bo_va); | 608 | kfree(bo_va); |
609 | return 0; | 609 | return 0; |
diff --git a/drivers/gpu/drm/radeon/radeon_mode.h b/drivers/gpu/drm/radeon/radeon_mode.h index 4330e3253573..8a85598fb242 100644 --- a/drivers/gpu/drm/radeon/radeon_mode.h +++ b/drivers/gpu/drm/radeon/radeon_mode.h | |||
@@ -649,7 +649,7 @@ extern void radeon_crtc_fb_gamma_set(struct drm_crtc *crtc, u16 red, u16 green, | |||
649 | u16 blue, int regno); | 649 | u16 blue, int regno); |
650 | extern void radeon_crtc_fb_gamma_get(struct drm_crtc *crtc, u16 *red, u16 *green, | 650 | extern void radeon_crtc_fb_gamma_get(struct drm_crtc *crtc, u16 *red, u16 *green, |
651 | u16 *blue, int regno); | 651 | u16 *blue, int regno); |
652 | void radeon_framebuffer_init(struct drm_device *dev, | 652 | int radeon_framebuffer_init(struct drm_device *dev, |
653 | struct radeon_framebuffer *rfb, | 653 | struct radeon_framebuffer *rfb, |
654 | struct drm_mode_fb_cmd2 *mode_cmd, | 654 | struct drm_mode_fb_cmd2 *mode_cmd, |
655 | struct drm_gem_object *obj); | 655 | struct drm_gem_object *obj); |
diff --git a/drivers/gpu/drm/radeon/radeon_ring.c b/drivers/gpu/drm/radeon/radeon_ring.c index 32c83d8bad34..30566201dffb 100644 --- a/drivers/gpu/drm/radeon/radeon_ring.c +++ b/drivers/gpu/drm/radeon/radeon_ring.c | |||
@@ -503,8 +503,11 @@ static unsigned radeon_debugfs_ib_idx[RADEON_IB_POOL_SIZE]; | |||
503 | int radeon_debugfs_ring_init(struct radeon_device *rdev) | 503 | int radeon_debugfs_ring_init(struct radeon_device *rdev) |
504 | { | 504 | { |
505 | #if defined(CONFIG_DEBUG_FS) | 505 | #if defined(CONFIG_DEBUG_FS) |
506 | return radeon_debugfs_add_files(rdev, radeon_debugfs_ring_info_list, | 506 | if (rdev->family >= CHIP_CAYMAN) |
507 | ARRAY_SIZE(radeon_debugfs_ring_info_list)); | 507 | return radeon_debugfs_add_files(rdev, radeon_debugfs_ring_info_list, |
508 | ARRAY_SIZE(radeon_debugfs_ring_info_list)); | ||
509 | else | ||
510 | return radeon_debugfs_add_files(rdev, radeon_debugfs_ring_info_list, 1); | ||
508 | #else | 511 | #else |
509 | return 0; | 512 | return 0; |
510 | #endif | 513 | #endif |
diff --git a/drivers/gpu/drm/radeon/rs400.c b/drivers/gpu/drm/radeon/rs400.c index 5280c87d5955..4cf381b3a6d8 100644 --- a/drivers/gpu/drm/radeon/rs400.c +++ b/drivers/gpu/drm/radeon/rs400.c | |||
@@ -442,6 +442,8 @@ static int rs400_startup(struct radeon_device *rdev) | |||
442 | 442 | ||
443 | int rs400_resume(struct radeon_device *rdev) | 443 | int rs400_resume(struct radeon_device *rdev) |
444 | { | 444 | { |
445 | int r; | ||
446 | |||
445 | /* Make sur GART are not working */ | 447 | /* Make sur GART are not working */ |
446 | rs400_gart_disable(rdev); | 448 | rs400_gart_disable(rdev); |
447 | /* Resume clock before doing reset */ | 449 | /* Resume clock before doing reset */ |
@@ -462,7 +464,11 @@ int rs400_resume(struct radeon_device *rdev) | |||
462 | radeon_surface_init(rdev); | 464 | radeon_surface_init(rdev); |
463 | 465 | ||
464 | rdev->accel_working = true; | 466 | rdev->accel_working = true; |
465 | return rs400_startup(rdev); | 467 | r = rs400_startup(rdev); |
468 | if (r) { | ||
469 | rdev->accel_working = false; | ||
470 | } | ||
471 | return r; | ||
466 | } | 472 | } |
467 | 473 | ||
468 | int rs400_suspend(struct radeon_device *rdev) | 474 | int rs400_suspend(struct radeon_device *rdev) |
diff --git a/drivers/gpu/drm/radeon/rs600.c b/drivers/gpu/drm/radeon/rs600.c index 8c2a3d4d638c..d25cf869d08d 100644 --- a/drivers/gpu/drm/radeon/rs600.c +++ b/drivers/gpu/drm/radeon/rs600.c | |||
@@ -703,9 +703,7 @@ int rs600_irq_process(struct radeon_device *rdev) | |||
703 | WREG32(RADEON_BUS_CNTL, msi_rearm | RS600_MSI_REARM); | 703 | WREG32(RADEON_BUS_CNTL, msi_rearm | RS600_MSI_REARM); |
704 | break; | 704 | break; |
705 | default: | 705 | default: |
706 | msi_rearm = RREG32(RADEON_MSI_REARM_EN) & ~RV370_MSI_REARM_EN; | 706 | WREG32(RADEON_MSI_REARM_EN, RV370_MSI_REARM_EN); |
707 | WREG32(RADEON_MSI_REARM_EN, msi_rearm); | ||
708 | WREG32(RADEON_MSI_REARM_EN, msi_rearm | RV370_MSI_REARM_EN); | ||
709 | break; | 707 | break; |
710 | } | 708 | } |
711 | } | 709 | } |
@@ -897,6 +895,8 @@ static int rs600_startup(struct radeon_device *rdev) | |||
897 | 895 | ||
898 | int rs600_resume(struct radeon_device *rdev) | 896 | int rs600_resume(struct radeon_device *rdev) |
899 | { | 897 | { |
898 | int r; | ||
899 | |||
900 | /* Make sur GART are not working */ | 900 | /* Make sur GART are not working */ |
901 | rs600_gart_disable(rdev); | 901 | rs600_gart_disable(rdev); |
902 | /* Resume clock before doing reset */ | 902 | /* Resume clock before doing reset */ |
@@ -915,7 +915,11 @@ int rs600_resume(struct radeon_device *rdev) | |||
915 | radeon_surface_init(rdev); | 915 | radeon_surface_init(rdev); |
916 | 916 | ||
917 | rdev->accel_working = true; | 917 | rdev->accel_working = true; |
918 | return rs600_startup(rdev); | 918 | r = rs600_startup(rdev); |
919 | if (r) { | ||
920 | rdev->accel_working = false; | ||
921 | } | ||
922 | return r; | ||
919 | } | 923 | } |
920 | 924 | ||
921 | int rs600_suspend(struct radeon_device *rdev) | 925 | int rs600_suspend(struct radeon_device *rdev) |
diff --git a/drivers/gpu/drm/radeon/rs690.c b/drivers/gpu/drm/radeon/rs690.c index 6aa65032d3cb..f2c3b9d75f18 100644 --- a/drivers/gpu/drm/radeon/rs690.c +++ b/drivers/gpu/drm/radeon/rs690.c | |||
@@ -659,6 +659,8 @@ static int rs690_startup(struct radeon_device *rdev) | |||
659 | 659 | ||
660 | int rs690_resume(struct radeon_device *rdev) | 660 | int rs690_resume(struct radeon_device *rdev) |
661 | { | 661 | { |
662 | int r; | ||
663 | |||
662 | /* Make sur GART are not working */ | 664 | /* Make sur GART are not working */ |
663 | rs400_gart_disable(rdev); | 665 | rs400_gart_disable(rdev); |
664 | /* Resume clock before doing reset */ | 666 | /* Resume clock before doing reset */ |
@@ -677,7 +679,11 @@ int rs690_resume(struct radeon_device *rdev) | |||
677 | radeon_surface_init(rdev); | 679 | radeon_surface_init(rdev); |
678 | 680 | ||
679 | rdev->accel_working = true; | 681 | rdev->accel_working = true; |
680 | return rs690_startup(rdev); | 682 | r = rs690_startup(rdev); |
683 | if (r) { | ||
684 | rdev->accel_working = false; | ||
685 | } | ||
686 | return r; | ||
681 | } | 687 | } |
682 | 688 | ||
683 | int rs690_suspend(struct radeon_device *rdev) | 689 | int rs690_suspend(struct radeon_device *rdev) |
diff --git a/drivers/gpu/drm/radeon/rv515.c b/drivers/gpu/drm/radeon/rv515.c index 9e1b159bbb7f..c0549b146bae 100644 --- a/drivers/gpu/drm/radeon/rv515.c +++ b/drivers/gpu/drm/radeon/rv515.c | |||
@@ -423,6 +423,8 @@ static int rv515_startup(struct radeon_device *rdev) | |||
423 | 423 | ||
424 | int rv515_resume(struct radeon_device *rdev) | 424 | int rv515_resume(struct radeon_device *rdev) |
425 | { | 425 | { |
426 | int r; | ||
427 | |||
426 | /* Make sur GART are not working */ | 428 | /* Make sur GART are not working */ |
427 | if (rdev->flags & RADEON_IS_PCIE) | 429 | if (rdev->flags & RADEON_IS_PCIE) |
428 | rv370_pcie_gart_disable(rdev); | 430 | rv370_pcie_gart_disable(rdev); |
@@ -442,7 +444,11 @@ int rv515_resume(struct radeon_device *rdev) | |||
442 | radeon_surface_init(rdev); | 444 | radeon_surface_init(rdev); |
443 | 445 | ||
444 | rdev->accel_working = true; | 446 | rdev->accel_working = true; |
445 | return rv515_startup(rdev); | 447 | r = rv515_startup(rdev); |
448 | if (r) { | ||
449 | rdev->accel_working = false; | ||
450 | } | ||
451 | return r; | ||
446 | } | 452 | } |
447 | 453 | ||
448 | int rv515_suspend(struct radeon_device *rdev) | 454 | int rv515_suspend(struct radeon_device *rdev) |
diff --git a/drivers/gpu/drm/radeon/rv770.c b/drivers/gpu/drm/radeon/rv770.c index 6f2cbfb18292..c62ae4be3845 100644 --- a/drivers/gpu/drm/radeon/rv770.c +++ b/drivers/gpu/drm/radeon/rv770.c | |||
@@ -1139,6 +1139,7 @@ int rv770_resume(struct radeon_device *rdev) | |||
1139 | r = rv770_startup(rdev); | 1139 | r = rv770_startup(rdev); |
1140 | if (r) { | 1140 | if (r) { |
1141 | DRM_ERROR("r600 startup failed on resume\n"); | 1141 | DRM_ERROR("r600 startup failed on resume\n"); |
1142 | rdev->accel_working = false; | ||
1142 | return r; | 1143 | return r; |
1143 | } | 1144 | } |
1144 | 1145 | ||