aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/gpu/drm
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/gpu/drm')
-rw-r--r--drivers/gpu/drm/radeon/evergreen.c51
-rw-r--r--drivers/gpu/drm/radeon/r100.c93
-rw-r--r--drivers/gpu/drm/radeon/r300.c27
-rw-r--r--drivers/gpu/drm/radeon/r420.c36
-rw-r--r--drivers/gpu/drm/radeon/r520.c21
-rw-r--r--drivers/gpu/drm/radeon/r600.c123
-rw-r--r--drivers/gpu/drm/radeon/radeon.h13
-rw-r--r--drivers/gpu/drm/radeon/radeon_agp.c4
-rw-r--r--drivers/gpu/drm/radeon/radeon_device.c157
-rw-r--r--drivers/gpu/drm/radeon/radeon_fb.c2
-rw-r--r--drivers/gpu/drm/radeon/radeon_legacy_crtc.c2
-rw-r--r--drivers/gpu/drm/radeon/radeon_test.c2
-rw-r--r--drivers/gpu/drm/radeon/radeon_ttm.c12
-rw-r--r--drivers/gpu/drm/radeon/rs400.c38
-rw-r--r--drivers/gpu/drm/radeon/rs600.c42
-rw-r--r--drivers/gpu/drm/radeon/rs690.c40
-rw-r--r--drivers/gpu/drm/radeon/rv515.c21
-rw-r--r--drivers/gpu/drm/radeon/rv770.c41
18 files changed, 301 insertions, 424 deletions
diff --git a/drivers/gpu/drm/radeon/evergreen.c b/drivers/gpu/drm/radeon/evergreen.c
index 3368920df5f4..3f973d411d61 100644
--- a/drivers/gpu/drm/radeon/evergreen.c
+++ b/drivers/gpu/drm/radeon/evergreen.c
@@ -439,7 +439,6 @@ int evergreen_mc_init(struct radeon_device *rdev)
439 fixed20_12 a; 439 fixed20_12 a;
440 u32 tmp; 440 u32 tmp;
441 int chansize, numchan; 441 int chansize, numchan;
442 int r;
443 442
444 /* Get VRAM informations */ 443 /* Get VRAM informations */
445 rdev->mc.vram_is_ddr = true; 444 rdev->mc.vram_is_ddr = true;
@@ -475,48 +474,12 @@ int evergreen_mc_init(struct radeon_device *rdev)
475 /* size in MB on evergreen */ 474 /* size in MB on evergreen */
476 rdev->mc.mc_vram_size = RREG32(CONFIG_MEMSIZE) * 1024 * 1024; 475 rdev->mc.mc_vram_size = RREG32(CONFIG_MEMSIZE) * 1024 * 1024;
477 rdev->mc.real_vram_size = RREG32(CONFIG_MEMSIZE) * 1024 * 1024; 476 rdev->mc.real_vram_size = RREG32(CONFIG_MEMSIZE) * 1024 * 1024;
478 477 /* FIXME remove this once we support unmappable VRAM */
479 if (rdev->mc.mc_vram_size > rdev->mc.aper_size) 478 if (rdev->mc.mc_vram_size > rdev->mc.aper_size) {
480 rdev->mc.mc_vram_size = rdev->mc.aper_size; 479 rdev->mc.mc_vram_size = rdev->mc.aper_size;
481
482 if (rdev->mc.real_vram_size > rdev->mc.aper_size)
483 rdev->mc.real_vram_size = rdev->mc.aper_size; 480 rdev->mc.real_vram_size = rdev->mc.aper_size;
484
485 if (rdev->flags & RADEON_IS_AGP) {
486 r = radeon_agp_init(rdev);
487 if (r)
488 return r;
489 /* gtt_size is setup by radeon_agp_init */
490 rdev->mc.gtt_location = rdev->mc.agp_base;
491 tmp = 0xFFFFFFFFUL - rdev->mc.agp_base - rdev->mc.gtt_size;
492 /* Try to put vram before or after AGP because we
493 * we want SYSTEM_APERTURE to cover both VRAM and
494 * AGP so that GPU can catch out of VRAM/AGP access
495 */
496 if (rdev->mc.gtt_location > rdev->mc.mc_vram_size) {
497 /* Enought place before */
498 rdev->mc.vram_location = rdev->mc.gtt_location -
499 rdev->mc.mc_vram_size;
500 } else if (tmp > rdev->mc.mc_vram_size) {
501 /* Enought place after */
502 rdev->mc.vram_location = rdev->mc.gtt_location +
503 rdev->mc.gtt_size;
504 } else {
505 /* Try to setup VRAM then AGP might not
506 * not work on some card
507 */
508 rdev->mc.vram_location = 0x00000000UL;
509 rdev->mc.gtt_location = rdev->mc.mc_vram_size;
510 }
511 } else {
512 rdev->mc.vram_location = 0x00000000UL;
513 rdev->mc.gtt_location = rdev->mc.mc_vram_size;
514 rdev->mc.gtt_size = radeon_gart_size * 1024 * 1024;
515 } 481 }
516 rdev->mc.vram_start = rdev->mc.vram_location; 482 r600_vram_gtt_location(rdev, &rdev->mc);
517 rdev->mc.vram_end = rdev->mc.vram_location + rdev->mc.mc_vram_size - 1;
518 rdev->mc.gtt_start = rdev->mc.gtt_location;
519 rdev->mc.gtt_end = rdev->mc.gtt_location + rdev->mc.gtt_size - 1;
520 /* FIXME: we should enforce default clock in case GPU is not in 483 /* FIXME: we should enforce default clock in case GPU is not in
521 * default setup 484 * default setup
522 */ 485 */
@@ -525,6 +488,7 @@ int evergreen_mc_init(struct radeon_device *rdev)
525 rdev->pm.sclk.full = rfixed_div(rdev->pm.sclk, a); 488 rdev->pm.sclk.full = rfixed_div(rdev->pm.sclk, a);
526 return 0; 489 return 0;
527} 490}
491
528int evergreen_gpu_reset(struct radeon_device *rdev) 492int evergreen_gpu_reset(struct radeon_device *rdev)
529{ 493{
530 /* FIXME: implement for evergreen */ 494 /* FIXME: implement for evergreen */
@@ -726,6 +690,13 @@ int evergreen_init(struct radeon_device *rdev)
726 r = radeon_fence_driver_init(rdev); 690 r = radeon_fence_driver_init(rdev);
727 if (r) 691 if (r)
728 return r; 692 return r;
693 /* initialize AGP */
694 if (rdev->flags & RADEON_IS_AGP) {
695 r = radeon_agp_init(rdev);
696 if (r)
697 radeon_agp_disable(rdev);
698 }
699 /* initialize memory controller */
729 r = evergreen_mc_init(rdev); 700 r = evergreen_mc_init(rdev);
730 if (r) 701 if (r)
731 return r; 702 return r;
diff --git a/drivers/gpu/drm/radeon/r100.c b/drivers/gpu/drm/radeon/r100.c
index bc7d9e9211c8..1fdd793343b9 100644
--- a/drivers/gpu/drm/radeon/r100.c
+++ b/drivers/gpu/drm/radeon/r100.c
@@ -202,9 +202,8 @@ int r100_pci_gart_enable(struct radeon_device *rdev)
202 tmp = RREG32(RADEON_AIC_CNTL) | RADEON_DIS_OUT_OF_PCI_GART_ACCESS; 202 tmp = RREG32(RADEON_AIC_CNTL) | RADEON_DIS_OUT_OF_PCI_GART_ACCESS;
203 WREG32(RADEON_AIC_CNTL, tmp); 203 WREG32(RADEON_AIC_CNTL, tmp);
204 /* set address range for PCI address translate */ 204 /* set address range for PCI address translate */
205 WREG32(RADEON_AIC_LO_ADDR, rdev->mc.gtt_location); 205 WREG32(RADEON_AIC_LO_ADDR, rdev->mc.gtt_start);
206 tmp = rdev->mc.gtt_location + rdev->mc.gtt_size - 1; 206 WREG32(RADEON_AIC_HI_ADDR, rdev->mc.gtt_end);
207 WREG32(RADEON_AIC_HI_ADDR, tmp);
208 /* set PCI GART page-table base address */ 207 /* set PCI GART page-table base address */
209 WREG32(RADEON_AIC_PT_BASE, rdev->gart.table_addr); 208 WREG32(RADEON_AIC_PT_BASE, rdev->gart.table_addr);
210 tmp = RREG32(RADEON_AIC_CNTL) | RADEON_PCIGART_TRANSLATE_EN; 209 tmp = RREG32(RADEON_AIC_CNTL) | RADEON_PCIGART_TRANSLATE_EN;
@@ -1957,17 +1956,17 @@ static u32 r100_get_accessible_vram(struct radeon_device *rdev)
1957void r100_vram_init_sizes(struct radeon_device *rdev) 1956void r100_vram_init_sizes(struct radeon_device *rdev)
1958{ 1957{
1959 u64 config_aper_size; 1958 u64 config_aper_size;
1960 u32 accessible;
1961 1959
1960 /* work out accessible VRAM */
1961 rdev->mc.visible_vram_size = r100_get_accessible_vram(rdev);
1962 rdev->mc.aper_base = drm_get_resource_start(rdev->ddev, 0);
1963 rdev->mc.aper_size = drm_get_resource_len(rdev->ddev, 0);
1962 config_aper_size = RREG32(RADEON_CONFIG_APER_SIZE); 1964 config_aper_size = RREG32(RADEON_CONFIG_APER_SIZE);
1963
1964 if (rdev->flags & RADEON_IS_IGP) { 1965 if (rdev->flags & RADEON_IS_IGP) {
1965 uint32_t tom; 1966 uint32_t tom;
1966 /* read NB_TOM to get the amount of ram stolen for the GPU */ 1967 /* read NB_TOM to get the amount of ram stolen for the GPU */
1967 tom = RREG32(RADEON_NB_TOM); 1968 tom = RREG32(RADEON_NB_TOM);
1968 rdev->mc.real_vram_size = (((tom >> 16) - (tom & 0xffff) + 1) << 16); 1969 rdev->mc.real_vram_size = (((tom >> 16) - (tom & 0xffff) + 1) << 16);
1969 /* for IGPs we need to keep VRAM where it was put by the BIOS */
1970 rdev->mc.vram_location = (tom & 0xffff) << 16;
1971 WREG32(RADEON_CONFIG_MEMSIZE, rdev->mc.real_vram_size); 1970 WREG32(RADEON_CONFIG_MEMSIZE, rdev->mc.real_vram_size);
1972 rdev->mc.mc_vram_size = rdev->mc.real_vram_size; 1971 rdev->mc.mc_vram_size = rdev->mc.real_vram_size;
1973 } else { 1972 } else {
@@ -1979,30 +1978,19 @@ void r100_vram_init_sizes(struct radeon_device *rdev)
1979 rdev->mc.real_vram_size = 8192 * 1024; 1978 rdev->mc.real_vram_size = 8192 * 1024;
1980 WREG32(RADEON_CONFIG_MEMSIZE, rdev->mc.real_vram_size); 1979 WREG32(RADEON_CONFIG_MEMSIZE, rdev->mc.real_vram_size);
1981 } 1980 }
1982 /* let driver place VRAM */ 1981 /* Fix for RN50, M6, M7 with 8/16/32(??) MBs of VRAM -
1983 rdev->mc.vram_location = 0xFFFFFFFFUL; 1982 * Novell bug 204882 + along with lots of ubuntu ones
1984 /* Fix for RN50, M6, M7 with 8/16/32(??) MBs of VRAM - 1983 */
1985 * Novell bug 204882 + along with lots of ubuntu ones */
1986 if (config_aper_size > rdev->mc.real_vram_size) 1984 if (config_aper_size > rdev->mc.real_vram_size)
1987 rdev->mc.mc_vram_size = config_aper_size; 1985 rdev->mc.mc_vram_size = config_aper_size;
1988 else 1986 else
1989 rdev->mc.mc_vram_size = rdev->mc.real_vram_size; 1987 rdev->mc.mc_vram_size = rdev->mc.real_vram_size;
1990 } 1988 }
1991 1989 /* FIXME remove this once we support unmappable VRAM */
1992 /* work out accessible VRAM */ 1990 if (rdev->mc.mc_vram_size > rdev->mc.aper_size) {
1993 accessible = r100_get_accessible_vram(rdev);
1994
1995 rdev->mc.aper_base = drm_get_resource_start(rdev->ddev, 0);
1996 rdev->mc.aper_size = drm_get_resource_len(rdev->ddev, 0);
1997
1998 if (accessible > rdev->mc.aper_size)
1999 accessible = rdev->mc.aper_size;
2000
2001 if (rdev->mc.mc_vram_size > rdev->mc.aper_size)
2002 rdev->mc.mc_vram_size = rdev->mc.aper_size; 1991 rdev->mc.mc_vram_size = rdev->mc.aper_size;
2003
2004 if (rdev->mc.real_vram_size > rdev->mc.aper_size)
2005 rdev->mc.real_vram_size = rdev->mc.aper_size; 1992 rdev->mc.real_vram_size = rdev->mc.aper_size;
1993 }
2006} 1994}
2007 1995
2008void r100_vga_set_state(struct radeon_device *rdev, bool state) 1996void r100_vga_set_state(struct radeon_device *rdev, bool state)
@@ -2019,11 +2007,18 @@ void r100_vga_set_state(struct radeon_device *rdev, bool state)
2019 WREG32(RADEON_CONFIG_CNTL, temp); 2007 WREG32(RADEON_CONFIG_CNTL, temp);
2020} 2008}
2021 2009
2022void r100_vram_info(struct radeon_device *rdev) 2010void r100_mc_init(struct radeon_device *rdev)
2023{ 2011{
2024 r100_vram_get_type(rdev); 2012 u64 base;
2025 2013
2014 r100_vram_get_type(rdev);
2026 r100_vram_init_sizes(rdev); 2015 r100_vram_init_sizes(rdev);
2016 base = rdev->mc.aper_base;
2017 if (rdev->flags & RADEON_IS_IGP)
2018 base = (RREG32(RADEON_NB_TOM) & 0xffff) << 16;
2019 radeon_vram_location(rdev, &rdev->mc, base);
2020 if (!(rdev->flags & RADEON_IS_AGP))
2021 radeon_gtt_location(rdev, &rdev->mc);
2027} 2022}
2028 2023
2029 2024
@@ -3294,10 +3289,9 @@ void r100_mc_stop(struct radeon_device *rdev, struct r100_mc_save *save)
3294void r100_mc_resume(struct radeon_device *rdev, struct r100_mc_save *save) 3289void r100_mc_resume(struct radeon_device *rdev, struct r100_mc_save *save)
3295{ 3290{
3296 /* Update base address for crtc */ 3291 /* Update base address for crtc */
3297 WREG32(R_00023C_DISPLAY_BASE_ADDR, rdev->mc.vram_location); 3292 WREG32(R_00023C_DISPLAY_BASE_ADDR, rdev->mc.vram_start);
3298 if (!(rdev->flags & RADEON_SINGLE_CRTC)) { 3293 if (!(rdev->flags & RADEON_SINGLE_CRTC)) {
3299 WREG32(R_00033C_CRTC2_DISPLAY_BASE_ADDR, 3294 WREG32(R_00033C_CRTC2_DISPLAY_BASE_ADDR, rdev->mc.vram_start);
3300 rdev->mc.vram_location);
3301 } 3295 }
3302 /* Restore CRTC registers */ 3296 /* Restore CRTC registers */
3303 WREG8(R_0003C2_GENMO_WT, save->GENMO_WT); 3297 WREG8(R_0003C2_GENMO_WT, save->GENMO_WT);
@@ -3458,32 +3452,6 @@ void r100_fini(struct radeon_device *rdev)
3458 rdev->bios = NULL; 3452 rdev->bios = NULL;
3459} 3453}
3460 3454
3461int r100_mc_init(struct radeon_device *rdev)
3462{
3463 int r;
3464 u32 tmp;
3465
3466 /* Setup GPU memory space */
3467 rdev->mc.vram_location = 0xFFFFFFFFUL;
3468 rdev->mc.gtt_location = 0xFFFFFFFFUL;
3469 if (rdev->flags & RADEON_IS_IGP) {
3470 tmp = G_00015C_MC_FB_START(RREG32(R_00015C_NB_TOM));
3471 rdev->mc.vram_location = tmp << 16;
3472 }
3473 if (rdev->flags & RADEON_IS_AGP) {
3474 r = radeon_agp_init(rdev);
3475 if (r) {
3476 radeon_agp_disable(rdev);
3477 } else {
3478 rdev->mc.gtt_location = rdev->mc.agp_base;
3479 }
3480 }
3481 r = radeon_mc_setup(rdev);
3482 if (r)
3483 return r;
3484 return 0;
3485}
3486
3487int r100_init(struct radeon_device *rdev) 3455int r100_init(struct radeon_device *rdev)
3488{ 3456{
3489 int r; 3457 int r;
@@ -3526,12 +3494,15 @@ int r100_init(struct radeon_device *rdev)
3526 radeon_get_clock_info(rdev->ddev); 3494 radeon_get_clock_info(rdev->ddev);
3527 /* Initialize power management */ 3495 /* Initialize power management */
3528 radeon_pm_init(rdev); 3496 radeon_pm_init(rdev);
3529 /* Get vram informations */ 3497 /* initialize AGP */
3530 r100_vram_info(rdev); 3498 if (rdev->flags & RADEON_IS_AGP) {
3531 /* Initialize memory controller (also test AGP) */ 3499 r = radeon_agp_init(rdev);
3532 r = r100_mc_init(rdev); 3500 if (r) {
3533 if (r) 3501 radeon_agp_disable(rdev);
3534 return r; 3502 }
3503 }
3504 /* initialize VRAM */
3505 r100_mc_init(rdev);
3535 /* Fence driver */ 3506 /* Fence driver */
3536 r = radeon_fence_driver_init(rdev); 3507 r = radeon_fence_driver_init(rdev);
3537 if (r) 3508 if (r)
diff --git a/drivers/gpu/drm/radeon/r300.c b/drivers/gpu/drm/radeon/r300.c
index a4f395226b34..7e9f95653cbe 100644
--- a/drivers/gpu/drm/radeon/r300.c
+++ b/drivers/gpu/drm/radeon/r300.c
@@ -121,15 +121,15 @@ int rv370_pcie_gart_enable(struct radeon_device *rdev)
121 /* discard memory request outside of configured range */ 121 /* discard memory request outside of configured range */
122 tmp = RADEON_PCIE_TX_GART_UNMAPPED_ACCESS_DISCARD; 122 tmp = RADEON_PCIE_TX_GART_UNMAPPED_ACCESS_DISCARD;
123 WREG32_PCIE(RADEON_PCIE_TX_GART_CNTL, tmp); 123 WREG32_PCIE(RADEON_PCIE_TX_GART_CNTL, tmp);
124 WREG32_PCIE(RADEON_PCIE_TX_GART_START_LO, rdev->mc.gtt_location); 124 WREG32_PCIE(RADEON_PCIE_TX_GART_START_LO, rdev->mc.gtt_start);
125 tmp = rdev->mc.gtt_location + rdev->mc.gtt_size - RADEON_GPU_PAGE_SIZE; 125 tmp = rdev->mc.gtt_end & ~RADEON_GPU_PAGE_MASK;
126 WREG32_PCIE(RADEON_PCIE_TX_GART_END_LO, tmp); 126 WREG32_PCIE(RADEON_PCIE_TX_GART_END_LO, tmp);
127 WREG32_PCIE(RADEON_PCIE_TX_GART_START_HI, 0); 127 WREG32_PCIE(RADEON_PCIE_TX_GART_START_HI, 0);
128 WREG32_PCIE(RADEON_PCIE_TX_GART_END_HI, 0); 128 WREG32_PCIE(RADEON_PCIE_TX_GART_END_HI, 0);
129 table_addr = rdev->gart.table_addr; 129 table_addr = rdev->gart.table_addr;
130 WREG32_PCIE(RADEON_PCIE_TX_GART_BASE, table_addr); 130 WREG32_PCIE(RADEON_PCIE_TX_GART_BASE, table_addr);
131 /* FIXME: setup default page */ 131 /* FIXME: setup default page */
132 WREG32_PCIE(RADEON_PCIE_TX_DISCARD_RD_ADDR_LO, rdev->mc.vram_location); 132 WREG32_PCIE(RADEON_PCIE_TX_DISCARD_RD_ADDR_LO, rdev->mc.vram_start);
133 WREG32_PCIE(RADEON_PCIE_TX_DISCARD_RD_ADDR_HI, 0); 133 WREG32_PCIE(RADEON_PCIE_TX_DISCARD_RD_ADDR_HI, 0);
134 /* Clear error */ 134 /* Clear error */
135 WREG32_PCIE(0x18, 0); 135 WREG32_PCIE(0x18, 0);
@@ -459,13 +459,12 @@ int r300_gpu_reset(struct radeon_device *rdev)
459/* 459/*
460 * r300,r350,rv350,rv380 VRAM info 460 * r300,r350,rv350,rv380 VRAM info
461 */ 461 */
462void r300_vram_info(struct radeon_device *rdev) 462void r300_mc_init(struct radeon_device *rdev)
463{ 463{
464 uint32_t tmp; 464 uint32_t tmp;
465 465
466 /* DDR for all card after R300 & IGP */ 466 /* DDR for all card after R300 & IGP */
467 rdev->mc.vram_is_ddr = true; 467 rdev->mc.vram_is_ddr = true;
468
469 tmp = RREG32(RADEON_MEM_CNTL); 468 tmp = RREG32(RADEON_MEM_CNTL);
470 tmp &= R300_MEM_NUM_CHANNELS_MASK; 469 tmp &= R300_MEM_NUM_CHANNELS_MASK;
471 switch (tmp) { 470 switch (tmp) {
@@ -474,8 +473,9 @@ void r300_vram_info(struct radeon_device *rdev)
474 case 2: rdev->mc.vram_width = 256; break; 473 case 2: rdev->mc.vram_width = 256; break;
475 default: rdev->mc.vram_width = 128; break; 474 default: rdev->mc.vram_width = 128; break;
476 } 475 }
477
478 r100_vram_init_sizes(rdev); 476 r100_vram_init_sizes(rdev);
477 if (!(rdev->flags & RADEON_IS_AGP))
478 radeon_gtt_location(rdev, &rdev->mc);
479} 479}
480 480
481void rv370_set_pcie_lanes(struct radeon_device *rdev, int lanes) 481void rv370_set_pcie_lanes(struct radeon_device *rdev, int lanes)
@@ -1377,12 +1377,15 @@ int r300_init(struct radeon_device *rdev)
1377 radeon_get_clock_info(rdev->ddev); 1377 radeon_get_clock_info(rdev->ddev);
1378 /* Initialize power management */ 1378 /* Initialize power management */
1379 radeon_pm_init(rdev); 1379 radeon_pm_init(rdev);
1380 /* Get vram informations */ 1380 /* initialize AGP */
1381 r300_vram_info(rdev); 1381 if (rdev->flags & RADEON_IS_AGP) {
1382 /* Initialize memory controller (also test AGP) */ 1382 r = radeon_agp_init(rdev);
1383 r = r420_mc_init(rdev); 1383 if (r) {
1384 if (r) 1384 radeon_agp_disable(rdev);
1385 return r; 1385 }
1386 }
1387 /* initialize memory controller */
1388 r300_mc_init(rdev);
1386 /* Fence driver */ 1389 /* Fence driver */
1387 r = radeon_fence_driver_init(rdev); 1390 r = radeon_fence_driver_init(rdev);
1388 if (r) 1391 if (r)
diff --git a/drivers/gpu/drm/radeon/r420.c b/drivers/gpu/drm/radeon/r420.c
index 12ebbdb83d1c..c7593b8f58ee 100644
--- a/drivers/gpu/drm/radeon/r420.c
+++ b/drivers/gpu/drm/radeon/r420.c
@@ -40,28 +40,6 @@ static void r420_set_reg_safe(struct radeon_device *rdev)
40 rdev->config.r300.reg_safe_bm_size = ARRAY_SIZE(r420_reg_safe_bm); 40 rdev->config.r300.reg_safe_bm_size = ARRAY_SIZE(r420_reg_safe_bm);
41} 41}
42 42
43int r420_mc_init(struct radeon_device *rdev)
44{
45 int r;
46
47 /* Setup GPU memory space */
48 rdev->mc.vram_location = 0xFFFFFFFFUL;
49 rdev->mc.gtt_location = 0xFFFFFFFFUL;
50 if (rdev->flags & RADEON_IS_AGP) {
51 r = radeon_agp_init(rdev);
52 if (r) {
53 radeon_agp_disable(rdev);
54 } else {
55 rdev->mc.gtt_location = rdev->mc.agp_base;
56 }
57 }
58 r = radeon_mc_setup(rdev);
59 if (r) {
60 return r;
61 }
62 return 0;
63}
64
65void r420_pipes_init(struct radeon_device *rdev) 43void r420_pipes_init(struct radeon_device *rdev)
66{ 44{
67 unsigned tmp; 45 unsigned tmp;
@@ -349,13 +327,15 @@ int r420_init(struct radeon_device *rdev)
349 radeon_get_clock_info(rdev->ddev); 327 radeon_get_clock_info(rdev->ddev);
350 /* Initialize power management */ 328 /* Initialize power management */
351 radeon_pm_init(rdev); 329 radeon_pm_init(rdev);
352 /* Get vram informations */ 330 /* initialize AGP */
353 r300_vram_info(rdev); 331 if (rdev->flags & RADEON_IS_AGP) {
354 /* Initialize memory controller (also test AGP) */ 332 r = radeon_agp_init(rdev);
355 r = r420_mc_init(rdev); 333 if (r) {
356 if (r) { 334 radeon_agp_disable(rdev);
357 return r; 335 }
358 } 336 }
337 /* initialize memory controller */
338 r300_mc_init(rdev);
359 r420_debugfs(rdev); 339 r420_debugfs(rdev);
360 /* Fence driver */ 340 /* Fence driver */
361 r = radeon_fence_driver_init(rdev); 341 r = radeon_fence_driver_init(rdev);
diff --git a/drivers/gpu/drm/radeon/r520.c b/drivers/gpu/drm/radeon/r520.c
index ddf5731eba0d..2b8a5dd13516 100644
--- a/drivers/gpu/drm/radeon/r520.c
+++ b/drivers/gpu/drm/radeon/r520.c
@@ -119,13 +119,15 @@ static void r520_vram_get_type(struct radeon_device *rdev)
119 rdev->mc.vram_width *= 2; 119 rdev->mc.vram_width *= 2;
120} 120}
121 121
122void r520_vram_info(struct radeon_device *rdev) 122void r520_mc_init(struct radeon_device *rdev)
123{ 123{
124 fixed20_12 a; 124 fixed20_12 a;
125 125
126 r520_vram_get_type(rdev); 126 r520_vram_get_type(rdev);
127
128 r100_vram_init_sizes(rdev); 127 r100_vram_init_sizes(rdev);
128 radeon_vram_location(rdev, &rdev->mc, 0);
129 if (!(rdev->flags & RADEON_IS_AGP))
130 radeon_gtt_location(rdev, &rdev->mc);
129 /* FIXME: we should enforce default clock in case GPU is not in 131 /* FIXME: we should enforce default clock in case GPU is not in
130 * default setup 132 * default setup
131 */ 133 */
@@ -267,12 +269,15 @@ int r520_init(struct radeon_device *rdev)
267 radeon_get_clock_info(rdev->ddev); 269 radeon_get_clock_info(rdev->ddev);
268 /* Initialize power management */ 270 /* Initialize power management */
269 radeon_pm_init(rdev); 271 radeon_pm_init(rdev);
270 /* Get vram informations */ 272 /* initialize AGP */
271 r520_vram_info(rdev); 273 if (rdev->flags & RADEON_IS_AGP) {
272 /* Initialize memory controller (also test AGP) */ 274 r = radeon_agp_init(rdev);
273 r = r420_mc_init(rdev); 275 if (r) {
274 if (r) 276 radeon_agp_disable(rdev);
275 return r; 277 }
278 }
279 /* initialize memory controller */
280 r520_mc_init(rdev);
276 rv515_debugfs(rdev); 281 rv515_debugfs(rdev);
277 /* Fence driver */ 282 /* Fence driver */
278 r = radeon_fence_driver_init(rdev); 283 r = radeon_fence_driver_init(rdev);
diff --git a/drivers/gpu/drm/radeon/r600.c b/drivers/gpu/drm/radeon/r600.c
index a865946d2d08..694a4c564f52 100644
--- a/drivers/gpu/drm/radeon/r600.c
+++ b/drivers/gpu/drm/radeon/r600.c
@@ -611,6 +611,68 @@ static void r600_mc_program(struct radeon_device *rdev)
611 rv515_vga_render_disable(rdev); 611 rv515_vga_render_disable(rdev);
612} 612}
613 613
614/**
615 * r600_vram_gtt_location - try to find VRAM & GTT location
616 * @rdev: radeon device structure holding all necessary informations
617 * @mc: memory controller structure holding memory informations
618 *
619 * Function will place try to place VRAM at same place as in CPU (PCI)
620 * address space as some GPU seems to have issue when we reprogram at
621 * different address space.
622 *
623 * If there is not enough space to fit the unvisible VRAM after the
624 * aperture then we limit the VRAM size to the aperture.
625 *
626 * If we are using AGP then place VRAM adjacent to AGP aperture are we need
627 * them to be in one from GPU point of view so that we can program GPU to
628 * catch access outside them (weird GPU policy see ??).
629 *
630 * This function will never fails, worst case are limiting VRAM or GTT.
631 *
632 * Note: GTT start, end, size should be initialized before calling this
633 * function on AGP platform.
634 */
635void r600_vram_gtt_location(struct radeon_device *rdev, struct radeon_mc *mc)
636{
637 u64 size_bf, size_af;
638
639 if (mc->mc_vram_size > 0xE0000000) {
640 /* leave room for at least 512M GTT */
641 dev_warn(rdev->dev, "limiting VRAM\n");
642 mc->real_vram_size = 0xE0000000;
643 mc->mc_vram_size = 0xE0000000;
644 }
645 if (rdev->flags & RADEON_IS_AGP) {
646 size_bf = mc->gtt_start;
647 size_af = 0xFFFFFFFF - mc->gtt_end + 1;
648 if (size_bf > size_af) {
649 if (mc->mc_vram_size > size_bf) {
650 dev_warn(rdev->dev, "limiting VRAM\n");
651 mc->real_vram_size = size_bf;
652 mc->mc_vram_size = size_bf;
653 }
654 mc->vram_start = mc->gtt_start - mc->mc_vram_size;
655 } else {
656 if (mc->mc_vram_size > size_af) {
657 dev_warn(rdev->dev, "limiting VRAM\n");
658 mc->real_vram_size = size_af;
659 mc->mc_vram_size = size_af;
660 }
661 mc->vram_start = mc->gtt_end;
662 }
663 mc->vram_end = mc->vram_start + mc->mc_vram_size - 1;
664 dev_info(rdev->dev, "VRAM: %lluM 0x%08llX - 0x%08llX (%lluM used)\n",
665 mc->mc_vram_size >> 20, mc->vram_start,
666 mc->vram_end, mc->real_vram_size >> 20);
667 } else {
668 u64 base = 0;
669 if (rdev->flags & RADEON_IS_IGP)
670 base = (RREG32(MC_VM_FB_LOCATION) & 0xFFFF) << 24;
671 radeon_vram_location(rdev, &rdev->mc, base);
672 radeon_gtt_location(rdev, mc);
673 }
674}
675
614int r600_mc_init(struct radeon_device *rdev) 676int r600_mc_init(struct radeon_device *rdev)
615{ 677{
616 fixed20_12 a; 678 fixed20_12 a;
@@ -650,75 +712,20 @@ int r600_mc_init(struct radeon_device *rdev)
650 /* Setup GPU memory space */ 712 /* Setup GPU memory space */
651 rdev->mc.mc_vram_size = RREG32(CONFIG_MEMSIZE); 713 rdev->mc.mc_vram_size = RREG32(CONFIG_MEMSIZE);
652 rdev->mc.real_vram_size = RREG32(CONFIG_MEMSIZE); 714 rdev->mc.real_vram_size = RREG32(CONFIG_MEMSIZE);
653 715 /* FIXME remove this once we support unmappable VRAM */
654 if (rdev->mc.mc_vram_size > rdev->mc.aper_size) 716 if (rdev->mc.mc_vram_size > rdev->mc.aper_size) {
655 rdev->mc.mc_vram_size = rdev->mc.aper_size; 717 rdev->mc.mc_vram_size = rdev->mc.aper_size;
656
657 if (rdev->mc.real_vram_size > rdev->mc.aper_size)
658 rdev->mc.real_vram_size = rdev->mc.aper_size; 718 rdev->mc.real_vram_size = rdev->mc.aper_size;
659
660 if (rdev->flags & RADEON_IS_AGP) {
661 /* gtt_size is setup by radeon_agp_init */
662 rdev->mc.gtt_location = rdev->mc.agp_base;
663 tmp = 0xFFFFFFFFUL - rdev->mc.agp_base - rdev->mc.gtt_size;
664 /* Try to put vram before or after AGP because we
665 * we want SYSTEM_APERTURE to cover both VRAM and
666 * AGP so that GPU can catch out of VRAM/AGP access
667 */
668 if (rdev->mc.gtt_location > rdev->mc.mc_vram_size) {
669 /* Enought place before */
670 rdev->mc.vram_location = rdev->mc.gtt_location -
671 rdev->mc.mc_vram_size;
672 } else if (tmp > rdev->mc.mc_vram_size) {
673 /* Enought place after */
674 rdev->mc.vram_location = rdev->mc.gtt_location +
675 rdev->mc.gtt_size;
676 } else {
677 /* Try to setup VRAM then AGP might not
678 * not work on some card
679 */
680 rdev->mc.vram_location = 0x00000000UL;
681 rdev->mc.gtt_location = rdev->mc.mc_vram_size;
682 }
683 } else {
684 rdev->mc.gtt_size = radeon_gart_size * 1024 * 1024;
685 rdev->mc.vram_location = (RREG32(MC_VM_FB_LOCATION) &
686 0xFFFF) << 24;
687 tmp = rdev->mc.vram_location + rdev->mc.mc_vram_size;
688 if ((0xFFFFFFFFUL - tmp) >= rdev->mc.gtt_size) {
689 /* Enough place after vram */
690 rdev->mc.gtt_location = tmp;
691 } else if (rdev->mc.vram_location >= rdev->mc.gtt_size) {
692 /* Enough place before vram */
693 rdev->mc.gtt_location = 0;
694 } else {
695 /* Not enough place after or before shrink
696 * gart size
697 */
698 if (rdev->mc.vram_location > (0xFFFFFFFFUL - tmp)) {
699 rdev->mc.gtt_location = 0;
700 rdev->mc.gtt_size = rdev->mc.vram_location;
701 } else {
702 rdev->mc.gtt_location = tmp;
703 rdev->mc.gtt_size = 0xFFFFFFFFUL - tmp;
704 }
705 }
706 rdev->mc.gtt_location = rdev->mc.mc_vram_size;
707 } 719 }
708 rdev->mc.vram_start = rdev->mc.vram_location; 720 r600_vram_gtt_location(rdev, &rdev->mc);
709 rdev->mc.vram_end = rdev->mc.vram_location + rdev->mc.mc_vram_size - 1;
710 rdev->mc.gtt_start = rdev->mc.gtt_location;
711 rdev->mc.gtt_end = rdev->mc.gtt_location + rdev->mc.gtt_size - 1;
712 /* FIXME: we should enforce default clock in case GPU is not in 721 /* FIXME: we should enforce default clock in case GPU is not in
713 * default setup 722 * default setup
714 */ 723 */
715 a.full = rfixed_const(100); 724 a.full = rfixed_const(100);
716 rdev->pm.sclk.full = rfixed_const(rdev->clock.default_sclk); 725 rdev->pm.sclk.full = rfixed_const(rdev->clock.default_sclk);
717 rdev->pm.sclk.full = rfixed_div(rdev->pm.sclk, a); 726 rdev->pm.sclk.full = rfixed_div(rdev->pm.sclk, a);
718
719 if (rdev->flags & RADEON_IS_IGP) 727 if (rdev->flags & RADEON_IS_IGP)
720 rdev->mc.igp_sideport_enabled = radeon_atombios_sideport_present(rdev); 728 rdev->mc.igp_sideport_enabled = radeon_atombios_sideport_present(rdev);
721
722 return 0; 729 return 0;
723} 730}
724 731
diff --git a/drivers/gpu/drm/radeon/radeon.h b/drivers/gpu/drm/radeon/radeon.h
index 350ae71953e9..0ca83ca91111 100644
--- a/drivers/gpu/drm/radeon/radeon.h
+++ b/drivers/gpu/drm/radeon/radeon.h
@@ -282,6 +282,7 @@ union radeon_gart_table {
282}; 282};
283 283
284#define RADEON_GPU_PAGE_SIZE 4096 284#define RADEON_GPU_PAGE_SIZE 4096
285#define RADEON_GPU_PAGE_MASK (RADEON_GPU_PAGE_SIZE - 1)
285 286
286struct radeon_gart { 287struct radeon_gart {
287 dma_addr_t table_addr; 288 dma_addr_t table_addr;
@@ -316,21 +317,19 @@ struct radeon_mc {
316 /* for some chips with <= 32MB we need to lie 317 /* for some chips with <= 32MB we need to lie
317 * about vram size near mc fb location */ 318 * about vram size near mc fb location */
318 u64 mc_vram_size; 319 u64 mc_vram_size;
319 u64 gtt_location; 320 u64 visible_vram_size;
320 u64 gtt_size; 321 u64 gtt_size;
321 u64 gtt_start; 322 u64 gtt_start;
322 u64 gtt_end; 323 u64 gtt_end;
323 u64 vram_location;
324 u64 vram_start; 324 u64 vram_start;
325 u64 vram_end; 325 u64 vram_end;
326 unsigned vram_width; 326 unsigned vram_width;
327 u64 real_vram_size; 327 u64 real_vram_size;
328 int vram_mtrr; 328 int vram_mtrr;
329 bool vram_is_ddr; 329 bool vram_is_ddr;
330 bool igp_sideport_enabled; 330 bool igp_sideport_enabled;
331}; 331};
332 332
333int radeon_mc_setup(struct radeon_device *rdev);
334bool radeon_combios_sideport_present(struct radeon_device *rdev); 333bool radeon_combios_sideport_present(struct radeon_device *rdev);
335bool radeon_atombios_sideport_present(struct radeon_device *rdev); 334bool radeon_atombios_sideport_present(struct radeon_device *rdev);
336 335
@@ -1165,6 +1164,8 @@ extern void radeon_legacy_set_clock_gating(struct radeon_device *rdev, int enabl
1165extern void radeon_atom_set_clock_gating(struct radeon_device *rdev, int enable); 1164extern void radeon_atom_set_clock_gating(struct radeon_device *rdev, int enable);
1166extern void radeon_ttm_placement_from_domain(struct radeon_bo *rbo, u32 domain); 1165extern void radeon_ttm_placement_from_domain(struct radeon_bo *rbo, u32 domain);
1167extern bool radeon_ttm_bo_is_radeon_bo(struct ttm_buffer_object *bo); 1166extern bool radeon_ttm_bo_is_radeon_bo(struct ttm_buffer_object *bo);
1167extern void radeon_vram_location(struct radeon_device *rdev, struct radeon_mc *mc, u64 base);
1168extern void radeon_gtt_location(struct radeon_device *rdev, struct radeon_mc *mc);
1168 1169
1169/* r100,rv100,rs100,rv200,rs200,r200,rv250,rs300,rv280 */ 1170/* r100,rv100,rs100,rv200,rs200,r200,rv250,rs300,rv280 */
1170struct r100_mc_save { 1171struct r100_mc_save {
@@ -1219,7 +1220,7 @@ extern void r200_set_safe_registers(struct radeon_device *rdev);
1219/* r300,r350,rv350,rv370,rv380 */ 1220/* r300,r350,rv350,rv370,rv380 */
1220extern void r300_set_reg_safe(struct radeon_device *rdev); 1221extern void r300_set_reg_safe(struct radeon_device *rdev);
1221extern void r300_mc_program(struct radeon_device *rdev); 1222extern void r300_mc_program(struct radeon_device *rdev);
1222extern void r300_vram_info(struct radeon_device *rdev); 1223extern void r300_mc_init(struct radeon_device *rdev);
1223extern void r300_clock_startup(struct radeon_device *rdev); 1224extern void r300_clock_startup(struct radeon_device *rdev);
1224extern int r300_mc_wait_for_idle(struct radeon_device *rdev); 1225extern int r300_mc_wait_for_idle(struct radeon_device *rdev);
1225extern int rv370_pcie_gart_init(struct radeon_device *rdev); 1226extern int rv370_pcie_gart_init(struct radeon_device *rdev);
@@ -1228,7 +1229,6 @@ extern int rv370_pcie_gart_enable(struct radeon_device *rdev);
1228extern void rv370_pcie_gart_disable(struct radeon_device *rdev); 1229extern void rv370_pcie_gart_disable(struct radeon_device *rdev);
1229 1230
1230/* r420,r423,rv410 */ 1231/* r420,r423,rv410 */
1231extern int r420_mc_init(struct radeon_device *rdev);
1232extern u32 r420_mc_rreg(struct radeon_device *rdev, u32 reg); 1232extern u32 r420_mc_rreg(struct radeon_device *rdev, u32 reg);
1233extern void r420_mc_wreg(struct radeon_device *rdev, u32 reg, u32 v); 1233extern void r420_mc_wreg(struct radeon_device *rdev, u32 reg, u32 v);
1234extern int r420_debugfs_pipes_info_init(struct radeon_device *rdev); 1234extern int r420_debugfs_pipes_info_init(struct radeon_device *rdev);
@@ -1270,6 +1270,7 @@ extern void rs690_line_buffer_adjust(struct radeon_device *rdev,
1270 struct drm_display_mode *mode2); 1270 struct drm_display_mode *mode2);
1271 1271
1272/* r600, rv610, rv630, rv620, rv635, rv670, rs780, rs880 */ 1272/* r600, rv610, rv630, rv620, rv635, rv670, rs780, rs880 */
1273extern void r600_vram_gtt_location(struct radeon_device *rdev, struct radeon_mc *mc);
1273extern bool r600_card_posted(struct radeon_device *rdev); 1274extern bool r600_card_posted(struct radeon_device *rdev);
1274extern void r600_cp_stop(struct radeon_device *rdev); 1275extern void r600_cp_stop(struct radeon_device *rdev);
1275extern void r600_ring_init(struct radeon_device *rdev, unsigned ring_size); 1276extern void r600_ring_init(struct radeon_device *rdev, unsigned ring_size);
diff --git a/drivers/gpu/drm/radeon/radeon_agp.c b/drivers/gpu/drm/radeon/radeon_agp.c
index c0681a5556dc..c4457791dff1 100644
--- a/drivers/gpu/drm/radeon/radeon_agp.c
+++ b/drivers/gpu/drm/radeon/radeon_agp.c
@@ -237,6 +237,10 @@ int radeon_agp_init(struct radeon_device *rdev)
237 237
238 rdev->mc.agp_base = rdev->ddev->agp->agp_info.aper_base; 238 rdev->mc.agp_base = rdev->ddev->agp->agp_info.aper_base;
239 rdev->mc.gtt_size = rdev->ddev->agp->agp_info.aper_size << 20; 239 rdev->mc.gtt_size = rdev->ddev->agp->agp_info.aper_size << 20;
240 rdev->mc.gtt_start = rdev->mc.agp_base;
241 rdev->mc.gtt_end = rdev->mc.gtt_start + rdev->mc.gtt_size - 1;
242 dev_info(rdev->dev, "GTT: %lluM 0x%08llX - 0x%08llX\n",
243 rdev->mc.gtt_size >> 20, rdev->mc.gtt_start, rdev->mc.gtt_end);
240 244
241 /* workaround some hw issues */ 245 /* workaround some hw issues */
242 if (rdev->family < CHIP_R200) { 246 if (rdev->family < CHIP_R200) {
diff --git a/drivers/gpu/drm/radeon/radeon_device.c b/drivers/gpu/drm/radeon/radeon_device.c
index 7be3a6968463..91a9b966238e 100644
--- a/drivers/gpu/drm/radeon/radeon_device.c
+++ b/drivers/gpu/drm/radeon/radeon_device.c
@@ -100,80 +100,103 @@ void radeon_scratch_free(struct radeon_device *rdev, uint32_t reg)
100 } 100 }
101} 101}
102 102
103/* 103/**
104 * MC common functions 104 * radeon_vram_location - try to find VRAM location
105 * @rdev: radeon device structure holding all necessary informations
106 * @mc: memory controller structure holding memory informations
107 * @base: base address at which to put VRAM
108 *
109 * Function will place try to place VRAM at base address provided
110 * as parameter (which is so far either PCI aperture address or
111 * for IGP TOM base address).
112 *
113 * If there is not enough space to fit the unvisible VRAM in the 32bits
114 * address space then we limit the VRAM size to the aperture.
115 *
116 * If we are using AGP and if the AGP aperture doesn't allow us to have
117 * room for all the VRAM than we restrict the VRAM to the PCI aperture
118 * size and print a warning.
119 *
120 * This function will never fails, worst case are limiting VRAM.
121 *
122 * Note: GTT start, end, size should be initialized before calling this
123 * function on AGP platform.
124 *
125 * Note: We don't explictly enforce VRAM start to be aligned on VRAM size,
126 * this shouldn't be a problem as we are using the PCI aperture as a reference.
127 * Otherwise this would be needed for rv280, all r3xx, and all r4xx, but
128 * not IGP.
129 *
130 * Note: we use mc_vram_size as on some board we need to program the mc to
131 * cover the whole aperture even if VRAM size is inferior to aperture size
132 * Novell bug 204882 + along with lots of ubuntu ones
133 *
134 * Note: when limiting vram it's safe to overwritte real_vram_size because
135 * we are not in case where real_vram_size is inferior to mc_vram_size (ie
136 * note afected by bogus hw of Novell bug 204882 + along with lots of ubuntu
137 * ones)
138 *
139 * Note: IGP TOM addr should be the same as the aperture addr, we don't
140 * explicitly check for that thought.
141 *
142 * FIXME: when reducing VRAM size align new size on power of 2.
105 */ 143 */
106int radeon_mc_setup(struct radeon_device *rdev) 144void radeon_vram_location(struct radeon_device *rdev, struct radeon_mc *mc, u64 base)
145{
146 mc->vram_start = base;
147 if (mc->mc_vram_size > (0xFFFFFFFF - base + 1)) {
148 dev_warn(rdev->dev, "limiting VRAM to PCI aperture size\n");
149 mc->real_vram_size = mc->aper_size;
150 mc->mc_vram_size = mc->aper_size;
151 }
152 mc->vram_end = mc->vram_start + mc->mc_vram_size - 1;
153 if (rdev->flags & RADEON_IS_AGP && mc->vram_end > mc->gtt_start && mc->vram_end <= mc->gtt_end) {
154 dev_warn(rdev->dev, "limiting VRAM to PCI aperture size\n");
155 mc->real_vram_size = mc->aper_size;
156 mc->mc_vram_size = mc->aper_size;
157 }
158 mc->vram_end = mc->vram_start + mc->mc_vram_size - 1;
159 dev_info(rdev->dev, "VRAM: %lluM 0x%08llX - 0x%08llX (%lluM used)\n",
160 mc->mc_vram_size >> 20, mc->vram_start,
161 mc->vram_end, mc->real_vram_size >> 20);
162}
163
164/**
165 * radeon_gtt_location - try to find GTT location
166 * @rdev: radeon device structure holding all necessary informations
167 * @mc: memory controller structure holding memory informations
168 *
169 * Function will place try to place GTT before or after VRAM.
170 *
171 * If GTT size is bigger than space left then we ajust GTT size.
172 * Thus function will never fails.
173 *
174 * FIXME: when reducing GTT size align new size on power of 2.
175 */
176void radeon_gtt_location(struct radeon_device *rdev, struct radeon_mc *mc)
107{ 177{
108 uint32_t tmp; 178 u64 size_af, size_bf;
109 179
110 /* Some chips have an "issue" with the memory controller, the 180 size_af = 0xFFFFFFFF - mc->vram_end;
111 * location must be aligned to the size. We just align it down, 181 size_bf = mc->vram_start;
112 * too bad if we walk over the top of system memory, we don't 182 if (size_bf > size_af) {
113 * use DMA without a remapped anyway. 183 if (mc->gtt_size > size_bf) {
114 * Affected chips are rv280, all r3xx, and all r4xx, but not IGP 184 dev_warn(rdev->dev, "limiting GTT\n");
115 */ 185 mc->gtt_size = size_bf;
116 /* FGLRX seems to setup like this, VRAM a 0, then GART.
117 */
118 /*
119 * Note: from R6xx the address space is 40bits but here we only
120 * use 32bits (still have to see a card which would exhaust 4G
121 * address space).
122 */
123 if (rdev->mc.vram_location != 0xFFFFFFFFUL) {
124 /* vram location was already setup try to put gtt after
125 * if it fits */
126 tmp = rdev->mc.vram_location + rdev->mc.mc_vram_size;
127 tmp = (tmp + rdev->mc.gtt_size - 1) & ~(rdev->mc.gtt_size - 1);
128 if ((0xFFFFFFFFUL - tmp) >= rdev->mc.gtt_size) {
129 rdev->mc.gtt_location = tmp;
130 } else {
131 if (rdev->mc.gtt_size >= rdev->mc.vram_location) {
132 printk(KERN_ERR "[drm] GTT too big to fit "
133 "before or after vram location.\n");
134 return -EINVAL;
135 }
136 rdev->mc.gtt_location = 0;
137 }
138 } else if (rdev->mc.gtt_location != 0xFFFFFFFFUL) {
139 /* gtt location was already setup try to put vram before
140 * if it fits */
141 if (rdev->mc.mc_vram_size < rdev->mc.gtt_location) {
142 rdev->mc.vram_location = 0;
143 } else {
144 tmp = rdev->mc.gtt_location + rdev->mc.gtt_size;
145 tmp += (rdev->mc.mc_vram_size - 1);
146 tmp &= ~(rdev->mc.mc_vram_size - 1);
147 if ((0xFFFFFFFFUL - tmp) >= rdev->mc.mc_vram_size) {
148 rdev->mc.vram_location = tmp;
149 } else {
150 printk(KERN_ERR "[drm] vram too big to fit "
151 "before or after GTT location.\n");
152 return -EINVAL;
153 }
154 } 186 }
187 mc->gtt_start = mc->vram_start - mc->gtt_size;
155 } else { 188 } else {
156 rdev->mc.vram_location = 0; 189 if (mc->gtt_size > size_af) {
157 tmp = rdev->mc.mc_vram_size; 190 dev_warn(rdev->dev, "limiting GTT\n");
158 tmp = (tmp + rdev->mc.gtt_size - 1) & ~(rdev->mc.gtt_size - 1); 191 mc->gtt_size = size_af;
159 rdev->mc.gtt_location = tmp; 192 }
160 } 193 mc->gtt_start = mc->vram_end + 1;
161 rdev->mc.vram_start = rdev->mc.vram_location; 194 }
162 rdev->mc.vram_end = rdev->mc.vram_location + rdev->mc.mc_vram_size - 1; 195 mc->gtt_end = mc->gtt_start + mc->gtt_size - 1;
163 rdev->mc.gtt_start = rdev->mc.gtt_location; 196 dev_info(rdev->dev, "GTT: %lluM 0x%08llX - 0x%08llX\n",
164 rdev->mc.gtt_end = rdev->mc.gtt_location + rdev->mc.gtt_size - 1; 197 mc->gtt_size >> 20, mc->gtt_start, mc->gtt_end);
165 DRM_INFO("radeon: VRAM %uM\n", (unsigned)(rdev->mc.mc_vram_size >> 20));
166 DRM_INFO("radeon: VRAM from 0x%08X to 0x%08X\n",
167 (unsigned)rdev->mc.vram_location,
168 (unsigned)(rdev->mc.vram_location + rdev->mc.mc_vram_size - 1));
169 DRM_INFO("radeon: GTT %uM\n", (unsigned)(rdev->mc.gtt_size >> 20));
170 DRM_INFO("radeon: GTT from 0x%08X to 0x%08X\n",
171 (unsigned)rdev->mc.gtt_location,
172 (unsigned)(rdev->mc.gtt_location + rdev->mc.gtt_size - 1));
173 return 0;
174} 198}
175 199
176
177/* 200/*
178 * GPU helpers function. 201 * GPU helpers function.
179 */ 202 */
diff --git a/drivers/gpu/drm/radeon/radeon_fb.c b/drivers/gpu/drm/radeon/radeon_fb.c
index 105c678fa73a..c39ddda13840 100644
--- a/drivers/gpu/drm/radeon/radeon_fb.c
+++ b/drivers/gpu/drm/radeon/radeon_fb.c
@@ -252,7 +252,7 @@ int radeonfb_create(struct drm_device *dev,
252 info->flags = FBINFO_DEFAULT; 252 info->flags = FBINFO_DEFAULT;
253 info->fbops = &radeonfb_ops; 253 info->fbops = &radeonfb_ops;
254 254
255 tmp = fb_gpuaddr - rdev->mc.vram_location; 255 tmp = fb_gpuaddr - rdev->mc.vram_start;
256 info->fix.smem_start = rdev->mc.aper_base + tmp; 256 info->fix.smem_start = rdev->mc.aper_base + tmp;
257 info->fix.smem_len = size; 257 info->fix.smem_len = size;
258 info->screen_base = fbptr; 258 info->screen_base = fbptr;
diff --git a/drivers/gpu/drm/radeon/radeon_legacy_crtc.c b/drivers/gpu/drm/radeon/radeon_legacy_crtc.c
index 83d4dbd6d067..643251719f1c 100644
--- a/drivers/gpu/drm/radeon/radeon_legacy_crtc.c
+++ b/drivers/gpu/drm/radeon/radeon_legacy_crtc.c
@@ -403,7 +403,7 @@ int radeon_crtc_set_base(struct drm_crtc *crtc, int x, int y,
403 403
404 /* if scanout was in GTT this really wouldn't work */ 404 /* if scanout was in GTT this really wouldn't work */
405 /* crtc offset is from display base addr not FB location */ 405 /* crtc offset is from display base addr not FB location */
406 radeon_crtc->legacy_display_base_addr = rdev->mc.vram_location; 406 radeon_crtc->legacy_display_base_addr = rdev->mc.vram_start;
407 407
408 base -= radeon_crtc->legacy_display_base_addr; 408 base -= radeon_crtc->legacy_display_base_addr;
409 409
diff --git a/drivers/gpu/drm/radeon/radeon_test.c b/drivers/gpu/drm/radeon/radeon_test.c
index 9f5e2f929da9..313c96bc09da 100644
--- a/drivers/gpu/drm/radeon/radeon_test.c
+++ b/drivers/gpu/drm/radeon/radeon_test.c
@@ -186,7 +186,7 @@ void radeon_test_moves(struct radeon_device *rdev)
186 radeon_bo_kunmap(gtt_obj[i]); 186 radeon_bo_kunmap(gtt_obj[i]);
187 187
188 DRM_INFO("Tested GTT->VRAM and VRAM->GTT copy for GTT offset 0x%llx\n", 188 DRM_INFO("Tested GTT->VRAM and VRAM->GTT copy for GTT offset 0x%llx\n",
189 gtt_addr - rdev->mc.gtt_location); 189 gtt_addr - rdev->mc.gtt_start);
190 } 190 }
191 191
192out_cleanup: 192out_cleanup:
diff --git a/drivers/gpu/drm/radeon/radeon_ttm.c b/drivers/gpu/drm/radeon/radeon_ttm.c
index db820ae9a034..1157e0f758fa 100644
--- a/drivers/gpu/drm/radeon/radeon_ttm.c
+++ b/drivers/gpu/drm/radeon/radeon_ttm.c
@@ -150,7 +150,7 @@ static int radeon_init_mem_type(struct ttm_bo_device *bdev, uint32_t type,
150 man->default_caching = TTM_PL_FLAG_CACHED; 150 man->default_caching = TTM_PL_FLAG_CACHED;
151 break; 151 break;
152 case TTM_PL_TT: 152 case TTM_PL_TT:
153 man->gpu_offset = rdev->mc.gtt_location; 153 man->gpu_offset = rdev->mc.gtt_start;
154 man->available_caching = TTM_PL_MASK_CACHING; 154 man->available_caching = TTM_PL_MASK_CACHING;
155 man->default_caching = TTM_PL_FLAG_CACHED; 155 man->default_caching = TTM_PL_FLAG_CACHED;
156 man->flags = TTM_MEMTYPE_FLAG_MAPPABLE | TTM_MEMTYPE_FLAG_CMA; 156 man->flags = TTM_MEMTYPE_FLAG_MAPPABLE | TTM_MEMTYPE_FLAG_CMA;
@@ -180,7 +180,7 @@ static int radeon_init_mem_type(struct ttm_bo_device *bdev, uint32_t type,
180 break; 180 break;
181 case TTM_PL_VRAM: 181 case TTM_PL_VRAM:
182 /* "On-card" video ram */ 182 /* "On-card" video ram */
183 man->gpu_offset = rdev->mc.vram_location; 183 man->gpu_offset = rdev->mc.vram_start;
184 man->flags = TTM_MEMTYPE_FLAG_FIXED | 184 man->flags = TTM_MEMTYPE_FLAG_FIXED |
185 TTM_MEMTYPE_FLAG_NEEDS_IOREMAP | 185 TTM_MEMTYPE_FLAG_NEEDS_IOREMAP |
186 TTM_MEMTYPE_FLAG_MAPPABLE; 186 TTM_MEMTYPE_FLAG_MAPPABLE;
@@ -262,10 +262,10 @@ static int radeon_move_blit(struct ttm_buffer_object *bo,
262 262
263 switch (old_mem->mem_type) { 263 switch (old_mem->mem_type) {
264 case TTM_PL_VRAM: 264 case TTM_PL_VRAM:
265 old_start += rdev->mc.vram_location; 265 old_start += rdev->mc.vram_start;
266 break; 266 break;
267 case TTM_PL_TT: 267 case TTM_PL_TT:
268 old_start += rdev->mc.gtt_location; 268 old_start += rdev->mc.gtt_start;
269 break; 269 break;
270 default: 270 default:
271 DRM_ERROR("Unknown placement %d\n", old_mem->mem_type); 271 DRM_ERROR("Unknown placement %d\n", old_mem->mem_type);
@@ -273,10 +273,10 @@ static int radeon_move_blit(struct ttm_buffer_object *bo,
273 } 273 }
274 switch (new_mem->mem_type) { 274 switch (new_mem->mem_type) {
275 case TTM_PL_VRAM: 275 case TTM_PL_VRAM:
276 new_start += rdev->mc.vram_location; 276 new_start += rdev->mc.vram_start;
277 break; 277 break;
278 case TTM_PL_TT: 278 case TTM_PL_TT:
279 new_start += rdev->mc.gtt_location; 279 new_start += rdev->mc.gtt_start;
280 break; 280 break;
281 default: 281 default:
282 DRM_ERROR("Unknown placement %d\n", old_mem->mem_type); 282 DRM_ERROR("Unknown placement %d\n", old_mem->mem_type);
diff --git a/drivers/gpu/drm/radeon/rs400.c b/drivers/gpu/drm/radeon/rs400.c
index 1e4582e27c14..626d51891ee9 100644
--- a/drivers/gpu/drm/radeon/rs400.c
+++ b/drivers/gpu/drm/radeon/rs400.c
@@ -151,9 +151,8 @@ int rs400_gart_enable(struct radeon_device *rdev)
151 WREG32(RADEON_AGP_BASE, 0xFFFFFFFF); 151 WREG32(RADEON_AGP_BASE, 0xFFFFFFFF);
152 WREG32(RS480_AGP_BASE_2, 0); 152 WREG32(RS480_AGP_BASE_2, 0);
153 } 153 }
154 tmp = rdev->mc.gtt_location + rdev->mc.gtt_size - 1; 154 tmp = REG_SET(RS690_MC_AGP_TOP, rdev->mc.gtt_end >> 16);
155 tmp = REG_SET(RS690_MC_AGP_TOP, tmp >> 16); 155 tmp |= REG_SET(RS690_MC_AGP_START, rdev->mc.gtt_start >> 16);
156 tmp |= REG_SET(RS690_MC_AGP_START, rdev->mc.gtt_location >> 16);
157 if ((rdev->family == CHIP_RS690) || (rdev->family == CHIP_RS740)) { 156 if ((rdev->family == CHIP_RS690) || (rdev->family == CHIP_RS740)) {
158 WREG32_MC(RS690_MCCFG_AGP_LOCATION, tmp); 157 WREG32_MC(RS690_MCCFG_AGP_LOCATION, tmp);
159 tmp = RREG32(RADEON_BUS_CNTL) & ~RS600_BUS_MASTER_DIS; 158 tmp = RREG32(RADEON_BUS_CNTL) & ~RS600_BUS_MASTER_DIS;
@@ -252,14 +251,19 @@ void rs400_gpu_init(struct radeon_device *rdev)
252 } 251 }
253} 252}
254 253
255void rs400_vram_info(struct radeon_device *rdev) 254void rs400_mc_init(struct radeon_device *rdev)
256{ 255{
256 u64 base;
257
257 rs400_gart_adjust_size(rdev); 258 rs400_gart_adjust_size(rdev);
259 rdev->mc.igp_sideport_enabled = radeon_combios_sideport_present(rdev);
258 /* DDR for all card after R300 & IGP */ 260 /* DDR for all card after R300 & IGP */
259 rdev->mc.vram_is_ddr = true; 261 rdev->mc.vram_is_ddr = true;
260 rdev->mc.vram_width = 128; 262 rdev->mc.vram_width = 128;
261
262 r100_vram_init_sizes(rdev); 263 r100_vram_init_sizes(rdev);
264 base = (RREG32(RADEON_NB_TOM) & 0xffff) << 16;
265 radeon_vram_location(rdev, &rdev->mc, base);
266 radeon_gtt_location(rdev, &rdev->mc);
263} 267}
264 268
265uint32_t rs400_mc_rreg(struct radeon_device *rdev, uint32_t reg) 269uint32_t rs400_mc_rreg(struct radeon_device *rdev, uint32_t reg)
@@ -363,22 +367,6 @@ static int rs400_debugfs_pcie_gart_info_init(struct radeon_device *rdev)
363#endif 367#endif
364} 368}
365 369
366static int rs400_mc_init(struct radeon_device *rdev)
367{
368 int r;
369 u32 tmp;
370
371 /* Setup GPU memory space */
372 tmp = RREG32(R_00015C_NB_TOM);
373 rdev->mc.vram_location = G_00015C_MC_FB_START(tmp) << 16;
374 rdev->mc.gtt_location = 0xFFFFFFFFUL;
375 r = radeon_mc_setup(rdev);
376 rdev->mc.igp_sideport_enabled = radeon_combios_sideport_present(rdev);
377 if (r)
378 return r;
379 return 0;
380}
381
382void rs400_mc_program(struct radeon_device *rdev) 370void rs400_mc_program(struct radeon_device *rdev)
383{ 371{
384 struct r100_mc_save save; 372 struct r100_mc_save save;
@@ -517,12 +505,8 @@ int rs400_init(struct radeon_device *rdev)
517 radeon_get_clock_info(rdev->ddev); 505 radeon_get_clock_info(rdev->ddev);
518 /* Initialize power management */ 506 /* Initialize power management */
519 radeon_pm_init(rdev); 507 radeon_pm_init(rdev);
520 /* Get vram informations */ 508 /* initialize memory controller */
521 rs400_vram_info(rdev); 509 rs400_mc_init(rdev);
522 /* Initialize memory controller (also test AGP) */
523 r = rs400_mc_init(rdev);
524 if (r)
525 return r;
526 /* Fence driver */ 510 /* Fence driver */
527 r = radeon_fence_driver_init(rdev); 511 r = radeon_fence_driver_init(rdev);
528 if (r) 512 if (r)
diff --git a/drivers/gpu/drm/radeon/rs600.c b/drivers/gpu/drm/radeon/rs600.c
index 28c8690c7a35..d5aeb2a31d59 100644
--- a/drivers/gpu/drm/radeon/rs600.c
+++ b/drivers/gpu/drm/radeon/rs600.c
@@ -45,23 +45,6 @@
45void rs600_gpu_init(struct radeon_device *rdev); 45void rs600_gpu_init(struct radeon_device *rdev);
46int rs600_mc_wait_for_idle(struct radeon_device *rdev); 46int rs600_mc_wait_for_idle(struct radeon_device *rdev);
47 47
48int rs600_mc_init(struct radeon_device *rdev)
49{
50 /* read back the MC value from the hw */
51 int r;
52 u32 tmp;
53
54 /* Setup GPU memory space */
55 tmp = RREG32_MC(R_000004_MC_FB_LOCATION);
56 rdev->mc.vram_location = G_000004_MC_FB_START(tmp) << 16;
57 rdev->mc.gtt_location = 0xffffffffUL;
58 r = radeon_mc_setup(rdev);
59 rdev->mc.igp_sideport_enabled = radeon_atombios_sideport_present(rdev);
60 if (r)
61 return r;
62 return 0;
63}
64
65/* hpd for digital panel detect/disconnect */ 48/* hpd for digital panel detect/disconnect */
66bool rs600_hpd_sense(struct radeon_device *rdev, enum radeon_hpd_id hpd) 49bool rs600_hpd_sense(struct radeon_device *rdev, enum radeon_hpd_id hpd)
67{ 50{
@@ -475,22 +458,21 @@ void rs600_gpu_init(struct radeon_device *rdev)
475 dev_warn(rdev->dev, "Wait MC idle timeout before updating MC.\n"); 458 dev_warn(rdev->dev, "Wait MC idle timeout before updating MC.\n");
476} 459}
477 460
478void rs600_vram_info(struct radeon_device *rdev) 461void rs600_mc_init(struct radeon_device *rdev)
479{ 462{
463 u64 base;
464
480 rdev->mc.vram_is_ddr = true; 465 rdev->mc.vram_is_ddr = true;
481 rdev->mc.vram_width = 128; 466 rdev->mc.vram_width = 128;
482
483 rdev->mc.real_vram_size = RREG32(RADEON_CONFIG_MEMSIZE); 467 rdev->mc.real_vram_size = RREG32(RADEON_CONFIG_MEMSIZE);
484 rdev->mc.mc_vram_size = rdev->mc.real_vram_size; 468 rdev->mc.mc_vram_size = rdev->mc.real_vram_size;
485
486 rdev->mc.aper_base = drm_get_resource_start(rdev->ddev, 0); 469 rdev->mc.aper_base = drm_get_resource_start(rdev->ddev, 0);
487 rdev->mc.aper_size = drm_get_resource_len(rdev->ddev, 0); 470 rdev->mc.aper_size = drm_get_resource_len(rdev->ddev, 0);
488 471 rdev->mc.igp_sideport_enabled = radeon_atombios_sideport_present(rdev);
489 if (rdev->mc.mc_vram_size > rdev->mc.aper_size) 472 base = RREG32_MC(R_000004_MC_FB_LOCATION);
490 rdev->mc.mc_vram_size = rdev->mc.aper_size; 473 base = G_000004_MC_FB_START(base) << 16;
491 474 radeon_vram_location(rdev, &rdev->mc, base);
492 if (rdev->mc.real_vram_size > rdev->mc.aper_size) 475 radeon_gtt_location(rdev, &rdev->mc);
493 rdev->mc.real_vram_size = rdev->mc.aper_size;
494} 476}
495 477
496void rs600_bandwidth_update(struct radeon_device *rdev) 478void rs600_bandwidth_update(struct radeon_device *rdev)
@@ -666,12 +648,8 @@ int rs600_init(struct radeon_device *rdev)
666 radeon_get_clock_info(rdev->ddev); 648 radeon_get_clock_info(rdev->ddev);
667 /* Initialize power management */ 649 /* Initialize power management */
668 radeon_pm_init(rdev); 650 radeon_pm_init(rdev);
669 /* Get vram informations */ 651 /* initialize memory controller */
670 rs600_vram_info(rdev); 652 rs600_mc_init(rdev);
671 /* Initialize memory controller (also test AGP) */
672 r = rs600_mc_init(rdev);
673 if (r)
674 return r;
675 rs600_debugfs(rdev); 653 rs600_debugfs(rdev);
676 /* Fence driver */ 654 /* Fence driver */
677 r = radeon_fence_driver_init(rdev); 655 r = radeon_fence_driver_init(rdev);
diff --git a/drivers/gpu/drm/radeon/rs690.c b/drivers/gpu/drm/radeon/rs690.c
index 06e2771aee5a..8d37501da7df 100644
--- a/drivers/gpu/drm/radeon/rs690.c
+++ b/drivers/gpu/drm/radeon/rs690.c
@@ -129,27 +129,20 @@ void rs690_pm_info(struct radeon_device *rdev)
129 rdev->pm.sideport_bandwidth.full = rfixed_div(rdev->pm.sideport_bandwidth, tmp); 129 rdev->pm.sideport_bandwidth.full = rfixed_div(rdev->pm.sideport_bandwidth, tmp);
130} 130}
131 131
132void rs690_vram_info(struct radeon_device *rdev) 132void rs690_mc_init(struct radeon_device *rdev)
133{ 133{
134 fixed20_12 a; 134 fixed20_12 a;
135 u64 base;
135 136
136 rs400_gart_adjust_size(rdev); 137 rs400_gart_adjust_size(rdev);
137
138 rdev->mc.vram_is_ddr = true; 138 rdev->mc.vram_is_ddr = true;
139 rdev->mc.vram_width = 128; 139 rdev->mc.vram_width = 128;
140
141 rdev->mc.real_vram_size = RREG32(RADEON_CONFIG_MEMSIZE); 140 rdev->mc.real_vram_size = RREG32(RADEON_CONFIG_MEMSIZE);
142 rdev->mc.mc_vram_size = rdev->mc.real_vram_size; 141 rdev->mc.mc_vram_size = rdev->mc.real_vram_size;
143
144 rdev->mc.aper_base = drm_get_resource_start(rdev->ddev, 0); 142 rdev->mc.aper_base = drm_get_resource_start(rdev->ddev, 0);
145 rdev->mc.aper_size = drm_get_resource_len(rdev->ddev, 0); 143 rdev->mc.aper_size = drm_get_resource_len(rdev->ddev, 0);
146 144 base = RREG32_MC(R_000100_MCCFG_FB_LOCATION);
147 if (rdev->mc.mc_vram_size > rdev->mc.aper_size) 145 base = G_000100_MC_FB_START(base) << 16;
148 rdev->mc.mc_vram_size = rdev->mc.aper_size;
149
150 if (rdev->mc.real_vram_size > rdev->mc.aper_size)
151 rdev->mc.real_vram_size = rdev->mc.aper_size;
152
153 rs690_pm_info(rdev); 146 rs690_pm_info(rdev);
154 /* FIXME: we should enforce default clock in case GPU is not in 147 /* FIXME: we should enforce default clock in case GPU is not in
155 * default setup 148 * default setup
@@ -160,22 +153,9 @@ void rs690_vram_info(struct radeon_device *rdev)
160 a.full = rfixed_const(16); 153 a.full = rfixed_const(16);
161 /* core_bandwidth = sclk(Mhz) * 16 */ 154 /* core_bandwidth = sclk(Mhz) * 16 */
162 rdev->pm.core_bandwidth.full = rfixed_div(rdev->pm.sclk, a); 155 rdev->pm.core_bandwidth.full = rfixed_div(rdev->pm.sclk, a);
163}
164
165static int rs690_mc_init(struct radeon_device *rdev)
166{
167 int r;
168 u32 tmp;
169
170 /* Setup GPU memory space */
171 tmp = RREG32_MC(R_000100_MCCFG_FB_LOCATION);
172 rdev->mc.vram_location = G_000100_MC_FB_START(tmp) << 16;
173 rdev->mc.gtt_location = 0xFFFFFFFFUL;
174 r = radeon_mc_setup(rdev);
175 rdev->mc.igp_sideport_enabled = radeon_atombios_sideport_present(rdev); 156 rdev->mc.igp_sideport_enabled = radeon_atombios_sideport_present(rdev);
176 if (r) 157 radeon_vram_location(rdev, &rdev->mc, base);
177 return r; 158 radeon_gtt_location(rdev, &rdev->mc);
178 return 0;
179} 159}
180 160
181void rs690_line_buffer_adjust(struct radeon_device *rdev, 161void rs690_line_buffer_adjust(struct radeon_device *rdev,
@@ -728,12 +708,8 @@ int rs690_init(struct radeon_device *rdev)
728 radeon_get_clock_info(rdev->ddev); 708 radeon_get_clock_info(rdev->ddev);
729 /* Initialize power management */ 709 /* Initialize power management */
730 radeon_pm_init(rdev); 710 radeon_pm_init(rdev);
731 /* Get vram informations */ 711 /* initialize memory controller */
732 rs690_vram_info(rdev); 712 rs690_mc_init(rdev);
733 /* Initialize memory controller (also test AGP) */
734 r = rs690_mc_init(rdev);
735 if (r)
736 return r;
737 rv515_debugfs(rdev); 713 rv515_debugfs(rdev);
738 /* Fence driver */ 714 /* Fence driver */
739 r = radeon_fence_driver_init(rdev); 715 r = radeon_fence_driver_init(rdev);
diff --git a/drivers/gpu/drm/radeon/rv515.c b/drivers/gpu/drm/radeon/rv515.c
index 0e1e6b8632b8..bea747da123f 100644
--- a/drivers/gpu/drm/radeon/rv515.c
+++ b/drivers/gpu/drm/radeon/rv515.c
@@ -277,13 +277,15 @@ static void rv515_vram_get_type(struct radeon_device *rdev)
277 } 277 }
278} 278}
279 279
280void rv515_vram_info(struct radeon_device *rdev) 280void rv515_mc_init(struct radeon_device *rdev)
281{ 281{
282 fixed20_12 a; 282 fixed20_12 a;
283 283
284 rv515_vram_get_type(rdev); 284 rv515_vram_get_type(rdev);
285
286 r100_vram_init_sizes(rdev); 285 r100_vram_init_sizes(rdev);
286 radeon_vram_location(rdev, &rdev->mc, 0);
287 if (!(rdev->flags & RADEON_IS_AGP))
288 radeon_gtt_location(rdev, &rdev->mc);
287 /* FIXME: we should enforce default clock in case GPU is not in 289 /* FIXME: we should enforce default clock in case GPU is not in
288 * default setup 290 * default setup
289 */ 291 */
@@ -587,12 +589,15 @@ int rv515_init(struct radeon_device *rdev)
587 radeon_get_clock_info(rdev->ddev); 589 radeon_get_clock_info(rdev->ddev);
588 /* Initialize power management */ 590 /* Initialize power management */
589 radeon_pm_init(rdev); 591 radeon_pm_init(rdev);
590 /* Get vram informations */ 592 /* initialize AGP */
591 rv515_vram_info(rdev); 593 if (rdev->flags & RADEON_IS_AGP) {
592 /* Initialize memory controller (also test AGP) */ 594 r = radeon_agp_init(rdev);
593 r = r420_mc_init(rdev); 595 if (r) {
594 if (r) 596 radeon_agp_disable(rdev);
595 return r; 597 }
598 }
599 /* initialize memory controller */
600 rv515_mc_init(rdev);
596 rv515_debugfs(rdev); 601 rv515_debugfs(rdev);
597 /* Fence driver */ 602 /* Fence driver */
598 r = radeon_fence_driver_init(rdev); 603 r = radeon_fence_driver_init(rdev);
diff --git a/drivers/gpu/drm/radeon/rv770.c b/drivers/gpu/drm/radeon/rv770.c
index 6f1f4abbe88c..323fa6be5082 100644
--- a/drivers/gpu/drm/radeon/rv770.c
+++ b/drivers/gpu/drm/radeon/rv770.c
@@ -820,45 +820,12 @@ int rv770_mc_init(struct radeon_device *rdev)
820 /* Setup GPU memory space */ 820 /* Setup GPU memory space */
821 rdev->mc.mc_vram_size = RREG32(CONFIG_MEMSIZE); 821 rdev->mc.mc_vram_size = RREG32(CONFIG_MEMSIZE);
822 rdev->mc.real_vram_size = RREG32(CONFIG_MEMSIZE); 822 rdev->mc.real_vram_size = RREG32(CONFIG_MEMSIZE);
823 823 /* FIXME remove this once we support unmappable VRAM */
824 if (rdev->mc.mc_vram_size > rdev->mc.aper_size) 824 if (rdev->mc.mc_vram_size > rdev->mc.aper_size) {
825 rdev->mc.mc_vram_size = rdev->mc.aper_size; 825 rdev->mc.mc_vram_size = rdev->mc.aper_size;
826
827 if (rdev->mc.real_vram_size > rdev->mc.aper_size)
828 rdev->mc.real_vram_size = rdev->mc.aper_size; 826 rdev->mc.real_vram_size = rdev->mc.aper_size;
829
830 if (rdev->flags & RADEON_IS_AGP) {
831 /* gtt_size is setup by radeon_agp_init */
832 rdev->mc.gtt_location = rdev->mc.agp_base;
833 tmp = 0xFFFFFFFFUL - rdev->mc.agp_base - rdev->mc.gtt_size;
834 /* Try to put vram before or after AGP because we
835 * we want SYSTEM_APERTURE to cover both VRAM and
836 * AGP so that GPU can catch out of VRAM/AGP access
837 */
838 if (rdev->mc.gtt_location > rdev->mc.mc_vram_size) {
839 /* Enought place before */
840 rdev->mc.vram_location = rdev->mc.gtt_location -
841 rdev->mc.mc_vram_size;
842 } else if (tmp > rdev->mc.mc_vram_size) {
843 /* Enought place after */
844 rdev->mc.vram_location = rdev->mc.gtt_location +
845 rdev->mc.gtt_size;
846 } else {
847 /* Try to setup VRAM then AGP might not
848 * not work on some card
849 */
850 rdev->mc.vram_location = 0x00000000UL;
851 rdev->mc.gtt_location = rdev->mc.mc_vram_size;
852 }
853 } else {
854 rdev->mc.vram_location = 0x00000000UL;
855 rdev->mc.gtt_location = rdev->mc.mc_vram_size;
856 rdev->mc.gtt_size = radeon_gart_size * 1024 * 1024;
857 } 827 }
858 rdev->mc.vram_start = rdev->mc.vram_location; 828 r600_vram_gtt_location(rdev, &rdev->mc);
859 rdev->mc.vram_end = rdev->mc.vram_location + rdev->mc.mc_vram_size - 1;
860 rdev->mc.gtt_start = rdev->mc.gtt_location;
861 rdev->mc.gtt_end = rdev->mc.gtt_location + rdev->mc.gtt_size - 1;
862 /* FIXME: we should enforce default clock in case GPU is not in 829 /* FIXME: we should enforce default clock in case GPU is not in
863 * default setup 830 * default setup
864 */ 831 */
@@ -867,6 +834,7 @@ int rv770_mc_init(struct radeon_device *rdev)
867 rdev->pm.sclk.full = rfixed_div(rdev->pm.sclk, a); 834 rdev->pm.sclk.full = rfixed_div(rdev->pm.sclk, a);
868 return 0; 835 return 0;
869} 836}
837
870int rv770_gpu_reset(struct radeon_device *rdev) 838int rv770_gpu_reset(struct radeon_device *rdev)
871{ 839{
872 /* FIXME: implement any rv770 specific bits */ 840 /* FIXME: implement any rv770 specific bits */
@@ -1042,6 +1010,7 @@ int rv770_init(struct radeon_device *rdev)
1042 r = radeon_fence_driver_init(rdev); 1010 r = radeon_fence_driver_init(rdev);
1043 if (r) 1011 if (r)
1044 return r; 1012 return r;
1013 /* initialize AGP */
1045 if (rdev->flags & RADEON_IS_AGP) { 1014 if (rdev->flags & RADEON_IS_AGP) {
1046 r = radeon_agp_init(rdev); 1015 r = radeon_agp_init(rdev);
1047 if (r) 1016 if (r)