drm/amdgpu: move default gart size setting into gmc modules
[platform/kernel/linux-rpi.git] / drivers / gpu / drm / amd / amdgpu / gmc_v8_0.c
index cc9f880..3b3326d 100644 (file)
@@ -35,6 +35,9 @@
 #include "oss/oss_3_0_d.h"
 #include "oss/oss_3_0_sh_mask.h"
 
+#include "dce/dce_10_0_d.h"
+#include "dce/dce_10_0_sh_mask.h"
+
 #include "vid.h"
 #include "vi.h"
 
@@ -161,14 +164,10 @@ static void gmc_v8_0_init_golden_registers(struct amdgpu_device *adev)
        }
 }
 
-static void gmc_v8_0_mc_stop(struct amdgpu_device *adev,
-                            struct amdgpu_mode_mc_save *save)
+static void gmc_v8_0_mc_stop(struct amdgpu_device *adev)
 {
        u32 blackout;
 
-       if (adev->mode_info.num_crtc)
-               amdgpu_display_stop_mc_access(adev, save);
-
        gmc_v8_0_wait_for_idle(adev);
 
        blackout = RREG32(mmMC_SHARED_BLACKOUT_CNTL);
@@ -184,8 +183,7 @@ static void gmc_v8_0_mc_stop(struct amdgpu_device *adev,
        udelay(100);
 }
 
-static void gmc_v8_0_mc_resume(struct amdgpu_device *adev,
-                              struct amdgpu_mode_mc_save *save)
+static void gmc_v8_0_mc_resume(struct amdgpu_device *adev)
 {
        u32 tmp;
 
@@ -197,9 +195,6 @@ static void gmc_v8_0_mc_resume(struct amdgpu_device *adev,
        tmp = REG_SET_FIELD(0, BIF_FB_EN, FB_READ_EN, 1);
        tmp = REG_SET_FIELD(tmp, BIF_FB_EN, FB_WRITE_EN, 1);
        WREG32(mmBIF_FB_EN, tmp);
-
-       if (adev->mode_info.num_crtc)
-               amdgpu_display_resume_mc_access(adev, save);
 }
 
 /**
@@ -404,15 +399,20 @@ static int gmc_v8_0_polaris_mc_load_microcode(struct amdgpu_device *adev)
 static void gmc_v8_0_vram_gtt_location(struct amdgpu_device *adev,
                                       struct amdgpu_mc *mc)
 {
+       u64 base = 0;
+
+       if (!amdgpu_sriov_vf(adev))
+               base = RREG32(mmMC_VM_FB_LOCATION) & 0xFFFF;
+       base <<= 24;
+
        if (mc->mc_vram_size > 0xFFC0000000ULL) {
                /* leave room for at least 1024M GTT */
                dev_warn(adev->dev, "limiting VRAM\n");
                mc->real_vram_size = 0xFFC0000000ULL;
                mc->mc_vram_size = 0xFFC0000000ULL;
        }
-       amdgpu_vram_location(adev, &adev->mc, 0);
-       adev->mc.gtt_base_align = 0;
-       amdgpu_gtt_location(adev, mc);
+       amdgpu_vram_location(adev, &adev->mc, base);
+       amdgpu_gart_location(adev, mc);
 }
 
 /**
@@ -425,7 +425,6 @@ static void gmc_v8_0_vram_gtt_location(struct amdgpu_device *adev,
  */
 static void gmc_v8_0_mc_program(struct amdgpu_device *adev)
 {
-       struct amdgpu_mode_mc_save save;
        u32 tmp;
        int i, j;
 
@@ -439,13 +438,20 @@ static void gmc_v8_0_mc_program(struct amdgpu_device *adev)
        }
        WREG32(mmHDP_REG_COHERENCY_FLUSH_CNTL, 0);
 
-       if (adev->mode_info.num_crtc)
-               amdgpu_display_set_vga_render_state(adev, false);
-
-       gmc_v8_0_mc_stop(adev, &save);
        if (gmc_v8_0_wait_for_idle((void *)adev)) {
                dev_warn(adev->dev, "Wait for MC idle timedout !\n");
        }
+       if (adev->mode_info.num_crtc) {
+               /* Lockout access through VGA aperture*/
+               tmp = RREG32(mmVGA_HDP_CONTROL);
+               tmp = REG_SET_FIELD(tmp, VGA_HDP_CONTROL, VGA_MEMORY_DISABLE, 1);
+               WREG32(mmVGA_HDP_CONTROL, tmp);
+
+               /* disable VGA render */
+               tmp = RREG32(mmVGA_RENDER_CONTROL);
+               tmp = REG_SET_FIELD(tmp, VGA_RENDER_CONTROL, VGA_VSTATUS_CNTL, 0);
+               WREG32(mmVGA_RENDER_CONTROL, tmp);
+       }
        /* Update configuration */
        WREG32(mmMC_VM_SYSTEM_APERTURE_LOW_ADDR,
               adev->mc.vram_start >> 12);
