aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/gpu
diff options
context:
space:
mode:
authorDave Airlie <airlied@linux.ie>2009-09-18 01:19:37 -0400
committerDave Airlie <airlied@redhat.com>2009-09-18 02:17:42 -0400
commitfc30b8efbe1b271eb64e0d4f6cb2a91bb57ee5f3 (patch)
tree87e0fb824b19667c2570bc99bc9ca918f4a25f6e /drivers/gpu
parentbc1a631e5104317cc8b4ef7d14adc597f2844003 (diff)
drm/radeon/kms: move around new init path code to avoid posting at init
We really don't want to post the card at init, it takes a relatively long time and isn't required, so split the resume path into a startup path called by both init/resume and separate resume entry point to do posting. Signed-off-by: Dave Airlie <airlied@redhat.com>
Diffstat (limited to 'drivers/gpu')
-rw-r--r--drivers/gpu/drm/radeon/r420.c52
-rw-r--r--drivers/gpu/drm/radeon/r600.c38
-rw-r--r--drivers/gpu/drm/radeon/rv770.c38
3 files changed, 101 insertions, 27 deletions
diff --git a/drivers/gpu/drm/radeon/r420.c b/drivers/gpu/drm/radeon/r420.c
index 2142a4781970..9b38956e91c7 100644
--- a/drivers/gpu/drm/radeon/r420.c
+++ b/drivers/gpu/drm/radeon/r420.c
@@ -157,31 +157,10 @@ static void r420_clock_resume(struct radeon_device *rdev)
157 WREG32_PLL(R_00000D_SCLK_CNTL, sclk_cntl); 157 WREG32_PLL(R_00000D_SCLK_CNTL, sclk_cntl);
158} 158}
159 159
160int r420_resume(struct radeon_device *rdev) 160static int r420_startup(struct radeon_device *rdev)
161{ 161{
162 int r; 162 int r;
163 163
164 /* Make sur GART are not working */
165 if (rdev->flags & RADEON_IS_PCIE)
166 rv370_pcie_gart_disable(rdev);
167 if (rdev->flags & RADEON_IS_PCI)
168 r100_pci_gart_disable(rdev);
169 /* Resume clock before doing reset */
170 r420_clock_resume(rdev);
171 /* Reset gpu before posting otherwise ATOM will enter infinite loop */
172 if (radeon_gpu_reset(rdev)) {
173 dev_warn(rdev->dev, "GPU reset failed ! (0xE40=0x%08X, 0x7C0=0x%08X)\n",
174 RREG32(R_000E40_RBBM_STATUS),
175 RREG32(R_0007C0_CP_STAT));
176 }
177 /* check if cards are posted or not */
178 if (rdev->is_atom_bios) {
179 atom_asic_init(rdev->mode_info.atom_context);
180 } else {
181 radeon_combios_asic_init(rdev->ddev);
182 }
183 /* Resume clock after posting */
184 r420_clock_resume(rdev);
185 r300_mc_program(rdev); 164 r300_mc_program(rdev);
186 /* Initialize GART (initialize after TTM so we can allocate 165 /* Initialize GART (initialize after TTM so we can allocate
187 * memory through TTM but finalize after TTM) */ 166 * memory through TTM but finalize after TTM) */
@@ -217,6 +196,33 @@ int r420_resume(struct radeon_device *rdev)
217 return 0; 196 return 0;
218} 197}
219 198
199int r420_resume(struct radeon_device *rdev)
200{
201 /* Make sur GART are not working */
202 if (rdev->flags & RADEON_IS_PCIE)
203 rv370_pcie_gart_disable(rdev);
204 if (rdev->flags & RADEON_IS_PCI)
205 r100_pci_gart_disable(rdev);
206 /* Resume clock before doing reset */
207 r420_clock_resume(rdev);
208 /* Reset gpu before posting otherwise ATOM will enter infinite loop */
209 if (radeon_gpu_reset(rdev)) {
210 dev_warn(rdev->dev, "GPU reset failed ! (0xE40=0x%08X, 0x7C0=0x%08X)\n",
211 RREG32(R_000E40_RBBM_STATUS),
212 RREG32(R_0007C0_CP_STAT));
213 }
214 /* check if cards are posted or not */
215 if (rdev->is_atom_bios) {
216 atom_asic_init(rdev->mode_info.atom_context);
217 } else {
218 radeon_combios_asic_init(rdev->ddev);
219 }
220 /* Resume clock after posting */
221 r420_clock_resume(rdev);
222
223 return r420_startup(rdev);
224}
225
220int r420_suspend(struct radeon_device *rdev) 226int r420_suspend(struct radeon_device *rdev)
221{ 227{
222 r100_cp_disable(rdev); 228 r100_cp_disable(rdev);
@@ -330,7 +336,7 @@ int r420_init(struct radeon_device *rdev)
330 } 336 }
331 r300_set_reg_safe(rdev); 337 r300_set_reg_safe(rdev);
332 rdev->accel_working = true; 338 rdev->accel_working = true;
333 r = r420_resume(rdev); 339 r = r420_startup(rdev);
334 if (r) { 340 if (r) {
335 /* Somethings want wront with the accel init stop accel */ 341 /* Somethings want wront with the accel init stop accel */
336 dev_err(rdev->dev, "Disabling GPU acceleration\n"); 342 dev_err(rdev->dev, "Disabling GPU acceleration\n");
diff --git a/drivers/gpu/drm/radeon/r600.c b/drivers/gpu/drm/radeon/r600.c
index 9844783cd8d7..5f42fad19190 100644
--- a/drivers/gpu/drm/radeon/r600.c
+++ b/drivers/gpu/drm/radeon/r600.c
@@ -1466,7 +1466,7 @@ bool r600_card_posted(struct radeon_device *rdev)
1466 return false; 1466 return false;
1467} 1467}
1468 1468
1469int r600_resume(struct radeon_device *rdev) 1469int r600_startup(struct radeon_device *rdev)
1470{ 1470{
1471 int r; 1471 int r;
1472 1472
@@ -1499,6 +1499,40 @@ int r600_resume(struct radeon_device *rdev)
1499 return 0; 1499 return 0;
1500} 1500}
1501 1501
1502int r600_resume(struct radeon_device *rdev)
1503{
1504 int r;
1505
1506 if (radeon_gpu_reset(rdev)) {
1507 /* FIXME: what do we want to do here ? */
1508 }
1509 /* post card */
1510 if (rdev->is_atom_bios) {
1511 atom_asic_init(rdev->mode_info.atom_context);
1512 } else {
1513 radeon_combios_asic_init(rdev->ddev);
1514 }
1515 /* Initialize clocks */
1516 r = radeon_clocks_init(rdev);
1517 if (r) {
1518 return r;
1519 }
1520
1521 r = r600_startup(rdev);
1522 if (r) {
1523 DRM_ERROR("r600 startup failed on resume\n");
1524 return r;
1525 }
1526
1527 r = radeon_ib_test(rdev);
1528 if (r) {
1529 DRM_ERROR("radeon: failled testing IB (%d).\n", r);
1530 return r;
1531 }
1532 return r;
1533}
1534
1535
1502int r600_suspend(struct radeon_device *rdev) 1536int r600_suspend(struct radeon_device *rdev)
1503{ 1537{
1504 /* FIXME: we should wait for ring to be empty */ 1538 /* FIXME: we should wait for ring to be empty */
@@ -1596,7 +1630,7 @@ int r600_init(struct radeon_device *rdev)
1596 return r; 1630 return r;
1597 } 1631 }
1598 1632
1599 r = r600_resume(rdev); 1633 r = r600_startup(rdev);
1600 if (r) { 1634 if (r) {
1601 if (rdev->flags & RADEON_IS_AGP) { 1635 if (rdev->flags & RADEON_IS_AGP) {
1602 /* Retry with disabling AGP */ 1636 /* Retry with disabling AGP */
diff --git a/drivers/gpu/drm/radeon/rv770.c b/drivers/gpu/drm/radeon/rv770.c
index 47427623a84c..a6399662a843 100644
--- a/drivers/gpu/drm/radeon/rv770.c
+++ b/drivers/gpu/drm/radeon/rv770.c
@@ -851,7 +851,7 @@ int rv770_gpu_reset(struct radeon_device *rdev)
851 return 0; 851 return 0;
852} 852}
853 853
854int rv770_resume(struct radeon_device *rdev) 854static int rv770_startup(struct radeon_device *rdev)
855{ 855{
856 int r; 856 int r;
857 857
@@ -875,6 +875,40 @@ int rv770_resume(struct radeon_device *rdev)
875 return 0; 875 return 0;
876} 876}
877 877
878int rv770_resume(struct radeon_device *rdev)
879{
880 int r;
881
882 if (radeon_gpu_reset(rdev)) {
883 /* FIXME: what do we want to do here ? */
884 }
885 /* post card */
886 if (rdev->is_atom_bios) {
887 atom_asic_init(rdev->mode_info.atom_context);
888 } else {
889 radeon_combios_asic_init(rdev->ddev);
890 }
891 /* Initialize clocks */
892 r = radeon_clocks_init(rdev);
893 if (r) {
894 return r;
895 }
896
897 r = rv770_startup(rdev);
898 if (r) {
899 DRM_ERROR("r600 startup failed on resume\n");
900 return r;
901 }
902
903 r = radeon_ib_test(rdev);
904 if (r) {
905 DRM_ERROR("radeon: failled testing IB (%d).\n", r);
906 return r;
907 }
908 return r;
909
910}
911
878int rv770_suspend(struct radeon_device *rdev) 912int rv770_suspend(struct radeon_device *rdev)
879{ 913{
880 /* FIXME: we should wait for ring to be empty */ 914 /* FIXME: we should wait for ring to be empty */
@@ -959,7 +993,7 @@ int rv770_init(struct radeon_device *rdev)
959 return r; 993 return r;
960 994
961 rdev->accel_working = true; 995 rdev->accel_working = true;
962 r = rv770_resume(rdev); 996 r = rv770_startup(rdev);
963 if (r) { 997 if (r) {
964 if (rdev->flags & RADEON_IS_AGP) { 998 if (rdev->flags & RADEON_IS_AGP) {
965 /* Retry with disabling AGP */ 999 /* Retry with disabling AGP */