@@ -453,20 +459,23 @@ static void gmc_v8_0_mc_program(struct amdgpu_device *adev)
               adev->mc.vram_end >> 12);
        WREG32(mmMC_VM_SYSTEM_APERTURE_DEFAULT_ADDR,
               adev->vram_scratch.gpu_addr >> 12);
-       tmp = ((adev->mc.vram_end >> 24) & 0xFFFF) << 16;
-       tmp |= ((adev->mc.vram_start >> 24) & 0xFFFF);
-       WREG32(mmMC_VM_FB_LOCATION, tmp);
-       /* XXX double check these! */
-       WREG32(mmHDP_NONSURFACE_BASE, (adev->mc.vram_start >> 8));
-       WREG32(mmHDP_NONSURFACE_INFO, (2 << 7) | (1 << 30));
-       WREG32(mmHDP_NONSURFACE_SIZE, 0x3FFFFFFF);
+
+       if (amdgpu_sriov_vf(adev)) {
+               tmp = ((adev->mc.vram_end >> 24) & 0xFFFF) << 16;
+               tmp |= ((adev->mc.vram_start >> 24) & 0xFFFF);
+               WREG32(mmMC_VM_FB_LOCATION, tmp);
+               /* XXX double check these! */
+               WREG32(mmHDP_NONSURFACE_BASE, (adev->mc.vram_start >> 8));
+               WREG32(mmHDP_NONSURFACE_INFO, (2 << 7) | (1 << 30));
+               WREG32(mmHDP_NONSURFACE_SIZE, 0x3FFFFFFF);
+       }
+
        WREG32(mmMC_VM_AGP_BASE, 0);
        WREG32(mmMC_VM_AGP_TOP, 0x0FFFFFFF);
        WREG32(mmMC_VM_AGP_BOT, 0x0FFFFFFF);
        if (gmc_v8_0_wait_for_idle((void *)adev)) {
                dev_warn(adev->dev, "Wait for MC idle timedout !\n");
        }
-       gmc_v8_0_mc_resume(adev, &save);
 
        WREG32(mmBIF_FB_EN, BIF_FB_EN__FB_READ_EN_MASK | BIF_FB_EN__FB_WRITE_EN_MASK);
 
@@ -553,14 +562,25 @@ static int gmc_v8_0_mc_init(struct amdgpu_device *adev)
        if (adev->mc.visible_vram_size > adev->mc.real_vram_size)
                adev->mc.visible_vram_size = adev->mc.real_vram_size;
 
-       /* unless the user had overridden it, set the gart
-        * size equal to the 1024 or vram, whichever is larger.
-        */
-       if (amdgpu_gart_size == -1)
-               adev->mc.gtt_size = max((AMDGPU_DEFAULT_GTT_SIZE_MB << 20),
-                                       adev->mc.mc_vram_size);
-       else
-               adev->mc.gtt_size = (uint64_t)amdgpu_gart_size << 20;
+       /* set the gart size */
+       if (amdgpu_gart_size == -1) {
+               switch (adev->asic_type) {
+               case CHIP_POLARIS11: /* all engines support GPUVM */
+               case CHIP_POLARIS10: /* all engines support GPUVM */
+               case CHIP_POLARIS12: /* all engines support GPUVM */
+               default:
+                       adev->mc.gart_size = 256ULL << 20;
+                       break;
+               case CHIP_TONGA:   /* UVD, VCE do not support GPUVM */
+               case CHIP_FIJI:    /* UVD, VCE do not support GPUVM */
+               case CHIP_CARRIZO: /* UVD, VCE do not support GPUVM, DCE SG support */
+               case CHIP_STONEY:  /* UVD does not support GPUVM, DCE SG support */
+                       adev->mc.gart_size = 1024ULL << 20;
+                       break;
+               }
+       } else {
+               adev->mc.gart_size = (u64)amdgpu_gart_size << 20;
+       }
 
        gmc_v8_0_vram_gtt_location(adev, &adev->mc);
 
@@ -761,7 +781,7 @@ static void gmc_v8_0_set_prt(struct amdgpu_device *adev, bool enable)
 static int gmc_v8_0_gart_enable(struct amdgpu_device *adev)
 {
        int r, i;
-       u32 tmp;
+       u32 tmp, field;
 
        if (adev->gart.robj == NULL) {
                dev_err(adev->dev, "No VRAM object for PCIE GART.\n");
@@ -792,10 +812,12 @@ static int gmc_v8_0_gart_enable(struct amdgpu_device *adev)
        tmp = REG_SET_FIELD(tmp, VM_L2_CNTL2, INVALIDATE_ALL_L1_TLBS, 1);
        tmp = REG_SET_FIELD(tmp, VM_L2_CNTL2, INVALIDATE_L2_CACHE, 1);
        WREG32(mmVM_L2_CNTL2, tmp);
+
+       field = adev->vm_manager.fragment_size;
        tmp = RREG32(mmVM_L2_CNTL3);
        tmp = REG_SET_FIELD(tmp, VM_L2_CNTL3, L2_CACHE_BIGK_ASSOCIATIVITY, 1);
-       tmp = REG_SET_FIELD(tmp, VM_L2_CNTL3, BANK_SELECT, 4);
-       tmp = REG_SET_FIELD(tmp, VM_L2_CNTL3, L2_CACHE_BIGK_FRAGMENT_SIZE, 4);
+       tmp = REG_SET_FIELD(tmp, VM_L2_CNTL3, BANK_SELECT, field);
+       tmp = REG_SET_FIELD(tmp, VM_L2_CNTL3, L2_CACHE_BIGK_FRAGMENT_SIZE, field);
        WREG32(mmVM_L2_CNTL3, tmp);
        /* XXX: set to enable PTE/PDE in system memory */
        tmp = RREG32(mmVM_L2_CNTL4);
@@ -813,8 +835,8 @@ static int gmc_v8_0_gart_enable(struct amdgpu_device *adev)
        tmp = REG_SET_FIELD(tmp, VM_L2_CNTL4, VMC_TAP_CONTEXT1_PTE_REQUEST_SNOOP, 0);
        WREG32(mmVM_L2_CNTL4, tmp);
        /* setup context0 */
-       WREG32(mmVM_CONTEXT0_PAGE_TABLE_START_ADDR, adev->mc.gtt_start >> 12);
-       WREG32(mmVM_CONTEXT0_PAGE_TABLE_END_ADDR, adev->mc.gtt_end >> 12);
+       WREG32(mmVM_CONTEXT0_PAGE_TABLE_START_ADDR, adev->mc.gart_start >> 12);
+       WREG32(mmVM_CONTEXT0_PAGE_TABLE_END_ADDR, adev->mc.gart_end >> 12);
        WREG32(mmVM_CONTEXT0_PAGE_TABLE_BASE_ADDR, adev->gart.table_addr >> 12);
        WREG32(mmVM_CONTEXT0_PROTECTION_FAULT_DEFAULT_ADDR,
                        (u32)(adev->dummy_page.addr >> 12));
@@ -869,7 +891,7 @@ static int gmc_v8_0_gart_enable(struct amdgpu_device *adev)
 
        gmc_v8_0_gart_flush_gpu_tlb(adev, 0);
        DRM_INFO("PCIE GART of %uM enabled (table at 0x%016llX).\n",
-                (unsigned)(adev->mc.gtt_size >> 20),
+                (unsigned)(adev->mc.gart_size >> 20),
                 (unsigned long long)adev->gart.table_addr);
        adev->gart.ready = true;
        return 0;
@@ -1045,7 +1067,7 @@ static int gmc_v8_0_sw_init(void *handle)
         * Currently set to 4GB ((1 << 20) 4k pages).
         * Max GPUVM size for cayman and SI is 40 bits.
         */
-       amdgpu_vm_adjust_size(adev, 64);
+       amdgpu_vm_adjust_size(adev, 64, 4);
        adev->vm_manager.max_pfn = adev->vm_manager.vm_size << 18;
 
        /* Set the internal MC address mask
@@ -1260,7 +1282,7 @@ static int gmc_v8_0_pre_soft_reset(void *handle)
        if (!adev->mc.srbm_soft_reset)
                return 0;
 
-       gmc_v8_0_mc_stop(adev, &adev->mc.save);
+       gmc_v8_0_mc_stop(adev);
        if (gmc_v8_0_wait_for_idle(adev)) {
                dev_warn(adev->dev, "Wait for GMC idle timed out !\n");
        }
@@ -1306,7 +1328,7 @@ static int gmc_v8_0_post_soft_reset(void *handle)
        if (!adev->mc.srbm_soft_reset)
                return 0;
 
-       gmc_v8_0_mc_resume(adev, &adev->mc.save);
+       gmc_v8_0_mc_resume(adev);
        return 0;
 }